From 14138d9f74c7b56e600166a993ea62818fa0f840 Mon Sep 17 00:00:00 2001 From: Sultan Qasim Khan Date: Mon, 4 Apr 2016 04:11:25 -0400 Subject: 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 4bf01ada2..ec370abe5 100644 --- a/gui/input.cpp +++ b/gui/input.cpp @@ -71,6 +71,7 @@ GUIInput::GUIInput(xml_node<>* node) CursorWidth = 3; ConvertStrToColor("black", &mBackgroundColor); ConvertStrToColor("white", &mCursorColor); + mValue = ""; displayValue = ""; if (!node) @@ -124,10 +125,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) { @@ -196,7 +193,7 @@ void GUIInput::HandleTextLocation(int x) { lastX = x; } -void GUIInput::UpdateTextWidth() { +void GUIInput::UpdateDisplayText() { void* fontResource = NULL; if (mFont) { @@ -206,14 +203,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; } } @@ -425,14 +425,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(); } @@ -497,16 +497,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(); } @@ -515,15 +515,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; @@ -536,24 +536,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 7913b36cb..84a9e5ecf 100644 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -1000,7 +1000,7 @@ protected: // 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(); @@ -1010,15 +1010,14 @@ protected: 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; -- cgit v1.2.3