mirror of https://github.com/OpenTTD/OpenTTD
(svn r25092) -Codechange: Deduplicate keyboard handling between console and editboxes.
parent
1ddf5a0786
commit
c2c50b0c50
|
@ -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 {
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue