int GUIInput::NotifyVarChange(std::string varName, std::string value) { if (varName == mVariable && !isLocalChange) { HandleTextLocation(-1003); return 0; } return 0; }
int GUIInput::NotifyVarChange(const std::string& varName, const std::string& value) { GUIObject::NotifyVarChange(varName, value); if (varName == mVariable && !isLocalChange) { HandleTextLocation(-1003); return 0; } return 0; }
int GUIInput::NotifyKeyboard(int key) { string variableValue; if (HasInputFocus) { if (key == KEYBOARD_BACKSPACE) { //Backspace DataManager::GetValue(mVariable, variableValue); if (variableValue.size() > 0 && (mCursorLocation + skipChars != 0 || mCursorLocation == -1)) { if (mCursorLocation == -1) { variableValue.resize(variableValue.size() - 1); } else { variableValue.erase(mCursorLocation + skipChars - 1, 1); if (mCursorLocation > 0) mCursorLocation--; else if (skipChars > 0) skipChars--; } isLocalChange = true; DataManager::SetValue(mVariable, variableValue); isLocalChange = false; if (HasMask) { int index, string_size = variableValue.size(); string maskedValue; for (index=0; index<string_size; index++) maskedValue += mMask; DataManager::SetValue(mMaskVariable, maskedValue); } HandleTextLocation(-1002); } } else if (key == KEYBOARD_SWIPE_LEFT) { // Delete all isLocalChange = true; if (mCursorLocation == -1) { DataManager::SetValue (mVariable, ""); if (HasMask) DataManager::SetValue(mMaskVariable, ""); mCursorLocation = -1; } else { DataManager::GetValue(mVariable, variableValue); variableValue.erase(0, mCursorLocation + skipChars); DataManager::SetValue(mVariable, variableValue); if (HasMask) { DataManager::GetValue(mMaskVariable, variableValue); variableValue.erase(0, mCursorLocation + skipChars); DataManager::SetValue(mMaskVariable, variableValue); } mCursorLocation = 0; } skipChars = 0; scrollingX = 0; mInputText->SkipCharCount(skipChars); isLocalChange = false; mRendered = false; return 0; } else if (key == KEYBOARD_ARROW_LEFT) { if (mCursorLocation == 0 && skipChars == 0) return 0; // we're already at the beginning if (mCursorLocation == -1) { DataManager::GetValue(mVariable, variableValue); if (variableValue.size() == 0) return 0; mCursorLocation = variableValue.size() - skipChars - 1; } else if (mCursorLocation == 0) { skipChars--; HandleTextLocation(-1002); } else { mCursorLocation--; HandleTextLocation(-1002); } mRendered = false; return 0; } else if (key == KEYBOARD_ARROW_RIGHT) { if (mCursorLocation == -1) return 0; // we're already at the end mCursorLocation++; DataManager::GetValue(mVariable, variableValue); if (variableValue.size() <= mCursorLocation + skipChars) mCursorLocation = -1; HandleTextLocation(-1001); mRendered = false; return 0; } else if (key == KEYBOARD_HOME || key == KEYBOARD_ARROW_UP) { DataManager::GetValue(mVariable, variableValue); if (variableValue.size() == 0) return 0; mCursorLocation = 0; skipChars = 0; mRendered = false; HandleTextLocation(-1002); return 0; } else if (key == KEYBOARD_END || key == KEYBOARD_ARROW_DOWN) { mCursorLocation = -1; mRendered = false; HandleTextLocation(-1003); return 0; } else if (key < KEYBOARD_SPECIAL_KEYS && key > 0) { // Regular key if (HasAllowed && AllowedList.find((char)key) == string::npos) { return 0; } if (HasDisabled && DisabledList.find((char)key) != string::npos) { return 0; } DataManager::GetValue(mVariable, variableValue); if (MaxLen != 0 && variableValue.size() >= MaxLen) { return 0; } if (mCursorLocation == -1) { variableValue += key; } else { const char newchar = (char)key; const char* a = &newchar; string newstring = a; newstring.resize(1); variableValue.insert(mCursorLocation + skipChars, newstring); mCursorLocation++; } isLocalChange = true; DataManager::SetValue(mVariable, variableValue); HandleTextLocation(-1001); isLocalChange = false; if (HasMask) { int index, string_size = variableValue.size(); string maskedValue; for (index=0; index<string_size; index++) maskedValue += mMask; DataManager::SetValue(mMaskVariable, maskedValue); } } else if (key == KEYBOARD_ACTION) { // Action DataManager::GetValue(mVariable, variableValue); if (mAction) { unsigned inputLen = variableValue.length(); if (inputLen < MinLen) return 0; else if (MaxLen != 0 && inputLen > MaxLen) return 0; else return (mAction ? mAction->NotifyTouch(TOUCH_RELEASE, mRenderX, mRenderY) : 1); } } return 0; } else { if (key == 0) { // Somewhat ugly hack-ish way to tell the box to redraw after losing focus to remove the cursor mRendered = false; return 1; } } return 1; }
int GUIInput::NotifyTouch(TOUCH_STATE state, int x, int y) { static int startSelection = -1; int textWidth; string displayValue, originalValue; void* fontResource = NULL; if (mFont) fontResource = mFont->GetResource(); if (!isConditionTrue()) return -1; if (!HasInputFocus) { if (state != TOUCH_RELEASE) return 0; // Only change focus if touch releases within the input box if (GetSelection(x, y) >= 0) { // When changing focus, we don't scroll or change the cursor location PageManager::SetKeyBoardFocus(0); PageManager::NotifyKeyboard(0); SetInputFocus(1); DrawCursor = true; mRendered = false; } } else { switch (state) { case TOUCH_HOLD: case TOUCH_REPEAT: break; case TOUCH_START: startSelection = GetSelection(x,y); lastX = x; DrawCursor = false; mRendered = false; break; case TOUCH_DRAG: // Check if we dragged out of the selection window if (GetSelection(x, y) == -1) { lastX = 0; break; } DrawCursor = false; // Provide some debounce on initial touches if (startSelection != -1 && abs(x - lastX) < 6) { break; } startSelection = -1; if (lastX != x) HandleTextLocation(x); break; case TOUCH_RELEASE: // We've moved the cursor location int relativeX = x - mRenderX; mRendered = false; DrawCursor = true; DataManager::GetValue(mVariable, displayValue); if (HasMask) { int index, string_size = displayValue.size(); string maskedValue; for (index=0; index<string_size; index++) maskedValue += mMask; displayValue = maskedValue; } if (displayValue.size() == 0) { skipChars = 0; mCursorLocation = -1; return 0; } else if (skipChars && skipChars < displayValue.size()) { displayValue.erase(0, skipChars); } string cursorString; int cursorX = 0; unsigned index = 0; for(index=0; index<displayValue.size(); index++) { cursorString = displayValue.substr(0, index); cursorX = gr_measureEx(cursorString.c_str(), fontResource) + mRenderX; if (cursorX > x) { if (index > 0) mCursorLocation = index - 1; else mCursorLocation = index; return 0; } } mCursorLocation = -1; break; } } return 0; }
GUIInput::GUIInput(xml_node<>* node) : GUIObject(node) { xml_attribute<>* attr; xml_node<>* child; mInputText = NULL; mAction = NULL; mBackground = NULL; mCursor = NULL; mFont = NULL; mRendered = false; HasMask = false; DrawCursor = false; isLocalChange = true; HasAllowed = false; HasDisabled = false; skipChars = scrollingX = mFontHeight = mFontY = lastX = 0; mBackgroundX = mBackgroundY = mBackgroundW = mBackgroundH = MinLen = MaxLen = 0; mCursorLocation = -1; // -1 is always the end of the string CursorWidth = 3; ConvertStrToColor("black", &mBackgroundColor); ConvertStrToColor("white", &mCursorColor); if (!node) return; // Load text directly from the node mInputText = new GUIText(node); // Load action directly from the node mAction = new GUIAction(node); if (mInputText->Render() < 0) { delete mInputText; mInputText = NULL; } // Load the background child = node->first_node("background"); if (child) { attr = child->first_attribute("resource"); if (attr) mBackground = PageManager::FindResource(attr->value()); attr = child->first_attribute("color"); if (attr) { std::string color = attr->value(); ConvertStrToColor(color, &mBackgroundColor); } } if (mBackground && mBackground->GetResource()) { mBackgroundW = gr_get_width(mBackground->GetResource()); mBackgroundH = gr_get_height(mBackground->GetResource()); } // Load the cursor color child = node->first_node("cursor"); if (child) { attr = child->first_attribute("resource"); if (attr) mCursor = PageManager::FindResource(attr->value()); attr = child->first_attribute("color"); if (attr) { std::string color = attr->value(); ConvertStrToColor(color, &mCursorColor); } attr = child->first_attribute("hasfocus"); if (attr) { std::string color = attr->value(); SetInputFocus(atoi(color.c_str())); } attr = child->first_attribute("width"); if (attr) { std::string cwidth = gui_parse_text(attr->value()); CursorWidth = atoi(cwidth.c_str()); } } DrawCursor = HasInputFocus; // Load the font, and possibly override the color child = node->first_node("font"); if (child) { attr = child->first_attribute("resource"); if (attr) { mFont = PageManager::FindResource(attr->value()); mFontHeight = gr_getMaxFontHeight(mFont ? mFont->GetResource() : NULL); } } child = node->first_node("text"); if (child) mText = child->value(); mLastValue = gui_parse_text(mText); child = node->first_node("data"); if (child) { attr = child->first_attribute("name"); if (attr) mVariable = attr->value(); attr = child->first_attribute("default"); if (attr) DataManager::SetValue(mVariable, attr->value()); attr = child->first_attribute("mask"); if (attr) { mMask = attr->value(); HasMask = true; } attr = child->first_attribute("maskvariable"); if (attr) mMaskVariable = attr->value(); else mMaskVariable = mVariable; } // Load input restrictions child = node->first_node("restrict"); if (child) { attr = child->first_attribute("minlen"); if (attr) { std::string attrib = attr->value(); MinLen = atoi(attrib.c_str()); } attr = child->first_attribute("maxlen"); if (attr) { std::string attrib = attr->value(); MaxLen = atoi(attrib.c_str()); } attr = child->first_attribute("allow"); if (attr) { HasAllowed = true; AllowedList = attr->value(); } attr = child->first_attribute("disable"); if (attr) { HasDisabled = true; DisabledList = attr->value(); } } // Load the placement LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH); SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH); if (mInputText && mFontHeight && mFontHeight < (unsigned)mRenderH) { mFontY = ((mRenderH - mFontHeight) / 2) + mRenderY; mInputText->SetRenderPos(mRenderX, mFontY); } else mFontY = mRenderY; if (mInputText) mInputText->SetMaxWidth(mRenderW); isLocalChange = false; HandleTextLocation(-3); }
GUIInput::GUIInput(xml_node<>* node) : GUIObject(node) { xml_attribute<>* attr; xml_node<>* child; mInputText = NULL; mAction = NULL; mBackground = NULL; mCursor = NULL; mFont = NULL; mRendered = false; HasMask = false; DrawCursor = false; isLocalChange = true; HasAllowed = false; HasDisabled = false; skipChars = scrollingX = mFontHeight = mFontY = lastX = 0; mBackgroundX = mBackgroundY = mBackgroundW = mBackgroundH = MinLen = MaxLen = 0; mCursorLocation = -1; // -1 is always the end of the string CursorWidth = 3; ConvertStrToColor("black", &mBackgroundColor); ConvertStrToColor("white", &mCursorColor); if (!node) return; // Load text directly from the node mInputText = new GUIText(node); // Load action directly from the node mAction = new GUIAction(node); if (mInputText->Render() < 0) { delete mInputText; mInputText = NULL; } // Load the background child = FindNode(node, "background"); if (child) { mBackground = LoadAttrImage(child, "resource"); mBackgroundColor = LoadAttrColor(child, "color", mBackgroundColor); } if (mBackground && mBackground->GetResource()) { mBackgroundW = mBackground->GetWidth(); mBackgroundH = mBackground->GetHeight(); } // Load the cursor color child = FindNode(node, "cursor"); if (child) { mCursor = LoadAttrImage(child, "resource"); mCursorColor = LoadAttrColor(child, "color", mCursorColor); attr = child->first_attribute("hasfocus"); if (attr) { std::string focus = attr->value(); SetInputFocus(atoi(focus.c_str())); } CursorWidth = LoadAttrIntScaleX(child, "width", CursorWidth); } DrawCursor = HasInputFocus; // Load the font child = FindNode(node, "font"); if (child) { mFont = LoadAttrFont(child, "resource"); mFontHeight = mFont->GetHeight(); } child = FindNode(node, "text"); if (child) mText = child->value(); mLastValue = gui_parse_text(mText); child = FindNode(node, "data"); if (child) { attr = child->first_attribute("name"); if (attr) mVariable = attr->value(); attr = child->first_attribute("default"); if (attr) DataManager::SetValue(mVariable, attr->value()); mMask = LoadAttrString(child, "mask"); HasMask = !mMask.empty(); attr = child->first_attribute("maskvariable"); if (attr) mMaskVariable = attr->value(); else mMaskVariable = mVariable; } // Load input restrictions child = FindNode(node, "restrict"); if (child) { MinLen = LoadAttrInt(child, "minlen", MinLen); MaxLen = LoadAttrInt(child, "maxlen", MaxLen); AllowedList = LoadAttrString(child, "allow"); HasAllowed = !AllowedList.empty(); DisabledList = LoadAttrString(child, "disable"); HasDisabled = !DisabledList.empty(); } // Load the placement LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, &mRenderW, &mRenderH); SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH); if (mInputText && mFontHeight && mFontHeight < (unsigned)mRenderH) { mFontY = ((mRenderH - mFontHeight) / 2) + mRenderY; mInputText->SetRenderPos(mRenderX, mFontY); } else mFontY = mRenderY; if (mInputText) mInputText->SetMaxWidth(mRenderW); isLocalChange = false; HandleTextLocation(-3); }