diff options
-rw-r--r-- | src/widget.cpp | 97 | ||||
-rw-r--r-- | src/widget_type.h | 9 |
2 files changed, 58 insertions, 48 deletions
diff --git a/src/widget.cpp b/src/widget.cpp index b76008775..be97ae50b 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -687,9 +687,9 @@ NWidgetBase::NWidgetBase(WidgetType tp) : ZeroedMemoryAllocator() /** * @fn int NWidgetBase::ComputeMinimalSize() - * @brief Compute minimal size needed by the widget. + * @brief Compute smallest size needed by the widget. * - * The minimal size of a widget is the smallest size that a widget needs to + * The smallest size of a widget is the smallest size that a widget needs to * display itself properly. * In addition, filling and resizing of the widget are computed. * @return Biggest index in the widget array of all child widgets. @@ -771,8 +771,8 @@ void NWidgetResizeBase::AssignMinimalPosition(uint x, uint y, uint given_width, { this->pos_x = x; this->pos_y = y; - this->min_x = given_width; - this->min_y = given_height; + this->smallest_x = given_width; + this->smallest_y = given_height; if (!allow_resize_x) this->resize_x = 0; if (!allow_resize_y) this->resize_y = 0; } @@ -817,7 +817,9 @@ void NWidgetCore::SetDataTip(uint16 widget_data, StringID tool_tip) int NWidgetCore::ComputeMinimalSize() { - /* All data is already at the right place. */ + this->smallest_x = this->min_x; + this->smallest_y = this->min_y; + /* All other data is already at the right place. */ return this->index; } @@ -848,9 +850,9 @@ void NWidgetCore::StoreWidgets(Widget *widgets, int length, bool left_moving, bo w->display_flags = flags; w->colour = this->colour; w->left = this->pos_x; - w->right = this->pos_x + this->min_x - 1; + w->right = this->pos_x + this->smallest_x - 1; w->top = this->pos_y; - w->bottom = this->pos_y + this->min_y - 1; + w->bottom = this->pos_y + this->smallest_y - 1; w->data = this->widget_data; w->tooltips = this->tool_tip; } @@ -908,8 +910,8 @@ int NWidgetStacked::ComputeMinimalSize() { /* First sweep, recurse down and compute minimal size and filling. */ int biggest_index = -1; - this->min_x = 0; - this->min_y = 0; + this->smallest_x = 0; + this->smallest_y = 0; this->fill_x = (this->head != NULL); this->fill_y = (this->head != NULL); this->resize_x = (this->head != NULL) ? 1 : 0; @@ -918,8 +920,8 @@ int NWidgetStacked::ComputeMinimalSize() int idx = child_wid->ComputeMinimalSize(); biggest_index = max(biggest_index, idx); - this->min_x = max(this->min_x, child_wid->min_x + child_wid->padding_left + child_wid->padding_right); - this->min_y = max(this->min_y, child_wid->min_y + child_wid->padding_top + child_wid->padding_bottom); + this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); + this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); this->fill_x &= child_wid->fill_x; this->fill_y &= child_wid->fill_y; this->resize_x = LeastCommonMultiple(this->resize_x, child_wid->resize_x); @@ -930,12 +932,12 @@ int NWidgetStacked::ComputeMinimalSize() void NWidgetStacked::AssignMinimalPosition(uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl) { - assert(given_width >= this->min_x && given_height >= this->min_y); + assert(given_width >= this->smallest_x && given_height >= this->smallest_y); this->pos_x = x; this->pos_y = y; - this->min_x = given_width; - this->min_y = given_height; + this->smallest_x = given_width; + this->smallest_y = given_height; if (!allow_resize_x) this->resize_x = 0; if (!allow_resize_y) this->resize_y = 0; @@ -947,7 +949,7 @@ void NWidgetStacked::AssignMinimalPosition(uint x, uint y, uint given_width, uin child_width = given_width - child_wid->padding_left - child_wid->padding_right; child_pos_x = (rtl ? child_wid->padding_right : child_wid->padding_left); } else { - child_width = child_wid->min_x; + child_width = child_wid->smallest_x; child_pos_x = (given_width - child_wid->padding_left - child_wid->padding_right - child_width) / 2 + (rtl ? child_wid->padding_right : child_wid->padding_left); } @@ -958,7 +960,7 @@ void NWidgetStacked::AssignMinimalPosition(uint x, uint y, uint given_width, uin child_height = given_height - child_wid->padding_top - child_wid->padding_bottom; child_pos_y = 0; } else { - child_height = child_wid->min_y; + child_height = child_wid->smallest_y; child_pos_y = (given_height - child_wid->padding_top - child_wid->padding_bottom - child_height) / 2; } child_wid->AssignMinimalPosition(x + child_pos_x, y + child_pos_y, child_width, child_height, (this->resize_x > 0), (this->resize_y > 0), rtl); @@ -1000,8 +1002,8 @@ NWidgetHorizontal::NWidgetHorizontal() : NWidgetPIPContainer(NWID_HORIZONTAL) int NWidgetHorizontal::ComputeMinimalSize() { int biggest_index = -1; - this->min_x = 0; // Sum of minimal size of all childs. - this->min_y = 0; // Biggest child. + this->smallest_x = 0; // Sum of minimal size of all childs. + this->smallest_y = 0; // Biggest child. this->fill_x = false; // true if at least one child allows fill_x. this->fill_y = true; // true if all childs allow fill_y. this->resize_x = 0; // smallest non-zero child widget resize step. @@ -1018,8 +1020,8 @@ int NWidgetHorizontal::ComputeMinimalSize() child_wid->padding_right += this->pip_post; } - this->min_x += child_wid->min_x + child_wid->padding_left + child_wid->padding_right; - this->min_y = max(this->min_y, child_wid->min_y + child_wid->padding_top + child_wid->padding_bottom); + this->smallest_x += child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right; + this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); this->fill_x |= child_wid->fill_x; this->fill_y &= child_wid->fill_y; @@ -1036,13 +1038,13 @@ int NWidgetHorizontal::ComputeMinimalSize() void NWidgetHorizontal::AssignMinimalPosition(uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl) { - assert(given_width >= this->min_x && given_height >= this->min_y); + assert(given_width >= this->smallest_x && given_height >= this->smallest_y); - uint additional_length = given_width - this->min_x; // Additional width given to us. + uint additional_length = given_width - this->smallest_x; // Additional width given to us. this->pos_x = x; this->pos_y = y; - this->min_x = given_width; - this->min_y = given_height; + this->smallest_x = given_width; + this->smallest_y = given_height; if (!allow_resize_x) this->resize_x = 0; if (!allow_resize_y) this->resize_y = 0; @@ -1058,7 +1060,7 @@ void NWidgetHorizontal::AssignMinimalPosition(uint x, uint y, uint given_width, allow_resize_x = (this->resize_x > 0); child_wid = rtl ? this->tail : this->head; while (child_wid != NULL) { - assert(given_height >= child_wid->min_y + child_wid->padding_top + child_wid->padding_bottom); + assert(given_height >= child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); /* Decide about vertical filling of the child. */ uint child_height; // Height of the child widget. uint child_pos_y; // Vertical position of child relative to the top of the container. @@ -1066,13 +1068,13 @@ void NWidgetHorizontal::AssignMinimalPosition(uint x, uint y, uint given_width, child_height = given_height - child_wid->padding_top - child_wid->padding_bottom; child_pos_y = child_wid->padding_top; } else { - child_height = child_wid->min_y; + child_height = child_wid->smallest_y; child_pos_y = (given_height - child_wid->padding_top - child_wid->padding_bottom - child_height) / 2 + child_wid->padding_top; } /* Decide about horizontal filling of the child. */ uint child_width; - child_width = child_wid->min_x; + child_width = child_wid->smallest_x; if (child_wid->fill_x && num_changing_childs > 0) { /* Hand out a piece of the pie while compensating for rounding errors. */ uint increment = additional_length / num_changing_childs; @@ -1125,8 +1127,8 @@ NWidgetVertical::NWidgetVertical() : NWidgetPIPContainer(NWID_VERTICAL) int NWidgetVertical::ComputeMinimalSize() { int biggest_index = -1; - this->min_x = 0; // Biggest child. - this->min_y = 0; // Sum of minimal size of all childs. + this->smallest_x = 0; // Biggest child. + this->smallest_y = 0; // Sum of minimal size of all childs. this->fill_x = true; // true if all childs allow fill_x. this->fill_y = false; // true if at least one child allows fill_y. this->resize_x = 1; // smallest common child resize step @@ -1143,8 +1145,8 @@ int NWidgetVertical::ComputeMinimalSize() child_wid->padding_bottom += this->pip_post; } - this->min_y += child_wid->min_y + child_wid->padding_top + child_wid->padding_bottom; - this->min_x = max(this->min_x, child_wid->min_x + child_wid->padding_left + child_wid->padding_right); + this->smallest_y += child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom; + this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); this->fill_y |= child_wid->fill_y; this->fill_x &= child_wid->fill_x; @@ -1161,13 +1163,13 @@ int NWidgetVertical::ComputeMinimalSize() void NWidgetVertical::AssignMinimalPosition(uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl) { - assert(given_width >= this->min_x && given_height >= this->min_y); + assert(given_width >= this->smallest_x && given_height >= this->smallest_y); - int additional_length = given_height - this->min_y; // Additional height given to us. + int additional_length = given_height - this->smallest_y; // Additional height given to us. this->pos_x = x; this->pos_y = y; - this->min_x = given_width; - this->min_y = given_height; + this->smallest_x = given_width; + this->smallest_y = given_height; if (!allow_resize_x) this->resize_x = 0; if (!allow_resize_y) this->resize_y = 0; @@ -1181,7 +1183,7 @@ void NWidgetVertical::AssignMinimalPosition(uint x, uint y, uint given_width, ui uint position = 0; // Place to put next child relative to origin of the container. allow_resize_y = (this->resize_y > 0); for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) { - assert(given_width >= child_wid->min_x + child_wid->padding_left + child_wid->padding_right); + assert(given_width >= child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); /* Decide about horizontal filling of the child. */ uint child_width; // Width of the child widget. uint child_pos_x; // Horizontal position of child relative to the left of the container. @@ -1189,13 +1191,13 @@ void NWidgetVertical::AssignMinimalPosition(uint x, uint y, uint given_width, ui child_width = given_width - child_wid->padding_left - child_wid->padding_right; child_pos_x = (rtl ? child_wid->padding_right : child_wid->padding_left); } else { - child_width = child_wid->min_x; + child_width = child_wid->smallest_x; child_pos_x = (given_width - child_wid->padding_left - child_wid->padding_right - child_width) / 2 + (rtl ? child_wid->padding_right : child_wid->padding_left); } /* Decide about vertical filling of the child. */ uint child_height; - child_height = child_wid->min_y; + child_height = child_wid->smallest_y; if (child_wid->fill_y && num_changing_childs > 0) { /* Hand out a piece of the pie while compensating for rounding errors. */ uint increment = additional_length / num_changing_childs; @@ -1232,7 +1234,8 @@ NWidgetSpacer::NWidgetSpacer(int length, int height) : NWidgetResizeBase(NWID_SP int NWidgetSpacer::ComputeMinimalSize() { - /* No further computation needed. */ + this->smallest_x = this->min_x; + this->smallest_y = this->min_y; return -1; } @@ -1303,14 +1306,16 @@ int NWidgetBackground::ComputeMinimalSize() int idx = this->child->ComputeMinimalSize(); biggest_index = max(biggest_index, idx); - this->min_x = this->child->min_x; - this->min_y = this->child->min_y; + this->smallest_x = this->child->smallest_x; + this->smallest_y = this->child->smallest_y; this->fill_x = this->child->fill_x; this->fill_y = this->child->fill_y; this->resize_x = this->child->resize_x; this->resize_y = this->child->resize_y; + } else { + this->smallest_x = this->min_x; + this->smallest_y = this->min_y; } - /* Otherwise, the program should have already set the above values. */ return biggest_index; } @@ -1319,8 +1324,8 @@ void NWidgetBackground::AssignMinimalPosition(uint x, uint y, uint given_width, { this->pos_x = x; this->pos_y = y; - this->min_x = given_width; - this->min_y = given_height; + this->smallest_x = given_width; + this->smallest_y = given_height; if (!allow_resize_x) this->resize_x = 0; if (!allow_resize_y) this->resize_y = 0; @@ -1438,7 +1443,7 @@ Widget *InitializeNWidgets(NWidgetBase *nwid, bool rtl) { /* Initialize nested widgets. */ int biggest_index = nwid->ComputeMinimalSize(); - nwid->AssignMinimalPosition(0, 0, nwid->min_x, nwid->min_y, (nwid->resize_x > 0), (nwid->resize_y > 0), rtl); + nwid->AssignMinimalPosition(0, 0, nwid->smallest_x, nwid->smallest_y, (nwid->resize_x > 0), (nwid->resize_y > 0), rtl); /* Construct a local widget array and initialize all its types to #WWT_LAST. */ Widget *widgets = MallocT<Widget>(biggest_index + 2); @@ -1753,7 +1758,7 @@ const Widget *InitializeWidgetArrayFromNestedWidgets(const NWidgetPart *parts, i */ bool ok = CompareWidgetArrays(orig_wid, gen_wid, false); if (ok) { - DEBUG(misc, 1, "Nested widgets are equal, min-size(%u, %u)", nwid->min_x, nwid->min_y); + DEBUG(misc, 1, "Nested widgets are equal, min-size(%u, %u)", nwid->smallest_x, nwid->smallest_y); } else { DEBUG(misc, 0, "Nested widgets give different results"); CompareWidgetArrays(orig_wid, gen_wid, true); diff --git a/src/widget_type.h b/src/widget_type.h index af15e2bef..53a887e45 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -173,12 +173,17 @@ public: }; WidgetType type; ///< Type of the widget / nested widget. - uint min_x; ///< Minimal horizontal size. - uint min_y; ///< Minimal vertical size. + uint min_x; ///< Minimal horizontal size of only this widget. + uint min_y; ///< Minimal vertical size of only this widget. bool fill_x; ///< Allow horizontal filling from initial size. bool fill_y; ///< Allow vertical filling from initial size. uint resize_x; ///< Horizontal resize step (\c 0 means not resizable). uint resize_y; ///< Vertical resize step (\c 0 means not resizable). + /* Size of the widget in the smallest window possible. + * Computed by #ComputeMinimalSize() followed by #AssignMinimalPosition(). + */ + uint smallest_x; ///< Smallest horizontal size of the widget in a filled window. + uint smallest_y; ///< Smallest vertical size of the widget in a filled window. uint pos_x; ///< Horizontal position of top-left corner of the widget in the window. uint pos_y; ///< Vertical position of top-left corner of the widget in the window. |