00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "gui/setup_keyboard.h"
00024
00025 #include "gui/ok_dialog.h"
00026
00027 #include "gui/widgets/button.h"
00028 #include "gui/widgets/layouthelper.h"
00029 #include "gui/widgets/listbox.h"
00030 #include "gui/widgets/scrollarea.h"
00031
00032 #include "keyboardconfig.h"
00033
00034 #include "utils/gettext.h"
00035 #include "utils/stringutils.h"
00036
00037 #include <SDL_keyboard.h>
00038
00039 #include <guichan/listmodel.hpp>
00040
00046 class KeyListModel : public gcn::ListModel
00047 {
00048 public:
00052 int getNumberOfElements() { return keyboard.KEY_TOTAL; }
00053
00057 std::string getElementAt(int i) { return mKeyFunctions[i]; }
00058
00062 void setElementAt(int i, const std::string &caption)
00063 {
00064 mKeyFunctions[i] = caption;
00065 }
00066
00067 private:
00068 std::string mKeyFunctions[KeyboardConfig::KEY_TOTAL];
00069 };
00070
00071 Setup_Keyboard::Setup_Keyboard():
00072 mKeyListModel(new KeyListModel),
00073 mKeyList(new ListBox(mKeyListModel)),
00074 mKeySetting(false)
00075 {
00076 keyboard.setSetupKeyboard(this);
00077 setName(_("Keyboard"));
00078
00079 refreshKeys();
00080
00081 mKeyList->addActionListener(this);
00082
00083 ScrollArea *scrollArea = new ScrollArea(mKeyList);
00084 scrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
00085
00086 mAssignKeyButton = new Button(_("Assign"), "assign", this);
00087 mAssignKeyButton->addActionListener(this);
00088 mAssignKeyButton->setEnabled(false);
00089
00090 mMakeDefaultButton = new Button(_("Default"), "makeDefault", this);
00091 mMakeDefaultButton->addActionListener(this);
00092
00093
00094 LayoutHelper h(this);
00095 ContainerPlacer place = h.getPlacer(0, 0);
00096
00097 place(0, 0, scrollArea, 4, 6).setPadding(2);
00098 place(0, 6, mMakeDefaultButton);
00099 place(3, 6, mAssignKeyButton);
00100
00101 setDimension(gcn::Rectangle(0, 0, 325, 280));
00102 }
00103
00104 Setup_Keyboard::~Setup_Keyboard()
00105 {
00106 delete mKeyList;
00107 delete mKeyListModel;
00108
00109 delete mAssignKeyButton;
00110 delete mMakeDefaultButton;
00111 }
00112
00113 void Setup_Keyboard::apply()
00114 {
00115 keyUnresolved();
00116
00117 if (keyboard.hasConflicts())
00118 {
00119 new OkDialog(_("Key Conflict(s) Detected."),
00120 _("Resolve them, or gameplay may result in strange "
00121 "behaviour."));
00122 }
00123 keyboard.setEnabled(true);
00124 keyboard.store();
00125 }
00126
00127 void Setup_Keyboard::cancel()
00128 {
00129 keyUnresolved();
00130
00131 keyboard.retrieve();
00132 keyboard.setEnabled(true);
00133
00134 refreshKeys();
00135 }
00136
00137 void Setup_Keyboard::action(const gcn::ActionEvent &event)
00138 {
00139 if (event.getSource() == mKeyList)
00140 {
00141 if (!mKeySetting)
00142 mAssignKeyButton->setEnabled(true);
00143 }
00144 else if (event.getId() == "assign")
00145 {
00146 mKeySetting = true;
00147 mAssignKeyButton->setEnabled(false);
00148 keyboard.setEnabled(false);
00149 int i(mKeyList->getSelected());
00150 keyboard.setNewKeyIndex(i);
00151 mKeyListModel->setElementAt(i, keyboard.getKeyCaption(i) + ": ?");
00152 }
00153 else if (event.getId() == "makeDefault")
00154 {
00155 keyboard.makeDefault();
00156 refreshKeys();
00157 }
00158 }
00159
00160 void Setup_Keyboard::refreshAssignedKey(int index)
00161 {
00162 std::string caption;
00163 char *temp = SDL_GetKeyName(
00164 (SDLKey) keyboard.getKeyValue(index));
00165 caption = keyboard.getKeyCaption(index) + ": " + toString(temp);
00166 mKeyListModel->setElementAt(index, caption);
00167 }
00168
00169 void Setup_Keyboard::newKeyCallback(int index)
00170 {
00171 mKeySetting = false;
00172 refreshAssignedKey(index);
00173 mAssignKeyButton->setEnabled(true);
00174 }
00175
00176 void Setup_Keyboard::refreshKeys()
00177 {
00178 for (int i = 0; i < keyboard.KEY_TOTAL; i++)
00179 {
00180 refreshAssignedKey(i);
00181 }
00182 }
00183
00184 void Setup_Keyboard::keyUnresolved()
00185 {
00186 if (mKeySetting)
00187 {
00188 newKeyCallback(keyboard.getNewKeyIndex());
00189 keyboard.setNewKeyIndex(keyboard.KEY_NO_VALUE);
00190 }
00191 }