Skip to content

Commit ee7d357

Browse files
authoredFeb 14, 2020
Key settings: Clear with escape (#8282)
Key ESCAPE -> Cancel change Key DELETE -> Remove entry
1 parent 71899e1 commit ee7d357

File tree

2 files changed

+45
-52
lines changed

2 files changed

+45
-52
lines changed
 

‎src/gui/guiKeyChangeMenu.cpp

+44-50
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ GUIKeyChangeMenu::GUIKeyChangeMenu(gui::IGUIEnvironment* env,
8686
GUIModalMenu(env, parent, id, menumgr)
8787
{
8888
init_keys();
89-
for (key_setting *ks : key_settings)
90-
key_used.push_back(ks->key);
9189
}
9290

9391
GUIKeyChangeMenu::~GUIKeyChangeMenu()
@@ -112,6 +110,7 @@ void GUIKeyChangeMenu::removeChildren()
112110
for (gui::IGUIElement *i : children_copy) {
113111
i->remove();
114112
}
113+
key_used_text = nullptr;
115114
}
116115

117116
void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
@@ -246,7 +245,13 @@ void GUIKeyChangeMenu::drawMenu()
246245
bool GUIKeyChangeMenu::acceptInput()
247246
{
248247
for (key_setting *k : key_settings) {
249-
g_settings->set(k->setting_name, k->key.sym());
248+
std::string default_key;
249+
g_settings->getDefaultNoEx(k->setting_name, default_key);
250+
251+
if (k->key.sym() != default_key)
252+
g_settings->set(k->setting_name, k->key.sym());
253+
else
254+
g_settings->remove(k->setting_name);
250255
}
251256

252257
{
@@ -274,81 +279,75 @@ bool GUIKeyChangeMenu::acceptInput()
274279

275280
bool GUIKeyChangeMenu::resetMenu()
276281
{
277-
if (activeKey >= 0)
278-
{
279-
for (key_setting *k : key_settings) {
280-
if (k->id == activeKey) {
281-
const wchar_t *text = wgettext(k->key.name());
282-
k->button->setText(text);
283-
delete[] text;
284-
break;
285-
}
286-
}
287-
activeKey = -1;
282+
if (active_key) {
283+
const wchar_t *text = wgettext(active_key->key.name());
284+
active_key->button->setText(text);
285+
delete[] text;
286+
active_key = nullptr;
288287
return false;
289288
}
290289
return true;
291290
}
292291
bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
293292
{
294-
if (event.EventType == EET_KEY_INPUT_EVENT && activeKey >= 0
293+
if (event.EventType == EET_KEY_INPUT_EVENT && active_key
295294
&& event.KeyInput.PressedDown) {
296295

297296
bool prefer_character = shift_down;
298297
KeyPress kp(event.KeyInput, prefer_character);
299298

299+
if (event.KeyInput.Key == irr::KEY_DELETE)
300+
kp = KeyPress(""); // To erase key settings
301+
else if (event.KeyInput.Key == irr::KEY_ESCAPE)
302+
kp = active_key->key; // Cancel
303+
300304
bool shift_went_down = false;
301305
if(!shift_down &&
302306
(event.KeyInput.Key == irr::KEY_SHIFT ||
303307
event.KeyInput.Key == irr::KEY_LSHIFT ||
304308
event.KeyInput.Key == irr::KEY_RSHIFT))
305309
shift_went_down = true;
306310

307-
// Remove Key already in use message
308-
if(this->key_used_text)
309-
{
310-
this->key_used_text->remove();
311-
this->key_used_text = NULL;
312-
}
313311
// Display Key already in use message
314-
if (std::find(this->key_used.begin(), this->key_used.end(), kp) != this->key_used.end())
315-
{
316-
core::rect < s32 > rect(0, 0, 600, 40);
312+
bool key_in_use = false;
313+
if (strcmp(kp.sym(), "") != 0) {
314+
for (key_setting *ks : key_settings) {
315+
if (ks != active_key && ks->key == kp) {
316+
key_in_use = true;
317+
break;
318+
}
319+
}
320+
}
321+
322+
if (key_in_use && !this->key_used_text) {
323+
core::rect<s32> rect(0, 0, 600, 40);
317324
rect += v2s32(0, 0) + v2s32(25, 30);
318325
const wchar_t *text = wgettext("Key already in use");
319326
this->key_used_text = Environment->addStaticText(text,
320327
rect, false, true, this, -1);
321328
delete[] text;
322-
//infostream << "Key already in use" << std::endl;
329+
} else if (!key_in_use && this->key_used_text) {
330+
this->key_used_text->remove();
331+
this->key_used_text = nullptr;
323332
}
324333

325334
// But go on
326335
{
327-
key_setting *k = NULL;
328-
for (key_setting *ks : key_settings) {
329-
if (ks->id == activeKey) {
330-
k = ks;
331-
break;
332-
}
333-
}
334-
FATAL_ERROR_IF(k == NULL, "Key setting not found");
335-
k->key = kp;
336-
const wchar_t *text = wgettext(k->key.name());
337-
k->button->setText(text);
336+
active_key->key = kp;
337+
const wchar_t *text = wgettext(kp.name());
338+
active_key->button->setText(text);
338339
delete[] text;
339340

340-
this->key_used.push_back(kp);
341-
342341
// Allow characters made with shift
343-
if(shift_went_down){
342+
if (shift_went_down){
344343
shift_down = true;
345344
return false;
346345
}
347346

348-
activeKey = -1;
347+
active_key = nullptr;
349348
return true;
350349
}
351-
} else if (event.EventType == EET_KEY_INPUT_EVENT && activeKey < 0
350+
} else if (event.EventType == EET_KEY_INPUT_EVENT && !active_key
352351
&& event.KeyInput.PressedDown
353352
&& event.KeyInput.Key == irr::KEY_ESCAPE) {
354353
quitMenu();
@@ -377,24 +376,19 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
377376
quitMenu();
378377
return true;
379378
default:
380-
key_setting *k = NULL;
381-
379+
resetMenu();
382380
for (key_setting *ks : key_settings) {
383381
if (ks->id == event.GUIEvent.Caller->getID()) {
384-
k = ks;
382+
active_key = ks;
385383
break;
386384
}
387385
}
388-
FATAL_ERROR_IF(k == NULL, "Key setting not found");
386+
FATAL_ERROR_IF(!active_key, "Key setting not found");
389387

390-
resetMenu();
391388
shift_down = false;
392-
activeKey = event.GUIEvent.Caller->getID();
393389
const wchar_t *text = wgettext("press key");
394-
k->button->setText(text);
390+
active_key->button->setText(text);
395391
delete[] text;
396-
this->key_used.erase(std::remove(this->key_used.begin(),
397-
this->key_used.end(), k->key), this->key_used.end());
398392
break;
399393
}
400394
Environment->setFocus(this);

‎src/gui/guiKeyChangeMenu.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,8 @@ class GUIKeyChangeMenu : public GUIModalMenu
7070
void add_key(int id, const wchar_t *button_name, const std::string &setting_name);
7171

7272
bool shift_down = false;
73-
s32 activeKey = -1;
7473

75-
std::vector<KeyPress> key_used;
74+
key_setting *active_key = nullptr;
7675
gui::IGUIStaticText *key_used_text = nullptr;
7776
std::vector<key_setting *> key_settings;
7877
};

0 commit comments

Comments
 (0)
Please sign in to comment.