Changeset - r9176:0027bcf4d7f5
[Not reviewed]
master
0 1 0
rubidium - 16 years ago 2008-05-11 06:59:51
rubidium@openttd.org
(svn r13039) -Codechange: make a class of the Query window.
1 file changed with 59 insertions and 60 deletions:
0 comments (0 inline, 0 general)
src/misc_gui.cpp
Show inline comments
 
@@ -1104,64 +1104,77 @@ enum QueryWidgets {
 
	QUERY_WIDGET_YES
 
};
 

	
 

	
 
struct query_d {
 
/**
 
 * Window used for asking the user a YES/NO question.
 
 */
 
struct QueryWindow : public Window {
 
	void (*proc)(Window*, bool); ///< callback function executed on closing of popup. Window* points to parent, bool is true if 'yes' clicked, false otherwise
 
	uint64 params[10];           ///< local copy of _decode_parameters
 
	StringID message;            ///< message shown for query window
 
	bool calledback;             ///< has callback been executed already (internal usage for WE_DESTROY event)
 
};
 
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(query_d));
 

	
 
	QueryWindow(const WindowDesc *desc, StringID caption, StringID message, Window *parent, void (*callback)(Window*, bool)) : Window(desc)
 
	{
 
		if (parent == NULL) parent = FindWindowById(WC_MAIN_WINDOW, 0);
 
		this->parent = parent;
 
		this->left = parent->left + (parent->width / 2) - (this->width / 2);
 
		this->top = parent->top + (parent->height / 2) - (this->height / 2);
 

	
 

	
 
static void QueryWndProc(Window *w, WindowEvent *e)
 
{
 
	query_d *q = &WP(w, query_d);
 
		/* Create a backup of the variadic arguments to strings because it will be
 
		* overridden pretty often. We will copy these back for drawing */
 
		CopyOutDParam(this->params, 0, lengthof(this->params));
 
		this->widget[QUERY_WIDGET_CAPTION].data = caption;
 
		this->message    = message;
 
		this->proc       = callback;
 
	}
 

	
 
	switch (e->event) {
 
		case WE_PAINT:
 
			CopyInDParam(0, q->params, lengthof(q->params));
 
			DrawWindowWidgets(w);
 
			CopyInDParam(0, q->params, lengthof(q->params));
 
	~QueryWindow()
 
	{
 
		if (this->proc != NULL) this->proc(this->parent, false);
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		CopyInDParam(0, this->params, lengthof(this->params));
 
		DrawWindowWidgets(this);
 
		CopyInDParam(0, this->params, lengthof(this->params));
 

	
 
			DrawStringMultiCenter(w->width / 2, (w->height / 2) - 10, q->message, w->width - 2);
 
			break;
 
		DrawStringMultiCenter(this->width / 2, (this->height / 2) - 10, this->message, this->width - 2);
 
	}
 

	
 
		case WE_CLICK:
 
			switch (e->we.click.widget) {
 
	virtual void OnClick(Point pt, int widget)
 
	{
 
		switch (widget) {
 
				case QUERY_WIDGET_YES:
 
					q->calledback = true;
 
					if (q->proc != NULL) q->proc(w->parent, true);
 
				if (this->proc != NULL) {
 
					this->proc(this->parent, true);
 
					this->proc = NULL;
 
				}
 
					/* Fallthrough */
 
				case QUERY_WIDGET_NO:
 
					delete w;
 
					break;
 
				}
 
			break;
 

	
 
		case WE_KEYPRESS: // ESC closes the window, Enter confirms the action
 
			switch (e->we.keypress.keycode) {
 
				case WKC_RETURN:
 
				case WKC_NUM_ENTER:
 
					q->calledback = true;
 
					if (q->proc != NULL) q->proc(w->parent, true);
 
					/* Fallthrough */
 
				case WKC_ESC:
 
					e->we.keypress.cont = false;
 
					delete w;
 
					break;
 
			}
 
			break;
 

	
 
		case WE_DESTROY: // Call callback function (if any) on window close if not yet called
 
			if (!q->calledback && q->proc != NULL) {
 
				q->calledback = true;
 
				q->proc(w->parent, false);
 
			}
 
				delete this;
 
			break;
 
	}
 
}
 

	
 
	virtual bool OnKeyPress(uint16 key, uint16 keycode)
 
	{
 
		/* ESC closes the window, Enter confirms the action */
 
		switch (keycode) {
 
			case WKC_RETURN:
 
			case WKC_NUM_ENTER:
 
				if (this->proc != NULL) {
 
					this->proc(this->parent, true);
 
					this->proc = NULL;
 
				}
 
				/* Fallthrough */
 
			case WKC_ESC:
 
				delete this;
 
				return false;
 
		}
 
		return true;
 
	}
 
};
 

	
 

	
 
static const Widget _query_widgets[] = {
 
{  WWT_CLOSEBOX, RESIZE_NONE,  4,   0,  10,   0,  13, STR_00C5,        STR_018B_CLOSE_WINDOW},
 
@@ -1177,7 +1190,7 @@ static const WindowDesc _query_desc = {
 
	WC_CONFIRM_POPUP_QUERY, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_DEF_WIDGET | WDF_MODAL,
 
	_query_widgets,
 
	QueryWndProc
 
	NULL
 
};
 

	
 
/** Show a modal confirmation window with standard 'yes' and 'no' buttons
 
@@ -1190,21 +1203,7 @@ static const WindowDesc _query_desc = {
 
 * @param callback callback function pointer to set in the window descriptor*/
 
void ShowQuery(StringID caption, StringID message, Window *parent, void (*callback)(Window*, bool))
 
{
 
	Window *w = new Window(&_query_desc);
 
	if (w == NULL) return;
 

	
 
	if (parent == NULL) parent = FindWindowById(WC_MAIN_WINDOW, 0);
 
	w->parent = parent;
 
	w->left = parent->left + (parent->width / 2) - (w->width / 2);
 
	w->top = parent->top + (parent->height / 2) - (w->height / 2);
 

	
 
	/* Create a backup of the variadic arguments to strings because it will be
 
	 * overridden pretty often. We will copy these back for drawing */
 
	CopyOutDParam(WP(w, query_d).params, 0, lengthof(WP(w, query_d).params));
 
	w->widget[QUERY_WIDGET_CAPTION].data = caption;
 
	WP(w, query_d).message    = message;
 
	WP(w, query_d).proc       = callback;
 
	WP(w, query_d).calledback = false;
 
	new QueryWindow(&_query_desc, caption, message, parent, callback);
 
}
 

	
 

	
0 comments (0 inline, 0 general)