summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
authorPeter Nelson <peter1138@openttd.org>2019-02-14 06:25:17 +0000
committerCharles Pigott <charlespigott@googlemail.com>2019-02-21 08:11:35 +0000
commitde9f54ccc185d35727858a36fcebc82178c519c6 (patch)
tree661eacdde5ffdbc9e16f5a80eb67024c384634f8 /src/window.cpp
parent66d23e3e865167200a1121d30be9f538bb878507 (diff)
downloadopenttd-de9f54ccc185d35727858a36fcebc82178c519c6.tar.xz
Codechange: Change scrolling_scrollbar to mouse_capture_widget, and dispatch OnClick() event if widget is not a scrollbar.
This allows any widget to support mouse capture.
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp81
1 files changed, 50 insertions, 31 deletions
diff --git a/src/window.cpp b/src/window.cpp
index e8c4fe74d..1729687f2 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -1846,7 +1846,7 @@ void Window::InitNested(WindowNumber window_number)
* Empty constructor, initialization has been moved to #InitNested() called from the constructor of the derived class.
* @param desc The description of the window.
*/
-Window::Window(WindowDesc *desc) : window_desc(desc), scrolling_scrollbar(-1)
+Window::Window(WindowDesc *desc) : window_desc(desc), mouse_capture_widget(-1)
{
}
@@ -1934,7 +1934,7 @@ static void DecreaseWindowCounters()
NWidgetScrollbar *sb = static_cast<NWidgetScrollbar*>(nwid);
if (sb->disp_flags & (ND_SCROLLBAR_UP | ND_SCROLLBAR_DOWN)) {
sb->disp_flags &= ~(ND_SCROLLBAR_UP | ND_SCROLLBAR_DOWN);
- w->scrolling_scrollbar = -1;
+ w->mouse_capture_widget = -1;
sb->SetDirty(w);
}
}
@@ -2386,47 +2386,66 @@ static void StartWindowSizing(Window *w, bool to_left)
}
/**
- * handle scrollbar scrolling with the mouse.
+ * Handle scrollbar scrolling with the mouse.
+ * @param w window with active scrollbar.
+ */
+static void HandleScrollbarScrolling(Window *w)
+{
+ int i;
+ NWidgetScrollbar *sb = w->GetWidget<NWidgetScrollbar>(w->mouse_capture_widget);
+ bool rtl = false;
+
+ if (sb->type == NWID_HSCROLLBAR) {
+ i = _cursor.pos.x - _cursorpos_drag_start.x;
+ rtl = _current_text_dir == TD_RTL;
+ } else {
+ i = _cursor.pos.y - _cursorpos_drag_start.y;
+ }
+
+ if (sb->disp_flags & ND_SCROLLBAR_BTN) {
+ if (_scroller_click_timeout == 1) {
+ _scroller_click_timeout = 3;
+ sb->UpdatePosition(rtl == HasBit(sb->disp_flags, NDB_SCROLLBAR_UP) ? 1 : -1);
+ w->SetDirty();
+ }
+ return;
+ }
+
+ /* Find the item we want to move to and make sure it's inside bounds. */
+ int pos = min(max(0, i + _scrollbar_start_pos) * sb->GetCount() / _scrollbar_size, max(0, sb->GetCount() - sb->GetCapacity()));
+ if (rtl) pos = max(0, sb->GetCount() - sb->GetCapacity() - pos);
+ if (pos != sb->GetPosition()) {
+ sb->SetPosition(pos);
+ w->SetDirty();
+ }
+}
+
+/**
+ * Handle active widget (mouse draggin on widget) with the mouse.
* @return State of handling the event.
*/
-static EventState HandleScrollbarScrolling()
+static EventState HandleActiveWidget()
{
Window *w;
FOR_ALL_WINDOWS_FROM_BACK(w) {
- if (w->scrolling_scrollbar >= 0) {
+ if (w->mouse_capture_widget >= 0) {
/* Abort if no button is clicked any more. */
if (!_left_button_down) {
- w->scrolling_scrollbar = -1;
+ w->mouse_capture_widget = -1;
w->SetDirty();
return ES_HANDLED;
}
- int i;
- NWidgetScrollbar *sb = w->GetWidget<NWidgetScrollbar>(w->scrolling_scrollbar);
- bool rtl = false;
+ /* If cursor hasn't moved, there is nothing to do. */
+ if (_cursor.delta.x == 0 && _cursor.delta.y == 0) return ES_HANDLED;
- if (sb->type == NWID_HSCROLLBAR) {
- i = _cursor.pos.x - _cursorpos_drag_start.x;
- rtl = _current_text_dir == TD_RTL;
+ /* Handle scrollbar internally, or dispatch click event */
+ WidgetType type = w->GetWidget<NWidgetBase>(w->mouse_capture_widget)->type;
+ if (type == NWID_VSCROLLBAR || type == NWID_HSCROLLBAR) {
+ HandleScrollbarScrolling(w);
} else {
- i = _cursor.pos.y - _cursorpos_drag_start.y;
- }
-
- if (sb->disp_flags & ND_SCROLLBAR_BTN) {
- if (_scroller_click_timeout == 1) {
- _scroller_click_timeout = 3;
- sb->UpdatePosition(rtl == HasBit(sb->disp_flags, NDB_SCROLLBAR_UP) ? 1 : -1);
- w->SetDirty();
- }
- return ES_HANDLED;
- }
-
- /* Find the item we want to move to and make sure it's inside bounds. */
- int pos = min(max(0, i + _scrollbar_start_pos) * sb->GetCount() / _scrollbar_size, max(0, sb->GetCount() - sb->GetCapacity()));
- if (rtl) pos = max(0, sb->GetCount() - sb->GetCapacity() - pos);
- if (pos != sb->GetPosition()) {
- sb->SetPosition(pos);
- w->SetDirty();
+ Point pt = { _cursor.pos.x - w->left, _cursor.pos.y - w->top };
+ w->OnClick(pt, w->mouse_capture_widget, 0);
}
return ES_HANDLED;
}
@@ -2845,7 +2864,7 @@ static void MouseLoop(MouseClick click, int mousewheel)
if (VpHandlePlaceSizingDrag() == ES_HANDLED) return;
if (HandleMouseDragDrop() == ES_HANDLED) return;
if (HandleWindowDragging() == ES_HANDLED) return;
- if (HandleScrollbarScrolling() == ES_HANDLED) return;
+ if (HandleActiveWidget() == ES_HANDLED) return;
if (HandleViewportScroll() == ES_HANDLED) return;
HandleMouseOver();