blob: a2958db991ff99934ccff7f0835dfb79084ee1c4 [file] [log] [blame]
Matt Mower37a7ab62017-01-18 20:06:08 -06001/*
2 Copyright 2017 TeamWin
3 This file is part of TWRP/TeamWin Recovery Project.
4
5 TWRP is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 TWRP is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with TWRP. If not, see <http://www.gnu.org/licenses/>.
17*/
18
Dees_Troy51a0e822012-09-05 15:24:24 -040019// checkbox.cpp - GUICheckbox object
20
21#include <stdarg.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <fcntl.h>
26#include <sys/reboot.h>
27#include <sys/stat.h>
28#include <sys/time.h>
29#include <sys/mman.h>
30#include <sys/types.h>
31#include <sys/ioctl.h>
32#include <time.h>
33#include <unistd.h>
34#include <stdlib.h>
35
36#include <string>
37
38extern "C" {
Dees_Troy2673cec2013-04-02 20:22:16 +000039#include "../twcommon.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040040}
Ethan Yonkerfbb43532015-12-28 21:54:50 +010041#include "../minuitwrp/minui.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040042
43#include "rapidxml.hpp"
44#include "objects.hpp"
45
46GUICheckbox::GUICheckbox(xml_node<>* node)
Vojtech Bocekede51c52014-02-07 23:58:09 +010047 : GUIObject(node)
Dees_Troy51a0e822012-09-05 15:24:24 -040048{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020049 xml_attribute<>* attr;
50 xml_node<>* child;
Dees_Troy51a0e822012-09-05 15:24:24 -040051
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020052 mChecked = NULL;
53 mUnchecked = NULL;
54 mLabel = NULL;
55 mRendered = false;
Dees_Troy51a0e822012-09-05 15:24:24 -040056
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020057 mLastState = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040058
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020059 if (!node)
60 return;
Dees_Troy51a0e822012-09-05 15:24:24 -040061
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020062 // The label can be loaded directly
63 mLabel = new GUIText(node);
Dees_Troy51a0e822012-09-05 15:24:24 -040064
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020065 // Read the check states
Ethan Yonker21ff02a2015-02-18 14:35:00 -060066 child = FindNode(node, "image");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020067 if (child)
68 {
thatf6ed8fc2015-02-14 20:23:16 +010069 mChecked = LoadAttrImage(child, "checked");
70 mUnchecked = LoadAttrImage(child, "unchecked");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020071 }
Dees_Troy51a0e822012-09-05 15:24:24 -040072
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020073 // Get the variable data
Ethan Yonker21ff02a2015-02-18 14:35:00 -060074 child = FindNode(node, "data");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020075 if (child)
76 {
77 attr = child->first_attribute("variable");
78 if (attr)
79 mVarName = attr->value();
80 attr = child->first_attribute("default");
81 if (attr)
82 DataManager::SetValue(mVarName, attr->value());
83 }
Dees_Troy51a0e822012-09-05 15:24:24 -040084
thatf6ed8fc2015-02-14 20:23:16 +010085 mCheckW = mChecked->GetWidth();
86 mCheckH = mChecked->GetHeight();
87 if (mCheckW == 0)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020088 {
thatf6ed8fc2015-02-14 20:23:16 +010089 mCheckW = mUnchecked->GetWidth();
90 mCheckH = mUnchecked->GetHeight();
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020091 }
Dees_Troy51a0e822012-09-05 15:24:24 -040092
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020093 int x, y, w, h;
94 mLabel->GetRenderPos(x, y, w, h);
95 SetRenderPos(x, y, 0, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -040096}
97
98GUICheckbox::~GUICheckbox()
99{
100}
101
102int GUICheckbox::Render(void)
103{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200104 if (!isConditionTrue())
105 {
106 mRendered = false;
107 return 0;
108 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400109
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200110 int ret = 0;
111 int lastState = 0;
112 DataManager::GetValue(mVarName, lastState);
Dees_Troy51a0e822012-09-05 15:24:24 -0400113
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200114 if (lastState)
115 {
116 if (mChecked && mChecked->GetResource())
117 gr_blit(mChecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
118 }
119 else
120 {
121 if (mUnchecked && mUnchecked->GetResource())
122 gr_blit(mUnchecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
123 }
124 if (mLabel)
125 ret = mLabel->Render();
126 mLastState = lastState;
127 mRendered = true;
128 return ret;
Dees_Troy51a0e822012-09-05 15:24:24 -0400129}
130
131int GUICheckbox::Update(void)
132{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200133 if (!isConditionTrue()) return (mRendered ? 2 : 0);
134 if (!mRendered) return 2;
Dees_Troy51a0e822012-09-05 15:24:24 -0400135
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200136 int lastState = 0;
137 DataManager::GetValue(mVarName, lastState);
Dees_Troy51a0e822012-09-05 15:24:24 -0400138
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200139 if (lastState != mLastState)
140 return 2;
141 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400142}
143
144int GUICheckbox::SetRenderPos(int x, int y, int w, int h)
145{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200146 mRenderX = x;
147 mRenderY = y;
Dees_Troy51a0e822012-09-05 15:24:24 -0400148
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200149 if (w || h)
150 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400151
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200152 int textW, textH;
153 mLabel->GetCurrentBounds(textW, textH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400154
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200155 w = textW + mCheckW + 5;
156 mRenderW = w;
157 mRenderH = mCheckH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400158
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200159 mTextX = mRenderX + mCheckW + 5;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500160 mTextY = mRenderY + (mCheckH / 2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400161
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200162 mLabel->SetRenderPos(mTextX, mTextY, 0, 0);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500163 mLabel->SetPlacement(TEXT_ONLY_RIGHT);
164 mLabel->SetMaxWidth(gr_fb_width() - mTextX);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200165 SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
166 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400167}
168
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500169int GUICheckbox::NotifyTouch(TOUCH_STATE state, int x __unused, int y __unused)
Dees_Troy51a0e822012-09-05 15:24:24 -0400170{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200171 if (!isConditionTrue())
172 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400173
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200174 if (state == TOUCH_RELEASE)
175 {
176 int lastState;
177 DataManager::GetValue(mVarName, lastState);
178 lastState = (lastState == 0) ? 1 : 0;
179 DataManager::SetValue(mVarName, lastState);
Vojtech Bocek5af8f3f2014-02-08 02:21:23 +0100180
181 DataManager::Vibrate("tw_button_vibrate");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200182 }
183 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400184}
185