From 15bcf132b3829c2bbee5265d200f7ad678a7d88a Mon Sep 17 00:00:00 2001 From: Sultan Qasim Khan Date: Mon, 4 Apr 2016 04:11:25 -0400 Subject: [PATCH] gui: don't mix up display value with actual value In the case of password entry, the two differ. Password entry was broken by the earlier commit entitled "Improve input box text handling" because it started using the displayValue as the actual value, even in cases where they differ because of a mask value. Change-Id: Iaf5a67e1d928f34595962a1f1b80eebb64e8b493 --- gui/input.cpp | 58 ++++++++++++++++++++++++------------------------- gui/objects.hpp | 7 +++--- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/gui/input.cpp b/gui/input.cpp index 0777fa2212..ec21810e8b 100644 --- a/gui/input.cpp +++ b/gui/input.cpp @@ -57,6 +57,7 @@ GUIInput::GUIInput(xml_node<>* node) CursorWidth = 3; ConvertStrToColor("black", &mBackgroundColor); ConvertStrToColor("white", &mCursorColor); + mValue = ""; displayValue = ""; if (!node) @@ -110,10 +111,6 @@ GUIInput::GUIInput(xml_node<>* node) mFontHeight = mFont->GetHeight(); } - child = FindNode(node, "text"); - if (child) mText = child->value(); - mLastValue = gui_parse_text(mText); - child = FindNode(node, "data"); if (child) { @@ -182,7 +179,7 @@ void GUIInput::HandleTextLocation(int x) { lastX = x; } -void GUIInput::UpdateTextWidth() { +void GUIInput::UpdateDisplayText() { void* fontResource = NULL; if (mFont) { @@ -192,14 +189,17 @@ void GUIInput::UpdateTextWidth() { return; } - DataManager::GetValue(mVariable, displayValue); + DataManager::GetValue(mVariable, mValue); if (HasMask) { - int index, string_size = displayValue.size(); + int index, string_size = mValue.size(); string maskedValue; for (index=0; index= mRenderX + mRenderW) { - scrollingX = mRenderW - cursorWidth; + scrollingX = mRenderW - cursorTextWidth; cursorX = mRenderX + mRenderW - CursorWidth; } else if (cursorX < mRenderX) { - scrollingX = cursorWidth * -1; + scrollingX = cursorTextWidth * -1; cursorX = mRenderX; } } @@ -411,14 +411,14 @@ int GUIInput::NotifyVarChange(const std::string& varName, const std::string& val if (varName == mVariable) { if (!isLocalChange) { - UpdateTextWidth(); + UpdateDisplayText(); HandleTextLocation(TW_INPUT_NO_UPDATE); } else isLocalChange = false; return 0; } if (varName.empty()) { - UpdateTextWidth(); + UpdateDisplayText(); HandleTextLocation(TW_INPUT_NO_UPDATE); HandleCursorByText(); } @@ -483,16 +483,16 @@ int GUIInput::NotifyCharInput(int key) if (HasInputFocus) { if (key == KEYBOARD_BACKSPACE) { //Backspace - if (displayValue.size() > 0 && mCursorLocation != 0) { + if (mValue.size() > 0 && mCursorLocation != 0) { if (mCursorLocation == -1) { - displayValue.resize(displayValue.size() - 1); + mValue.resize(mValue.size() - 1); } else { - displayValue.erase(mCursorLocation - 1, 1); + mValue.erase(mCursorLocation - 1, 1); mCursorLocation--; } isLocalChange = true; - DataManager::SetValue(mVariable, displayValue); - UpdateTextWidth(); + DataManager::SetValue(mVariable, mValue); + UpdateDisplayText(); HandleTextLocation(TW_INPUT_NO_UPDATE); HandleCursorByText(); } @@ -501,15 +501,15 @@ int GUIInput::NotifyCharInput(int key) isLocalChange = true; if (mCursorLocation == -1) { DataManager::SetValue (mVariable, ""); - displayValue = ""; + mValue = ""; textWidth = 0; mCursorLocation = -1; } else { - displayValue.erase(0, mCursorLocation); - DataManager::SetValue(mVariable, displayValue); - UpdateTextWidth(); + mValue.erase(0, mCursorLocation); + DataManager::SetValue(mVariable, mValue); mCursorLocation = 0; } + UpdateDisplayText(); cursorX = mRenderX; scrollingX = 0; mRendered = false; @@ -522,24 +522,24 @@ int GUIInput::NotifyCharInput(int key) if (HasDisabled && DisabledList.find((char)key) != string::npos) { return 0; } - if (MaxLen != 0 && displayValue.size() >= MaxLen) { + if (MaxLen != 0 && mValue.size() >= MaxLen) { return 0; } if (mCursorLocation == -1) { - displayValue += key; + mValue += key; } else { - displayValue.insert(mCursorLocation, 1, key); + mValue.insert(mCursorLocation, 1, key); mCursorLocation++; } isLocalChange = true; - DataManager::SetValue(mVariable, displayValue); - UpdateTextWidth(); + DataManager::SetValue(mVariable, mValue); + UpdateDisplayText(); HandleTextLocation(TW_INPUT_NO_UPDATE); HandleCursorByText(); } else if (key == KEYBOARD_ACTION) { // Action if (mAction) { - unsigned inputLen = displayValue.length(); + unsigned inputLen = mValue.length(); if (inputLen < MinLen) return 0; else if (MaxLen != 0 && inputLen > MaxLen) diff --git a/gui/objects.hpp b/gui/objects.hpp index 232d21fa59..f74a25ed99 100644 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -1002,7 +1002,7 @@ class GUIInput : public GUIObject, public RenderObject, public ActionObject, pub // Handles displaying the text properly when chars are added, deleted, or for scrolling void HandleTextLocation(int x); - void UpdateTextWidth(); + void UpdateDisplayText(); void HandleCursorByTouch(int x); void HandleCursorByText(); @@ -1012,15 +1012,14 @@ class GUIInput : public GUIObject, public RenderObject, public ActionObject, pub ImageResource* mBackground; ImageResource* mCursor; FontResource* mFont; - std::string mText; - std::string mLastValue; std::string mVariable; std::string mMask; + std::string mValue; std::string displayValue; COLOR mBackgroundColor; COLOR mCursorColor; int scrollingX; - int cursorX; + int cursorX; // actual x axis location of the cursor int lastX; int mCursorLocation; int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;