From 4193299e2e05d40477a50e5cb0fcc906227f53a2 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sun, 15 Apr 2012 18:01:03 +0300
Subject: Split input settings tab to categories.

---
 src/gui/inventorywindow.cpp  |   2 +-
 src/gui/setup_input.cpp      | 777 ++++-------------------------------
 src/gui/setup_input.h        |   6 +
 src/gui/setupactiondata.h    | 951 +++++++++++++++++++++++++++++++++++++++++++
 src/gui/widgets/tabstrip.cpp |   5 +
 src/gui/widgets/tabstrip.h   |   4 +-
 6 files changed, 1051 insertions(+), 694 deletions(-)
 create mode 100644 src/gui/setupactiondata.h

(limited to 'src')

diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp
index d6fb95fe7..425130b57 100644
--- a/src/gui/inventorywindow.cpp
+++ b/src/gui/inventorywindow.cpp
@@ -139,7 +139,7 @@ InventoryWindow::InventoryWindow(Inventory *inventory):
     mSlotsBar = new ProgressBar(0.0f, 100, 20, Theme::PROG_INVY_SLOTS);
 
     int size = config.getIntValue("fontSize");
-    mFilter = new TabStrip("filter_" + getWindowName(), size + 8, 0);
+    mFilter = new TabStrip("filter_" + getWindowName(), size + 8);
     mFilter->addActionListener(this);
     mFilter->setActionEventId("tag_");
 
diff --git a/src/gui/setup_input.cpp b/src/gui/setup_input.cpp
index 35badbe9c..a85a35975 100644
--- a/src/gui/setup_input.cpp
+++ b/src/gui/setup_input.cpp
@@ -23,15 +23,19 @@
 
 #include "gui/setup_input.h"
 
+#include "configuration.h"
 #include "inputmanager.h"
 #include "keyboardconfig.h"
+#include "logger.h"
 
 #include "gui/okdialog.h"
+#include "gui/setupactiondata.h"
 
 #include "gui/widgets/button.h"
 #include "gui/widgets/layouthelper.h"
 #include "gui/widgets/listbox.h"
 #include "gui/widgets/scrollarea.h"
+#include "gui/widgets/tabstrip.h"
 
 #include "utils/gettext.h"
 #include "utils/stringutils.h"
@@ -42,677 +46,6 @@
 
 #include "debug.h"
 
-struct SetupActionData
-{
-    std::string name;
-    int actionId;
-};
-
-static SetupActionData const setupActionData[] =
-{
-    {
-        N_("Basic Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Move Up"),
-        Input::KEY_MOVE_UP
-    },
-    {
-        N_("Move Down"),
-        Input::KEY_MOVE_DOWN
-    },
-    {
-        N_("Move Left"),
-        Input::KEY_MOVE_LEFT
-    },
-    {
-        N_("Move Right"),
-        Input::KEY_MOVE_RIGHT
-    },
-    {
-        N_("Attack"),
-        Input::KEY_ATTACK
-    },
-    {
-        N_("Target & Attack"),
-        Input::KEY_TARGET_ATTACK
-    },
-    {
-        N_("Move to Target"),
-        Input::KEY_MOVE_TO_TARGET
-    },
-    {
-        N_("Change Move to Target type"),
-        Input::KEY_CHANGE_MOVE_TO_TARGET
-    },
-    {
-        N_("Move to Home location"),
-        Input::KEY_MOVE_TO_HOME
-    },
-    {
-        N_("Set home location"),
-        Input::KEY_SET_HOME
-    },
-    {
-        N_("Move to navigation point"),
-        Input::KEY_MOVE_TO_POINT
-    },
-    {
-        N_("Talk"),
-        Input::KEY_TALK
-    },
-    {
-        N_("Stop Attack"),
-        Input::KEY_STOP_ATTACK
-    },
-    {
-        N_("Untarget"),
-        Input::KEY_UNTARGET
-    },
-    {
-        N_("Target monster"),
-        Input::KEY_TARGET_MONSTER
-    },
-    {
-        N_("Target NPC"),
-        Input::KEY_TARGET_NPC
-    },
-    {
-        N_("Target Player"),
-        Input::KEY_TARGET_PLAYER
-    },
-    {
-        N_("Pickup"),
-        Input::KEY_PICKUP
-    },
-    {
-        N_("Change Pickup Type"),
-        Input::KEY_CHANGE_PICKUP_TYPE
-    },
-    {
-        N_("Hide Windows"),
-        Input::KEY_HIDE_WINDOWS
-    },
-    {
-        N_("Sit"),
-        Input::KEY_SIT
-    },
-    {
-        N_("Screenshot"),
-        Input::KEY_SCREENSHOT
-    },
-    {
-        N_("Enable/Disable Trading"),
-        Input::KEY_TRADE
-    },
-    {
-        N_("Change Map View Mode"),
-        Input::KEY_PATHFIND
-    },
-    {
-        N_("Select OK"),
-        Input::KEY_OK
-    },
-    {
-        N_("Quit"),
-        Input::KEY_QUIT
-    },
-    {
-        N_("Shortcuts Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Item Shortcuts Key"),
-        Input::KEY_SHORTCUTS_KEY
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 1),
-        Input::KEY_SHORTCUT_1
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 2),
-        Input::KEY_SHORTCUT_2
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 3),
-        Input::KEY_SHORTCUT_3
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 4),
-        Input::KEY_SHORTCUT_4
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 5),
-        Input::KEY_SHORTCUT_5
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 6),
-        Input::KEY_SHORTCUT_6
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 7),
-        Input::KEY_SHORTCUT_7
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 8),
-        Input::KEY_SHORTCUT_8
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 9),
-        Input::KEY_SHORTCUT_9
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 10),
-        Input::KEY_SHORTCUT_10
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 11),
-        Input::KEY_SHORTCUT_11
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 12),
-        Input::KEY_SHORTCUT_12
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 13),
-        Input::KEY_SHORTCUT_13
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 14),
-        Input::KEY_SHORTCUT_14
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 15),
-        Input::KEY_SHORTCUT_15
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 16),
-        Input::KEY_SHORTCUT_16
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 17),
-        Input::KEY_SHORTCUT_17
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 18),
-        Input::KEY_SHORTCUT_18
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 19),
-        Input::KEY_SHORTCUT_19
-    },
-    {
-        strprintf(N_("Item Shortcut %d"), 20),
-        Input::KEY_SHORTCUT_20
-    },
-    {
-        N_("Windows Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Help Window"),
-        Input::KEY_WINDOW_HELP
-    },
-    {
-        N_("Status Window"),
-        Input::KEY_WINDOW_STATUS
-    },
-    {
-        N_("Inventory Window"),
-        Input::KEY_WINDOW_INVENTORY
-    },
-    {
-        N_("Equipment Window"),
-        Input::KEY_WINDOW_EQUIPMENT
-    },
-    {
-        N_("Skill Window"),
-        Input::KEY_WINDOW_SKILL
-    },
-    {
-        N_("Minimap Window"),
-        Input::KEY_WINDOW_MINIMAP
-    },
-    {
-        N_("Chat Window"),
-        Input::KEY_WINDOW_CHAT
-    },
-    {
-        N_("Item Shortcut Window"),
-        Input::KEY_WINDOW_SHORTCUT
-    },
-    {
-        N_("Setup Window"),
-        Input::KEY_WINDOW_SETUP
-    },
-    {
-        N_("Debug Window"),
-        Input::KEY_WINDOW_DEBUG
-    },
-    {
-        N_("Social Window"),
-        Input::KEY_WINDOW_SOCIAL
-    },
-    {
-        N_("Emote Shortcut Window"),
-        Input::KEY_WINDOW_EMOTE_SHORTCUT
-    },
-    {
-        N_("Outfits Window"),
-        Input::KEY_WINDOW_OUTFIT
-    },
-    {
-        N_("Shop Window"),
-        Input::KEY_WINDOW_SHOP
-    },
-    {
-        N_("Quick drop Window"),
-        Input::KEY_WINDOW_DROP
-    },
-    {
-        N_("Kill Stats Window"),
-        Input::KEY_WINDOW_KILLS
-    },
-    {
-        N_("Commands Window"),
-        Input::KEY_WINDOW_SPELLS
-    },
-    {
-        N_("Bot Checker Window"),
-        Input::KEY_WINDOW_BOT_CHECKER
-    },
-    {
-        N_("Who Is Online Window"),
-        Input::KEY_WINDOW_ONLINE
-    },
-    {
-        N_("Did you know Window"),
-        Input::KEY_WINDOW_DIDYOUKNOW
-    },
-    {
-        N_("Previous Social Tab"),
-        Input::KEY_PREV_SOCIAL_TAB
-    },
-    {
-        N_("Next Social Tab"),
-        Input::KEY_NEXT_SOCIAL_TAB
-    },
-    {
-        N_("Emotes Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Smilie"),
-        Input::KEY_EMOTE
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 1),
-        Input::KEY_EMOTE_1
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 2),
-        Input::KEY_EMOTE_2
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 3),
-        Input::KEY_EMOTE_3
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 4),
-        Input::KEY_EMOTE_4
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 5),
-        Input::KEY_EMOTE_5
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 6),
-        Input::KEY_EMOTE_6
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 7),
-        Input::KEY_EMOTE_7
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 8),
-        Input::KEY_EMOTE_8
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 9),
-        Input::KEY_EMOTE_9
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 10),
-        Input::KEY_EMOTE_10
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 11),
-        Input::KEY_EMOTE_11
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 12),
-        Input::KEY_EMOTE_12
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 13),
-        Input::KEY_EMOTE_13
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 14),
-        Input::KEY_EMOTE_14
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 15),
-        Input::KEY_EMOTE_15
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 16),
-        Input::KEY_EMOTE_16
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 17),
-        Input::KEY_EMOTE_17
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 18),
-        Input::KEY_EMOTE_18
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 19),
-        Input::KEY_EMOTE_19
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 20),
-        Input::KEY_EMOTE_20
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 21),
-        Input::KEY_EMOTE_21
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 22),
-        Input::KEY_EMOTE_22
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 23),
-        Input::KEY_EMOTE_23
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 24),
-        Input::KEY_EMOTE_24
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 25),
-        Input::KEY_EMOTE_25
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 26),
-        Input::KEY_EMOTE_26
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 27),
-        Input::KEY_EMOTE_27
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 28),
-        Input::KEY_EMOTE_28
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 29),
-        Input::KEY_EMOTE_29
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 30),
-        Input::KEY_EMOTE_30
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 31),
-        Input::KEY_EMOTE_31
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 32),
-        Input::KEY_EMOTE_32
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 33),
-        Input::KEY_EMOTE_33
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 34),
-        Input::KEY_EMOTE_34
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 35),
-        Input::KEY_EMOTE_35
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 36),
-        Input::KEY_EMOTE_36
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 37),
-        Input::KEY_EMOTE_37
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 38),
-        Input::KEY_EMOTE_38
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 39),
-        Input::KEY_EMOTE_39
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 40),
-        Input::KEY_EMOTE_40
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 41),
-        Input::KEY_EMOTE_41
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 42),
-        Input::KEY_EMOTE_42
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 43),
-        Input::KEY_EMOTE_43
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 44),
-        Input::KEY_EMOTE_44
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 45),
-        Input::KEY_EMOTE_45
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 46),
-        Input::KEY_EMOTE_46
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 47),
-        Input::KEY_EMOTE_47
-    },
-    {
-        strprintf(N_("Emote Shortcut %d"), 48),
-        Input::KEY_EMOTE_48
-    },
-    {
-        N_("Outfits Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Wear Outfit"),
-        Input::KEY_WEAR_OUTFIT
-    },
-    {
-        N_("Copy Outfit"),
-        Input::KEY_COPY_OUTFIT
-    },
-    {
-        N_("Copy equipped to Outfit"),
-        Input::KEY_COPY_EQUIPED_OUTFIT
-    },
-    {
-        N_("Chat Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Toggle Chat"),
-        Input::KEY_TOGGLE_CHAT
-    },
-    {
-        N_("Scroll Chat Up"),
-        Input::KEY_SCROLL_CHAT_UP
-    },
-    {
-        N_("Scroll Chat Down"),
-        Input::KEY_SCROLL_CHAT_DOWN
-    },
-    {
-        N_("Previous Chat Tab"),
-        Input::KEY_PREV_CHAT_TAB
-    },
-    {
-        N_("Next Chat Tab"),
-        Input::KEY_NEXT_CHAT_TAB
-    },
-    {
-        N_("Close current Chat Tab"),
-        Input::KEY_CLOSE_CHAT_TAB
-    },
-    {
-        N_("Previous chat line"),
-        Input::KEY_CHAT_PREV_HISTORY
-    },
-    {
-        N_("Next chat line"),
-        Input::KEY_CHAT_NEXT_HISTORY
-    },
-    {
-        N_("Chat Auto Complete"),
-        Input::KEY_AUTOCOMPLETE_CHAT
-    },
-    {
-        N_("Deactivate Chat Input"),
-        Input::KEY_DEACTIVATE_CHAT
-    },
-    {
-        N_("Other Keys"),
-        Input::KEY_NO_VALUE
-    },
-    {
-        N_("Ignore input 1"),
-        Input::KEY_IGNORE_INPUT_1
-    },
-    {
-        N_("Ignore input 2"),
-        Input::KEY_IGNORE_INPUT_2
-    },
-    {
-        N_("Direct Up"),
-        Input::KEY_DIRECT_UP
-    },
-    {
-        N_("Direct Down"),
-        Input::KEY_DIRECT_DOWN
-    },
-    {
-        N_("Direct Left"),
-        Input::KEY_DIRECT_LEFT
-    },
-    {
-        N_("Direct Right"),
-        Input::KEY_DIRECT_RIGHT
-    },
-    {
-        N_("Crazy moves"),
-        Input::KEY_CRAZY_MOVES
-    },
-    {
-        N_("Change Crazy Move mode"),
-        Input::KEY_CHANGE_CRAZY_MOVES_TYPE
-    },
-    {
-        N_("Quick Drop N Items from 0 slot"),
-        Input::KEY_QUICK_DROP
-    },
-    {
-        N_("Quick Drop N Items"),
-        Input::KEY_QUICK_DROPN
-    },
-    {
-        N_("Switch Quick Drop Counter"),
-        Input::KEY_SWITCH_QUICK_DROP
-    },
-    {
-        N_("Quick heal target or self"),
-        Input::KEY_MAGIC_INMA1
-    },
-    {
-        N_("Use #itenplz spell"),
-        Input::KEY_MAGIC_ITENPLZ
-    },
-    {
-        N_("Use magic attack"),
-        Input::KEY_MAGIC_ATTACK
-    },
-    {
-        N_("Switch magic attack"),
-        Input::KEY_SWITCH_MAGIC_ATTACK
-    },
-    {
-        N_("Switch pvp attack"),
-        Input::KEY_SWITCH_PVP_ATTACK
-    },
-    {
-        N_("Change move type"),
-        Input::KEY_INVERT_DIRECTION
-    },
-    {
-        N_("Change Attack Weapon Type"),
-        Input::KEY_CHANGE_ATTACK_WEAPON_TYPE
-    },
-    {
-        N_("Change Attack Type"),
-        Input::KEY_CHANGE_ATTACK_TYPE
-    },
-    {
-        N_("Change Follow mode"),
-        Input::KEY_CHANGE_FOLLOW_MODE
-    },
-    {
-        N_("Change Imitation mode"),
-        Input::KEY_CHANGE_IMITATION_MODE
-    },
-    {
-        N_("Disable / Enable Game modifier keys"),
-        Input::KEY_DISABLE_GAME_MODIFIERS
-    },
-    {
-        N_("On / Off audio"),
-        Input::KEY_CHANGE_AUDIO
-    },
-    {
-        N_("Enable / Disable away mode"),
-        Input::KEY_AWAY
-    },
-    {
-        N_("Emulate right click from keyboard"),
-        Input::KEY_RIGHT_CLICK
-    },
-    {
-        N_("Toggle camera mode"),
-        Input::KEY_CAMERA
-    },
-    {
-        N_("Modifier key"),
-        Input::KEY_MOD
-    }
-};
-
-const int keysSize = sizeof(setupActionData) / sizeof(SetupActionData);
 /**
  * The list model for key function list.
  *
@@ -721,36 +54,64 @@ const int keysSize = sizeof(setupActionData) / sizeof(SetupActionData);
 class KeyListModel : public gcn::ListModel
 {
     public:
+        KeyListModel() :
+            gcn::ListModel(),
+            mDataNum(0),
+            mSize(0)
+        {
+        }
+
         /**
          * Returns the number of elements in container.
          */
         int getNumberOfElements()
-        { return keysSize; }
+        { return mSize; }
 
         /**
          * Returns element from container.
          */
         std::string getElementAt(int i)
-        { return mKeyFunctions[i]; }
+        { return setupActionData[selectedData][i].text; }
 
         /**
          * Sets element from container.
          */
         void setElementAt(int i, const std::string &caption)
-        { mKeyFunctions[i] = caption; }
+        { setupActionData[selectedData][i].text = caption; }
+
+        void setSize(int size)
+        { mSize = size; }
+
+        void setDataNum(int num)
+        { mDataNum = num; }
 
     private:
-        std::string mKeyFunctions[keysSize];
+        int mDataNum;
+        int mSize;
 };
 
 Setup_Input::Setup_Input():
     mKeyListModel(new KeyListModel),
     mKeyList(new ListBox(mKeyListModel)),
-    mKeySetting(false)
+    mKeySetting(false),
+    mActionDataSize(nullptr)
 {
     inputManager.setSetupInput(this);
     setName(_("Input"));
 
+    selectedData = 0;
+    mActionDataSize = new int [7];
+
+    for (int f = 0; f < 7; f ++)
+    {
+        int cnt = 0;
+        while (!setupActionData[f][cnt].name.empty())
+            cnt ++;
+        mActionDataSize[f] = cnt;
+    }
+
+    mKeyListModel->setSize(mActionDataSize[0]);
+
     refreshKeys();
 
     mKeyList->addActionListener(this);
@@ -769,11 +130,22 @@ Setup_Input::Setup_Input():
     mMakeDefaultButton = new Button(_("Default"), "makeDefault", this);
     mMakeDefaultButton->addActionListener(this);
 
+    mTabs = new TabStrip(config.getIntValue("fontSize") + 10);
+    mTabs->addActionListener(this);
+    mTabs->setActionEventId("tabs_");
+    int k = 0;
+    while (pages[k])
+    {
+        mTabs->addButton(gettext(pages[k]), pages[k]);
+        k ++;
+    }
+
     // Do the layout
     LayoutHelper h(this);
     ContainerPlacer place = h.getPlacer(0, 0);
 
-    place(0, 0, scrollArea, 4, 6).setPadding(2);
+    place(0, 0, mTabs, 4);
+    place(0, 1, scrollArea, 4, 5).setPadding(2);
     place(0, 6, mMakeDefaultButton);
     place(2, 6, mAssignKeyButton);
     place(3, 6, mUnassignKeyButton);
@@ -809,8 +181,8 @@ void Setup_Input::apply()
         new OkDialog(_("Key Conflict(s) Detected."),
             strprintf(_("Conflict \"%s\" and \"%s\" keys. "
             "Resolve them, or gameplay may result in strange behaviour."),
-            setupActionData[s1].name.c_str(),
-            setupActionData[s2].name.c_str()), DIALOG_ERROR);
+            setupActionData[selectedData][s1].name.c_str(),
+            setupActionData[selectedData][s2].name.c_str()), DIALOG_ERROR);
     }
     keyboard.setEnabled(true);
     inputManager.store();
@@ -828,14 +200,17 @@ void Setup_Input::cancel()
 
 void Setup_Input::action(const gcn::ActionEvent &event)
 {
+    logger->log("event: %s", event.getId().c_str());
+    const std::string id = event.getId();
+
     if (event.getSource() == mKeyList)
     {
         if (!mKeySetting)
         {
             int i(mKeyList->getSelected());
-            if (i >= 0 && i < keysSize)
+            if (i >= 0 && i < mActionDataSize[selectedData])
             {
-                if (setupActionData[i].actionId
+                if (setupActionData[selectedData][i].actionId
                     == Input::KEY_NO_VALUE)
                 {
                     mAssignKeyButton->setEnabled(false);
@@ -849,27 +224,27 @@ void Setup_Input::action(const gcn::ActionEvent &event)
             }
         }
     }
-    else if (event.getId() == "assign")
+    else if (id == "assign")
     {
         mKeySetting = true;
         mAssignKeyButton->setEnabled(false);
         keyboard.setEnabled(false);
         int i(mKeyList->getSelected());
-        if (i >= 0 && i < keysSize)
+        if (i >= 0 && i < mActionDataSize[selectedData])
         {
-            const SetupActionData &key = setupActionData[i];
+            const SetupActionData &key = setupActionData[selectedData][i];
             int ik = key.actionId;
             inputManager.setNewKeyIndex(ik);
             mKeyListModel->setElementAt(i, std::string(
                 gettext(key.name.c_str())) + ": ?");
         }
     }
-    else if (event.getId() == "unassign")
+    else if (id == "unassign")
     {
         int i(mKeyList->getSelected());
-        if (i >= 0 && i < keysSize)
+        if (i >= 0 && i < mActionDataSize[selectedData])
         {
-            const SetupActionData &key = setupActionData[i];
+            const SetupActionData &key = setupActionData[selectedData][i];
             int ik = key.actionId;
             inputManager.setNewKeyIndex(ik);
             refreshAssignedKey(mKeyList->getSelected());
@@ -877,16 +252,34 @@ void Setup_Input::action(const gcn::ActionEvent &event)
         }
         mAssignKeyButton->setEnabled(true);
     }
-    else if (event.getId() == "makeDefault")
+    else if (id == "makeDefault")
     {
         inputManager.makeDefault();
         refreshKeys();
     }
+    else if (!id.find("tabs_"))
+    {
+        int k = 0;
+        std::string str = "tabs_";
+        while (pages[k])
+        {
+            if (str + pages[k] == id)
+                break;
+            k ++;
+        }
+        if (pages[k] && str + pages[k] == id)
+        {
+            selectedData = k;
+            mKeyListModel->setSize(mActionDataSize[k]);
+            refreshKeys();
+            mKeyList->setSelected(0);
+        }
+    }
 }
 
 void Setup_Input::refreshAssignedKey(int index)
 {
-    const SetupActionData &key = setupActionData[index];
+    const SetupActionData &key = setupActionData[selectedData][index];
     if (key.actionId == Input::KEY_NO_VALUE)
     {
         const std::string str = " \342\200\225\342\200\225\342\200\225"
@@ -913,9 +306,9 @@ void Setup_Input::newKeyCallback(int index)
 
 int Setup_Input::keyToSetupData(int index)
 {
-    for (int i = 0; i < keysSize; i++)
+    for (int i = 0; i < mActionDataSize[selectedData]; i++)
     {
-        const SetupActionData &key = setupActionData[i];
+        const SetupActionData &key = setupActionData[selectedData][i];
         if (key.actionId == index)
             return i;
     }
@@ -924,7 +317,7 @@ int Setup_Input::keyToSetupData(int index)
 
 void Setup_Input::refreshKeys()
 {
-    for (int i = 0; i < keysSize; i++)
+    for (int i = 0; i < mActionDataSize[selectedData]; i++)
         refreshAssignedKey(i);
 }
 
diff --git a/src/gui/setup_input.h b/src/gui/setup_input.h
index 79c7e73ff..b2e2d64c0 100644
--- a/src/gui/setup_input.h
+++ b/src/gui/setup_input.h
@@ -33,6 +33,9 @@
 
 #include <string>
 
+class TabStrip;
+struct SetupActionData;
+
 class Setup_Input : public SetupTab
 {
     public:
@@ -81,8 +84,11 @@ class Setup_Input : public SetupTab
         gcn::Button *mAssignKeyButton;
         gcn::Button *mUnassignKeyButton;
         gcn::Button *mMakeDefaultButton;
+        TabStrip *mTabs;
 
         bool mKeySetting; /**< flag to check if key being set. */
+
+        int *mActionDataSize;
 };
 
 #endif
diff --git a/src/gui/setupactiondata.h b/src/gui/setupactiondata.h
new file mode 100644
index 000000000..53699110b
--- /dev/null
+++ b/src/gui/setupactiondata.h
@@ -0,0 +1,951 @@
+/*
+ *  Setup action data configuration
+ *  Copyright (C) 2007  Joshua Langley <joshlangley@optusnet.com.au>
+ *  Copyright (C) 2009  The Mana World Development Team
+ *  Copyright (C) 2009-2010  The Mana Developers
+ *  Copyright (C) 2011-2012  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus Client.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GUI_SETUPACTIONDATA_H
+#define GUI_SETUPACTIONDATA_H
+
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+int selectedData = 0;
+
+struct SetupActionData
+{
+    const std::string name;
+    const int actionId;
+    std::string text;
+};
+
+static SetupActionData setupActionData0[] =
+{
+    {
+        N_("Move Keys"),
+        Input::KEY_NO_VALUE,
+        "",
+    },
+    {
+        N_("Move Up"),
+        Input::KEY_MOVE_UP,
+        "",
+    },
+    {
+        N_("Move Down"),
+        Input::KEY_MOVE_DOWN,
+        "",
+    },
+    {
+        N_("Move Left"),
+        Input::KEY_MOVE_LEFT,
+        "",
+    },
+    {
+        N_("Move Right"),
+        Input::KEY_MOVE_RIGHT,
+        "",
+    },
+    {
+        N_("Target and attack keys"),
+        Input::KEY_NO_VALUE,
+        "",
+    },
+    {
+        N_("Attack"),
+        Input::KEY_ATTACK,
+        "",
+    },
+    {
+        N_("Target & Attack"),
+        Input::KEY_TARGET_ATTACK,
+        "",
+    },
+    {
+        N_("Move to Target"),
+        Input::KEY_MOVE_TO_TARGET,
+        "",
+    },
+    {
+        N_("Change Move to Target type"),
+        Input::KEY_CHANGE_MOVE_TO_TARGET,
+        "",
+    },
+    {
+        N_("Move to Home location"),
+        Input::KEY_MOVE_TO_HOME,
+        "",
+    },
+    {
+        N_("Set home location"),
+        Input::KEY_SET_HOME,
+        "",
+    },
+    {
+        N_("Move to navigation point"),
+        Input::KEY_MOVE_TO_POINT,
+        "",
+    },
+    {
+        N_("Talk"),
+        Input::KEY_TALK,
+        "",
+    },
+    {
+        N_("Stop Attack"),
+        Input::KEY_STOP_ATTACK,
+        "",
+    },
+    {
+        N_("Untarget"),
+        Input::KEY_UNTARGET,
+        "",
+    },
+    {
+        N_("Target monster"),
+        Input::KEY_TARGET_MONSTER,
+        "",
+    },
+    {
+        N_("Target NPC"),
+        Input::KEY_TARGET_NPC,
+        "",
+    },
+    {
+        N_("Target Player"),
+        Input::KEY_TARGET_PLAYER,
+        "",
+    },
+    {
+        N_("Other Keys"),
+        Input::KEY_NO_VALUE,
+        "",
+    },
+    {
+        N_("Pickup"),
+        Input::KEY_PICKUP,
+        "",
+    },
+    {
+        N_("Change Pickup Type"),
+        Input::KEY_CHANGE_PICKUP_TYPE,
+        "",
+    },
+    {
+        N_("Sit"),
+        Input::KEY_SIT,
+        "",
+    },
+    {
+        N_("Screenshot"),
+        Input::KEY_SCREENSHOT,
+        "",
+    },
+    {
+        N_("Enable/Disable Trading"),
+        Input::KEY_TRADE,
+        "",
+    },
+    {
+        N_("Change Map View Mode"),
+        Input::KEY_PATHFIND,
+        "",
+    },
+    {
+        N_("Select OK"),
+        Input::KEY_OK,
+        "",
+    },
+    {
+        N_("Quit"),
+        Input::KEY_QUIT,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData setupActionData1[] =
+{
+    {
+        N_("Shortcuts modifiers keys"),
+        Input::KEY_NO_VALUE,
+        ""
+    },
+    {
+        N_("Item Shortcuts Key"),
+        Input::KEY_SHORTCUTS_KEY,
+        "",
+    },
+    {
+        N_("Shortcuts keys"),
+        Input::KEY_NO_VALUE,
+        ""
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 1),
+        Input::KEY_SHORTCUT_1,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 2),
+        Input::KEY_SHORTCUT_2,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 3),
+        Input::KEY_SHORTCUT_3,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 4),
+        Input::KEY_SHORTCUT_4,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 5),
+        Input::KEY_SHORTCUT_5,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 6),
+        Input::KEY_SHORTCUT_6,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 7),
+        Input::KEY_SHORTCUT_7,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 8),
+        Input::KEY_SHORTCUT_8,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 9),
+        Input::KEY_SHORTCUT_9,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 10),
+        Input::KEY_SHORTCUT_10,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 11),
+        Input::KEY_SHORTCUT_11,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 12),
+        Input::KEY_SHORTCUT_12,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 13),
+        Input::KEY_SHORTCUT_13,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 14),
+        Input::KEY_SHORTCUT_14,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 15),
+        Input::KEY_SHORTCUT_15,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 16),
+        Input::KEY_SHORTCUT_16,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 17),
+        Input::KEY_SHORTCUT_17,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 18),
+        Input::KEY_SHORTCUT_18,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 19),
+        Input::KEY_SHORTCUT_19,
+        "",
+    },
+    {
+        strprintf(N_("Item Shortcut %d"), 20),
+        Input::KEY_SHORTCUT_20,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData setupActionData2[] =
+{
+    {
+        N_("Hide Windows"),
+        Input::KEY_HIDE_WINDOWS,
+        "",
+    },
+    {
+        N_("Help Window"),
+        Input::KEY_WINDOW_HELP,
+        "",
+    },
+    {
+        N_("Status Window"),
+        Input::KEY_WINDOW_STATUS,
+        "",
+    },
+    {
+        N_("Inventory Window"),
+        Input::KEY_WINDOW_INVENTORY,
+        "",
+    },
+    {
+        N_("Equipment Window"),
+        Input::KEY_WINDOW_EQUIPMENT,
+        "",
+    },
+    {
+        N_("Skill Window"),
+        Input::KEY_WINDOW_SKILL,
+        "",
+    },
+    {
+        N_("Minimap Window"),
+        Input::KEY_WINDOW_MINIMAP,
+        "",
+    },
+    {
+        N_("Chat Window"),
+        Input::KEY_WINDOW_CHAT,
+        "",
+    },
+    {
+        N_("Item Shortcut Window"),
+        Input::KEY_WINDOW_SHORTCUT,
+        "",
+    },
+    {
+        N_("Setup Window"),
+        Input::KEY_WINDOW_SETUP,
+        "",
+    },
+    {
+        N_("Debug Window"),
+        Input::KEY_WINDOW_DEBUG,
+        "",
+    },
+    {
+        N_("Social Window"),
+        Input::KEY_WINDOW_SOCIAL,
+        "",
+    },
+    {
+        N_("Emote Shortcut Window"),
+        Input::KEY_WINDOW_EMOTE_SHORTCUT,
+        "",
+    },
+    {
+        N_("Outfits Window"),
+        Input::KEY_WINDOW_OUTFIT,
+        "",
+    },
+    {
+        N_("Shop Window"),
+        Input::KEY_WINDOW_SHOP,
+        "",
+    },
+    {
+        N_("Quick drop Window"),
+        Input::KEY_WINDOW_DROP,
+        "",
+    },
+    {
+        N_("Kill Stats Window"),
+        Input::KEY_WINDOW_KILLS,
+        "",
+    },
+    {
+        N_("Commands Window"),
+        Input::KEY_WINDOW_SPELLS,
+        "",
+    },
+    {
+        N_("Bot Checker Window"),
+        Input::KEY_WINDOW_BOT_CHECKER,
+        "",
+    },
+    {
+        N_("Who Is Online Window"),
+        Input::KEY_WINDOW_ONLINE,
+        "",
+    },
+    {
+        N_("Did you know Window"),
+        Input::KEY_WINDOW_DIDYOUKNOW,
+        "",
+    },
+    {
+        N_("Previous Social Tab"),
+        Input::KEY_PREV_SOCIAL_TAB,
+        "",
+    },
+    {
+        N_("Next Social Tab"),
+        Input::KEY_NEXT_SOCIAL_TAB,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData setupActionData3[] =
+{
+    {
+        N_("Emote modifiers keys"),
+        Input::KEY_NO_VALUE,
+        ""
+    },
+    {
+        N_("Emote modifier key"),
+        Input::KEY_EMOTE,
+        "",
+    },
+    {
+        N_("Emote shortcuts"),
+        Input::KEY_NO_VALUE,
+        ""
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 1),
+        Input::KEY_EMOTE_1,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 2),
+        Input::KEY_EMOTE_2,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 3),
+        Input::KEY_EMOTE_3,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 4),
+        Input::KEY_EMOTE_4,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 5),
+        Input::KEY_EMOTE_5,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 6),
+        Input::KEY_EMOTE_6,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 7),
+        Input::KEY_EMOTE_7,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 8),
+        Input::KEY_EMOTE_8,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 9),
+        Input::KEY_EMOTE_9,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 10),
+        Input::KEY_EMOTE_10,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 11),
+        Input::KEY_EMOTE_11,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 12),
+        Input::KEY_EMOTE_12,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 13),
+        Input::KEY_EMOTE_13,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 14),
+        Input::KEY_EMOTE_14,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 15),
+        Input::KEY_EMOTE_15,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 16),
+        Input::KEY_EMOTE_16,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 17),
+        Input::KEY_EMOTE_17,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 18),
+        Input::KEY_EMOTE_18,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 19),
+        Input::KEY_EMOTE_19,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 20),
+        Input::KEY_EMOTE_20,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 21),
+        Input::KEY_EMOTE_21,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 22),
+        Input::KEY_EMOTE_22,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 23),
+        Input::KEY_EMOTE_23,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 24),
+        Input::KEY_EMOTE_24,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 25),
+        Input::KEY_EMOTE_25,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 26),
+        Input::KEY_EMOTE_26,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 27),
+        Input::KEY_EMOTE_27,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 28),
+        Input::KEY_EMOTE_28,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 29),
+        Input::KEY_EMOTE_29,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 30),
+        Input::KEY_EMOTE_30,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 31),
+        Input::KEY_EMOTE_31,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 32),
+        Input::KEY_EMOTE_32,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 33),
+        Input::KEY_EMOTE_33,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 34),
+        Input::KEY_EMOTE_34,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 35),
+        Input::KEY_EMOTE_35,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 36),
+        Input::KEY_EMOTE_36,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 37),
+        Input::KEY_EMOTE_37,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 38),
+        Input::KEY_EMOTE_38,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 39),
+        Input::KEY_EMOTE_39,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 40),
+        Input::KEY_EMOTE_40,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 41),
+        Input::KEY_EMOTE_41,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 42),
+        Input::KEY_EMOTE_42,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 43),
+        Input::KEY_EMOTE_43,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 44),
+        Input::KEY_EMOTE_44,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 45),
+        Input::KEY_EMOTE_45,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 46),
+        Input::KEY_EMOTE_46,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 47),
+        Input::KEY_EMOTE_47,
+        "",
+    },
+    {
+        strprintf(N_("Emote Shortcut %d"), 48),
+        Input::KEY_EMOTE_48,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData setupActionData4[] =
+{
+    {
+        N_("Wear Outfit"),
+        Input::KEY_WEAR_OUTFIT,
+        "",
+    },
+    {
+        N_("Copy Outfit"),
+        Input::KEY_COPY_OUTFIT,
+        "",
+    },
+    {
+        N_("Copy equipped to Outfit"),
+        Input::KEY_COPY_EQUIPED_OUTFIT,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData setupActionData5[] =
+{
+    {
+        N_("Toggle Chat"),
+        Input::KEY_TOGGLE_CHAT,
+        "",
+    },
+    {
+        N_("Scroll Chat Up"),
+        Input::KEY_SCROLL_CHAT_UP,
+        "",
+    },
+    {
+        N_("Scroll Chat Down"),
+        Input::KEY_SCROLL_CHAT_DOWN,
+        "",
+    },
+    {
+        N_("Previous Chat Tab"),
+        Input::KEY_PREV_CHAT_TAB,
+        "",
+    },
+    {
+        N_("Next Chat Tab"),
+        Input::KEY_NEXT_CHAT_TAB,
+        "",
+    },
+    {
+        N_("Close current Chat Tab"),
+        Input::KEY_CLOSE_CHAT_TAB,
+        "",
+    },
+    {
+        N_("Previous chat line"),
+        Input::KEY_CHAT_PREV_HISTORY,
+        "",
+    },
+    {
+        N_("Next chat line"),
+        Input::KEY_CHAT_NEXT_HISTORY,
+        "",
+    },
+    {
+        N_("Chat Auto Complete"),
+        Input::KEY_AUTOCOMPLETE_CHAT,
+        "",
+    },
+    {
+        N_("Deactivate Chat Input"),
+        Input::KEY_DEACTIVATE_CHAT,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData setupActionData6[] =
+{
+    {
+        N_("Ignore input 1"),
+        Input::KEY_IGNORE_INPUT_1,
+        "",
+    },
+    {
+        N_("Ignore input 2"),
+        Input::KEY_IGNORE_INPUT_2,
+        "",
+    },
+    {
+        N_("Direct Up"),
+        Input::KEY_DIRECT_UP,
+        "",
+    },
+    {
+        N_("Direct Down"),
+        Input::KEY_DIRECT_DOWN,
+        "",
+    },
+    {
+        N_("Direct Left"),
+        Input::KEY_DIRECT_LEFT,
+        "",
+    },
+    {
+        N_("Direct Right"),
+        Input::KEY_DIRECT_RIGHT,
+        "",
+    },
+    {
+        N_("Crazy moves"),
+        Input::KEY_CRAZY_MOVES,
+        "",
+    },
+    {
+        N_("Change Crazy Move mode"),
+        Input::KEY_CHANGE_CRAZY_MOVES_TYPE,
+        "",
+    },
+    {
+        N_("Quick Drop N Items from 0 slot"),
+        Input::KEY_QUICK_DROP,
+        "",
+    },
+    {
+        N_("Quick Drop N Items"),
+        Input::KEY_QUICK_DROPN,
+        "",
+    },
+    {
+        N_("Switch Quick Drop Counter"),
+        Input::KEY_SWITCH_QUICK_DROP,
+        "",
+    },
+    {
+        N_("Quick heal target or self"),
+        Input::KEY_MAGIC_INMA1,
+        "",
+    },
+    {
+        N_("Use #itenplz spell"),
+        Input::KEY_MAGIC_ITENPLZ,
+        "",
+    },
+    {
+        N_("Use magic attack"),
+        Input::KEY_MAGIC_ATTACK,
+        "",
+    },
+    {
+        N_("Switch magic attack"),
+        Input::KEY_SWITCH_MAGIC_ATTACK,
+        "",
+    },
+    {
+        N_("Switch pvp attack"),
+        Input::KEY_SWITCH_PVP_ATTACK,
+        "",
+    },
+    {
+        N_("Change move type"),
+        Input::KEY_INVERT_DIRECTION,
+        "",
+    },
+    {
+        N_("Change Attack Weapon Type"),
+        Input::KEY_CHANGE_ATTACK_WEAPON_TYPE,
+        "",
+    },
+    {
+        N_("Change Attack Type"),
+        Input::KEY_CHANGE_ATTACK_TYPE,
+        "",
+    },
+    {
+        N_("Change Follow mode"),
+        Input::KEY_CHANGE_FOLLOW_MODE,
+        "",
+    },
+    {
+        N_("Change Imitation mode"),
+        Input::KEY_CHANGE_IMITATION_MODE,
+        "",
+    },
+    {
+        N_("Disable / Enable Game modifier keys"),
+        Input::KEY_DISABLE_GAME_MODIFIERS,
+        "",
+    },
+    {
+        N_("On / Off audio"),
+        Input::KEY_CHANGE_AUDIO,
+        "",
+    },
+    {
+        N_("Enable / Disable away mode"),
+        Input::KEY_AWAY,
+        "",
+    },
+    {
+        N_("Emulate right click from keyboard"),
+        Input::KEY_RIGHT_CLICK,
+        "",
+    },
+    {
+        N_("Toggle camera mode"),
+        Input::KEY_CAMERA,
+        "",
+    },
+    {
+        N_("Modifier key"),
+        Input::KEY_MOD,
+        "",
+    },
+    {
+        "",
+        Input::KEY_NO_VALUE,
+        ""
+    }
+};
+
+static SetupActionData *setupActionData[] =
+{
+    setupActionData0,
+    setupActionData1,
+    setupActionData2,
+    setupActionData3,
+    setupActionData4,
+    setupActionData5,
+    setupActionData6
+};
+
+static const char *pages[] =
+{
+    N_("Basic"),
+    N_("Shortcuts"),
+    N_("Windows"),
+    N_("Emotes"),
+    N_("Outfits"),
+    N_("Chat"),
+    N_("Other"),
+    nullptr
+};
+
+#endif
diff --git a/src/gui/widgets/tabstrip.cpp b/src/gui/widgets/tabstrip.cpp
index 6dcf02008..6b3f42fe9 100644
--- a/src/gui/widgets/tabstrip.cpp
+++ b/src/gui/widgets/tabstrip.cpp
@@ -32,6 +32,11 @@ TabStrip::TabStrip(std::string group, int height, int spacing) :
 {
 }
 
+TabStrip::TabStrip(int height, int spacing) :
+    WidgetGroup("", height, spacing)
+{
+}
+
 gcn::Widget *TabStrip::createWidget(std::string text)
 {
     Button *widget = new Button();
diff --git a/src/gui/widgets/tabstrip.h b/src/gui/widgets/tabstrip.h
index 588833606..078845b39 100644
--- a/src/gui/widgets/tabstrip.h
+++ b/src/gui/widgets/tabstrip.h
@@ -29,7 +29,9 @@
 class TabStrip : public WidgetGroup
 {
     public:
-        TabStrip(std::string group, int height, int spacing);
+        TabStrip(std::string group, int height, int spacing = 0);
+
+        TabStrip(int height, int spacing = 0);
 
         gcn::Widget *createWidget(std::string name);
 
-- 
cgit v1.2.3-70-g09d2