void OsuScreenBackable::onKeyDown(KeyboardEvent &e) { OsuScreen::onKeyDown(e); if (!m_bVisible || e.isConsumed()) return; if (e == KEY_ESCAPE || e == (KEYCODE)OsuKeyBindings::GAME_PAUSE.getInt()) onBack(); e.consume(); }
void OsuPauseMenu::onKeyDown(KeyboardEvent &e) { OsuScreen::onKeyDown(e); // only used for options menu if (!m_bVisible || e.isConsumed()) return; if (e == (KEYCODE)OsuKeyBindings::LEFT_CLICK.getInt() || e == (KEYCODE)OsuKeyBindings::RIGHT_CLICK.getInt()) { bool fireButtonClick = false; if (e == (KEYCODE)OsuKeyBindings::LEFT_CLICK.getInt() && !m_bClick1Down) { m_bClick1Down = true; fireButtonClick = true; } if (e == (KEYCODE)OsuKeyBindings::RIGHT_CLICK.getInt() && !m_bClick2Down) { m_bClick2Down = true; fireButtonClick = true; } if (fireButtonClick) { for (int i=0; i<m_buttons.size(); i++) { if (m_buttons[i]->isMouseInside()) { m_buttons[i]->click(); break; } } } } // handle arrow keys selection if (m_buttons.size() > 0) { if (!engine->getKeyboard()->isAltDown() && e == KEY_DOWN) { OsuUIPauseMenuButton *nextSelectedButton = m_buttons[0]; // get first visible button for (int i=0; i<m_buttons.size(); i++) { if (!m_buttons[i]->isVisible()) continue; nextSelectedButton = m_buttons[i]; break; } // next selection logic bool next = false; for (int i=0; i<m_buttons.size(); i++) { if (!m_buttons[i]->isVisible()) continue; if (next) { nextSelectedButton = m_buttons[i]; break; } if (m_selectedButton == m_buttons[i]) next = true; } m_selectedButton = nextSelectedButton; onSelectionChange(); } if (!engine->getKeyboard()->isAltDown() && e == KEY_UP) { OsuUIPauseMenuButton *nextSelectedButton = m_buttons[m_buttons.size()-1]; // get first visible button for (int i=m_buttons.size()-1; i>=0; i--) { if (!m_buttons[i]->isVisible()) continue; nextSelectedButton = m_buttons[i]; break; } // next selection logic bool next = false; for (int i=m_buttons.size()-1; i>=0; i--) { if (!m_buttons[i]->isVisible()) continue; if (next) { nextSelectedButton = m_buttons[i]; break; } if (m_selectedButton == m_buttons[i]) next = true; } m_selectedButton = nextSelectedButton; onSelectionChange(); } if (m_selectedButton != NULL && e == KEY_ENTER) m_selectedButton->click(); } // consume ALL events, except for a few special binds which are allowed through (e.g. for unpause or changing the local offset in Osu.cpp) if (e != KEY_ESCAPE && e != (KEYCODE)OsuKeyBindings::GAME_PAUSE.getInt() && e != (KEYCODE)OsuKeyBindings::INCREASE_LOCAL_OFFSET.getInt() && e != (KEYCODE)OsuKeyBindings::DECREASE_LOCAL_OFFSET.getInt()) e.consume(); }