Changeset - r20398:419006c5117e
[Not reviewed]
master
0 2 0
frosch - 11 years ago 2013-06-15 15:30:16
frosch@openttd.org
(svn r25411) -Add: Window::OnHotkey
2 files changed with 42 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/window.cpp
Show inline comments
 
@@ -86,7 +86,7 @@ char *_windows_file;
 
/** Window description constructor. */
 
WindowDesc::WindowDesc(WindowPosition def_pos, const char *ini_key, int16 def_width, int16 def_height,
 
			WindowClass window_class, WindowClass parent_class, uint32 flags,
 
			const NWidgetPart *nwid_parts, int16 nwid_length) :
 
			const NWidgetPart *nwid_parts, int16 nwid_length, HotkeyList *hotkeys) :
 
	default_pos(def_pos),
 
	default_width(def_width),
 
	default_height(def_height),
 
@@ -96,6 +96,7 @@ WindowDesc::WindowDesc(WindowPosition de
 
	flags(flags),
 
	nwid_parts(nwid_parts),
 
	nwid_length(nwid_length),
 
	hotkeys(hotkeys),
 
	pref_sticky(false),
 
	pref_width(0),
 
	pref_height(0)
 
@@ -469,6 +470,29 @@ void Window::SetWidgetDirty(byte widget_
 
}
 

	
 
/**
 
 * A hotkey has been pressed.
 
 * @param hotkey  Hotkey index, by default a widget index of a button or editbox.
 
 * @return #ES_HANDLED if the key press has been handled, and the hotkey is not unavailable for some reason.
 
 */
 
EventState Window::OnHotkey(int hotkey)
 
{
 
	if (hotkey < 0) return ES_NOT_HANDLED;
 

	
 
	NWidgetCore *nw = this->GetWidget<NWidgetCore>(hotkey);
 
	if (nw == NULL || nw->IsDisabled()) return ES_NOT_HANDLED;
 

	
 
	if (nw->type == WWT_EDITBOX) {
 
		/* Focus editbox */
 
		this->SetFocusedWidget(hotkey);
 
		SetFocusedWindow(this);
 
	} else {
 
		/* Click button */
 
		this->OnClick(Point(), hotkey, 1);
 
	}
 
	return ES_HANDLED;
 
}
 

	
 
/**
 
 * Do all things to make a button look clicked and mark it to be
 
 * unclicked in a few ticks.
 
 * @param widget the widget to "click"
 
@@ -2456,12 +2480,22 @@ void HandleKeypress(uint32 raw_key)
 
	Window *w;
 
	FOR_ALL_WINDOWS_FROM_FRONT(w) {
 
		if (w->window_class == WC_MAIN_TOOLBAR) continue;
 
		if (w->window_desc->hotkeys != NULL) {
 
			int hotkey = w->window_desc->hotkeys->CheckMatch(keycode);
 
			if (hotkey >= 0 && w->OnHotkey(hotkey) == ES_HANDLED) return;
 
		}
 
		if (w->OnKeyPress(key, keycode) == ES_HANDLED) return;
 
	}
 

	
 
	w = FindWindowById(WC_MAIN_TOOLBAR, 0);
 
	/* When there is no toolbar w is null, check for that */
 
	if (w != NULL && w->OnKeyPress(key, keycode) == ES_HANDLED) return;
 
	if (w != NULL) {
 
		if (w->window_desc->hotkeys != NULL) {
 
			int hotkey = w->window_desc->hotkeys->CheckMatch(keycode);
 
			if (hotkey >= 0 && w->OnHotkey(hotkey) == ES_HANDLED) return;
 
		}
 
		if (w->OnKeyPress(key, keycode) == ES_HANDLED) return;
 
	}
 

	
 
	HandleGlobalHotkeys(key, keycode);
 
}
src/window_gui.h
Show inline comments
 
@@ -167,6 +167,8 @@ enum WindowPosition {
 

	
 
Point GetToolbarAlignedWindowPosition(int window_width);
 

	
 
struct HotkeyList;
 

	
 
/**
 
 * High level window description
 
 */
 
@@ -174,7 +176,7 @@ struct WindowDesc : ZeroedMemoryAllocato
 

	
 
	WindowDesc(WindowPosition default_pos, const char *ini_key, int16 def_width, int16 def_height,
 
			WindowClass window_class, WindowClass parent_class, uint32 flags,
 
			const NWidgetPart *nwid_parts, int16 nwid_length);
 
			const NWidgetPart *nwid_parts, int16 nwid_length, HotkeyList *hotkeys = NULL);
 

	
 
	~WindowDesc();
 

	
 
@@ -187,6 +189,7 @@ struct WindowDesc : ZeroedMemoryAllocato
 
	uint32 flags;                  ///< Flags. @see WindowDefaultFlag
 
	const NWidgetPart *nwid_parts; ///< Nested widget parts describing the window.
 
	int16 nwid_length;             ///< Length of the #nwid_parts array.
 
	HotkeyList *hotkeys;           ///< Hotkeys for the window.
 

	
 
	bool pref_sticky;              ///< Preferred stickyness.
 
	int16 pref_width;              ///< User-preferred width of the window. Zero if unset.
 
@@ -598,6 +601,8 @@ public:
 
	 */
 
	virtual EventState OnKeyPress(uint16 key, uint16 keycode) { return ES_NOT_HANDLED; }
 

	
 
	virtual EventState OnHotkey(int hotkey);
 

	
 
	/**
 
	 * The state of the control key has changed
 
	 * @return #ES_HANDLED if the change has been handled and no other
0 comments (0 inline, 0 general)