blob: 8bacd8f3a147604371ddefb162e7d578dee9a8c3 [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}
bigbiffd81833a2021-01-17 11:06:57 -050041#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");
Ethan Yonkerb1502762019-03-25 15:38:34 -050081 if (attr) {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020082 DataManager::SetValue(mVarName, attr->value());
Ethan Yonkerb1502762019-03-25 15:38:34 -050083 } else {
84 int val;
85 if (DataManager::GetValue(mVarName, val) != 0)
86 DataManager::SetValue(mVarName, 0); // Prevents check boxes from having to be tapped twice the first time
87 }
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020088 }
Dees_Troy51a0e822012-09-05 15:24:24 -040089
Ethan Yonker58f21322018-08-24 11:17:36 -050090 mCheckW = mCheckH = 0;
91 if (mChecked && mChecked->GetResource()) {
92 mCheckW = mChecked->GetWidth();
93 mCheckH = mChecked->GetHeight();
94 } else if (mUnchecked && mUnchecked->GetResource()) {
thatf6ed8fc2015-02-14 20:23:16 +010095 mCheckW = mUnchecked->GetWidth();
96 mCheckH = mUnchecked->GetHeight();
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020097 }
Dees_Troy51a0e822012-09-05 15:24:24 -040098
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020099 int x, y, w, h;
100 mLabel->GetRenderPos(x, y, w, h);
101 SetRenderPos(x, y, 0, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400102}
103
104GUICheckbox::~GUICheckbox()
105{
106}
107
108int GUICheckbox::Render(void)
109{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200110 if (!isConditionTrue())
111 {
112 mRendered = false;
113 return 0;
114 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400115
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200116 int ret = 0;
117 int lastState = 0;
118 DataManager::GetValue(mVarName, lastState);
Dees_Troy51a0e822012-09-05 15:24:24 -0400119
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200120 if (lastState)
121 {
122 if (mChecked && mChecked->GetResource())
123 gr_blit(mChecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
124 }
125 else
126 {
127 if (mUnchecked && mUnchecked->GetResource())
128 gr_blit(mUnchecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY);
129 }
130 if (mLabel)
131 ret = mLabel->Render();
132 mLastState = lastState;
133 mRendered = true;
134 return ret;
Dees_Troy51a0e822012-09-05 15:24:24 -0400135}
136
137int GUICheckbox::Update(void)
138{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200139 if (!isConditionTrue()) return (mRendered ? 2 : 0);
140 if (!mRendered) return 2;
Dees_Troy51a0e822012-09-05 15:24:24 -0400141
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200142 int lastState = 0;
143 DataManager::GetValue(mVarName, lastState);
Dees_Troy51a0e822012-09-05 15:24:24 -0400144
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200145 if (lastState != mLastState)
146 return 2;
147 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400148}
149
150int GUICheckbox::SetRenderPos(int x, int y, int w, int h)
151{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200152 mRenderX = x;
153 mRenderY = y;
Dees_Troy51a0e822012-09-05 15:24:24 -0400154
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200155 if (w || h)
156 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400157
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200158 int textW, textH;
159 mLabel->GetCurrentBounds(textW, textH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400160
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200161 w = textW + mCheckW + 5;
162 mRenderW = w;
163 mRenderH = mCheckH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400164
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200165 mTextX = mRenderX + mCheckW + 5;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500166 mTextY = mRenderY + (mCheckH / 2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400167
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200168 mLabel->SetRenderPos(mTextX, mTextY, 0, 0);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500169 mLabel->SetPlacement(TEXT_ONLY_RIGHT);
170 mLabel->SetMaxWidth(gr_fb_width() - mTextX);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200171 SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
172 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400173}
174
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500175int GUICheckbox::NotifyTouch(TOUCH_STATE state, int x __unused, int y __unused)
Dees_Troy51a0e822012-09-05 15:24:24 -0400176{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200177 if (!isConditionTrue())
178 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400179
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200180 if (state == TOUCH_RELEASE)
181 {
182 int lastState;
183 DataManager::GetValue(mVarName, lastState);
184 lastState = (lastState == 0) ? 1 : 0;
185 DataManager::SetValue(mVarName, lastState);
Vojtech Bocek5af8f3f2014-02-08 02:21:23 +0100186
bigbiff bigbiff3ed778a2019-03-12 19:28:31 -0400187#ifndef TW_NO_HAPTICS
Vojtech Bocek5af8f3f2014-02-08 02:21:23 +0100188 DataManager::Vibrate("tw_button_vibrate");
bigbiff bigbiff3ed778a2019-03-12 19:28:31 -0400189#endif
190
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200191 }
192 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400193}
194