From 9034a0bce9a466066b000ae95e482ee3041a3184 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Wed, 9 May 2018 01:18:03 +0200 Subject: [PATCH] Restore old selection when the tool gets interupted And re-type the selection variables to use LocationXY8 instead of storing them separately. --- src/openrct2-ui/windows/ViewClipping.cpp | 35 ++++++++++++------- src/openrct2/paint/Paint.cpp | 6 ++-- src/openrct2/paint/Paint.h | 6 ++-- src/openrct2/paint/sprite/Sprite.cpp | 4 +-- .../paint/tile_element/TileElement.cpp | 4 +-- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index 5a6adbad41..833532acb1 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -67,7 +67,10 @@ static rct_widget window_view_clipping_widgets[] = { #pragma region Members static LocationXY16 _selectionStart; -static bool _dragging = false; +static LocationXY8 _previousClipSelectionA; +static LocationXY8 _previousClipSelectionB; +static bool _toolActive; +static bool _dragging; #pragma endregion @@ -163,6 +166,9 @@ rct_window * window_view_clipping_open() window_invalidate(mainWindow); } + _toolActive = false; + _dragging = false; + return window; } @@ -229,12 +235,14 @@ static void window_view_clipping_mouseup(rct_window *w, rct_widgetindex widgetIn case WIDX_CLIP_SELECTOR: // Activate the selection tool tool_set(w, WIDX_BACKGROUND, TOOL_CROSSHAIR); + _toolActive = true; + _dragging = false; // Reset clip selection to show all tiles - gClipXMin = 0; - gClipXMax = MAXIMUM_MAP_SIZE_TECHNICAL - 1; - gClipYMin = 0; - gClipYMax = MAXIMUM_MAP_SIZE_TECHNICAL - 1; + _previousClipSelectionA = gClipSelectionA; + _previousClipSelectionB = gClipSelectionB; + gClipSelectionA = { 0, 0 }; + gClipSelectionB = { MAXIMUM_MAP_SIZE_TECHNICAL - 1, MAXIMUM_MAP_SIZE_TECHNICAL - 1 }; gfx_invalidate_screen(); break; } @@ -247,7 +255,7 @@ static bool window_view_clipping_tool_is_active() return false; if (gCurrentToolWidget.window_classification != WC_VIEW_CLIPPING) return false; - return true; + return _toolActive; } static void window_view_clipping_update(rct_window *w) @@ -266,9 +274,12 @@ static void window_view_clipping_update(rct_window *w) } } - if (window_view_clipping_tool_is_active()) + // Restore previous selection if the tool has been interrupted + if (_toolActive && !window_view_clipping_tool_is_active()) { - // TODO: Deactivate selection tool and restore previous selection + _toolActive = false; + gClipSelectionA = _previousClipSelectionA; + gClipSelectionB = _previousClipSelectionB; } widget_invalidate(w, WIDX_CLIP_HEIGHT_SLIDER); @@ -335,11 +346,9 @@ static void window_view_clipping_tool_drag(rct_window* w, rct_widgetindex widget static void window_view_clipping_tool_up(struct rct_window*, rct_widgetindex, sint32, sint32) { - gClipXMin = gMapSelectPositionA.x / 32; - gClipXMax = gMapSelectPositionB.x / 32; - gClipYMin = gMapSelectPositionA.y / 32; - gClipYMax = gMapSelectPositionB.y / 32; - _dragging = false; + gClipSelectionA = { uint8(gMapSelectPositionA.x / 32), uint8(gMapSelectPositionA.y / 32) }; + gClipSelectionB = { uint8(gMapSelectPositionB.x / 32), uint8(gMapSelectPositionB.y / 32) }; + _toolActive = false; tool_cancel(); gfx_invalidate_screen(); } diff --git a/src/openrct2/paint/Paint.cpp b/src/openrct2/paint/Paint.cpp index 74a5451a72..0b95183293 100644 --- a/src/openrct2/paint/Paint.cpp +++ b/src/openrct2/paint/Paint.cpp @@ -26,10 +26,8 @@ // Globals for paint clipping uint8 gClipHeight = 128; // Default to middle value -uint8 gClipXMin = 0; -uint8 gClipXMax = MAXIMUM_MAP_SIZE_TECHNICAL - 1; -uint8 gClipYMin = 0; -uint8 gClipYMax = MAXIMUM_MAP_SIZE_TECHNICAL - 1; +LocationXY8 gClipSelectionA = { 0, 0 }; +LocationXY8 gClipSelectionB = { MAXIMUM_MAP_SIZE_TECHNICAL - 1, MAXIMUM_MAP_SIZE_TECHNICAL - 1 }; paint_session gPaintSession; static bool _paintSessionInUse; diff --git a/src/openrct2/paint/Paint.h b/src/openrct2/paint/Paint.h index d6a65d9b38..e2337363c7 100644 --- a/src/openrct2/paint/Paint.h +++ b/src/openrct2/paint/Paint.h @@ -172,10 +172,8 @@ extern paint_session gPaintSession; // Globals for paint clipping extern uint8 gClipHeight; -extern uint8 gClipXMin; -extern uint8 gClipXMax; -extern uint8 gClipYMin; -extern uint8 gClipYMax; +extern LocationXY8 gClipSelectionA; +extern LocationXY8 gClipSelectionB; /** rct2: 0x00993CC4. The white ghost that indicates not-yet-built elements. */ #define CONSTRUCTION_MARKER (COLOUR_DARK_GREEN << 19 | COLOUR_GREY << 24 | IMAGE_TYPE_REMAP); diff --git a/src/openrct2/paint/sprite/Sprite.cpp b/src/openrct2/paint/sprite/Sprite.cpp index 1c41fd86ce..29de517c5c 100644 --- a/src/openrct2/paint/sprite/Sprite.cpp +++ b/src/openrct2/paint/sprite/Sprite.cpp @@ -77,9 +77,9 @@ void sprite_paint_setup(paint_session * session, const uint16 eax, const uint16 { if (spr->unknown.z > (gClipHeight * 8)) continue; - if (spr->unknown.x / 32 < gClipXMin || spr->unknown.x / 32 > gClipXMax) + if (spr->unknown.x / 32 < gClipSelectionA.x || spr->unknown.x / 32 > gClipSelectionB.x) continue; - if (spr->unknown.y / 32 < gClipYMin || spr->unknown.y / 32 > gClipYMax) + if (spr->unknown.y / 32 < gClipSelectionA.y || spr->unknown.y / 32 > gClipSelectionB.y) continue; } diff --git a/src/openrct2/paint/tile_element/TileElement.cpp b/src/openrct2/paint/tile_element/TileElement.cpp index 71a326bf1f..99d3fbc7da 100644 --- a/src/openrct2/paint/tile_element/TileElement.cpp +++ b/src/openrct2/paint/tile_element/TileElement.cpp @@ -146,9 +146,9 @@ static void sub_68B3FB(paint_session * session, sint32 x, sint32 y) if ((gCurrentViewportFlags & VIEWPORT_FLAG_CLIP_VIEW)) { - if (x / 32 < gClipXMin || x / 32 > gClipXMax) + if (x / 32 < gClipSelectionA.x || x / 32 > gClipSelectionB.x) return; - if (y / 32 < gClipYMin || y / 32 > gClipYMax) + if (y / 32 < gClipSelectionA.y || y / 32 > gClipSelectionB.y) return; }