wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src actions.cpp game.cpp hotkeys.cpp ho...


From: Philippe Plantier
Subject: [Wesnoth-cvs-commits] wesnoth/src actions.cpp game.cpp hotkeys.cpp ho...
Date: Sun, 31 Oct 2004 14:01:23 -0500

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     Philippe Plantier <address@hidden>      04/10/31 18:48:07

Modified files:
        src            : actions.cpp game.cpp hotkeys.cpp hotkeys.hpp 
                         playturn.cpp preferences.cpp 
        src/editor     : editor.cpp editor.hpp 

Log message:
        Partly rewrote the hotkey system, fixing bug 9981, other possible 
hotkeys bug,
        and simplifying the access to hotkeys.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/actions.cpp.diff?tr1=1.162&tr2=1.163&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/game.cpp.diff?tr1=1.153&tr2=1.154&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/hotkeys.cpp.diff?tr1=1.59&tr2=1.60&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/hotkeys.hpp.diff?tr1=1.51&tr2=1.52&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/playturn.cpp.diff?tr1=1.282&tr2=1.283&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/preferences.cpp.diff?tr1=1.117&tr2=1.118&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/editor/editor.cpp.diff?tr1=1.84&tr2=1.85&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/editor/editor.hpp.diff?tr1=1.40&tr2=1.41&r1=text&r2=text

Patches:
Index: wesnoth/src/actions.cpp
diff -u wesnoth/src/actions.cpp:1.162 wesnoth/src/actions.cpp:1.163
--- wesnoth/src/actions.cpp:1.162       Sun Oct 31 14:28:31 2004
+++ wesnoth/src/actions.cpp     Sun Oct 31 18:48:07 2004
@@ -1,4 +1,4 @@
-/* $Id: actions.cpp,v 1.162 2004/10/31 14:28:31 silene Exp $ */
+/* $Id: actions.cpp,v 1.163 2004/10/31 18:48:07 gruikya Exp $ */
 /*
    Copyright (C) 2003 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
@@ -1798,15 +1798,9 @@
                        
                        if(steps.size() < route.size()) {
                                //see if the "Continue Move" action has an 
associated hotkey
-                               const std::vector<hotkey::hotkey_item>& hotkeys 
= hotkey::get_hotkeys();
-                               
std::vector<hotkey::hotkey_item>::const_iterator hk;
-                               for(hk = hotkeys.begin(); hk != hotkeys.end(); 
++hk) {
-                                       if(hk->action == 
hotkey::HOTKEY_CONTINUE_MOVE) {
-                                               break;
-                                       }
-                               }
-                               if(hk != hotkeys.end()) {
-                                       symbols["hotkey"] = 
hotkey::get_hotkey_name(*hk);
+                               const hotkey::hotkey_item& hk = 
hotkey::get_hotkey(hotkey::HOTKEY_CONTINUE_MOVE);
+                               if(!hk.null()) {
+                                       symbols["hotkey"] = hk.get_name();
                                        msg << '\n' << _("(press $hotkey to 
continue)");
                                }
                        }
Index: wesnoth/src/editor/editor.cpp
diff -u wesnoth/src/editor/editor.cpp:1.84 wesnoth/src/editor/editor.cpp:1.85
--- wesnoth/src/editor/editor.cpp:1.84  Sat Oct 30 23:56:50 2004
+++ wesnoth/src/editor/editor.cpp       Sun Oct 31 18:48:07 2004
@@ -103,18 +103,13 @@
                        std::cerr << "Error when reading " << prefs_filename << 
": "
                                          << e.message << std::endl;
                }
-               // Clear the current hotkeys. Alot of hotkeys are already set
-               // through other configuration files (e.g. english.cfg and
-               // preferences) and we need to clear these or they will overlap.
-               hotkey::get_hotkeys().clear();
-               hotkey::add_hotkeys(theme_, true);
-               hotkey::add_hotkeys(prefs_, true);
+               hotkey::load_hotkeys(theme_);
+               hotkey::load_hotkeys(prefs_);
                left_button_func_changed(DRAW);
                first_time_created_ = false;
        }
        else {
-               hotkey::get_hotkeys().clear();
-               hotkey::add_hotkeys(hotkeys_, true);
+               hotkey::load_hotkeys(hotkeys_);
                palette_.select_fg_terrain(old_fg_terrain_);
                palette_.select_bg_terrain(old_bg_terrain_);
                brush_.select_brush_size(old_brush_size_);
@@ -1042,28 +1037,17 @@
        // menu is what to display in the menu.
        std::vector<std::string> menu;
        if(items.size() == 1) {
-               execute_command(hotkey::string_to_command(items.front()));
+               execute_command(hotkey::get_hotkey(items.front()).get_id());
                return;
        }
        for(std::vector<std::string>::const_iterator i = items.begin();
                i != items.end(); ++i) {
+
+               const hotkey::hotkey_item hk = hotkey::get_hotkey(*i);
                std::stringstream str;
                // Try to translate it to nicer format.
-               str << 
hotkey::command_to_description(hotkey::string_to_command(*i));
-               // See if this menu item has an associated hotkey.
-               const hotkey::HOTKEY_COMMAND cmd = 
hotkey::string_to_command(*i);
-               const std::vector<hotkey::hotkey_item>& hotkeys = 
hotkey::get_hotkeys();
-               std::vector<hotkey::hotkey_item>::const_iterator hk;
-               for(hk = hotkeys.begin(); hk != hotkeys.end(); ++hk) {
-                       if(hk->action == cmd) {
-                               break;
-                       }
-               }
-               if(hk != hotkeys.end()) {
-                       // Hotkey was found for this item, add the hotkey 
description to
-                       // the menu item.
-                       str << "," << hotkey::get_hotkey_name(*hk);
-               }
+               str << hk.get_description() << "," << hk.get_name();
+
                menu.push_back(str.str());
        }
        static const std::string style = "menu2";
@@ -1071,7 +1055,7 @@
                                                                         NULL, 
256, NULL, NULL, xloc, yloc, &style);
        if(res < 0 || (unsigned)res >= items.size())
                return;
-       const hotkey::HOTKEY_COMMAND cmd = 
hotkey::string_to_command(items[res]);
+       const hotkey::HOTKEY_COMMAND cmd = 
hotkey::get_hotkey(items[res]).get_id();
        execute_command(cmd);
 }
 
@@ -1131,7 +1115,7 @@
        if (func != l_button_func_) {
                l_button_func_ = func;
                reports::set_report_content(reports::EDIT_LEFT_BUTTON_FUNCTION,
-                                           
hotkey::command_to_description(hotkey::string_to_command(get_action_name(func))));
+                               
hotkey::get_hotkey(get_action_name(func)).get_description());
                gui_.invalidate_game_status();
                l_button_palette_dirty_ = true;
        }
Index: wesnoth/src/editor/editor.hpp
diff -u wesnoth/src/editor/editor.hpp:1.40 wesnoth/src/editor/editor.hpp:1.41
--- wesnoth/src/editor/editor.hpp:1.40  Thu Jun  3 21:42:08 2004
+++ wesnoth/src/editor/editor.hpp       Sun Oct 31 18:48:07 2004
@@ -314,6 +314,7 @@
        // cycles.
        bool mouse_moved_;
        bool highlighted_locs_cleared_;
+       const hotkey::manager hotkey_manager_;
        const preferences::display_manager prefs_disp_manager_;
        static config prefs_;
        static config hotkeys_;
Index: wesnoth/src/game.cpp
diff -u wesnoth/src/game.cpp:1.153 wesnoth/src/game.cpp:1.154
--- wesnoth/src/game.cpp:1.153  Sun Oct 31 13:18:56 2004
+++ wesnoth/src/game.cpp        Sun Oct 31 18:48:07 2004
@@ -1,4 +1,4 @@
-/* $Id: game.cpp,v 1.153 2004/10/31 13:18:56 cedricd Exp $ */
+/* $Id: game.cpp,v 1.154 2004/10/31 18:48:07 gruikya Exp $ */
 /*
    Copyright (C) 2003 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
@@ -356,6 +356,7 @@
        const preferences::manager prefs_manager_;
        const image::manager image_manager_;
        const events::event_context main_event_context_;
+       const hotkey::manager hotkey_manager_;
        binary_paths_manager paths_manager_;
 
        bool test_mode_, multiplayer_mode_, no_gui_;
@@ -585,7 +586,7 @@
 
        game_config::load_config(game_config_.child("game_config"));
 
-       hotkey::add_hotkeys(game_config_,false);
+       hotkey::load_hotkeys(game_config_);
 
        paths_manager_.set_paths(game_config_);
 
@@ -732,14 +733,6 @@
                const config* side = type == side_types.end() ? 
era_cfg->child("multiplayer_side") :
                                                                
era_cfg->find_child("multiplayer_side","type",type->second);
 
-#if 0
-               size_t tries = 0;
-               while(side != NULL && (*side)["type"] == "random" && ++tries < 
100) {
-                       const config::child_list& v = 
era_cfg->get_children("multiplayer_side");
-                       side = v[rand()%v.size()];
-               }
-#endif
-
                if(side == NULL || (*side)["random_faction"] == "yes" || 
(*side)["type"] == "random") {
                        std::string side_name = (type == side_types.end() ? 
"default" : type->second);
                        std::cerr << "Could not find side '" << side_name << "' 
for side " << side_num << "\n";
Index: wesnoth/src/hotkeys.cpp
diff -u wesnoth/src/hotkeys.cpp:1.59 wesnoth/src/hotkeys.cpp:1.60
--- wesnoth/src/hotkeys.cpp:1.59        Sun Sep 19 14:00:51 2004
+++ wesnoth/src/hotkeys.cpp     Sun Oct 31 18:48:07 2004
@@ -1,4 +1,4 @@
-/* $Id: hotkeys.cpp,v 1.59 2004/09/19 14:00:51 ettin Exp $ */
+/* $Id: hotkeys.cpp,v 1.60 2004/10/31 18:48:07 gruikya Exp $ */
 /*
    Copyright (C) 2003 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
@@ -27,330 +27,287 @@
 #include <cstdlib>
 #include <map>
 
-namespace hotkey {
-
-static std::map<std::string,HOTKEY_COMMAND> m;
-       
-       
-HOTKEY_COMMAND string_to_command(const std::string& str)
-{
-       if(m.empty()) {
-               typedef std::pair<std::string,HOTKEY_COMMAND> val;
-               m.insert(val("cycle",HOTKEY_CYCLE_UNITS));
-               m.insert(val("endunitturn",HOTKEY_END_UNIT_TURN));
-               m.insert(val("leader",HOTKEY_LEADER));
-               m.insert(val("undo",HOTKEY_UNDO));
-               m.insert(val("redo",HOTKEY_REDO));
-               m.insert(val("zoomin",HOTKEY_ZOOM_IN));
-               m.insert(val("zoomout",HOTKEY_ZOOM_OUT));
-               m.insert(val("zoomdefault",HOTKEY_ZOOM_DEFAULT));
-               m.insert(val("fullscreen",HOTKEY_FULLSCREEN));
-               m.insert(val("accelerated",HOTKEY_ACCELERATED));
-               m.insert(val("describeunit",HOTKEY_UNIT_DESCRIPTION));
-               m.insert(val("renameunit",HOTKEY_RENAME_UNIT));
-               m.insert(val("save",HOTKEY_SAVE_GAME));
-               m.insert(val("load",HOTKEY_LOAD_GAME));
-               m.insert(val("recruit",HOTKEY_RECRUIT));
-               m.insert(val("repeatrecruit",HOTKEY_REPEAT_RECRUIT));
-               m.insert(val("recall",HOTKEY_RECALL));
-               m.insert(val("endturn",HOTKEY_ENDTURN));
-               m.insert(val("togglegrid",HOTKEY_TOGGLE_GRID));
-               m.insert(val("statustable",HOTKEY_STATUS_TABLE));
-               m.insert(val("mute",HOTKEY_MUTE));
-               m.insert(val("speak",HOTKEY_SPEAK));
-               m.insert(val("createunit",HOTKEY_CREATE_UNIT));
-               m.insert(val("changeside",HOTKEY_CHANGE_UNIT_SIDE));
-               m.insert(val("preferences",HOTKEY_PREFERENCES));
-               m.insert(val("objectives",HOTKEY_OBJECTIVES));
-               m.insert(val("unitlist",HOTKEY_UNIT_LIST));
-               m.insert(val("statistics",HOTKEY_STATISTICS));
-               m.insert(val("quit",HOTKEY_QUIT_GAME));
-               m.insert(val("labelterrain",HOTKEY_LABEL_TERRAIN));
-               m.insert(val("showenemymoves",HOTKEY_SHOW_ENEMY_MOVES));
-               m.insert(val("bestenemymoves",HOTKEY_BEST_ENEMY_MOVES));
-               m.insert(val("editquit",HOTKEY_EDIT_QUIT));
-               m.insert(val("editnewmap",HOTKEY_EDIT_NEW_MAP));
-               m.insert(val("editloadmap",HOTKEY_EDIT_LOAD_MAP));
-               m.insert(val("editsavemap",HOTKEY_EDIT_SAVE_MAP));
-               m.insert(val("editsaveas",HOTKEY_EDIT_SAVE_AS));
-               m.insert(val("editsetstartpos",HOTKEY_EDIT_SET_START_POS));
-               m.insert(val("editfloodfill",HOTKEY_EDIT_FLOOD_FILL));
-               m.insert(val("editfillselection",HOTKEY_EDIT_FILL_SELECTION));
-               m.insert(val("editcut",HOTKEY_EDIT_CUT));
-               m.insert(val("editcopy",HOTKEY_EDIT_COPY));
-               m.insert(val("editpaste",HOTKEY_EDIT_PASTE));
-               m.insert(val("editrevert",HOTKEY_EDIT_REVERT));
-               m.insert(val("editresize",HOTKEY_EDIT_RESIZE));
-               m.insert(val("editflip",HOTKEY_EDIT_FLIP));
-               m.insert(val("editselectall",HOTKEY_EDIT_SELECT_ALL));
-               m.insert(val("editdraw",HOTKEY_EDIT_DRAW));
-               m.insert(val("delayshroud",HOTKEY_DELAY_SHROUD));
-               m.insert(val("updateshroud",HOTKEY_UPDATE_SHROUD));
-               m.insert(val("continue",HOTKEY_CONTINUE_MOVE));
-               m.insert(val("search",HOTKEY_SEARCH));
-               m.insert(val("speaktoally",HOTKEY_SPEAK_ALLY));
-               m.insert(val("speaktoall",HOTKEY_SPEAK_ALL));
-               m.insert(val("help",HOTKEY_HELP));
-               m.insert(val("chatlog",HOTKEY_CHAT_LOG));
-               m.insert(val("command",HOTKEY_USER_CMD));
-       }
-       
-       const std::map<std::string,HOTKEY_COMMAND>::const_iterator i = 
m.find(str);
-       if(i == m.end())
-               return HOTKEY_NULL;
-       else
-               return i->second;
+namespace {
+       std::vector<hotkey::hotkey_item> hotkeys_;
+       hotkey::hotkey_item null_hotkey_;
 }
-       
-std::string command_to_string(const HOTKEY_COMMAND &command)
-{
-       for(std::map<std::string,HOTKEY_COMMAND>::iterator i = m.begin(); i != 
m.end(); ++i) {
-               if(i->second == command) {
-                       return i->first;
-               }
-       }
 
-       std::cerr << "\n command_to_string: No matching command found...";
-       return "";
-}
+namespace hotkey {
 
-std::string command_to_description(const HOTKEY_COMMAND &command)
+hotkey_item::hotkey_item(HOTKEY_COMMAND id, const std::string& command, const 
std::string& description, bool hidden) 
+       : id_(id), command_(command), description_(description), keycode_(0),
+       alt_(false), ctrl_(false), shift_(false), cmd_(false), hidden_(hidden)
 {
-       switch (command) {
-       case HOTKEY_CYCLE_UNITS: return _("Next unit");
-       case HOTKEY_END_UNIT_TURN: return _("End Unit Turn");
-       case HOTKEY_LEADER: return _("Leader");
-       case HOTKEY_UNDO: return _("Undo");
-       case HOTKEY_REDO: return _("Redo");
-       case HOTKEY_ZOOM_IN: return _("Zoom In");
-       case HOTKEY_ZOOM_OUT: return _("Zoom Out");
-       case HOTKEY_ZOOM_DEFAULT: return _("Default Zoom");
-       case HOTKEY_FULLSCREEN: return _("Fullscreen");
-       case HOTKEY_ACCELERATED: return _("Accelerated");
-       case HOTKEY_UNIT_DESCRIPTION: return _("Unit Description");
-       case HOTKEY_RENAME_UNIT: return _("Rename Unit");
-       case HOTKEY_SAVE_GAME: return _("Save Game");
-       case HOTKEY_LOAD_GAME: return _("Load Game");
-       case HOTKEY_RECRUIT: return _("Recruit");
-       case HOTKEY_REPEAT_RECRUIT: return _("Repeat Recruit");
-       case HOTKEY_RECALL: return _("Recall");
-       case HOTKEY_ENDTURN: return _("End Turn");
-       case HOTKEY_TOGGLE_GRID: return _("Toggle Grid");
-       case HOTKEY_STATUS_TABLE: return _("Status Table");
-       case HOTKEY_MUTE: return _("Mute");
-       case HOTKEY_SPEAK: return _("Speak");
-       case HOTKEY_CREATE_UNIT: return _("Create Unit (Debug!)");
-       case HOTKEY_CHANGE_UNIT_SIDE: return _("Change Unit Side (Debug!)");
-       case HOTKEY_PREFERENCES: return _("Preferences");
-       case HOTKEY_OBJECTIVES: return _("Scenario Objectives");
-       case HOTKEY_UNIT_LIST: return _("Unit List");
-       case HOTKEY_STATISTICS: return _("Statistics");
-       case HOTKEY_QUIT_GAME: return _("Quit Game");
-       case HOTKEY_LABEL_TERRAIN: return _("Set Label");
-       case HOTKEY_SHOW_ENEMY_MOVES: return _("Show Enemy Moves");
-       case HOTKEY_BEST_ENEMY_MOVES: return _("Best Possible Enemy Moves");
-       case HOTKEY_EDIT_QUIT: return _("Quit Editor");
-       case HOTKEY_EDIT_NEW_MAP: return _("New Map");
-       case HOTKEY_EDIT_LOAD_MAP: return _("Load Map");
-       case HOTKEY_EDIT_SAVE_MAP: return _("Save Map");
-       case HOTKEY_EDIT_SAVE_AS: return _("Save As");
-       case HOTKEY_EDIT_SET_START_POS: return _("Set Player Start Position");
-       case HOTKEY_EDIT_FLOOD_FILL: return _("Flood Fill");
-       case HOTKEY_EDIT_FILL_SELECTION: return _("Fill Selection");
-       case HOTKEY_EDIT_CUT: return _("Cut");
-       case HOTKEY_EDIT_COPY: return _("Copy");
-       case HOTKEY_EDIT_PASTE: return _("Paste");
-       case HOTKEY_EDIT_REVERT: return _("Revert from Disk");
-       case HOTKEY_EDIT_RESIZE: return _("Resize Map");
-       case HOTKEY_EDIT_FLIP: return _("Flip Map");
-       case HOTKEY_EDIT_SELECT_ALL: return _("Select All");
-       case HOTKEY_EDIT_DRAW: return _("Draw Terrain");
-       case HOTKEY_DELAY_SHROUD: return _("Delay Shroud Updates");
-       case HOTKEY_UPDATE_SHROUD: return _("Update Shroud Now");
-       case HOTKEY_CONTINUE_MOVE: return _("Continue Move");
-       case HOTKEY_SEARCH: return _("Find Label or Unit");
-       case HOTKEY_SPEAK_ALLY: return _("Speak to Ally");
-       case HOTKEY_SPEAK_ALL: return _("Speak to All");
-       case HOTKEY_HELP: return _("Help");
-       case HOTKEY_CHAT_LOG: return _("View Chat Log");
-       default:
-         std::cerr << "\n command_to_description: No matching command 
found...";
-         return "";
-       }
 }
 
-
-hotkey_item::hotkey_item(const config& cfg) : lastres(false)
+void hotkey_item::load_from_config(const config& cfg)
 {
-       action = string_to_command(cfg["command"]);
-
        const std::string& code = cfg["key"];
        if(code.empty()) {
-               keycode = 0;
+               keycode_ = 0;
        } else if(code.size() >= 2 && tolower(code[0]) == 'f') {
                const int num = 
lexical_cast_default<int>(std::string(code.begin()+1,code.end()),1);
-               keycode = num + SDLK_F1 - 1;
-               std::cerr << "set key to F" << num << " = " << keycode << "\n";
+               keycode_ = num + SDLK_F1 - 1;
+               std::cerr << "set key to F" << num << " = " << keycode_ << "\n";
        } else {
-               keycode = code[0];
+               keycode_ = code[0];
        }
        
-       alt = (cfg["alt"] == "yes");
-       ctrl = (cfg["ctrl"] == "yes");
-       shift = (cfg["shift"] == "yes");
-       command = (cfg["cmd"] == "yes");
+       alt_ = (cfg["alt"] == "yes");
+       ctrl_ = (cfg["ctrl"] == "yes");
+       shift_ = (cfg["shift"] == "yes");
+       cmd_ = (cfg["cmd"] == "yes");
+}
+
+std::string hotkey_item::get_name() const 
+{
+       if (keycode_ != 0) {
+               std::stringstream str;                  
+               if (alt_)
+                       str << "alt+";
+               if (ctrl_)
+                       str << "ctrl+";
+               if (shift_)
+                       str << "shift+";
+               if (cmd_)
+                       str << "command+";
+
+               str << SDL_GetKeyName(SDLKey(keycode_));
+               return str.str();
+       } else {
+               return "";
+       }
 }
 
-bool operator==(const hotkey_item& a, const hotkey_item& b)
+void hotkey_item::set_key(int keycode, bool shift, bool ctrl, bool alt, bool 
cmd)
 {
-       return a.keycode == b.keycode && a.alt == b.alt &&
-              a.ctrl == b.ctrl && a.shift == b.shift && a.command == b.command;
+       keycode_ = keycode;
+       shift_ = shift;
+       ctrl_ = ctrl;
+       alt_ = alt;
+       cmd_ = cmd;
+}
+
+manager::manager() 
+{
+       hotkeys_.push_back(hotkey_item(HOTKEY_CYCLE_UNITS, "cycle", _("Next 
unit")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_END_UNIT_TURN, "endunitturn", 
_("End Unit Turn")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_LEADER, "leader", _("Leader")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_UNDO, "undo", _("Undo")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_REDO, "redo", _("Redo")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_ZOOM_IN, "zoomin", _("Zoom In")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_ZOOM_OUT, "zoomout", _("Zoom 
Out")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_ZOOM_DEFAULT, "zoomdefault", 
_("Default Zoom")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_FULLSCREEN, "fullscreen", 
_("Fullscreen")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_ACCELERATED, "accelerated", 
_("Accelerated")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_UNIT_DESCRIPTION, "describeunit", 
_("Unit Description")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_RENAME_UNIT, "renameunit", 
_("Rename Unit")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_SAVE_GAME, "save", _("Save 
Game")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_LOAD_GAME, "load", _("Load 
Game")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_RECRUIT, "recruit", 
_("Recruit")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_REPEAT_RECRUIT, "repeatrecruit", 
_("Repeat Recruit")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_RECALL, "recall", _("Recall")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_ENDTURN, "endturn", _("End 
Turn")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_TOGGLE_GRID, "togglegrid", 
_("Toggle Grid")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_STATUS_TABLE, "statustable", 
_("Status Table")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_MUTE, "mute", _("Mute")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_SPEAK, "speak", _("Speak")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_CREATE_UNIT, "createunit", 
_("Create Unit (Debug!)")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_CHANGE_UNIT_SIDE, "changeside", 
_("Change Unit Side (Debug!)")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_PREFERENCES, "preferences", 
_("Preferences")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_OBJECTIVES, "objectives", 
_("Scenario Objectives")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_UNIT_LIST, "unitlist", _("Unit 
List")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_STATISTICS, "statistics", 
_("Statistics")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_QUIT_GAME, "quit", _("Quit 
Game")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_LABEL_TERRAIN, "labelterrain", 
_("Set Label")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_SHOW_ENEMY_MOVES, 
"showenemymoves", _("Show Enemy Moves")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_BEST_ENEMY_MOVES, 
"bestenemymoves", _("Best Possible Enemy Moves")));
+
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_SET_TERRAIN, 
"editsetterrain", _("Set Terrain"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_QUIT, "editquit", _("Quit 
Editor"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_NEW_MAP, "editnewmap", 
_("New Map"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_LOAD_MAP, "editloadmap", 
_("Load Map"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_SAVE_MAP, "editsavemap", 
_("Save Map"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_SAVE_AS, "editsaveas", 
_("Save As"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_SET_START_POS, 
"editsetstartpos", _("Set Player Start Position"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_FLOOD_FILL, "editfloodfill", 
_("Flood Fill"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_FILL_SELECTION, 
"editfillselection", _("Fill Selection"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_CUT, "editcut", 
_("Cut"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_COPY, "editcopy", 
_("Copy"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_PASTE, "editpaste", 
_("Paste"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_REVERT, "editrevert", 
_("Revert from Disk"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_RESIZE, "editresize", 
_("Resize Map"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_FLIP, "editflip", _("Flip 
Map"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_SELECT_ALL, "editselectall", 
_("Select All"),true));
+       hotkeys_.push_back(hotkey_item(HOTKEY_EDIT_DRAW, "editdraw", _("Draw 
Terrain"),true));
+
+       hotkeys_.push_back(hotkey_item(HOTKEY_DELAY_SHROUD, "delayshroud", 
_("Delay Shroud Updates")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_UPDATE_SHROUD, "updateshroud", 
_("Update Shroud Now")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_CONTINUE_MOVE, "continue", 
_("Continue Move")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_SEARCH, "search", _("Find Label 
or Unit")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_SPEAK_ALLY, "speaktoally", 
_("Speak to Ally")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_SPEAK_ALL, "speaktoall", _("Speak 
to All")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_HELP, "help", _("Help")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_CHAT_LOG, "chatlog", _("View Chat 
Log")));
+       hotkeys_.push_back(hotkey_item(HOTKEY_USER_CMD, "command", _("Enter 
user command")));
 }
 
-bool operator!=(const hotkey_item& a, const hotkey_item& b)
+manager::~manager()
 {
-       return !(a == b);
-}
 
 }
 
-namespace {
-std::vector<hotkey::hotkey_item> hotkeys;
+void load_hotkeys(const config& cfg)
+{
+       const config::child_list& children = cfg.get_children("hotkey");
+       for(config::child_list::const_iterator i = children.begin(); i != 
children.end(); ++i) {
+               hotkey_item& h = get_hotkey((**i)["command"]);
 
+               if(h.get_id() != HOTKEY_NULL) {
+                       h.load_from_config(**i);
+               }
+       }
 }
 
-struct hotkey_pressed {
-       //this distinguishes between two modes of operation. If mods are 
disallowed,
-       //then any match must be exact. I.e. "shift+a" does not match "a". If 
they are allowed,
-       //then shift+a will match "a"
-       enum ALLOW_MOD_KEYS { DISALLOW_MODS, ALLOW_MODS };
-       hotkey_pressed(const SDL_KeyboardEvent& event, ALLOW_MOD_KEYS 
allow_mods=DISALLOW_MODS);
+void save_hotkeys(config& cfg)
+{
+       cfg.clear_children("hotkey");
 
-       bool operator()(const hotkey::hotkey_item& hk) const;
+       for(std::vector<hotkey_item>::iterator i = hotkeys_.begin(); i != 
hotkeys_.end(); ++i) {
+               if (i->hidden() || i->get_keycode() == 0)
+                       continue;
 
-private:
-       int keycode_;
-       bool shift_, ctrl_, alt_, command_;
-       bool mods_;
-};
+               config& item = cfg.add_child("hotkey");
 
-hotkey_pressed::hotkey_pressed(const SDL_KeyboardEvent& event, ALLOW_MOD_KEYS 
mods)
-       : keycode_(event.keysym.sym), shift_(event.keysym.mod&KMOD_SHIFT),
-         ctrl_(event.keysym.mod&KMOD_CTRL), alt_(event.keysym.mod&KMOD_ALT),
-                command_(event.keysym.mod&KMOD_LMETA), mods_(mods == 
ALLOW_MODS)
-{}
+               item["command"] = i->get_command();
 
-bool hotkey_pressed::operator()(const hotkey::hotkey_item& hk) const
-{
-       if(mods_) {
-               return hk.keycode == keycode_ && (shift_ == hk.shift || shift_ 
== true)
-                                             && (ctrl_ == hk.ctrl || ctrl_ == 
true)
-                                                                         && 
(alt_ == hk.alt || alt_ == true);
-       } else {
-               return hk.keycode == keycode_ && shift_ == hk.shift &&
-                      ctrl_ == hk.ctrl && alt_ == hk.alt && command_ == 
hk.command;
+               if(i->get_keycode() >= SDLK_F1 && i->get_keycode() <= SDLK_F12) 
{
+                       std::string str = "FF";
+                       str[1] = '1' + i->get_keycode() - SDLK_F1;
+                       item["key"] = str;
+               } else {
+                       item["key"] = i->get_keycode();
+               }
+
+               item["alt"] = i->get_alt() ? "yes" : "no";
+               item["ctrl"] = i->get_ctrl() ? "yes" : "no";
+               item["shift"] = i->get_shift() ? "yes" : "no";
+               item["cmd"] = i->get_cmd() ? "yes" : "no";
        }
 }
 
-namespace {
-
-void add_hotkey(const config& cfg,bool overwrite)
+hotkey_item& get_hotkey(HOTKEY_COMMAND id) 
 {
-       const hotkey::hotkey_item new_hotkey(cfg);
-       for(std::vector<hotkey::hotkey_item>::iterator i = hotkeys.begin();
-           i != hotkeys.end(); ++i) {
-               if(i->action == new_hotkey.action) {
-                 if(overwrite)
-                       *i = new_hotkey;        
-                 return;
-               }
+       std::vector<hotkey_item>::iterator itor;
+
+       for (itor = hotkeys_.begin(); itor != hotkeys_.end(); ++itor) {
+               if (itor->get_id() == id)
+                       break;
        }
-       hotkeys.push_back(new_hotkey);
-}
 
-}
+       if (itor == hotkeys_.end())
+               return null_hotkey_;
 
-namespace hotkey {
+       return *itor;
+}
 
-void change_hotkey(hotkey_item& item)
+hotkey_item& get_hotkey(const std::string& command) 
 {
-       for(std::vector<hotkey::hotkey_item>::iterator i =hotkeys.begin();
-               i!=hotkeys.end();i++)
-       {
-               if(item.action == i->action)
-                       *i = item;      
+       std::vector<hotkey_item>::iterator itor;
+
+       for (itor = hotkeys_.begin(); itor != hotkeys_.end(); ++itor) {
+               if (itor->get_command() == command)
+                       break;
        }
+
+       if (itor == hotkeys_.end())
+               return null_hotkey_;
+
+       return *itor;
 }
-       
-basic_handler::basic_handler(display* disp, command_executor* exec) : 
disp_(disp), exec_(exec) {}
 
-void basic_handler::handle_event(const SDL_Event& event)
+hotkey_item& get_hotkey(int keycode, bool shift, bool ctrl, bool alt, bool 
cmd, bool mods)
 {
-       if(event.type == SDL_KEYDOWN && disp_ != NULL) {
 
-               //if we're in a dialog we only want to handle things that are 
explicitly handled
-               //by the executor. If we're not in a dialog we can call the 
regular key event handler
-               if(!gui::in_dialog()) {
-                       key_event(*disp_,event.key,exec_);
-               } else if(exec_ != NULL) {
-                       key_event_execute(*disp_,event.key,exec_);
+       std::vector<hotkey_item>::iterator itor;
+
+       for (itor = hotkeys_.begin(); itor != hotkeys_.end(); ++itor) {
+               if(mods) {
+                       if(itor->get_keycode() == keycode 
+                                       && (shift == itor->get_shift() || shift 
== true)
+                                       && (ctrl == itor->get_ctrl() || ctrl == 
true)
+                                       && (alt == itor->get_alt() || alt == 
true)
+                                       && (cmd == itor->get_cmd() || cmd == 
true))
+                               break;
+               } else {
+                       if(itor->get_keycode() == keycode 
+                                       && shift == itor->get_shift() 
+                                       && ctrl == itor->get_ctrl() 
+                                       && alt == itor->get_alt() 
+                                       && cmd == itor->get_cmd())
+                               break;
                }
        }
+
+       if (itor == hotkeys_.end())
+               return null_hotkey_;
+
+       return *itor;
 }
 
-void add_hotkeys(config& cfg,bool overwrite)
+hotkey_item& get_hotkey(const SDL_KeyboardEvent& event, bool mods)
 {
-       const config::child_list& children = cfg.get_children("hotkey");
-       for(config::child_list::const_iterator i = children.begin(); i != 
children.end(); ++i) {
-         add_hotkey(**i,overwrite);
-       }
+       return get_hotkey(event.keysym.sym, 
+                       event.keysym.mod & KMOD_SHIFT, 
+                       event.keysym.mod & KMOD_CTRL, 
+                       event.keysym.mod & KMOD_ALT, 
+                       event.keysym.mod & KMOD_LMETA, 
+                       mods);
 }
 
-void save_hotkeys(config& cfg)
+hotkey_item& get_visible_hotkey(int index)
 {
-       const config::child_list children = cfg.get_children("hotkey");
-       for(std::vector<hotkey_item>::iterator i = hotkeys.begin(); i != 
hotkeys.end(); ++i) {
-               std::string action_name = command_to_string(i->action);
+       int counter = 0;
 
-               config* item = cfg.find_child("hotkey","command",action_name);
-               if(item == NULL)
-                       item = &cfg.add_child("hotkey");
+       std::vector<hotkey_item>::iterator itor;
+       for (itor = hotkeys_.begin(); itor != hotkeys_.end(); ++itor) {
+               if (itor->hidden())
+                       continue;
 
-               (*item)["command"] = action_name;
-
-               if(i->keycode >= SDLK_F1 && i->keycode <= SDLK_F12) {
-                       std::string str = "FF";
-                       str[1] = '1' + i->keycode - SDLK_F1;
-                       (*item)["key"] = str;
-               } else {
-                       (*item)["key"] = i->keycode;
-               }
+               if (index == counter)
+                       break;
 
-               (*item)["alt"] = (i->alt) ? "yes" : "no";
-               (*item)["ctrl"] = (i->ctrl) ? "yes" : "no";
-               (*item)["shift"] = (i->shift) ? "yes" : "no";
-               (*item)["cmd"] = (i->command) ? "yes" : "no";
+               counter++;
        }
+
+       if (itor == hotkeys_.end())
+               return null_hotkey_;
+
+       return *itor;
 }
 
 std::vector<hotkey_item>& get_hotkeys()
 {
-       return hotkeys;
+       return hotkeys_;
 }
 
-std::string get_hotkey_name(hotkey_item i)
+basic_handler::basic_handler(display* disp, command_executor* exec) : 
disp_(disp), exec_(exec) {}
+
+void basic_handler::handle_event(const SDL_Event& event)
 {
-       std::stringstream str;                  
-       if (i.alt)
-       str << "alt+";
-       if (i.ctrl)
-       str << "ctrl+";
-       if (i.shift)
-       str << "shift+";
-       str << SDL_GetKeyName(SDLKey(i.keycode));
-       return str.str();
+       if(event.type == SDL_KEYDOWN && disp_ != NULL) {
+
+               //if we're in a dialog we only want to handle things that are 
explicitly handled
+               //by the executor. If we're not in a dialog we can call the 
regular key event handler
+               if(!gui::in_dialog()) {
+                       key_event(*disp_,event.key,exec_);
+               } else if(exec_ != NULL) {
+                       key_event_execute(*disp_,event.key,exec_);
+               }
+       }
 }
 
+
 void key_event(display& disp, const SDL_KeyboardEvent& event, 
command_executor* executor)
 {
        if(event.keysym.sym == SDLK_ESCAPE && disp.in_game()) {
@@ -368,18 +325,17 @@
 
 void key_event_execute(display& disp, const SDL_KeyboardEvent& event, 
command_executor* executor)
 {
-       std::vector<hotkey_item>::iterator i = 
std::find_if(hotkeys.begin(),hotkeys.end(),hotkey_pressed(event));
+       const hotkey_item* hk = &get_hotkey(event);
 
-       if(i == hotkeys.end()) {
+       if(hk->null()) {
                //no matching hotkey was found, but try an in-exact match.
-               i = 
std::find_if(hotkeys.begin(),hotkeys.end(),hotkey_pressed(event,hotkey_pressed::ALLOW_MODS));
+               hk = &get_hotkey(event, true);
        }
 
-       if(i == hotkeys.end()) {
+       if(hk->null())
                return;
-       }
 
-       execute_command(disp,i->action,executor);
+       execute_command(disp,hk->get_id(),executor);
 }
 
 void execute_command(display& disp, HOTKEY_COMMAND command, command_executor* 
executor)
Index: wesnoth/src/hotkeys.hpp
diff -u wesnoth/src/hotkeys.hpp:1.51 wesnoth/src/hotkeys.hpp:1.52
--- wesnoth/src/hotkeys.hpp:1.51        Wed Aug 18 02:51:23 2004
+++ wesnoth/src/hotkeys.hpp     Sun Oct 31 18:48:07 2004
@@ -1,4 +1,4 @@
-/* $Id: hotkeys.hpp,v 1.51 2004/08/18 02:51:23 Sirp Exp $ */
+/* $Id: hotkeys.hpp,v 1.52 2004/10/31 18:48:07 gruikya Exp $ */
 /*
    Copyright (C) 2003 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
@@ -23,66 +23,92 @@
 //refers to a hotkey command being executed.
 namespace hotkey {
 
-enum HOTKEY_COMMAND { HOTKEY_CYCLE_UNITS, HOTKEY_END_UNIT_TURN, HOTKEY_LEADER,
-                      HOTKEY_UNDO, HOTKEY_REDO,
-                      HOTKEY_ZOOM_IN, HOTKEY_ZOOM_OUT, HOTKEY_ZOOM_DEFAULT,
-                      HOTKEY_FULLSCREEN, HOTKEY_ACCELERATED,
-                      HOTKEY_UNIT_DESCRIPTION, HOTKEY_RENAME_UNIT, 
HOTKEY_SAVE_GAME, HOTKEY_LOAD_GAME,
-                      HOTKEY_RECRUIT, HOTKEY_REPEAT_RECRUIT, HOTKEY_RECALL, 
HOTKEY_ENDTURN,
-                      HOTKEY_TOGGLE_GRID, HOTKEY_STATUS_TABLE, HOTKEY_MUTE,
-                                         HOTKEY_SPEAK, HOTKEY_CREATE_UNIT, 
HOTKEY_CHANGE_UNIT_SIDE, HOTKEY_PREFERENCES,
-                                         HOTKEY_OBJECTIVES, HOTKEY_UNIT_LIST, 
HOTKEY_STATISTICS, HOTKEY_QUIT_GAME,
-                      HOTKEY_LABEL_TERRAIN, HOTKEY_SHOW_ENEMY_MOVES, 
HOTKEY_BEST_ENEMY_MOVES,
-                                         HOTKEY_DELAY_SHROUD, 
HOTKEY_UPDATE_SHROUD, HOTKEY_CONTINUE_MOVE,
-                                         HOTKEY_SEARCH, HOTKEY_SPEAK_ALLY, 
HOTKEY_SPEAK_ALL, HOTKEY_HELP,
-                                         HOTKEY_CHAT_LOG,
-
-                                         //editing specific commands
-                                         HOTKEY_EDIT_SET_TERRAIN,
-                                         HOTKEY_EDIT_QUIT, 
HOTKEY_EDIT_SAVE_MAP, 
-                                         HOTKEY_EDIT_SAVE_AS, 
HOTKEY_EDIT_SET_START_POS,
-                                         HOTKEY_EDIT_NEW_MAP, 
HOTKEY_EDIT_LOAD_MAP, HOTKEY_EDIT_FLOOD_FILL,
-                                         HOTKEY_EDIT_FILL_SELECTION, 
HOTKEY_EDIT_CUT, HOTKEY_EDIT_COPY,
-                                         HOTKEY_EDIT_PASTE, 
HOTKEY_EDIT_REVERT, HOTKEY_EDIT_RESIZE,
-                                         HOTKEY_EDIT_FLIP, 
HOTKEY_EDIT_SELECT_ALL, HOTKEY_EDIT_DRAW,
-                      HOTKEY_USER_CMD,
-                                         HOTKEY_NULL };
-
-struct hotkey_item {
-       explicit hotkey_item(const config& cfg);
-
-       HOTKEY_COMMAND action;
-       int keycode;
-       bool alt, ctrl, shift, command;
-       mutable bool lastres;
+enum HOTKEY_COMMAND {
+       HOTKEY_CYCLE_UNITS, HOTKEY_END_UNIT_TURN, HOTKEY_LEADER,
+       HOTKEY_UNDO, HOTKEY_REDO,
+       HOTKEY_ZOOM_IN, HOTKEY_ZOOM_OUT, HOTKEY_ZOOM_DEFAULT,
+       HOTKEY_FULLSCREEN, HOTKEY_ACCELERATED,
+       HOTKEY_UNIT_DESCRIPTION, HOTKEY_RENAME_UNIT, HOTKEY_SAVE_GAME, 
HOTKEY_LOAD_GAME,
+       HOTKEY_RECRUIT, HOTKEY_REPEAT_RECRUIT, HOTKEY_RECALL, HOTKEY_ENDTURN,
+       HOTKEY_TOGGLE_GRID, HOTKEY_STATUS_TABLE, HOTKEY_MUTE,
+       HOTKEY_SPEAK, HOTKEY_CREATE_UNIT, HOTKEY_CHANGE_UNIT_SIDE, 
HOTKEY_PREFERENCES,
+       HOTKEY_OBJECTIVES, HOTKEY_UNIT_LIST, HOTKEY_STATISTICS, 
HOTKEY_QUIT_GAME,
+       HOTKEY_LABEL_TERRAIN, HOTKEY_SHOW_ENEMY_MOVES, HOTKEY_BEST_ENEMY_MOVES,
+       HOTKEY_DELAY_SHROUD, HOTKEY_UPDATE_SHROUD, HOTKEY_CONTINUE_MOVE,
+       HOTKEY_SEARCH, HOTKEY_SPEAK_ALLY, HOTKEY_SPEAK_ALL, HOTKEY_HELP,
+       HOTKEY_CHAT_LOG,
+
+       //editing specific commands
+       HOTKEY_EDIT_SET_TERRAIN,
+       HOTKEY_EDIT_QUIT, HOTKEY_EDIT_SAVE_MAP, 
+       HOTKEY_EDIT_SAVE_AS, HOTKEY_EDIT_SET_START_POS,
+       HOTKEY_EDIT_NEW_MAP, HOTKEY_EDIT_LOAD_MAP, HOTKEY_EDIT_FLOOD_FILL,
+       HOTKEY_EDIT_FILL_SELECTION, HOTKEY_EDIT_CUT, HOTKEY_EDIT_COPY,
+       HOTKEY_EDIT_PASTE, HOTKEY_EDIT_REVERT, HOTKEY_EDIT_RESIZE,
+       HOTKEY_EDIT_FLIP, HOTKEY_EDIT_SELECT_ALL, HOTKEY_EDIT_DRAW,
+       HOTKEY_USER_CMD,
+       HOTKEY_NULL 
 };
+
+class hotkey_item {
+public:
+       hotkey_item() : id_(HOTKEY_NULL) {};
+
+       hotkey_item(HOTKEY_COMMAND id, const std::string& command, const 
std::string& description, bool hidden=false);
+
+       HOTKEY_COMMAND get_id() const { return id_; };
+       const std::string& get_command() const { return command_; };
+       const std::string& get_description() const { return description_; };
+
+       void load_from_config(const config& cfg);
+
+       void set_key(int keycode, bool alt, bool ctrl, bool shift, bool cmd);
+
+       int get_keycode() const { return keycode_; };
+       bool get_alt() const { return alt_; };
+       bool get_ctrl() const { return ctrl_; };
+       bool get_shift() const { return shift_; };
+       bool get_cmd() const { return cmd_; };
        
-//function to load a hotkey configuration object. hotkey configuration objects
-//are a list of nodes that look like:
-//[hotkey]
-//command="cmd"
-//key="k"
-//ctrl=(yes|no)
-//alt=(yes|no)
-//shift=(yes|no)
-//[/hotkey]
-//where "cmd" is a command name, and "k" is a key. see hotkeys.cpp for the
-//valid command names.
-void add_hotkeys(config& cfg, bool overwrite);
+       // Return "name" of hotkey for example :"ctrl+alt+g"
+       std::string get_name() const;
 
-void change_hotkey(hotkey_item& item);
+       bool null() const { return id_ == HOTKEY_NULL; };
+       bool hidden() const { return hidden_; };
+private:
+       HOTKEY_COMMAND id_;
+       std::string command_;
+       std::string description_;
+
+       int keycode_;
+       bool shift_;
+       bool ctrl_;
+       bool alt_;
+       bool cmd_;
+       bool hidden_;
+};
 
+class manager {
+public:
+       manager();
+       ~manager();
+};
+
+void load_hotkeys(const config& cfg);
 void save_hotkeys(config& cfg);
 
-// return list of current hotkeys
-std::vector<hotkey_item>& get_hotkeys();
+hotkey_item& get_hotkey(HOTKEY_COMMAND id);
+hotkey_item& get_hotkey(const std::string& command);
+//the "mods" parameter distinguishes between two modes of operation. If mods
+//are disallowed (mods == false), then any match must be exact. I.e. "shift+a"
+//does not match "a". If they are allowed (mods == true), then shift+a will
+//match "a"
+hotkey_item& get_hotkey(int keycode, bool shift, bool ctrl, bool alt, bool 
cmd, bool mods = false);
+hotkey_item& get_hotkey(const SDL_KeyboardEvent& event, bool mods = false);
 
-// Return "name" of hotkey for example :"ctrl+alt+g"
-std::string get_hotkey_name(hotkey_item item);
+hotkey_item& get_visible_hotkey(int index);
 
-std::string command_to_string(const HOTKEY_COMMAND &command);
-HOTKEY_COMMAND string_to_command(const std::string& str);
-std::string command_to_description(const HOTKEY_COMMAND &command);
+std::vector<hotkey_item>& get_hotkeys();
 
 enum ACTION_STATE { ACTION_STATELESS, ACTION_ON, ACTION_OFF };
 
Index: wesnoth/src/playturn.cpp
diff -u wesnoth/src/playturn.cpp:1.282 wesnoth/src/playturn.cpp:1.283
--- wesnoth/src/playturn.cpp:1.282      Sun Oct 31 05:13:22 2004
+++ wesnoth/src/playturn.cpp    Sun Oct 31 18:48:07 2004
@@ -1,4 +1,4 @@
-/* $Id: playturn.cpp,v 1.282 2004/10/31 05:13:22 Sirp Exp $ */
+/* $Id: playturn.cpp,v 1.283 2004/10/31 18:48:07 gruikya Exp $ */
 /*
    Copyright (C) 2003 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
@@ -972,7 +972,7 @@
        struct cannot_execute {
                cannot_execute(const turn_info& info) : info_(info) {}
                bool operator()(const std::string& str) const {
-                       return 
!info_.can_execute_command(hotkey::string_to_command(str));
+                       return 
!info_.can_execute_command(hotkey::get_hotkey(str).get_id());
                }
        private:
                const turn_info& info_;
@@ -981,7 +981,7 @@
        struct not_in_context_menu {
                not_in_context_menu(const turn_info& info) : info_(info) {}
                bool operator()(const std::string& str) const {
-                       return 
!info_.in_context_menu(hotkey::string_to_command(str));
+                       return 
!info_.in_context_menu(hotkey::get_hotkey(str).get_id());
                }
        private:
                const turn_info& info_;
@@ -999,36 +999,24 @@
 
        //if just one item is passed in, that means we should execute that item
        if(items.size() == 1 && items_arg.size() == 1) {
-               
hotkey::execute_command(gui_,hotkey::string_to_command(items.front()),this);
+               
hotkey::execute_command(gui_,hotkey::get_hotkey(items.front()).get_id(),this);
                return;
        }
 
        bool has_image = false;
        std::vector<std::string> menu;
        for(std::vector<std::string>::const_iterator i = items.begin(); i != 
items.end(); ++i) {
-               const hotkey::HOTKEY_COMMAND cmd = 
hotkey::string_to_command(*i);
+               const hotkey::hotkey_item hk = hotkey::get_hotkey(*i);
+
                std::stringstream str;
                //see if this menu item has an associated image
-               std::string img(get_menu_image(cmd));
+               std::string img(get_menu_image(hk.get_id()));
                if(img.empty() == false) {
                        has_image = true;
                        str << '&' << img << ',';
                }
                
-               str << 
hotkey::command_to_description(hotkey::string_to_command(*i));
-               
-               //see if this menu item has an associated hotkey
-               const std::vector<hotkey::hotkey_item>& hotkeys = 
hotkey::get_hotkeys();
-               std::vector<hotkey::hotkey_item>::const_iterator hk;
-               for(hk = hotkeys.begin(); hk != hotkeys.end(); ++hk) {
-                       if(hk->action == cmd) {
-                               break;
-                       }
-               }
-
-               if(hk != hotkeys.end()) {
-                       str << "," << hotkey::get_hotkey_name(*hk);
-               }
+               str << hk.get_description() << "," << hk.get_name();
 
                menu.push_back(str.str());
        }
@@ -1044,7 +1032,7 @@
        if(res < 0 || res >= items.size())
                return;
 
-       const hotkey::HOTKEY_COMMAND cmd = 
hotkey::string_to_command(items[res]);
+       const hotkey::HOTKEY_COMMAND cmd = 
hotkey::get_hotkey(items[res]).get_id();
        hotkey::execute_command(gui_,cmd,this);
 }
 
Index: wesnoth/src/preferences.cpp
diff -u wesnoth/src/preferences.cpp:1.117 wesnoth/src/preferences.cpp:1.118
--- wesnoth/src/preferences.cpp:1.117   Fri Oct 29 19:53:22 2004
+++ wesnoth/src/preferences.cpp Sun Oct 31 18:48:07 2004
@@ -1,4 +1,4 @@
-/* $Id: preferences.cpp,v 1.117 2004/10/29 19:53:22 ydirson Exp $ */
+/* $Id: preferences.cpp,v 1.118 2004/10/31 18:48:07 gruikya Exp $ */
 /*
    Copyright (C) 2003 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
@@ -98,7 +98,7 @@
 {
        disp = d;
 
-       hotkey::add_hotkeys(prefs,true);
+       hotkey::load_hotkeys(prefs);
 
        set_grid(grid());
        set_turbo(turbo());
@@ -1051,13 +1051,15 @@
 
        std::vector<std::string> menu_items;
 
-       std::vector<hotkey::hotkey_item> hotkeys = hotkey::get_hotkeys();
+       std::vector<hotkey::hotkey_item>& hotkeys = hotkey::get_hotkeys();
        for(std::vector<hotkey::hotkey_item>::iterator i = hotkeys.begin(); i 
!= hotkeys.end(); ++i) {
+               if(i->hidden())
+                       continue;
                std::stringstream str,name;
-               name<< hotkey::command_to_description(i->action);
+               name << i->get_description();
                str << name.str();
                str << ",  :  ,";
-               str << hotkey::get_hotkey_name(*i); 
+               str << i->get_name();
                menu_items.push_back (str.str ());
        }
 
@@ -1125,32 +1127,22 @@
                        } while (event.type!=SDL_KEYUP);
                        restorer.restore();
                        disp.update_display();
-                       for (std::vector < hotkey::hotkey_item >::iterator i =
-                       hotkeys.begin (); i != hotkeys.end (); i++)
-                       { 
-                               if((i->keycode == key) 
-                                       && (i->alt == ((mod&KMOD_ALT) != 0))
-                                       && (i->ctrl == ((mod&KMOD_CTRL) != 0))
-                                       && (i->shift == ((mod&KMOD_SHIFT) != 0))
-                                       && (i->command == ((mod&KMOD_LMETA) != 
0))) {
-                                       used = true;
-                               }
-                       }
-                       if(used) {
+
+                       const hotkey::hotkey_item& oldhk = 
hotkey::get_hotkey(key, mod & KMOD_SHIFT, 
+                                       mod & KMOD_CTRL, mod & KMOD_ALT, mod & 
KMOD_LMETA);
+                       hotkey::hotkey_item& newhk = 
hotkey::get_visible_hotkey(menu_.selection());
+
+                       if(oldhk.get_id() != newhk.get_id() && !oldhk.null()) {
                                gui::show_dialog(disp,NULL,"",_("This HotKey is 
already in use."),gui::MESSAGE);
                        } else {
-                               hotkeys[menu_.selection()].alt =  
((mod&KMOD_ALT) != 0);
-                               hotkeys[menu_.selection()].ctrl = 
((mod&KMOD_CTRL) != 0);
-                               hotkeys[menu_.selection()].shift = 
((mod&KMOD_SHIFT) != 0);
-                               hotkeys[menu_.selection()].command = 
((mod&KMOD_LMETA) != 0);
-                               hotkeys[menu_.selection()].keycode = key;
-                               
hotkey::change_hotkey(hotkeys[menu_.selection()]);
-                               menu_.change_item(menu_.selection(),2,
-                                                       
hotkey::get_hotkey_name(hotkeys[menu_.selection()]));
+                               newhk.set_key(key, mod & KMOD_SHIFT, 
+                                               mod & KMOD_CTRL, mod & 
KMOD_ALT, mod & KMOD_LMETA);
+
+                               menu_.change_item(menu_.selection(), 2, 
newhk.get_name());
                        };
                        redraw_all = true;
                }
-               if (save_button.process (mousex, mousey, left_button))
+               if (save_button.process(mousex, mousey, left_button))
                {
                        if (save_config == NULL) {
                                hotkey::save_hotkeys(prefs);
@@ -1161,7 +1153,7 @@
                        redraw_all = true;
                }
 
-               menu_.process (mousex, mousey, left_button, false,
+               menu_.process(mousex, mousey, left_button, false,
                               false, false, false);
 
                events::pump();




reply via email to

[Prev in Thread] Current Thread [Next in Thread]