From d32d2c9b6555201aeda94e657357803f2f9a9a70 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 22 Apr 2012 17:48:18 +0300 Subject: Improve keyboard handling in character selection dialog. --- src/gui/charselectdialog.cpp | 156 +++++++++++++++++++++++++++++++++++++++++-- src/gui/charselectdialog.h | 7 +- 2 files changed, 157 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/gui/charselectdialog.cpp b/src/gui/charselectdialog.cpp index a148376fb..f924cd259 100644 --- a/src/gui/charselectdialog.cpp +++ b/src/gui/charselectdialog.cpp @@ -59,6 +59,7 @@ #include "utils/gettext.h" #include "utils/stringutils.h" +#include #include #include @@ -110,6 +111,18 @@ class CharacterDisplay : public Container void setActive(bool active); + bool isSelectFocused() + { return mButton->isFocused(); } + + bool isDeleteFocused() + { return mDelete->isFocused(); } + + void focusSelect() + { mFocusHandler->requestFocus(mButton); } + + void focusDelete() + { mFocusHandler->requestFocus(mDelete); } + private: void update(); @@ -263,11 +276,144 @@ void CharSelectDialog::action(const gcn::ActionEvent &event) void CharSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) { - if (static_cast(&keyEvent)->getActionId() - == Input::KEY_GUI_CANCEL) + int actionId = static_cast(&keyEvent)->getActionId(); + switch (actionId) { - action(gcn::ActionEvent(mSwitchLoginButton, - mSwitchLoginButton->getActionEventId())); + case Input::KEY_GUI_CANCEL: + keyEvent.consume(); + action(gcn::ActionEvent(mSwitchLoginButton, + mSwitchLoginButton->getActionEventId())); + break; + + case Input::KEY_GUI_RIGHT: + { + keyEvent.consume(); + int idx; + int idx2; + if (getFocusedContainer(idx, idx2)) + { + idx ++; + if (idx == SLOTS_PER_ROW) + break; + setFocusedContainer(idx, idx2); + } + break; + } + + case Input::KEY_GUI_LEFT: + { + keyEvent.consume(); + int idx; + int idx2; + if (getFocusedContainer(idx, idx2)) + { + if (!idx || idx == SLOTS_PER_ROW) + break; + idx --; + setFocusedContainer(idx, idx2); + } + break; + } + + case Input::KEY_GUI_UP: + { + keyEvent.consume(); + int idx; + int idx2; + if (getFocusedContainer(idx, idx2)) + { + if (idx < SLOTS_PER_ROW && !idx2) + break; + if (idx2 > 0) + { + idx2 = 0; + } + else + { + idx -= SLOTS_PER_ROW; + if (mCharacterEntries[idx]->getCharacter()) + idx2 = 1; + else + idx2 = 0; + } + setFocusedContainer(idx, idx2); + } + break; + } + + case Input::KEY_GUI_DOWN: + { + keyEvent.consume(); + int idx; + int idx2; + if (getFocusedContainer(idx, idx2)) + { + if (idx >= SLOTS_PER_ROW && idx2) + break; + if (idx2 > 0) + { + idx += SLOTS_PER_ROW; + idx2 = 0; + } + else + { + if (mCharacterEntries[idx]->getCharacter()) + idx2 = 1; + else + idx += SLOTS_PER_ROW; + } + setFocusedContainer(idx, idx2); + } + break; + } + + case Input::KEY_GUI_DELETE: + { + keyEvent.consume(); + int idx; + int idx2; + if (getFocusedContainer(idx, idx2) + && mCharacterEntries[idx]->getCharacter()) + { + new CharDeleteConfirm(this, idx); + } + break; + } + + default: + break; + } +} + +bool CharSelectDialog::getFocusedContainer(int &container, int &idx) +{ + for (int f = 0; f < static_cast(mLoginData->characterSlots); f ++) + { + if (mCharacterEntries[f]->isSelectFocused()) + { + container = f; + idx = 0; + return true; + } + else if (mCharacterEntries[f]->isDeleteFocused()) + { + container = f; + idx = 1; + return true; + } + } + return false; +} + +void CharSelectDialog::setFocusedContainer(int i, int button) +{ + if (i >= 0 && i < static_cast(mLoginData->characterSlots)) + { + CharacterDisplay *container = mCharacterEntries[i]; + if (button) + container->focusDelete(); + else + container->focusSelect(); } } @@ -387,7 +533,7 @@ bool CharSelectDialog::selectByName(const std::string &name, Net::Character *character = mCharacterEntries[i]->getCharacter(); if (mCharacterEntries[i] && character) { - if ( character->dummy && character->dummy->getName() == name) + if (character->dummy && character->dummy->getName() == name) { if (mCharacterEntries[i]) mCharacterEntries[i]->requestFocus(); diff --git a/src/gui/charselectdialog.h b/src/gui/charselectdialog.h index 1e32fb311..fe65f3ce1 100644 --- a/src/gui/charselectdialog.h +++ b/src/gui/charselectdialog.h @@ -50,7 +50,8 @@ namespace Net * * \ingroup Interface */ -class CharSelectDialog : public Window, public gcn::ActionListener, +class CharSelectDialog : public Window, + public gcn::ActionListener, public gcn::KeyListener { public: @@ -97,6 +98,10 @@ class CharSelectDialog : public Window, public gcn::ActionListener, void unlock(); void setLocked(bool locked); + bool getFocusedContainer(int &container, int &idx); + + void setFocusedContainer(int i, int button); + bool mLocked; gcn::Label *mAccountNameLabel; -- cgit v1.2.3-60-g2f50