(svn r16367) -Codechange: Do not use min_x and min_y for storing smallest size to allow initialization more than once.

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
alberth 15 years ago
parent 82532ac12e
commit 054deab7b3

@ -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);

@ -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.

Loading…
Cancel
Save