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
This commit is contained in:
committed by
Ethan Yonker
parent
b85189658a
commit
14138d9f74
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user