# HG changeset patch # User Peter Nelson # Date 2023-10-19 18:58:43 # Node ID a4b8eb9ccfbb7bcbec8e1826e303333587924c7f # Parent 99c289b7c6ba9caba343f12a567073ffa7aa9902 Codechange: Use unified NWidgetContainer methods instead of duplicating. Most NWidgetContainer derivatives implemented Draw() and GetWidgetFromPos() the same way. Move this these to NWidgetContainer itself to avoid repeating. diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -161,24 +161,6 @@ public: } } } - - void Draw(const Window *w) override - { - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - child_wid->Draw(w); - } - } - - NWidgetCore *GetWidgetFromPos(int x, int y) override - { - if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr; - - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y); - if (nwid != nullptr) return nwid; - } - return nullptr; - } }; class NetworkGameWindow : public Window { diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1763,21 +1763,6 @@ public: display->AssignSizePosition(ST_RESIZE, x, y, given_width, display_height, rtl); bar->AssignSizePosition(ST_RESIZE, x, y + display_height, given_width, bar_height, rtl); } - - NWidgetCore *GetWidgetFromPos(int x, int y) override - { - if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr; - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - NWidgetCore *widget = child_wid->GetWidgetFromPos(x, y); - if (widget != nullptr) return widget; - } - return nullptr; - } - - void Draw(const Window *w) override - { - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) child_wid->Draw(w); - } }; /** Widget parts of the smallmap display. */ diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -1477,21 +1477,7 @@ public: GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_VERY_DARK_RED); GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_DARK_RED, FILLRECT_CHECKER); - bool rtl = _current_text_dir == TD_RTL; - for (NWidgetBase *child_wid = rtl ? this->tail : this->head; child_wid != nullptr; child_wid = rtl ? child_wid->prev : child_wid->next) { - child_wid->Draw(w); - } - } - - NWidgetCore *GetWidgetFromPos(int x, int y) override - { - if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr; - - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y); - if (nwid != nullptr) return nwid; - } - return nullptr; + this->NWidgetContainer::Draw(w); } /** diff --git a/src/widget.cpp b/src/widget.cpp --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1303,6 +1303,24 @@ void NWidgetContainer::FillNestedArray(N } } +void NWidgetContainer::Draw(const Window *w) +{ + for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { + child_wid->Draw(w); + } +} + +NWidgetCore *NWidgetContainer::GetWidgetFromPos(int x, int y) +{ + if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr; + + for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { + NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y); + if (nwid != nullptr) return nwid; + } + return nullptr; +} + /** * Widgets stacked on top of each other. */ @@ -1465,24 +1483,6 @@ void NWidgetPIPContainer::SetPIP(uint8_t this->pip_post = ScaleGUITrad(this->uz_pip_post); } -void NWidgetPIPContainer::Draw(const Window *w) -{ - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - child_wid->Draw(w); - } -} - -NWidgetCore *NWidgetPIPContainer::GetWidgetFromPos(int x, int y) -{ - if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr; - - for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { - NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y); - if (nwid != nullptr) return nwid; - } - return nullptr; -} - /** Horizontal container widget. */ NWidgetHorizontal::NWidgetHorizontal(NWidContainerFlags flags) : NWidgetPIPContainer(NWID_HORIZONTAL, flags) { diff --git a/src/widget_type.h b/src/widget_type.h --- a/src/widget_type.h +++ b/src/widget_type.h @@ -412,6 +412,9 @@ public: void Add(NWidgetBase *wid); void FillNestedArray(NWidgetBase **array, uint length) override; + void Draw(const Window *w) override; + NWidgetCore *GetWidgetFromPos(int x, int y) override; + /** Return whether the container is empty. */ inline bool IsEmpty() { return head == nullptr; } @@ -480,9 +483,6 @@ public: void AdjustPaddingForZoom() override; void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post); - void Draw(const Window *w) override; - NWidgetCore *GetWidgetFromPos(int x, int y) override; - protected: NWidContainerFlags flags; ///< Flags of the container. uint8_t pip_pre; ///< Amount of space before first widget.