/* Copyright 2017 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. TWRP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with TWRP. If not, see . */ // checkbox.cpp - GUICheckbox object #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" #include "rapidxml.hpp" #include "objects.hpp" GUICheckbox::GUICheckbox(xml_node<>* node) : GUIObject(node) { xml_attribute<>* attr; xml_node<>* child; mChecked = NULL; mUnchecked = NULL; mLabel = NULL; mRendered = false; mLastState = 0; if (!node) return; // The label can be loaded directly mLabel = new GUIText(node); // Read the check states child = FindNode(node, "image"); if (child) { mChecked = LoadAttrImage(child, "checked"); mUnchecked = LoadAttrImage(child, "unchecked"); } // Get the variable data child = FindNode(node, "data"); if (child) { attr = child->first_attribute("variable"); if (attr) mVarName = attr->value(); attr = child->first_attribute("default"); if (attr) { DataManager::SetValue(mVarName, attr->value()); } else { int val; if (DataManager::GetValue(mVarName, val) != 0) DataManager::SetValue(mVarName, 0); // Prevents check boxes from having to be tapped twice the first time } } mCheckW = mCheckH = 0; if (mChecked && mChecked->GetResource()) { mCheckW = mChecked->GetWidth(); mCheckH = mChecked->GetHeight(); } else if (mUnchecked && mUnchecked->GetResource()) { mCheckW = mUnchecked->GetWidth(); mCheckH = mUnchecked->GetHeight(); } int x, y, w, h; mLabel->GetRenderPos(x, y, w, h); SetRenderPos(x, y, 0, 0); } GUICheckbox::~GUICheckbox() { } int GUICheckbox::Render(void) { if (!isConditionTrue()) { mRendered = false; return 0; } int ret = 0; int lastState = 0; DataManager::GetValue(mVarName, lastState); if (lastState) { if (mChecked && mChecked->GetResource()) gr_blit(mChecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY); } else { if (mUnchecked && mUnchecked->GetResource()) gr_blit(mUnchecked->GetResource(), 0, 0, mCheckW, mCheckH, mRenderX, mRenderY); } if (mLabel) ret = mLabel->Render(); mLastState = lastState; mRendered = true; return ret; } int GUICheckbox::Update(void) { if (!isConditionTrue()) return (mRendered ? 2 : 0); if (!mRendered) return 2; int lastState = 0; DataManager::GetValue(mVarName, lastState); if (lastState != mLastState) return 2; return 0; } int GUICheckbox::SetRenderPos(int x, int y, int w, int h) { mRenderX = x; mRenderY = y; if (w || h) return -1; int textW, textH; mLabel->GetCurrentBounds(textW, textH); w = textW + mCheckW + 5; mRenderW = w; mRenderH = mCheckH; mTextX = mRenderX + mCheckW + 5; mTextY = mRenderY + (mCheckH / 2); mLabel->SetRenderPos(mTextX, mTextY, 0, 0); mLabel->SetPlacement(TEXT_ONLY_RIGHT); mLabel->SetMaxWidth(gr_fb_width() - mTextX); SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH); return 0; } int GUICheckbox::NotifyTouch(TOUCH_STATE state, int x __unused, int y __unused) { if (!isConditionTrue()) return -1; if (state == TOUCH_RELEASE) { int lastState; DataManager::GetValue(mVarName, lastState); lastState = (lastState == 0) ? 1 : 0; DataManager::SetValue(mVarName, lastState); #ifndef TW_NO_HAPTICS DataManager::Vibrate("tw_button_vibrate"); #endif } return 0; }