Changeset - r13153:b14cd764868c
[Not reviewed]
master
0 1 0
yexo - 15 years ago 2009-09-30 15:14:34
yexo@openttd.org
(svn r17668) -Codechange: Query window uses nested widgets
1 file changed with 47 insertions and 31 deletions:
0 comments (0 inline, 0 general)
src/misc_gui.cpp
Show inline comments
 
@@ -1421,6 +1421,7 @@ enum QueryWidgets {
 
	QUERY_WIDGET_CLOSEBOX,
 
	QUERY_WIDGET_CAPTION,
 
	QUERY_WIDGET_BACKGROUND,
 
	QUERY_WIDGET_TEXT,
 
	QUERY_WIDGET_NO,
 
	QUERY_WIDGET_YES
 
};
 
@@ -1432,22 +1433,23 @@ struct QueryWindow : public Window {
 
	QueryCallbackProc *proc; ///< 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
 
	StringID caption;        ///< title of window
 

	
 
	QueryWindow(const WindowDesc *desc, StringID caption, StringID message, Window *parent, QueryCallbackProc *callback) : Window(desc)
 
	QueryWindow(const WindowDesc *desc, StringID caption, StringID message, Window *parent, QueryCallbackProc *callback) : Window()
 
	{
 
		/* 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->caption = caption;
 
		this->message = message;
 
		this->proc    = callback;
 

	
 
		this->InitNested(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);
 

	
 
		/* 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;
 

	
 
		this->FindWindowPlacementAndResize(desc);
 
	}
 

	
 
	~QueryWindow()
 
@@ -1455,13 +1457,39 @@ struct QueryWindow : public Window {
 
		if (this->proc != NULL) this->proc(this->parent, false);
 
	}
 

	
 
	virtual void SetStringParameters(int widget) const
 
	{
 
		switch (widget) {
 
			case QUERY_WIDGET_CAPTION:
 
				SetDParam(0, this->caption);
 
				break;
 

	
 
			case QUERY_WIDGET_TEXT:
 
				CopyInDParam(0, this->params, lengthof(this->params));
 
				break;
 
		}
 
	}
 

	
 
	virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize)
 
	{
 
		if (widget != QUERY_WIDGET_TEXT) return;
 

	
 
		Dimension d = GetStringMultiLineBoundingBox(this->message, *size);
 
		d.width += padding.width;
 
		d.height += padding.height;
 
		*size = d;
 
	}
 

	
 
	virtual void DrawWidget(const Rect &r, int widget) const
 
	{
 
		if (widget != QUERY_WIDGET_TEXT) return;
 

	
 
		DrawStringMultiLine(r.left, r.right, r.top, r.bottom, this->message, TC_FROMSTRING, SA_CENTER);
 
	}
 

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

	
 
		DrawStringMultiLine(1, this->width - 1, 14, 62, this->message, TC_FROMSTRING, SA_CENTER);
 
	}
 

	
 
	virtual void OnClick(Point pt, int widget)
 
@@ -1505,28 +1533,17 @@ struct QueryWindow : public Window {
 
	}
 
};
 

	
 

	
 
static const Widget _query_widgets[] = {
 
{  WWT_CLOSEBOX, RESIZE_NONE,  COLOUR_RED,      0,  10,   0,  13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW}, // QUERY_WIDGET_CLOSEBOX
 
{   WWT_CAPTION, RESIZE_NONE,  COLOUR_RED,     11, 209,   0,  13, STR_NULL,        STR_NULL},              // QUERY_WIDGET_CAPTION
 
{     WWT_PANEL, RESIZE_NONE,  COLOUR_RED,      0, 209,  14,  81, 0x0, /*OVERRIDE*/STR_NULL},              // QUERY_WIDGET_BACKGROUND
 
{WWT_PUSHTXTBTN, RESIZE_NONE,  COLOUR_YELLOW,  20,  90,  62,  73, STR_QUIT_NO,          STR_NULL},              // QUERY_WIDGET_NO
 
{WWT_PUSHTXTBTN, RESIZE_NONE,  COLOUR_YELLOW, 120, 190,  62,  73, STR_QUIT_YES,         STR_NULL},              // QUERY_WIDGET_YES
 
{   WIDGETS_END },
 
};
 

	
 
static const NWidgetPart _nested_query_widgets[] = {
 
	NWidget(NWID_HORIZONTAL),
 
		NWidget(WWT_CLOSEBOX, COLOUR_RED, QUERY_WIDGET_CLOSEBOX),
 
		NWidget(WWT_CAPTION, COLOUR_RED, QUERY_WIDGET_CAPTION), SetDataTip(STR_NULL, STR_NULL),
 
		NWidget(WWT_CAPTION, COLOUR_RED, QUERY_WIDGET_CAPTION), SetDataTip(STR_JUST_STRING, STR_NULL),
 
	EndContainer(),
 
	NWidget(WWT_PANEL, COLOUR_RED, QUERY_WIDGET_BACKGROUND),
 
		NWidget(NWID_SPACER), SetMinimalSize(0, 48),
 
		NWidget(NWID_HORIZONTAL), SetPIP(20, 29, 19),
 
	NWidget(WWT_PANEL, COLOUR_RED, QUERY_WIDGET_BACKGROUND), SetPIP(8, 15, 8),
 
		NWidget(WWT_TEXT, COLOUR_RED, QUERY_WIDGET_TEXT), SetMinimalSize(200, 12),
 
		NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(20, 29, 20),
 
			NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, QUERY_WIDGET_NO), SetMinimalSize(71, 12), SetDataTip(STR_QUIT_NO, STR_NULL),
 
			NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, QUERY_WIDGET_YES), SetMinimalSize(71, 12), SetDataTip(STR_QUIT_YES, STR_NULL),
 
		EndContainer(),
 
		NWidget(NWID_SPACER), SetMinimalSize(0, 8),
 
	EndContainer(),
 
};
 

	
 
@@ -1534,12 +1551,11 @@ static const WindowDesc _query_desc(
 
	WDP_CENTER, WDP_CENTER, 210, 82, 210, 82,
 
	WC_CONFIRM_POPUP_QUERY, WC_NONE,
 
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_DEF_WIDGET | WDF_MODAL,
 
	_query_widgets, _nested_query_widgets, lengthof(_nested_query_widgets)
 
	NULL, _nested_query_widgets, lengthof(_nested_query_widgets)
 
);
 

	
 
/** Show a modal confirmation window with standard 'yes' and 'no' buttons
 
 * The window is aligned to the centre of its parent.
 
 * NOTE: You cannot use BindCString as parameter for this window!
 
 * @param caption string shown as window caption
 
 * @param message string that will be shown for the window
 
 * @param parent pointer to parent window, if this pointer is NULL the parent becomes
0 comments (0 inline, 0 general)