1
0
Fork 0

Fix #12976: Incorrect widget rect scrolling for RTL languages.

Industry directory window did not consider RTL when applying horizontal scrolling.
pull/12978/head
Peter Nelson 2024-10-04 21:01:08 +01:00
parent 26c2255897
commit da739204ca
No known key found for this signature in database
GPG Key ID: 8EF8F0A467DF75ED
4 changed files with 32 additions and 3 deletions

View File

@ -1712,8 +1712,7 @@ public:
AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
ir.left -= this->hscroll->GetPosition();
ir.right += this->hscroll->GetCapacity() - this->hscroll->GetPosition();
ir = ScrollRect(ir, *this->hscroll, 1);
if (this->industries.empty()) {
DrawString(ir, STR_INDUSTRY_DIRECTORY_NONE);

View File

@ -910,7 +910,7 @@ struct ScriptDebugWindow : public Window {
AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
fr.left -= this->hscroll->GetPosition();
fr = ScrollRect(fr, *this->hscroll, 1);
auto [first, last] = this->vscroll->GetVisibleRangeIterators(log);
for (auto it = first; it != last; ++it) {

View File

@ -2401,6 +2401,35 @@ void Scrollbar::SetCapacityFromWidget(Window *w, WidgetID widget, int padding)
}
}
/**
* Apply 'scroll' to a rect to be drawn in.
* @param r Rect to be 'scrolled'.
* @param sb The scrollbar affecting the scroll.
* @param resize_step Resize step of the widget/scrollbar (1 if the scrollbar is pixel-based.)
* @returns Scrolled rect.
*/
Rect ScrollRect(Rect r, const Scrollbar &sb, int resize_step)
{
const int count = sb.GetCount() * resize_step;
const int position = sb.GetPosition() * resize_step;
if (sb.IsVertical()) {
r.top -= position;
r.bottom = r.top + count;
} else {
bool rtl = _current_text_dir == TD_RTL;
if (rtl) {
r.right += position;
r.left = r.right - count;
} else {
r.left -= position;
r.right = r.left + count;
}
}
return r;
}
/**
* Scrollbar widget.
* @param tp Scrollbar type. (horizontal/vertical)

View File

@ -1051,5 +1051,6 @@ extern SpecialMouseMode _special_mouse_mode;
void SetFocusedWindow(Window *w);
void ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y);
Rect ScrollRect(Rect r, const Scrollbar &sb, int resize_step = 1);
#endif /* WINDOW_GUI_H */