# HG changeset patch # User Peter Nelson # Date 2024-02-14 17:23:03 # Node ID 67d8065b03e1aeb107475e854fb98fbc0358c356 # Parent d984b313db3ed975d81163c1ecbcdaaa322149fb Codechange: Update window's widget lookup map when switching displayed plane. diff --git a/src/widget.cpp b/src/widget.cpp --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1268,8 +1268,13 @@ void NWidgetStacked::AssignSizePosition( void NWidgetStacked::FillWidgetLookup(WidgetLookup &widget_lookup) { + /* We need to update widget_lookup later. */ + this->widget_lookup = &widget_lookup; + if (this->index >= 0) widget_lookup[this->index] = this; NWidgetContainer::FillWidgetLookup(widget_lookup); + /* In case widget IDs are repeated, make sure Window::GetWidget works on displayed widgets. */ + if (static_cast(this->shown_plane) < this->children.size()) this->children[shown_plane]->FillWidgetLookup(widget_lookup); } void NWidgetStacked::Draw(const Window *w) @@ -1300,6 +1305,8 @@ bool NWidgetStacked::SetDisplayedPlane(i { if (this->shown_plane == plane) return false; this->shown_plane = plane; + /* In case widget IDs are repeated, make sure Window::GetWidget works on displayed widgets. */ + if (static_cast(this->shown_plane) < this->children.size()) this->children[shown_plane]->FillWidgetLookup(*this->widget_lookup); return true; } diff --git a/src/widget_type.h b/src/widget_type.h --- a/src/widget_type.h +++ b/src/widget_type.h @@ -497,6 +497,8 @@ public: int shown_plane; ///< Plane being displayed (for #NWID_SELECTION only). const WidgetID index; ///< If non-negative, index in the #Window::widget_lookup. +private: + WidgetLookup *widget_lookup; ///< Window's widget lookup, updated in SetDisplayedPlane(). }; /** Nested widget container flags, */