mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Don't update window contents if scrollbar position has not moved.
parent
8321ef0061
commit
52b16237ad
|
@ -108,6 +108,7 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in
|
||||||
int pos;
|
int pos;
|
||||||
int button_size;
|
int button_size;
|
||||||
bool rtl = false;
|
bool rtl = false;
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
if (sb->type == NWID_HSCROLLBAR) {
|
if (sb->type == NWID_HSCROLLBAR) {
|
||||||
pos = x;
|
pos = x;
|
||||||
|
@ -122,7 +123,7 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in
|
||||||
SetBit(sb->disp_flags, NDB_SCROLLBAR_UP);
|
SetBit(sb->disp_flags, NDB_SCROLLBAR_UP);
|
||||||
if (_scroller_click_timeout <= 1) {
|
if (_scroller_click_timeout <= 1) {
|
||||||
_scroller_click_timeout = 3;
|
_scroller_click_timeout = 3;
|
||||||
sb->UpdatePosition(rtl ? 1 : -1);
|
changed = sb->UpdatePosition(rtl ? 1 : -1);
|
||||||
}
|
}
|
||||||
w->mouse_capture_widget = sb->index;
|
w->mouse_capture_widget = sb->index;
|
||||||
} else if (pos >= ma - button_size) {
|
} else if (pos >= ma - button_size) {
|
||||||
|
@ -131,16 +132,16 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in
|
||||||
|
|
||||||
if (_scroller_click_timeout <= 1) {
|
if (_scroller_click_timeout <= 1) {
|
||||||
_scroller_click_timeout = 3;
|
_scroller_click_timeout = 3;
|
||||||
sb->UpdatePosition(rtl ? -1 : 1);
|
changed = sb->UpdatePosition(rtl ? -1 : 1);
|
||||||
}
|
}
|
||||||
w->mouse_capture_widget = sb->index;
|
w->mouse_capture_widget = sb->index;
|
||||||
} else {
|
} else {
|
||||||
Point pt = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_HSCROLLBAR);
|
Point pt = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_HSCROLLBAR);
|
||||||
|
|
||||||
if (pos < pt.x) {
|
if (pos < pt.x) {
|
||||||
sb->UpdatePosition(rtl ? 1 : -1, Scrollbar::SS_BIG);
|
changed = sb->UpdatePosition(rtl ? 1 : -1, Scrollbar::SS_BIG);
|
||||||
} else if (pos > pt.y) {
|
} else if (pos > pt.y) {
|
||||||
sb->UpdatePosition(rtl ? -1 : 1, Scrollbar::SS_BIG);
|
changed = sb->UpdatePosition(rtl ? -1 : 1, Scrollbar::SS_BIG);
|
||||||
} else {
|
} else {
|
||||||
_scrollbar_start_pos = pt.x - mi - button_size;
|
_scrollbar_start_pos = pt.x - mi - button_size;
|
||||||
_scrollbar_size = ma - mi - button_size * 2;
|
_scrollbar_size = ma - mi - button_size * 2;
|
||||||
|
@ -149,7 +150,13 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
w->SetDirty();
|
if (changed) {
|
||||||
|
/* Position changed so refresh the window */
|
||||||
|
w->SetDirty();
|
||||||
|
} else {
|
||||||
|
/* No change so only refresh this scrollbar */
|
||||||
|
sb->SetDirty(w);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -737,12 +737,15 @@ public:
|
||||||
/**
|
/**
|
||||||
* Sets the position of the first visible element
|
* Sets the position of the first visible element
|
||||||
* @param position the position of the element
|
* @param position the position of the element
|
||||||
|
* @return true iff the position has changed
|
||||||
*/
|
*/
|
||||||
void SetPosition(int position)
|
bool SetPosition(int position)
|
||||||
{
|
{
|
||||||
assert(position >= 0);
|
assert(position >= 0);
|
||||||
assert(this->count <= this->cap ? (position == 0) : (position + this->cap <= this->count));
|
assert(this->count <= this->cap ? (position == 0) : (position + this->cap <= this->count));
|
||||||
|
uint16 old_pos = this->pos;
|
||||||
this->pos = position;
|
this->pos = position;
|
||||||
|
return this->pos != old_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -750,16 +753,17 @@ public:
|
||||||
* If the position would be too low or high it will be clamped appropriately
|
* If the position would be too low or high it will be clamped appropriately
|
||||||
* @param difference the amount of change requested
|
* @param difference the amount of change requested
|
||||||
* @param unit The stepping unit of \a difference
|
* @param unit The stepping unit of \a difference
|
||||||
|
* @return true iff the position has changed
|
||||||
*/
|
*/
|
||||||
void UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL)
|
bool UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL)
|
||||||
{
|
{
|
||||||
if (difference == 0) return;
|
if (difference == 0) return false;
|
||||||
switch (unit) {
|
switch (unit) {
|
||||||
case SS_SMALL: difference *= this->stepsize; break;
|
case SS_SMALL: difference *= this->stepsize; break;
|
||||||
case SS_BIG: difference *= this->cap; break;
|
case SS_BIG: difference *= this->cap; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
this->SetPosition(Clamp(this->pos + difference, 0, std::max(this->count - this->cap, 0)));
|
return this->SetPosition(Clamp(this->pos + difference, 0, std::max(this->count - this->cap, 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -849,8 +849,7 @@ static void DispatchMouseWheelEvent(Window *w, NWidgetCore *nwid, int wheel)
|
||||||
if (nwid->type == NWID_VSCROLLBAR) {
|
if (nwid->type == NWID_VSCROLLBAR) {
|
||||||
NWidgetScrollbar *sb = static_cast<NWidgetScrollbar *>(nwid);
|
NWidgetScrollbar *sb = static_cast<NWidgetScrollbar *>(nwid);
|
||||||
if (sb->GetCount() > sb->GetCapacity()) {
|
if (sb->GetCount() > sb->GetCapacity()) {
|
||||||
sb->UpdatePosition(wheel);
|
if (sb->UpdatePosition(wheel)) w->SetDirty();
|
||||||
w->SetDirty();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -858,8 +857,7 @@ static void DispatchMouseWheelEvent(Window *w, NWidgetCore *nwid, int wheel)
|
||||||
/* Scroll the widget attached to the scrollbar. */
|
/* Scroll the widget attached to the scrollbar. */
|
||||||
Scrollbar *sb = (nwid->scrollbar_index >= 0 ? w->GetScrollbar(nwid->scrollbar_index) : nullptr);
|
Scrollbar *sb = (nwid->scrollbar_index >= 0 ? w->GetScrollbar(nwid->scrollbar_index) : nullptr);
|
||||||
if (sb != nullptr && sb->GetCount() > sb->GetCapacity()) {
|
if (sb != nullptr && sb->GetCount() > sb->GetCapacity()) {
|
||||||
sb->UpdatePosition(wheel);
|
if (sb->UpdatePosition(wheel)) w->SetDirty();
|
||||||
w->SetDirty();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2413,8 +2411,7 @@ static void HandleScrollbarScrolling(Window *w)
|
||||||
if (sb->disp_flags & ND_SCROLLBAR_BTN) {
|
if (sb->disp_flags & ND_SCROLLBAR_BTN) {
|
||||||
if (_scroller_click_timeout == 1) {
|
if (_scroller_click_timeout == 1) {
|
||||||
_scroller_click_timeout = 3;
|
_scroller_click_timeout = 3;
|
||||||
sb->UpdatePosition(rtl == HasBit(sb->disp_flags, NDB_SCROLLBAR_UP) ? 1 : -1);
|
if (sb->UpdatePosition(rtl == HasBit(sb->disp_flags, NDB_SCROLLBAR_UP) ? 1 : -1)) w->SetDirty();
|
||||||
w->SetDirty();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue