Skip to content

Commit 5950eeb

Browse files
committed
(Yona-TYT) add API for script to query command keys
git-svn-id: svn://tron.homeunix.org/simutrans/simutrans/trunk@11896 8aca7d54-2c30-db11-9de9-000461428c89
1 parent e0c51bf commit 5950eeb

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

src/simutrans/script/api/api_scenario.cc

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "../../utils/simstring.h"
1717

1818
#include "../../simintr.h"
19+
#include "../../simevent.h"
1920

2021
using namespace script_api;
2122

@@ -56,6 +57,93 @@ static plainstring koord3d_to_string_intern(koord3d k)
5657
return k.get_str();
5758
}
5859

60+
static plainstring get_tool_key_intern(uint16 tool_id)
61+
{
62+
vector_tpl<tool_t *> *tool_list;
63+
uint16 category = tool_id & 0xF000;
64+
uint16 local_id = tool_id & 0x0FFF;
65+
66+
switch (category) {
67+
case GENERAL_TOOL:
68+
tool_list = &tool_t::general_tool;
69+
break;
70+
case SIMPLE_TOOL:
71+
tool_list = &tool_t::simple_tool;
72+
break;
73+
case DIALOGE_TOOL:
74+
tool_list = &tool_t::dialog_tool;
75+
break;
76+
case TOOLBAR_TOOL:
77+
return "";
78+
default:
79+
return "";
80+
}
81+
if (!tool_list || local_id >= tool_list->get_count()) {
82+
return "";
83+
}
84+
85+
tool_t *tool = (*tool_list)[local_id];
86+
if (!tool) {
87+
return "";
88+
}
89+
90+
// just to save some typing ...
91+
const uint16 key = tool->command_key;
92+
93+
// no binding => finish
94+
if (key == 0 || key == 0xFFFF) {
95+
return "";
96+
}
97+
98+
char mod[2];
99+
mod[0] = tool->command_flags == 2 ? '+' : (tool->command_flags == 1 ? '^' : 0);
100+
mod[1] = 0;
101+
102+
// keypad
103+
if (key >= SIM_KEYCODE_NUMPAD_BASE && key < SIM_KEYCODE_NUMPAD_BASE + 10) {
104+
char str[8];
105+
sprintf(str, "%sNUM_%d", mod, key - SIM_KEYCODE_NUMPAD_BASE);
106+
return str;
107+
}
108+
109+
// function keys
110+
if (key >= SIM_KEYCODE_F1 && key <= SIM_KEYCODE_F15) {
111+
char str[8];
112+
sprintf(str, "%sF%d", mod, key - SIM_KEYCODE_F1 + 1);
113+
return str;
114+
}
115+
116+
// speacial keys
117+
switch (key) {
118+
case ',': return "COMMA";
119+
// case SIM_KEYCODE_SCROLLLOCK: return "SCROLLLOCK";
120+
case SIM_KEYCODE_PAUSE: return "PAUSE";
121+
case SIM_KEYCODE_HOME: return "HOME";
122+
case SIM_KEYCODE_END: return "END";
123+
case SIM_KEYCODE_SPACE: return "SPACE";
124+
case SIM_KEYCODE_ESCAPE: return "ESC";
125+
case SIM_KEYCODE_DELETE: return "DELETE";
126+
case SIM_KEYCODE_BACKSPACE: return "BACKSPACE";
127+
}
128+
129+
if (key < 32) {
130+
char str[6];
131+
sprintf(str, "^%c", key + 64);
132+
return str;
133+
}
134+
135+
if (key < 127) {
136+
char str[2];
137+
str[0] = key;
138+
str[1] = 0;
139+
return str;
140+
}
141+
142+
char str[10];
143+
sprintf(str, "%s#%d", mod, key);
144+
return str;
145+
}
146+
59147
void export_string_methods(HSQUIRRELVM vm)
60148
{
61149
/**
@@ -114,6 +202,16 @@ void export_string_methods(HSQUIRRELVM vm)
114202
* @returns time difference using the current local setting
115203
*/
116204
register_method(vm, &difftick_to_string_intern, "difftick_to_string");
205+
206+
/**
207+
* Gets the tool_key (shortcut key) associated with a general tool by its ID.
208+
* The ID corresponds to the index used in menuconf.tab (e.g. 0 = query tool, 1 = remover, etc.).
209+
* Returns the hotkey as a string (e.g. "r", "M", "COMMA, "^s, "+F10", "#1234") without quotation marks
210+
* or an empty string if there is no hotkey or invalid ID.
211+
* @param tool_id the numeric ID of the general tool (as defined in menuconf.tab)
212+
* @returns a string representing the hotkey, or empty if none or invalid
213+
*/
214+
register_method(vm, &get_tool_key_intern, "get_tool_key");
117215
}
118216

119217

0 commit comments

Comments
 (0)