Fix: Recalculate padding and minimum sizes when GUI or Font zoom is changed.
(cherry picked from commit 4791ff2862
)
This commit is contained in:

committed by
Jonathan G Rennison

parent
43a3a233df
commit
a469b4f395
@@ -821,6 +821,14 @@ NWidgetBase *NWidgetBase::GetWidgetOfType(WidgetType tp)
|
||||
return (this->type == tp) ? this : nullptr;
|
||||
}
|
||||
|
||||
void NWidgetBase::AdjustPaddingForZoom()
|
||||
{
|
||||
this->padding_top = ScaleGUITrad(this->uz_padding_top);
|
||||
this->padding_right = ScaleGUITrad(this->uz_padding_right);
|
||||
this->padding_bottom = ScaleGUITrad(this->uz_padding_bottom);
|
||||
this->padding_left = ScaleGUITrad(this->uz_padding_left);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for resizable nested widgets.
|
||||
* @param tp Nested widget type.
|
||||
@@ -833,6 +841,15 @@ NWidgetResizeBase::NWidgetResizeBase(WidgetType tp, uint fill_x, uint fill_y) :
|
||||
this->fill_y = fill_y;
|
||||
}
|
||||
|
||||
void NWidgetResizeBase::AdjustPaddingForZoom()
|
||||
{
|
||||
if (!this->absolute) {
|
||||
this->min_x = ScaleGUITrad(this->uz_min_x);
|
||||
this->min_y = std::max(ScaleGUITrad(this->uz_min_y), this->uz_text_lines * GetCharacterHeight(this->uz_text_size) + ScaleGUITrad(this->uz_text_spacing));
|
||||
}
|
||||
NWidgetBase::AdjustPaddingForZoom();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set minimal size of the widget.
|
||||
* @param min_x Horizontal minimal size of the widget.
|
||||
@@ -840,6 +857,20 @@ NWidgetResizeBase::NWidgetResizeBase(WidgetType tp, uint fill_x, uint fill_y) :
|
||||
*/
|
||||
void NWidgetResizeBase::SetMinimalSize(uint min_x, uint min_y)
|
||||
{
|
||||
this->uz_min_x = std::max(this->uz_min_x, min_x);
|
||||
this->uz_min_y = std::max(this->uz_min_y, min_y);
|
||||
this->min_x = ScaleGUITrad(this->uz_min_x);
|
||||
this->min_y = std::max(ScaleGUITrad(this->uz_min_y), this->uz_text_lines * GetCharacterHeight(this->uz_text_size) + ScaleGUITrad(this->uz_text_spacing));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set absolute (post-scaling) minimal size of the widget.
|
||||
* @param min_x Horizontal minimal size of the widget.
|
||||
* @param min_y Vertical minimal size of the widget.
|
||||
*/
|
||||
void NWidgetResizeBase::SetMinimalSizeAbsolute(uint min_x, uint min_y)
|
||||
{
|
||||
this->absolute = true;
|
||||
this->min_x = std::max(this->min_x, min_x);
|
||||
this->min_y = std::max(this->min_y, min_y);
|
||||
}
|
||||
@@ -852,7 +883,10 @@ void NWidgetResizeBase::SetMinimalSize(uint min_x, uint min_y)
|
||||
*/
|
||||
void NWidgetResizeBase::SetMinimalTextLines(uint8 min_lines, uint8 spacing, FontSize size)
|
||||
{
|
||||
this->min_y = min_lines * GetCharacterHeight(size) + spacing;
|
||||
this->uz_text_lines = min_lines;
|
||||
this->uz_text_spacing = spacing;
|
||||
this->uz_text_size = size;
|
||||
this->min_y = std::max(ScaleGUITrad(this->uz_min_y), this->uz_text_lines * GetCharacterHeight(this->uz_text_size) + ScaleGUITrad(this->uz_text_spacing));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -995,6 +1029,14 @@ NWidgetBase *NWidgetContainer::GetWidgetOfType(WidgetType tp)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void NWidgetContainer::AdjustPaddingForZoom()
|
||||
{
|
||||
for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
|
||||
child_wid->AdjustPaddingForZoom();
|
||||
}
|
||||
NWidgetBase::AdjustPaddingForZoom();
|
||||
}
|
||||
|
||||
/**
|
||||
* Append widget \a wid to container.
|
||||
* @param wid Widget to append.
|
||||
@@ -1036,6 +1078,14 @@ void NWidgetStacked::SetIndex(int index)
|
||||
this->index = index;
|
||||
}
|
||||
|
||||
void NWidgetStacked::AdjustPaddingForZoom()
|
||||
{
|
||||
for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
|
||||
child_wid->AdjustPaddingForZoom();
|
||||
}
|
||||
NWidgetContainer::AdjustPaddingForZoom();
|
||||
}
|
||||
|
||||
void NWidgetStacked::SetupSmallestSize(Window *w, bool init_array)
|
||||
{
|
||||
if (this->index >= 0 && init_array) { // Fill w->nested_array[]
|
||||
@@ -1166,6 +1216,14 @@ NWidgetPIPContainer::NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags
|
||||
this->flags = flags;
|
||||
}
|
||||
|
||||
void NWidgetPIPContainer::AdjustPaddingForZoom()
|
||||
{
|
||||
this->pip_pre = ScaleGUITrad(this->uz_pip_pre);
|
||||
this->pip_inter = ScaleGUITrad(this->uz_pip_inter);
|
||||
this->pip_post = ScaleGUITrad(this->uz_pip_post);
|
||||
NWidgetContainer::AdjustPaddingForZoom();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set additional pre/inter/post space for the container.
|
||||
*
|
||||
@@ -1177,9 +1235,13 @@ NWidgetPIPContainer::NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags
|
||||
*/
|
||||
void NWidgetPIPContainer::SetPIP(uint8 pip_pre, uint8 pip_inter, uint8 pip_post)
|
||||
{
|
||||
this->pip_pre = pip_pre;
|
||||
this->pip_inter = pip_inter;
|
||||
this->pip_post = pip_post;
|
||||
this->uz_pip_pre = pip_pre;
|
||||
this->uz_pip_inter = pip_inter;
|
||||
this->uz_pip_post = pip_post;
|
||||
|
||||
this->pip_pre = ScaleGUITrad(this->uz_pip_pre);
|
||||
this->pip_inter = ScaleGUITrad(this->uz_pip_inter);
|
||||
this->pip_post = ScaleGUITrad(this->uz_pip_post);
|
||||
}
|
||||
|
||||
void NWidgetPIPContainer::Draw(const Window *w)
|
||||
@@ -1862,6 +1924,12 @@ void NWidgetBackground::SetPIP(uint8 pip_pre, uint8 pip_inter, uint8 pip_post)
|
||||
this->child->SetPIP(pip_pre, pip_inter, pip_post);
|
||||
}
|
||||
|
||||
void NWidgetBackground::AdjustPaddingForZoom()
|
||||
{
|
||||
if (child != nullptr) child->AdjustPaddingForZoom();
|
||||
NWidgetCore::AdjustPaddingForZoom();
|
||||
}
|
||||
|
||||
void NWidgetBackground::SetupSmallestSize(Window *w, bool init_array)
|
||||
{
|
||||
if (init_array && this->index >= 0) {
|
||||
@@ -2203,11 +2271,11 @@ void NWidgetScrollbar::SetupSmallestSize(Window *w, bool init_array)
|
||||
|
||||
switch (this->type) {
|
||||
case NWID_HSCROLLBAR:
|
||||
this->SetMinimalSize(NWidgetScrollbar::GetHorizontalDimension().width * 3, NWidgetScrollbar::GetHorizontalDimension().height);
|
||||
this->SetMinimalSizeAbsolute(NWidgetScrollbar::GetHorizontalDimension().width * 3, NWidgetScrollbar::GetHorizontalDimension().height);
|
||||
break;
|
||||
|
||||
case NWID_VSCROLLBAR:
|
||||
this->SetMinimalSize(NWidgetScrollbar::GetVerticalDimension().width, NWidgetScrollbar::GetVerticalDimension().height * 3);
|
||||
this->SetMinimalSizeAbsolute(NWidgetScrollbar::GetVerticalDimension().width, NWidgetScrollbar::GetVerticalDimension().height * 3);
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
@@ -2840,7 +2908,7 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest,
|
||||
NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
|
||||
if (nwrb != nullptr) {
|
||||
assert(parts->u.xy.x >= 0 && parts->u.xy.y >= 0);
|
||||
nwrb->SetMinimalSize(ScaleGUITrad(parts->u.xy.x), ScaleGUITrad(parts->u.xy.y));
|
||||
nwrb->SetMinimalSize(parts->u.xy.x, parts->u.xy.y);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2886,15 +2954,15 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest,
|
||||
}
|
||||
|
||||
case WPT_PADDING:
|
||||
if (*dest != nullptr) (*dest)->SetPadding(ScaleGUITrad(parts->u.padding.top), ScaleGUITrad(parts->u.padding.right), ScaleGUITrad(parts->u.padding.bottom), ScaleGUITrad(parts->u.padding.left));
|
||||
if (*dest != nullptr) (*dest)->SetPadding(parts->u.padding.top, parts->u.padding.right, parts->u.padding.bottom, parts->u.padding.left);
|
||||
break;
|
||||
|
||||
case WPT_PIPSPACE: {
|
||||
NWidgetPIPContainer *nwc = dynamic_cast<NWidgetPIPContainer *>(*dest);
|
||||
if (nwc != nullptr) nwc->SetPIP(ScaleGUITrad(parts->u.pip.pre), ScaleGUITrad(parts->u.pip.inter), ScaleGUITrad(parts->u.pip.post));
|
||||
if (nwc != nullptr) nwc->SetPIP(parts->u.pip.pre, parts->u.pip.inter, parts->u.pip.post);
|
||||
|
||||
NWidgetBackground *nwb = dynamic_cast<NWidgetBackground *>(*dest);
|
||||
if (nwb != nullptr) nwb->SetPIP(ScaleGUITrad(parts->u.pip.pre), ScaleGUITrad(parts->u.pip.inter), ScaleGUITrad(parts->u.pip.post));
|
||||
if (nwb != nullptr) nwb->SetPIP(parts->u.pip.pre, parts->u.pip.inter, parts->u.pip.post);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3091,7 +3159,7 @@ NWidgetBase *MakeCompanyButtonRows(int *biggest_index, int widget_first, int wid
|
||||
NWidgetHorizontal *hor = nullptr; // Storage for buttons in one row.
|
||||
int hor_length = 0;
|
||||
|
||||
Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON);
|
||||
Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_OUT_4X);
|
||||
sprite_size.width += WD_MATRIX_LEFT + WD_MATRIX_RIGHT;
|
||||
sprite_size.height += WD_MATRIX_TOP + WD_MATRIX_BOTTOM + 1; // 1 for the 'offset' of being pressed
|
||||
|
||||
|
Reference in New Issue
Block a user