summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2009-12-06 13:01:16 -0700
committerJared Adams <jaxad0127@gmail.com>2009-12-06 13:01:16 -0700
commitfc48c24c6d366e165cbcfbd022d9421790089890 (patch)
treeed264bca67ac2380f787765980ba1897ab43a93a /src
parentc0e6ef1dd4941d689ea723542c4218179d688c7f (diff)
downloadmana-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.cpp13
-rw-r--r--src/gui/charselectdialog.h6
-rw-r--r--src/gui/login.cpp18
-rw-r--r--src/gui/serverdialog.cpp18
-rw-r--r--src/gui/serverdialog.h4
-rw-r--r--src/gui/updatewindow.cpp27
-rw-r--r--src/gui/updatewindow.h6
-rw-r--r--src/gui/worldselectdialog.cpp18
-rw-r--r--src/gui/worldselectdialog.h6
-rw-r--r--src/main.cpp14
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;