/* Copyright 2015 bigbiff/Dees_Troy/_that 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 . */ // textbox.cpp - GUITextBox object #include extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" #include "rapidxml.hpp" #include "objects.hpp" GUITextBox::GUITextBox(xml_node<>* node) : GUIScrollList(node) { xml_node<>* child; mLastCount = 0; mIsStatic = true; allowSelection = false; // textbox doesn't support list item selections child = FindNode(node, "color"); if (child) { mFontColor = LoadAttrColor(child, "foreground", mFontColor); mBackgroundColor = LoadAttrColor(child, "background", mBackgroundColor); //mScrollColor = LoadAttrColor(child, "scroll", mScrollColor); } child = FindNode(node, "text"); while (child) { string txt = child->value(); mText.push_back(txt); string lookup = gui_parse_text(txt); if (lookup != txt) mIsStatic = false; mLastValue.push_back(lookup); child = child->next_sibling("text"); } } int GUITextBox::Update(void) { if (AddLines(&mLastValue, NULL, &mLastCount, &rText, NULL)) { // someone added new text // at least the scrollbar must be updated, even if the new lines are currently not visible mUpdate = 1; } GUIScrollList::Update(); if (mUpdate) { mUpdate = 0; if (Render() == 0) return 2; } return 0; } size_t GUITextBox::GetItemCount() { return rText.size(); } void GUITextBox::RenderItem(size_t itemindex, int yPos, bool selected __unused) { if (!mFont || !mFont->GetResource()) return; // Set the color for the font gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha); // render text const char* text = rText[itemindex].c_str(); gr_textEx_scaleW(mRenderX, yPos, text, mFont->GetResource(), mRenderW, TOP_LEFT, 0); } void GUITextBox::NotifySelect(size_t item_selected __unused) { // do nothing - textbox ignores selections } int GUITextBox::NotifyVarChange(const std::string& varName, const std::string& value) { GUIScrollList::NotifyVarChange(varName, value); if (!isConditionTrue() || mIsStatic) return 0; // Check to see if the variable exists in mText for (size_t i = 0; i < mText.size(); i++) { string lookup = gui_parse_text(mText.at(i)); if (lookup != mText.at(i)) { mLastValue.at(i) = lookup; mUpdate = 1; // There are ways to improve efficiency here, but I am not // sure if we will even use this feature in the stock theme // at all except for language translation. If we start using // variables in textboxes in the stock theme, we can circle // back and make improvements here. mLastCount = 0; rText.clear(); } } return 0; }