changeset 13073:013c3a75e449 draft

(svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
author alberth <alberth@openttd.org>
date Sat, 19 Sep 2009 11:55:44 +0000
parents 75bd67594af2
children c6408d5b9f99
files src/company_gui.cpp src/network/network_content_gui.cpp src/order_gui.cpp src/vehicle_gui.cpp src/widget.cpp src/widget_type.h
diffstat 6 files changed, 61 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/company_gui.cpp
+++ b/src/company_gui.cpp
@@ -1443,7 +1443,7 @@
 		EndContainer(),
 		NWidget(NWID_SPACER), SetMinimalSize(0, 94),
 		/* Multi player buttons. */
-		NWidget(NWID_SELECTION),
+		NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 			NWidget(NWID_HORIZONTAL),
 				NWidget(NWID_SPACER), SetFill(true, false),
 				NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CW_WIDGET_COMPANY_PASSWORD), SetMinimalSize(90, 12), SetPadding(0, 4, 0, 0),
@@ -1458,7 +1458,7 @@
 		NWidget(NWID_SPACER), SetMinimalSize(0, 8),
 	EndContainer(),
 	/* Button bars at the bottom. */
-	NWidget(NWID_SELECTION),
+	NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 		NWidget(NWID_HORIZONTAL),
 			NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CW_WIDGET_NEW_FACE), SetMinimalSize(90, 12),
 										SetDataTip(STR_COMPANY_VIEW_NEW_FACE_BUTTON, STR_COMPANY_VIEW_NEW_FACE_TOOLTIP),
--- a/src/network/network_content_gui.cpp
+++ b/src/network/network_content_gui.cpp
@@ -811,7 +811,7 @@
 		/* Bottom. */
 		NWidget(NWID_HORIZONTAL),
 			NWidget(NWID_SPACER), SetMinimalSize(10, 0),
-			NWidget(NWID_SELECTION),
+			NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 				NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, NCLWW_SELECT_ALL), SetMinimalSize(101, 12),
 										SetDataTip(STR_CONTENT_SELECT_ALL_CAPTION, STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP),
 				NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, NCLWW_SELECT_UPDATE), SetMinimalSize(101, 12),
--- a/src/order_gui.cpp
+++ b/src/order_gui.cpp
@@ -1296,7 +1296,7 @@
 
 	/* First button row. */
 	NWidget(NWID_HORIZONTAL),
-		NWidget(NWID_SELECTION),
+		NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 			/* Unload + (full load, unload) or (refit, service) buttons. */
 			NWidget(NWID_HORIZONTAL),
 				NWidget(NWID_LAYERED),
@@ -1306,7 +1306,7 @@
 					EndContainer(),
 					NWidget(WWT_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_NON_STOP_DROPDOWN), SetMinimalSize(124, 12), SetDataTip(STR_NULL, STR_ORDER_TOOLTIP_NON_STOP),
 				EndContainer(),
-				NWidget(NWID_SELECTION),
+				NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 					NWidget(NWID_HORIZONTAL),
 						NWidget(NWID_LAYERED),
 							NWidget(NWID_HORIZONTAL),
@@ -1433,7 +1433,7 @@
 
 	/* First button row. */
 	NWidget(NWID_HORIZONTAL),
-		NWidget(NWID_SELECTION),
+		NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 			/* Refit + service buttons. */
 			NWidget(NWID_HORIZONTAL),
 				NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_REFIT), SetMinimalSize(186, 12), SetDataTip(STR_ORDER_REFIT, STR_ORDER_REFIT_TOOLTIP),
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -1558,11 +1558,11 @@
 		EndContainer(),
 		NWidget(NWID_VERTICAL),
 			NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_CENTER_MAIN_VIEH), SetMinimalSize(18, 18), SetDataTip(SPR_CENTRE_VIEW_VEHICLE, 0x0 /* filled later */),
-			NWidget(NWID_SELECTION),
+			NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 				NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_GOTO_DEPOT), SetMinimalSize(18, 18), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */),
 				NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_CLONE_VEH), SetMinimalSize(18, 18), SetDataTip(0x0 /* filled later */, 0x0 /* filled later */),
 			EndContainer(),
-			NWidget(NWID_SELECTION),
+			NWidget(NWID_SELECTION, INVALID_COLOUR, -1),
 				NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_REFIT_VEH), SetMinimalSize(18, 18),
 												SetDataTip(SPR_REFIT_VEHICLE, 0x0 /* filled later */),
 				NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, VVW_WIDGET_TURN_AROUND), SetMinimalSize(18, 18),
--- a/src/widget.cpp
+++ b/src/widget.cpp
@@ -1253,6 +1253,12 @@
  */
 NWidgetStacked::NWidgetStacked(WidgetType tp) : NWidgetContainer(tp)
 {
+	this->index = -1;
+}
+
+void NWidgetStacked::SetIndex(int index)
+{
+	this->index = index;
 }
 
 void NWidgetStacked::SetupSmallestSize(Window *w, bool init_array)
@@ -1301,8 +1307,24 @@
 	}
 }
 
+void NWidgetStacked::FillNestedArray(NWidgetBase **array, uint length)
+{
+	if (this->index >= 0 && (uint)(this->index) < length) array[this->index] = this;
+	NWidgetContainer::FillNestedArray(array, length);
+}
+
 void NWidgetStacked::Draw(const Window *w)
 {
+	if (this->type == NWID_SELECTION) {
+		int plane = 0;
+		for (NWidgetBase *child_wid = this->head; child_wid != NULL; plane++, child_wid = child_wid->next) {
+			if (plane == this->shown_plane) {
+				child_wid->Draw(w);
+				return;
+			}
+		}
+	}
+
 	assert(this->type == NWID_LAYERED); // Currently, NWID_SELECTION is not supported.
 	/* Render from back to front. */
 	for (NWidgetBase *child_wid = this->tail; child_wid != NULL; child_wid = child_wid->prev) {
@@ -1313,13 +1335,23 @@
 NWidgetCore *NWidgetStacked::GetWidgetFromPos(int x, int y)
 {
 	if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return NULL;
-	for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
-		NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
-		if (nwid != NULL) return nwid;
+	int plane = 0;
+	for (NWidgetBase *child_wid = this->head; child_wid != NULL; plane++, child_wid = child_wid->next) {
+		if (plane == this->shown_plane) {
+			return child_wid->GetWidgetFromPos(x, y);
+		}
 	}
 	return NULL;
 }
 
+/** Select which plane to show (for #NWID_SELECTION only).
+ * @param plane Plane number to display.
+ */
+void NWidgetStacked::SetDisplayedPlane(int plane)
+{
+	this->shown_plane = plane;
+}
+
 NWidgetPIPContainer::NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags) : NWidgetContainer(tp)
 {
 	this->flags = flags;
@@ -2435,14 +2467,12 @@
 				break;
 			}
 
-			case NWID_SELECTION:
 			case NWID_LAYERED:
 				if (*dest != NULL) return num_used;
 				*dest = new NWidgetStacked(parts->type);
 				*fill_dest = true;
 				break;
 
-
 			case WPT_RESIZE: {
 				NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
 				if (nwrb != NULL) {
@@ -2498,6 +2528,16 @@
 				*biggest_index = max(*biggest_index, (int)parts->u.widget.index);
 				break;
 
+			case NWID_SELECTION: {
+				if (*dest != NULL) return num_used;
+				NWidgetStacked *nws = new NWidgetStacked(parts->type);
+				*dest = nws;
+				*fill_dest = true;
+				nws->SetIndex(parts->u.widget.index);
+				*biggest_index = max(*biggest_index, (int)parts->u.widget.index);
+				break;
+			}
+
 			default:
 				if (*dest != NULL) return num_used;
 				assert((parts->type & WWT_MASK) < WWT_LAST);
--- a/src/widget_type.h
+++ b/src/widget_type.h
@@ -377,12 +377,20 @@
 public:
 	NWidgetStacked(WidgetType tp);
 
+	void SetIndex(int index);
+
 	void SetupSmallestSize(Window *w, bool init_array);
 	void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl);
 	void StoreWidgets(Widget *widgets, int length, bool left_moving, bool top_moving, bool rtl);
+	/* virtual */ void FillNestedArray(NWidgetBase **array, uint length);
 
 	/* virtual */ void Draw(const Window *w);
 	/* virtual */ NWidgetCore *GetWidgetFromPos(int x, int y);
+
+	void SetDisplayedPlane(int plane);
+
+	int shown_plane; ///< Plane being displayed (for #NWID_SELECTION only).
+	int index;       ///< If non-negative, index in the #Window::nested_array.
 };
 
 /** Nested widget container flags, */