コード例 #1
0
ファイル: GuiTextBox.cpp プロジェクト: elfprince13/G3D10
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;
}
コード例 #2
0
ファイル: HierarchyPanel.cpp プロジェクト: ConnorRB96/mutiny
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;
}