Changeset - r11745:e83554732991
[Not reviewed]
master
0 2 0
alberth - 15 years ago 2009-04-25 11:59:36
alberth@openttd.org
(svn r16140) -Codechange: Call a function while contructing a widget tree.
2 files changed with 31 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/widget.cpp
Show inline comments
 
@@ -1400,13 +1400,15 @@ bool CompareWidgetArrays(const Widget *o
 
 * @param parts Array with parts of the nested widget.
 
 * @param count Length of the \a parts array.
 
 * @param dest  Address of pointer to use for returning the composed widget.
 
 * @param fill_dest Fill the composed widget with child widgets.
 
 * @return Number of widget part elements used to compose the widget.
 
 */
 
static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest)
 
static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest, bool *fill_dest)
 
{
 
	int num_used = 0;
 

	
 
	*dest = NULL;
 
	*fill_dest = false;
 

	
 
	while (count > num_used) {
 
		switch (parts->type) {
 
@@ -1418,11 +1420,13 @@ static int MakeNWidget(const NWidgetPart
 
			case NWID_HORIZONTAL:
 
				if (*dest != NULL) return num_used;
 
				*dest = new NWidgetHorizontal();
 
				*fill_dest = true;
 
				break;
 

	
 
			case NWID_HORIZONTAL_LTR:
 
				if (*dest != NULL) return num_used;
 
				*dest = new NWidgetHorizontalLTR();
 
				*fill_dest = true;
 
				break;
 

	
 
			case WWT_PANEL:
 
@@ -1430,11 +1434,19 @@ static int MakeNWidget(const NWidgetPart
 
			case WWT_FRAME:
 
				if (*dest != NULL) return num_used;
 
				*dest = new NWidgetBackground(parts->type, parts->u.widget.colour, parts->u.widget.index);
 
				*fill_dest = true;
 
				break;
 

	
 
			case NWID_VERTICAL:
 
				if (*dest != NULL) return num_used;
 
				*dest = new NWidgetVertical();
 
				*fill_dest = true;
 
				break;
 

	
 
			case WPT_FUNCTION:
 
				if (*dest != NULL) return num_used;
 
				*dest = parts->u.func_ptr();
 
				*fill_dest = false;
 
				break;
 

	
 
			case WPT_RESIZE: {
 
@@ -1550,7 +1562,8 @@ static int MakeWidgetTree(const NWidgetP
 
	int total_used = 0;
 
	while (true) {
 
		NWidgetBase *sub_widget = NULL;
 
		int num_used = MakeNWidget(parts, count - total_used, &sub_widget);
 
		bool fill_sub = false;
 
		int num_used = MakeNWidget(parts, count - total_used, &sub_widget, &fill_sub);
 
		parts += num_used;
 
		total_used += num_used;
 

	
 
@@ -1563,7 +1576,7 @@ static int MakeWidgetTree(const NWidgetP
 

	
 
		/* If sub-widget is a container, recursively fill that container. */
 
		WidgetType tp = sub_widget->type;
 
		if (tp == NWID_HORIZONTAL || tp == NWID_HORIZONTAL_LTR || tp == NWID_VERTICAL || tp == WWT_PANEL || tp == WWT_FRAME || tp == WWT_INSET) {
 
		if (fill_sub && (tp == NWID_HORIZONTAL || tp == NWID_HORIZONTAL_LTR || tp == NWID_VERTICAL || tp == WWT_PANEL || tp == WWT_FRAME || tp == WWT_INSET)) {
 
			int num_used = MakeWidgetTree(parts, count - total_used, sub_widget);
 
			parts += num_used;
 
			total_used += num_used;
src/widget_type.h
Show inline comments
 
@@ -112,6 +112,7 @@ enum WidgetType {
 
	WPT_PADDING,      ///< Widget part for specifying a padding.
 
	WPT_PIPSPACE,     ///< Widget part for specifying pre/inter/post space for containers.
 
	WPT_ENDCONTAINER, ///< Widget part to denote end of a container.
 
	WPT_FUNCTION,     ///< Widget part for calling a user function.
 

	
 
	/* Pushable window widget types. */
 
	WWT_MASK = 0x7F,
 
@@ -312,6 +313,9 @@ struct NWidgetPartPIP {
 
	uint8 pre, inter, post; ///< Amount of space before/between/after child widgets.
 
};
 

	
 
/** Pointer to function returning a nested widget. */
 
typedef NWidgetBase *NWidgetFunctionType();
 

	
 
/** Partial widget specification to allow NWidgets to be written nested. */
 
struct NWidgetPart {
 
	WidgetType type;                         ///< Type of the part. @see NWidgetPartType.
 
@@ -323,6 +327,7 @@ struct NWidgetPart {
 
		NWidgetPartWidget widget;        ///< Part with a start of a widget.
 
		NWidgetPartPaddings padding;     ///< Part with paddings.
 
		NWidgetPartPIP pip;              ///< Part with pre/inter/post spaces.
 
		NWidgetFunctionType *func_ptr;   ///< Part with a function call.
 
	} u;
 
};
 

	
 
@@ -523,6 +528,16 @@ static inline NWidgetPart NWidget(Widget
 
	return part;
 
}
 

	
 
static inline NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
 
{
 
	NWidgetPart part;
 

	
 
	part.type = WPT_FUNCTION;
 
	part.u.func_ptr = func_ptr;
 

	
 
	return part;
 
}
 

	
 
NWidgetContainer *MakeNWidgets(const NWidgetPart *parts, int count);
 

	
 
#endif /* WIDGET_TYPE_H */
0 comments (0 inline, 0 general)