@@ -86,8 +86,6 @@ GUIKeyChangeMenu::GUIKeyChangeMenu(gui::IGUIEnvironment* env,
86
86
GUIModalMenu(env, parent, id, menumgr)
87
87
{
88
88
init_keys ();
89
- for (key_setting *ks : key_settings)
90
- key_used.push_back (ks->key );
91
89
}
92
90
93
91
GUIKeyChangeMenu::~GUIKeyChangeMenu ()
@@ -112,6 +110,7 @@ void GUIKeyChangeMenu::removeChildren()
112
110
for (gui::IGUIElement *i : children_copy) {
113
111
i->remove ();
114
112
}
113
+ key_used_text = nullptr ;
115
114
}
116
115
117
116
void GUIKeyChangeMenu::regenerateGui (v2u32 screensize)
@@ -246,7 +245,13 @@ void GUIKeyChangeMenu::drawMenu()
246
245
bool GUIKeyChangeMenu::acceptInput ()
247
246
{
248
247
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 );
250
255
}
251
256
252
257
{
@@ -274,81 +279,75 @@ bool GUIKeyChangeMenu::acceptInput()
274
279
275
280
bool GUIKeyChangeMenu::resetMenu ()
276
281
{
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 ;
288
287
return false ;
289
288
}
290
289
return true ;
291
290
}
292
291
bool GUIKeyChangeMenu::OnEvent (const SEvent& event)
293
292
{
294
- if (event.EventType == EET_KEY_INPUT_EVENT && activeKey >= 0
293
+ if (event.EventType == EET_KEY_INPUT_EVENT && active_key
295
294
&& event.KeyInput .PressedDown ) {
296
295
297
296
bool prefer_character = shift_down;
298
297
KeyPress kp (event.KeyInput , prefer_character);
299
298
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
+
300
304
bool shift_went_down = false ;
301
305
if (!shift_down &&
302
306
(event.KeyInput .Key == irr::KEY_SHIFT ||
303
307
event.KeyInput .Key == irr::KEY_LSHIFT ||
304
308
event.KeyInput .Key == irr::KEY_RSHIFT))
305
309
shift_went_down = true ;
306
310
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
- }
313
311
// 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 );
317
324
rect += v2s32 (0 , 0 ) + v2s32 (25 , 30 );
318
325
const wchar_t *text = wgettext (" Key already in use" );
319
326
this ->key_used_text = Environment->addStaticText (text,
320
327
rect, false , true , this , -1 );
321
328
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 ;
323
332
}
324
333
325
334
// But go on
326
335
{
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);
338
339
delete[] text;
339
340
340
- this ->key_used .push_back (kp);
341
-
342
341
// Allow characters made with shift
343
- if (shift_went_down){
342
+ if (shift_went_down){
344
343
shift_down = true ;
345
344
return false ;
346
345
}
347
346
348
- activeKey = - 1 ;
347
+ active_key = nullptr ;
349
348
return true ;
350
349
}
351
- } else if (event.EventType == EET_KEY_INPUT_EVENT && activeKey < 0
350
+ } else if (event.EventType == EET_KEY_INPUT_EVENT && !active_key
352
351
&& event.KeyInput .PressedDown
353
352
&& event.KeyInput .Key == irr::KEY_ESCAPE) {
354
353
quitMenu ();
@@ -377,24 +376,19 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
377
376
quitMenu ();
378
377
return true ;
379
378
default :
380
- key_setting *k = NULL ;
381
-
379
+ resetMenu ();
382
380
for (key_setting *ks : key_settings) {
383
381
if (ks->id == event.GUIEvent .Caller ->getID ()) {
384
- k = ks;
382
+ active_key = ks;
385
383
break ;
386
384
}
387
385
}
388
- FATAL_ERROR_IF (k == NULL , " Key setting not found" );
386
+ FATAL_ERROR_IF (!active_key , " Key setting not found" );
389
387
390
- resetMenu ();
391
388
shift_down = false ;
392
- activeKey = event.GUIEvent .Caller ->getID ();
393
389
const wchar_t *text = wgettext (" press key" );
394
- k ->button ->setText (text);
390
+ active_key ->button ->setText (text);
395
391
delete[] text;
396
- this ->key_used .erase (std::remove (this ->key_used .begin (),
397
- this ->key_used .end (), k->key ), this ->key_used .end ());
398
392
break ;
399
393
}
400
394
Environment->setFocus (this );
0 commit comments