summaryrefslogtreecommitdiff
path: root/src/widget.cpp
diff options
context:
space:
mode:
authoralberth <alberth@openttd.org>2009-09-19 11:55:44 +0000
committeralberth <alberth@openttd.org>2009-09-19 11:55:44 +0000
commitceab116065b3bde0c8932f1006374f9e37529436 (patch)
tree7b059fe2989966b1118df1ec33c5168fffd06ac6 /src/widget.cpp
parent116c77c342d0f628235a7f5dbacfbb5bc3fb0829 (diff)
downloadopenttd-ceab116065b3bde0c8932f1006374f9e37529436.tar.xz
(svn r17573) -Codechange: NWID_SELECTION containers have a selected widget-plane, and optionally an index in the nested_array.
Diffstat (limited to 'src/widget.cpp')
-rw-r--r--src/widget.cpp50
1 files changed, 45 insertions, 5 deletions
diff --git a/src/widget.cpp b/src/widget.cpp
index 7b29791a5..8f0e7b566 100644
--- a/src/widget.cpp
+++ b/src/widget.cpp
@@ -1253,6 +1253,12 @@ static inline uint ComputeOffset(uint space, uint max_space)
*/
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::StoreWidgets(Widget *widgets, int length, bool left_moving,
}
}
+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 @@ void NWidgetStacked::Draw(const Window *w)
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 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest,
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 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest,
*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);