Commit 14138d9f authored by Sultan Qasim Khan's avatar Sultan Qasim Khan Committed by Ethan Yonker
Browse files

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
parent b8518965
......@@ -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<string_size; index++)
maskedValue += mMask;
displayValue = maskedValue;
} else {
displayValue = mValue;
}
textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource);
}
......@@ -274,19 +274,19 @@ void GUIInput::HandleCursorByText() {
return;
}
int cursorWidth = textWidth;
int cursorTextWidth = textWidth; // width of text to the left of the cursor
if (mCursorLocation != -1) {
string cursorDisplay = displayValue;
cursorDisplay.resize(mCursorLocation);
cursorWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource);
cursorTextWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource);
}
cursorX = mRenderX + cursorWidth + scrollingX;
cursorX = mRenderX + cursorTextWidth + scrollingX;
if (cursorX >= 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)
......
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment