diff --git a/src/viewport.cpp b/src/viewport.cpp index ce1a582902..506f5e4c4d 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -4215,15 +4215,15 @@ bool HandleViewportDoubleClicked(Window *w, int x, int y) } } -bool HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click) +HandleViewportClickedResult HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click) { - /* No click in smallmap mode except for plan making. */ - if (vp->zoom >= ZOOM_LVL_DRAW_MAP && !(_thd.place_mode & HT_MAP)) return true; + /* No click in smallmap mode except for plan making and left-button scrolling. */ + if (vp->zoom >= ZOOM_LVL_DRAW_MAP && !(_thd.place_mode & HT_MAP)) return HVCR_SCROLL_ONLY; const Vehicle *v = CheckClickOnVehicle(vp, x, y); if (_thd.place_mode & HT_VEHICLE) { - if (v != nullptr && VehicleClicked(v)) return true; + if (v != nullptr && VehicleClicked(v)) return HVCR_DENY; } /* Vehicle placement mode already handled above. */ @@ -4235,18 +4235,18 @@ bool HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click) static bool stop_snap_on_double_click = false; if (double_click && stop_snap_on_double_click) { SetRailSnapMode(RSM_NO_SNAP); - return true; + return HVCR_DENY; } stop_snap_on_double_click = !(_thd.drawstyle & HT_LINE) || (_thd.dir2 == HT_DIR_END); } PlaceObject(); - return true; + return HVCR_DENY; } - if (vp->zoom >= ZOOM_LVL_DRAW_MAP) return true; + if (vp->zoom >= ZOOM_LVL_DRAW_MAP) return HVCR_SCROLL_ONLY; - if (CheckClickOnViewportSign(vp, x, y)) return true; + if (CheckClickOnViewportSign(vp, x, y)) return HVCR_DENY; bool result = CheckClickOnLandscape(vp, x, y); if (v != nullptr) { @@ -4260,9 +4260,9 @@ bool HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click) ShowVehicleViewWindow(v); } } - return true; + return HVCR_DENY; } - return result; + return result ? HVCR_DENY : HVCR_ALLOW; } void RebuildViewportOverlay(Window *w, bool incremental) diff --git a/src/viewport_func.h b/src/viewport_func.h index 229964b489..f37c2c5166 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -75,8 +75,14 @@ void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const Vie void StartSpriteCombine(); void EndSpriteCombine(); +enum HandleViewportClickedResult { + HVCR_DENY, + HVCR_SCROLL_ONLY, + HVCR_ALLOW, +}; + bool HandleViewportDoubleClicked(Window *w, int x, int y); -bool HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click); +HandleViewportClickedResult HandleViewportClicked(const Viewport *vp, int x, int y, bool double_click); void SetRedErrorSquare(TileIndex tile); void SetTileSelectSize(int w, int h); void SetTileSelectBigSize(int ox, int oy, int sx, int sy); diff --git a/src/window.cpp b/src/window.cpp index 2bcd6ab1f4..26a394a802 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2995,15 +2995,18 @@ static void MouseLoop(MouseClick click, int mousewheel) case MC_DOUBLE_LEFT: if (HandleViewportDoubleClicked(w, x, y)) break; /* FALL THROUGH */ - case MC_LEFT: - if (HandleViewportClicked(vp, x, y, click == MC_DOUBLE_LEFT)) return; + case MC_LEFT: { + HandleViewportClickedResult result = HandleViewportClicked(vp, x, y, click == MC_DOUBLE_LEFT); + if (result == HVCR_DENY) return; if (!(w->flags & WF_DISABLE_VP_SCROLL) && _settings_client.gui.scroll_mode == VSM_MAP_LMB) { _scrolling_viewport = w; _cursor.fix_at = false; return; } + if (result != HVCR_ALLOW) return; break; + } case MC_RIGHT: if (!(w->flags & WF_DISABLE_VP_SCROLL) &&