1
0
Fork 0

(svn r25092) -Codechange: Deduplicate keyboard handling between console and editboxes.

release/1.4
frosch 2013-03-17 13:05:45 +00:00
parent 1ddf5a0786
commit c2c50b0c50
6 changed files with 71 additions and 106 deletions

View File

@ -290,46 +290,13 @@ struct IConsoleWindow : Window
MarkWholeScreenDirty(); MarkWholeScreenDirty();
break; break;
#ifdef WITH_COCOA
case (WKC_META | 'V'):
#endif
case (WKC_CTRL | 'V'):
if (_iconsole_cmdline.InsertClipboard()) {
IConsoleResetHistoryPos();
this->SetDirty();
}
break;
case (WKC_CTRL | 'L'): case (WKC_CTRL | 'L'):
IConsoleCmdExec("clear"); IConsoleCmdExec("clear");
break; break;
#ifdef WITH_COCOA
case (WKC_META | 'U'):
#endif
case (WKC_CTRL | 'U'):
_iconsole_cmdline.DeleteAll();
this->SetDirty();
break;
case WKC_BACKSPACE: case WKC_DELETE:
if (_iconsole_cmdline.DeleteChar(keycode)) {
IConsoleResetHistoryPos();
this->SetDirty();
}
break;
case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
if (_iconsole_cmdline.MovePos(keycode)) {
IConsoleResetHistoryPos();
this->SetDirty();
}
break;
default: default:
if (IsValidChar(key, CS_ALPHANUMERAL)) { if (_iconsole_cmdline.HandleKeyPress(key, keycode) != HKPR_NOT_HANDLED) {
IConsoleWindow::scroll = 0; IConsoleWindow::scroll = 0;
_iconsole_cmdline.InsertChar(key);
IConsoleResetHistoryPos(); IConsoleResetHistoryPos();
this->SetDirty(); this->SetDirty();
} else { } else {

View File

@ -725,56 +725,6 @@ void GuiShowTooltips(Window *parent, StringID str, uint paramcount, const uint64
new TooltipsWindow(parent, str, paramcount, params, close_tooltip); new TooltipsWindow(parent, str, paramcount, params, close_tooltip);
} }
HandleEditBoxResult QueryString::HandleEditBoxKey(Window *w, int wid, uint16 key, uint16 keycode, EventState &state)
{
if (!w->IsWidgetGloballyFocused(wid)) return HEBR_NOT_FOCUSED;
state = ES_HANDLED;
bool edited = false;
switch (keycode) {
case WKC_ESC: return HEBR_CANCEL;
case WKC_RETURN: case WKC_NUM_ENTER: return HEBR_CONFIRM;
#ifdef WITH_COCOA
case (WKC_META | 'V'):
#endif
case (WKC_CTRL | 'V'):
edited = this->text.InsertClipboard();
break;
#ifdef WITH_COCOA
case (WKC_META | 'U'):
#endif
case (WKC_CTRL | 'U'):
this->text.DeleteAll();
edited = true;
break;
case WKC_BACKSPACE: case WKC_DELETE:
case WKC_CTRL | WKC_BACKSPACE: case WKC_CTRL | WKC_DELETE:
edited = this->text.DeleteChar(keycode);
break;
case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
case WKC_CTRL | WKC_LEFT: case WKC_CTRL | WKC_RIGHT:
this->text.MovePos(keycode);
break;
default:
if (IsValidChar(key, this->text.afilter)) {
edited = this->text.InsertChar(key);
} else {
state = ES_NOT_HANDLED;
}
break;
}
return edited ? HEBR_EDITING : HEBR_CURSOR;
}
void QueryString::HandleEditBox(Window *w, int wid) void QueryString::HandleEditBox(Window *w, int wid)
{ {
if (w->IsWidgetGloballyFocused(wid) && this->text.HandleCaret()) { if (w->IsWidgetGloballyFocused(wid) && this->text.HandleCaret()) {

View File

@ -16,18 +16,6 @@
#include "textbuf_gui.h" #include "textbuf_gui.h"
#include "window_gui.h" #include "window_gui.h"
/**
* Return values for HandleEditBoxKey
*/
enum HandleEditBoxResult
{
HEBR_EDITING, ///< Editbox content changed.
HEBR_CURSOR, ///< Non-text change, e.g. cursor position.
HEBR_CONFIRM, ///< Return or enter key pressed.
HEBR_CANCEL, ///< Escape key pressed.
HEBR_NOT_FOCUSED, ///< Edit box widget not focused.
};
/** /**
* Data stored about a string that can be modified in the GUI * Data stored about a string that can be modified in the GUI
*/ */
@ -65,7 +53,6 @@ public:
void DrawEditBox(const Window *w, int wid) const; void DrawEditBox(const Window *w, int wid) const;
void ClickEditBox(Window *w, Point pt, int wid, int click_count, bool focus_changed); void ClickEditBox(Window *w, Point pt, int wid, int click_count, bool focus_changed);
void HandleEditBox(Window *w, int wid); void HandleEditBox(Window *w, int wid);
HandleEditBoxResult HandleEditBoxKey(Window *w, int wid, uint16 key, uint16 keycode, EventState &state);
}; };
void ShowOnScreenKeyboard(Window *parent, int button); void ShowOnScreenKeyboard(Window *parent, int button);

View File

@ -450,3 +450,49 @@ bool Textbuf::HandleCaret()
} }
return false; return false;
} }
HandleKeyPressResult Textbuf::HandleKeyPress(uint16 key, uint16 keycode)
{
bool edited = false;
switch (keycode) {
case WKC_ESC: return HKPR_CANCEL;
case WKC_RETURN: case WKC_NUM_ENTER: return HKPR_CONFIRM;
#ifdef WITH_COCOA
case (WKC_META | 'V'):
#endif
case (WKC_CTRL | 'V'):
edited = this->InsertClipboard();
break;
#ifdef WITH_COCOA
case (WKC_META | 'U'):
#endif
case (WKC_CTRL | 'U'):
this->DeleteAll();
edited = true;
break;
case WKC_BACKSPACE: case WKC_DELETE:
case WKC_CTRL | WKC_BACKSPACE: case WKC_CTRL | WKC_DELETE:
edited = this->DeleteChar(keycode);
break;
case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
case WKC_CTRL | WKC_LEFT: case WKC_CTRL | WKC_RIGHT:
this->MovePos(keycode);
break;
default:
if (IsValidChar(key, this->afilter)) {
edited = this->InsertChar(key);
} else {
return HKPR_NOT_HANDLED;
}
break;
}
return edited ? HKPR_EDITING : HKPR_CURSOR;
}

View File

@ -15,6 +15,18 @@
#include "string_type.h" #include "string_type.h"
#include "strings_type.h" #include "strings_type.h"
/**
* Return values for Textbuf::HandleKeypress
*/
enum HandleKeyPressResult
{
HKPR_EDITING, ///< Textbuf content changed.
HKPR_CURSOR, ///< Non-text change, e.g. cursor position.
HKPR_CONFIRM, ///< Return or enter key pressed.
HKPR_CANCEL, ///< Escape key pressed.
HKPR_NOT_HANDLED, ///< Key does not affect editboxes.
};
/** Helper/buffer for input fields. */ /** Helper/buffer for input fields. */
struct Textbuf { struct Textbuf {
CharSetFilter afilter; ///< Allowed characters CharSetFilter afilter; ///< Allowed characters
@ -43,6 +55,8 @@ struct Textbuf {
bool DeleteChar(uint16 keycode); bool DeleteChar(uint16 keycode);
bool MovePos(uint16 keycode); bool MovePos(uint16 keycode);
HandleKeyPressResult HandleKeyPress(uint16 key, uint16 keycode);
bool HandleCaret(); bool HandleCaret();
void UpdateSize(); void UpdateSize();

View File

@ -2250,26 +2250,24 @@ static bool MaybeBringWindowToFront(Window *w)
*/ */
EventState Window::HandleEditBoxKey(int wid, uint16 key, uint16 keycode) EventState Window::HandleEditBoxKey(int wid, uint16 key, uint16 keycode)
{ {
EventState state = ES_NOT_HANDLED;
QueryString *query = this->GetQueryString(wid); QueryString *query = this->GetQueryString(wid);
if (query == NULL) return state; if (query == NULL) return ES_NOT_HANDLED;
int action = QueryString::ACTION_NOTHING; int action = QueryString::ACTION_NOTHING;
switch (query->HandleEditBoxKey(this, wid, key, keycode, state)) { switch (query->text.HandleKeyPress(key, keycode)) {
case HEBR_EDITING: case HKPR_EDITING:
this->SetWidgetDirty(wid); this->SetWidgetDirty(wid);
this->OnEditboxChanged(wid); this->OnEditboxChanged(wid);
break; break;
case HEBR_CURSOR: case HKPR_CURSOR:
this->SetWidgetDirty(wid); this->SetWidgetDirty(wid);
/* For the OSK also invalidate the parent window */ /* For the OSK also invalidate the parent window */
if (this->window_class == WC_OSK) this->InvalidateData(); if (this->window_class == WC_OSK) this->InvalidateData();
break; break;
case HEBR_CONFIRM: case HKPR_CONFIRM:
if (this->window_class == WC_OSK) { if (this->window_class == WC_OSK) {
this->OnClick(Point(), WID_OSK_OK, 1); this->OnClick(Point(), WID_OSK_OK, 1);
} else if (query->ok_button >= 0) { } else if (query->ok_button >= 0) {
@ -2279,7 +2277,7 @@ EventState Window::HandleEditBoxKey(int wid, uint16 key, uint16 keycode)
} }
break; break;
case HEBR_CANCEL: case HKPR_CANCEL:
if (this->window_class == WC_OSK) { if (this->window_class == WC_OSK) {
this->OnClick(Point(), WID_OSK_CANCEL, 1); this->OnClick(Point(), WID_OSK_CANCEL, 1);
} else if (query->cancel_button >= 0) { } else if (query->cancel_button >= 0) {
@ -2289,6 +2287,9 @@ EventState Window::HandleEditBoxKey(int wid, uint16 key, uint16 keycode)
} }
break; break;
case HKPR_NOT_HANDLED:
return ES_NOT_HANDLED;
default: break; default: break;
} }
@ -2307,7 +2308,7 @@ EventState Window::HandleEditBoxKey(int wid, uint16 key, uint16 keycode)
break; break;
} }
return state; return ES_HANDLED;
} }
/** /**