diff options
author | Jared Adams <jaxad0127@gmail.com> | 2009-12-06 13:01:16 -0700 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2009-12-06 13:01:16 -0700 |
commit | fc48c24c6d366e165cbcfbd022d9421790089890 (patch) | |
tree | ed264bca67ac2380f787765980ba1897ab43a93a /src | |
parent | c0e6ef1dd4941d689ea723542c4218179d688c7f (diff) | |
download | mana-fc48c24c6d366e165cbcfbd022d9421790089890.tar.gz mana-fc48c24c6d366e165cbcfbd022d9421790089890.tar.bz2 mana-fc48c24c6d366e165cbcfbd022d9421790089890.tar.xz mana-fc48c24c6d366e165cbcfbd022d9421790089890.zip |
Improve keyboard accessibility of login sequence
Enter and Escape now move forward and backwards for all dialogs except ServerSelectDialog (Escape quits) and CharSelectDialog (Enter doesn't do anything special).
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/charselectdialog.cpp | 13 | ||||
-rw-r--r-- | src/gui/charselectdialog.h | 6 | ||||
-rw-r--r-- | src/gui/login.cpp | 18 | ||||
-rw-r--r-- | src/gui/serverdialog.cpp | 18 | ||||
-rw-r--r-- | src/gui/serverdialog.h | 4 | ||||
-rw-r--r-- | src/gui/updatewindow.cpp | 27 | ||||
-rw-r--r-- | src/gui/updatewindow.h | 6 | ||||
-rw-r--r-- | src/gui/worldselectdialog.cpp | 18 | ||||
-rw-r--r-- | src/gui/worldselectdialog.h | 6 | ||||
-rw-r--r-- | src/main.cpp | 14 |
10 files changed, 118 insertions, 12 deletions
diff --git a/src/gui/charselectdialog.cpp b/src/gui/charselectdialog.cpp index 43537ca3..4f3619ae 100644 --- a/src/gui/charselectdialog.cpp +++ b/src/gui/charselectdialog.cpp @@ -34,6 +34,7 @@ #include "gui/confirmdialog.h" #include "gui/okdialog.h" #include "gui/playerbox.h" +#include "gui/sdlinput.h" #include "gui/unregisterdialog.h" #include "game.h" @@ -162,6 +163,8 @@ CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo, reflowLayout(); + addKeyListener(this); + center(); mCharEntries[0]->requestFocus(); setVisible(true); @@ -217,6 +220,16 @@ void CharSelectDialog::action(const gcn::ActionEvent &event) } } +void CharSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) +{ + gcn::Key key = keyEvent.getKey(); + + if (key.getValue() == Key::ESCAPE) + { + action(gcn::ActionEvent(NULL, mSwitchLoginButton->getActionEventId())); + } +} + void CharSelectDialog::attemptCharDelete() { mCharHandler->deleteCharacter(mCharInfo->getPos(), mCharInfo->getEntry()); diff --git a/src/gui/charselectdialog.h b/src/gui/charselectdialog.h index 44917d6c..507b0d9f 100644 --- a/src/gui/charselectdialog.h +++ b/src/gui/charselectdialog.h @@ -30,6 +30,7 @@ #include "player.h" #include <guichan/actionlistener.hpp> +#include <guichan/keylistener.hpp> class CharEntry; class LocalPlayer; @@ -45,7 +46,8 @@ class CharHandler; * * \ingroup Interface */ -class CharSelectDialog : public Window, public gcn::ActionListener +class CharSelectDialog : public Window, public gcn::ActionListener, + public gcn::KeyListener { public: friend class CharDeleteConfirm; @@ -58,6 +60,8 @@ class CharSelectDialog : public Window, public gcn::ActionListener void action(const gcn::ActionEvent &event); + void keyPressed(gcn::KeyEvent &keyEvent); + bool selectByName(const std::string &name); void chooseSelected(); diff --git a/src/gui/login.cpp b/src/gui/login.cpp index aa14b00e..396c5d1a 100644 --- a/src/gui/login.cpp +++ b/src/gui/login.cpp @@ -22,6 +22,7 @@ #include "gui/login.h" #include "gui/okdialog.h" +#include "gui/sdlinput.h" #include "gui/widgets/button.h" #include "gui/widgets/checkbox.h" @@ -77,6 +78,8 @@ LoginDialog::LoginDialog(LoginData *loginData): place(3, 6, mLoginButton); reflowLayout(250, 0); + addKeyListener(this); + center(); setVisible(true); @@ -121,7 +124,20 @@ void LoginDialog::action(const gcn::ActionEvent &event) void LoginDialog::keyPressed(gcn::KeyEvent &keyEvent) { - mLoginButton->setEnabled(canSubmit()); + gcn::Key key = keyEvent.getKey(); + + if (key.getValue() == Key::ESCAPE) + { + action(gcn::ActionEvent(NULL, mServerButton->getActionEventId())); + } + else if (key.getValue() == Key::ENTER) + { + action(gcn::ActionEvent(NULL, mLoginButton->getActionEventId())); + } + else + { + mLoginButton->setEnabled(canSubmit()); + } } bool LoginDialog::canSubmit() diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp index 39c2792f..32e714c6 100644 --- a/src/gui/serverdialog.cpp +++ b/src/gui/serverdialog.cpp @@ -22,6 +22,7 @@ #include "gui/serverdialog.h" #include "gui/okdialog.h" +#include "gui/sdlinput.h" #include "gui/widgets/button.h" #include "gui/widgets/label.h" @@ -149,9 +150,10 @@ ServerDialog::ServerDialog(ServerInfo *serverInfo, const std::string &dir): // Make sure the list has enough height getLayout().setRowHeight(3, 80); - reflowLayout(300, 0); + addKeyListener(this); + center(); setFieldsReadOnly(true); setVisible(true); @@ -248,6 +250,20 @@ void ServerDialog::action(const gcn::ActionEvent &event) } } +void ServerDialog::keyPressed(gcn::KeyEvent &keyEvent) +{ + gcn::Key key = keyEvent.getKey(); + + if (key.getValue() == Key::ESCAPE) + { + state = STATE_EXIT; + } + else if (key.getValue() == Key::ENTER) + { + action(gcn::ActionEvent(NULL, mConnectButton->getActionEventId())); + } +} + void ServerDialog::valueChanged(const gcn::SelectionEvent &event) { const int index = mServersList->getSelected(); diff --git a/src/gui/serverdialog.h b/src/gui/serverdialog.h index 943d69c9..d82e2613 100644 --- a/src/gui/serverdialog.h +++ b/src/gui/serverdialog.h @@ -30,6 +30,7 @@ #include "utils/mutex.h" #include <guichan/actionlistener.hpp> +#include <guichan/keylistener.hpp> #include <guichan/listmodel.hpp> #include <guichan/selectionlistener.hpp> @@ -78,6 +79,7 @@ class ServersListModel : public gcn::ListModel */ class ServerDialog : public Window, public gcn::ActionListener, + public gcn::KeyListener, public gcn::SelectionListener { public: @@ -98,6 +100,8 @@ class ServerDialog : public Window, */ void action(const gcn::ActionEvent &event); + void keyPressed(gcn::KeyEvent &keyEvent); + /** * Called when the selected value changed in the servers list box. */ diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index 801bd161..afb87430 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -28,6 +28,8 @@ #include "gui/widgets/progressbar.h" #include "gui/widgets/scrollarea.h" +#include "gui/sdlinput.h" + #include "configuration.h" #include "log.h" #include "main.h" @@ -105,6 +107,8 @@ UpdaterWindow::UpdaterWindow(const std::string &updateHost, Layout &layout = getLayout(); layout.setRowHeight(0, Layout::AUTO_SET); + addKeyListener(this); + center(); setVisible(true); mCancelButton->requestFocus(); @@ -162,6 +166,29 @@ void UpdaterWindow::action(const gcn::ActionEvent &event) } } +void UpdaterWindow::keyPressed(gcn::KeyEvent &keyEvent) +{ + gcn::Key key = keyEvent.getKey(); + + if (key.getValue() == Key::ESCAPE) + { + action(gcn::ActionEvent(NULL, mCancelButton->getActionEventId())); + state = STATE_WORLD_SELECT; + } + else if (key.getValue() == Key::ENTER) + { + if (mDownloadStatus == UPDATE_COMPLETE || + mDownloadStatus == UPDATE_ERROR) + { + action(gcn::ActionEvent(NULL, mPlayButton->getActionEventId())); + } + else + { + action(gcn::ActionEvent(NULL, mCancelButton->getActionEventId())); + } + } +} + void UpdaterWindow::loadNews() { if (!mMemoryBuffer) diff --git a/src/gui/updatewindow.h b/src/gui/updatewindow.h index 6e738fca..8388b722 100644 --- a/src/gui/updatewindow.h +++ b/src/gui/updatewindow.h @@ -29,6 +29,7 @@ #include "utils/mutex.h" #include <guichan/actionlistener.hpp> +#include <guichan/keylistener.hpp> #include <string> #include <vector> @@ -43,7 +44,8 @@ class ScrollArea; * * \ingroup GUI */ -class UpdaterWindow : public Window, public gcn::ActionListener +class UpdaterWindow : public Window, public gcn::ActionListener, + public gcn::KeyListener { public: /** @@ -84,6 +86,8 @@ class UpdaterWindow : public Window, public gcn::ActionListener void action(const gcn::ActionEvent &event); + void keyPressed(gcn::KeyEvent &keyEvent); + void logic(); int updateState; diff --git a/src/gui/worldselectdialog.cpp b/src/gui/worldselectdialog.cpp index aef98078..0a616f25 100644 --- a/src/gui/worldselectdialog.cpp +++ b/src/gui/worldselectdialog.cpp @@ -26,6 +26,8 @@ #include "gui/widgets/listbox.h" #include "gui/widgets/scrollarea.h" +#include "gui/sdlinput.h" + #include "net/logindata.h" #include "net/loginhandler.h" #include "net/net.h" @@ -92,6 +94,8 @@ WorldSelectDialog::WorldSelectDialog(Worlds worlds): // Select first server mWorldList->setSelected(0); + addKeyListener(this); + center(); setVisible(true); mChooseWorld->requestFocus(); @@ -119,3 +123,17 @@ void WorldSelectDialog::action(const gcn::ActionEvent &event) state = STATE_LOGIN; } } + +void WorldSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) +{ + gcn::Key key = keyEvent.getKey(); + + if (key.getValue() == Key::ESCAPE) + { + action(gcn::ActionEvent(NULL, mChangeLoginButton->getActionEventId())); + } + else if (key.getValue() == Key::ENTER) + { + action(gcn::ActionEvent(NULL, mChooseWorld->getActionEventId())); + } +} diff --git a/src/gui/worldselectdialog.h b/src/gui/worldselectdialog.h index 0b93e62e..acd00898 100644 --- a/src/gui/worldselectdialog.h +++ b/src/gui/worldselectdialog.h @@ -27,6 +27,7 @@ #include "net/worldinfo.h" #include <guichan/actionlistener.hpp> +#include <guichan/keylistener.hpp> #include <guichan/listmodel.hpp> #include <vector> @@ -38,7 +39,8 @@ class WorldListModel; * * \ingroup Interface */ -class WorldSelectDialog : public Window, public gcn::ActionListener { +class WorldSelectDialog : public Window, public gcn::ActionListener, + public gcn::KeyListener { public: /** * Constructor @@ -57,6 +59,8 @@ class WorldSelectDialog : public Window, public gcn::ActionListener { */ void action(const gcn::ActionEvent &event); + void keyPressed(gcn::KeyEvent &keyEvent); + private: WorldListModel *mWorldListModel; gcn::ListBox *mWorldList; diff --git a/src/main.cpp b/src/main.cpp index 5308304f..73752c9e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -835,13 +835,6 @@ int main(int argc, char *argv[]) break; case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) - { - if (!quitDialog) - quitDialog = new QuitDialog(&quitDialog); - else - quitDialog->requestMoveToTop(); - } break; } @@ -881,6 +874,13 @@ int main(int argc, char *argv[]) Net::getCharHandler()->setCharInfo(&charInfo); state = STATE_LOGIN; } + else if (state == STATE_WORLD_SELECT && oldstate == STATE_UPDATE) + { + if (Net::getLoginHandler()->getWorlds().size() < 2) + { + state = STATE_LOGIN; + } + } else if (oldstate == STATE_START || oldstate == STATE_GAME) { desktop = new Desktop; |