bool GuiTextBox::onEvent(const GEvent& event) { if (! m_visible) { return false; } switch (event.type) { case GEventType::MOUSE_BUTTON_UP: /**place the cursor in the space closest to the mouse click (does not support multi-line textboxes)*/ { const GuiTheme::TextStyle& style = theme()->defaultStyle(); //Offset if some text is hidden to the left const float textOffset = max(0.0f, style.font->bounds(m_userValue.substr(0, m_cursorPos), style.size).x - (clickRect().width() - theme()->textBoxPadding().wh().x)); const float clickPos = event.button.x - (m_captionWidth + rect().corner(0).x) + textOffset - theme()->textBoxPadding().topLeft.x; for (size_t i = 1; i < m_userValue.size(); ++i) { float newPos = style.font->bounds(m_userValue.substr(0, i), style.size).x; if (newPos > clickPos) { //subtracting one places the cursor before a clicked letter, as is normal m_cursorPos = (int)i - 1; break; } if (i == m_userValue.size() - 1) { //if the cursor pos is not otherwise set, put it at the end m_cursorPos = (int)m_userValue.size(); } } } break; case GEventType::GUI_KEY_FOCUS: if ((event.gui.control == this) && (m_gui->keyFocusGuiControl != this) && m_editing) { // This box just lost focus commit(); m_editing = false; if (m_update == DELAYED_UPDATE) { GEvent response; response.gui.type = GEventType::GUI_CHANGE; response.gui.control = m_eventSource; m_gui->fireEvent(response); } } break; case GEventType::KEY_DOWN: case GEventType::KEY_REPEAT: switch (event.key.keysym.sym) { case GKey::ESCAPE: // Stop editing and revert m_editing = false; { GEvent response; response.gui.type = GEventType::GUI_CANCEL; response.gui.control = m_eventSource; m_gui->fireEvent(response); } setFocused(false); return true; case GKey::RIGHT: case GKey::LEFT: case GKey::DELETE: case GKey::BACKSPACE: case GKey::HOME: case GKey::END: setRepeatKeysym(event.key.keysym); processRepeatKeysym(); debugAssert(m_cursorPos <= (int)m_userValue.size()); return true; case GKey::RETURN: case GKey::TAB: // Edit done, commit. setFocused(false); if (event.key.keysym.sym == GKey::RETURN) { commit(); GEvent response; response.gui.type = GEventType::GUI_ACTION; response.gui.control = m_eventSource; m_gui->fireEvent(response); } return true; default: if ((((event.key.keysym.mod & GKeyMod::CTRL) != 0) && ((event.key.keysym.sym == 'v') || (event.key.keysym.sym == 'y'))) || (((event.key.keysym.mod & GKeyMod::SHIFT) != 0) && (event.key.keysym.sym == GKey::INSERT))) { // Paste (not autorepeatable) m_userValue = OSWindow::clipboardText(); return true; } else if (((event.key.keysym.mod & GKeyMod::CTRL) != 0) && (event.key.keysym.sym == 'k')) { debugAssert(m_cursorPos <= (int)m_userValue.size()); // Cut (not autorepeatable) const String& cut = m_userValue.substr(m_cursorPos); m_userValue = m_userValue.substr(0, m_cursorPos); OSWindow::setClipboardText(cut); return true; } else if ((event.key.keysym.sym >= GKey::SPACE) && (event.key.keysym.sym <= 'z')) { // Suppress this event. Actually handle the key press on the CHAR_INPUT event return true; } else { // This key wasn't processed by the console return false; } } break; case GEventType::KEY_UP: if (event.key.keysym.sym == m_repeatKeysym.sym) { unsetRepeatKeysym(); return true; } break; case GEventType::CHAR_INPUT: if (event.character.unicode > 31) { // Insert character char c = event.character.unicode & 0xFF; m_userValue = m_userValue.substr(0, m_cursorPos) + c + ((m_cursorPos < (int)m_userValue.size()) ? m_userValue.substr(m_cursorPos, String::npos) : String()); ++m_cursorPos; if (m_editing && (m_update == IMMEDIATE_UPDATE)) { m_oldValue = m_userValue; commit(); GEvent response; response.gui.type = GEventType::GUI_CHANGE; response.gui.control = m_eventSource; m_gui->fireEvent(response); } } break; } return false; }
void HierarchyPanel::listGameObjects(int* indent, int* y, int* total, GameObject* gameObject) { Rect rect; Rect expandRect; bool display = false; //*total = *y; *total = *total + 1; rect.x = position.x + (10 * *indent); rect.height = ITEM_HEIGHT; rect.y = position.y + rect.height + (*y * rect.height) + ITEM_HEIGHT; rect.width = position.width; if(totalDisplay >= maxDisplay) { rect.width -= 20; } expandRect = Rect(rect.x, rect.y, expandTexture->getWidth(), expandTexture->getHeight()); if(*y <= maxDisplay && *y >= 0) { display = true; } if(display == true) { Rect labelRect(rect.x + expandTexture->getWidth(), rect.y, rect.width - ((position.x + rect.x) - position.x + expandTexture->getWidth()), rect.height); Rect clickRect(position.x, rect.y, rect.width, rect.height); if(selectedGo != NULL && gameObject->getName() == selectedGo->getName()) { Gui::drawTexture(Rect(position.x, rect.y, rect.width, rect.height), selectedTexture.get()); } Gui::label(labelRect, gameObject->getName()); if(Input::getMouseButtonDown(0) == true) { if(clickRect.contains(Input::getMousePosition()) == true && expandRect.contains(Input::getMousePosition()) == false) { selectedGo = gameObject; } } } *y = *y + 1; if(display == true) { if(gameObject->getTransform()->getChildCount() > 0) { if(gameObject->getTag() != "expanded") { Gui::drawTexture(expandRect, expandTexture); } else { GuiUtility::rotateAroundPivot(90, Vector2(rect.x + (expandTexture->getWidth() / 2), rect.y + (expandTexture->getHeight() / 2))); Gui::drawTexture(expandRect, expandTexture); GuiUtility::rotateAroundPivot(-90, Vector2(rect.x + (expandTexture->getWidth() / 2), rect.y + (expandTexture->getHeight() / 2))); } } if(Input::getMouseButtonDown(0) == true) { if(expandRect.contains(Input::getMousePosition()) == true) { if(gameObject->getTag() != "expanded") gameObject->setTag("expanded"); else if(gameObject->getTag() == "expanded") gameObject->setTag(""); } } } if(gameObject->getTag() != "expanded") { return; } *indent = *indent + 1; for(int i = 0; i < gameObject->getTransform()->getChildCount(); i++) { listGameObjects(indent, y, total, gameObject->getTransform()->getChild(i)->getGameObject()); } *indent = *indent - 1; }