From 419201f4767e517c40d94aa627a03c1f84425781 Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Tue, 28 Sep 2021 21:02:30 +0200 Subject: [PATCH 01/10] Work on refactoring ViewClipping.cpp to the new window framework. --- src/openrct2-ui/windows/ViewClipping.cpp | 350 ++++++++++++++++++++++- 1 file changed, 341 insertions(+), 9 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index e4c897d335..ef0d668230 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -65,17 +65,17 @@ static rct_widget window_view_clipping_widgets[] = { #pragma endregion #pragma region Members - +/* static CoordsXY _selectionStart; static CoordsXY _previousClipSelectionA; static CoordsXY _previousClipSelectionB; static bool _toolActive; static bool _dragging; - +*/ #pragma endregion #pragma region Events - +/* static void window_view_clipping_close_button(rct_window* w); static void window_view_clipping_mouseup(rct_window* w, rct_widgetindex widgetIndex); static void window_view_clipping_mousedown(rct_window*w, rct_widgetindex widgetIndex, rct_widget *widget); @@ -103,20 +103,327 @@ static rct_window_event_list window_view_clipping_events([](auto& events) events.invalidate = &window_view_clipping_invalidate; events.paint = &window_view_clipping_paint; }); +*/ // clang-format on #pragma endregion -static void window_view_clipping_set_clipheight(rct_window* w, const uint8_t clipheight) +class ViewClippingWindow final : public Window { - gClipHeight = clipheight; - rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; - const float clip_height_ratio = static_cast(gClipHeight) / 255; - w->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (w->scrolls[0].h_right - (widget->width() - 1)))); -} +private: + + CoordsXY _selectionStart; + CoordsXY _previousClipSelectionA; + CoordsXY _previousClipSelectionB; + bool _toolActive; + bool _dragging; +public: + void OnCloseButton() + { + OnClose(); + } + + void OnMouseUp(rct_widgetindex widgetIndex) override + { + rct_window* mainWindow; + + // mouseup appears to be used for buttons, checkboxes + switch (widgetIndex) + { + case WIDX_CLOSE: + window_close(this); // Unsure about this. ~hjort96 + break; + case WIDX_CLIP_CHECKBOX_ENABLE: + // Toggle height clipping. + mainWindow = window_get_main(); + if (mainWindow != nullptr) + { + mainWindow->viewport->flags ^= VIEWPORT_FLAG_CLIP_VIEW; + mainWindow->Invalidate(); + } + this->Invalidate(); + break; + case WIDX_CLIP_HEIGHT_VALUE: + // Toggle display of the cut height value in RAW vs UNITS + if (gClipHeightDisplayType == DISPLAY_TYPE::DISPLAY_RAW) + { + gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; + } + else + { + gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_RAW; + } + this->Invalidate(); + break; + case WIDX_CLIP_SELECTOR: + // Activate the selection tool + tool_set(this, WIDX_BACKGROUND, Tool::Crosshair); + _toolActive = true; + _dragging = false; + + // Reset clip selection to show all tiles + _previousClipSelectionA = gClipSelectionA; + _previousClipSelectionB = gClipSelectionB; + gClipSelectionA = { 0, 0 }; + gClipSelectionB = { MAXIMUM_MAP_SIZE_BIG - 1, MAXIMUM_MAP_SIZE_BIG - 1 }; + gfx_invalidate_screen(); + break; + case WIDX_CLIP_CLEAR: + if (IsActive()) + { + _toolActive = false; + tool_cancel(); + } + gClipSelectionA = { 0, 0 }; + gClipSelectionB = { MAXIMUM_MAP_SIZE_BIG - 1, MAXIMUM_MAP_SIZE_BIG - 1 }; + gfx_invalidate_screen(); + break; + } + } + + void OnMouseDown(rct_widgetindex widgetIndex) override + { + + rct_window* mainWindow; + + switch (widgetIndex) + { + case WIDX_CLIP_HEIGHT_INCREASE: + if (gClipHeight < 255) + SetClipHeight(gClipHeight + 1); + mainWindow = window_get_main(); + if (mainWindow != nullptr) + mainWindow->Invalidate(); + break; + case WIDX_CLIP_HEIGHT_DECREASE: + if (gClipHeight > 0) + SetClipHeight(gClipHeight - 1); + mainWindow = window_get_main(); + if (mainWindow != nullptr) + mainWindow->Invalidate(); + break; + } + } + + void OnUpdate() override + { + const rct_widget* const widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + const rct_scroll* const scroll = &this->scrolls[0]; + const int16_t scroll_width = widget->width() - 1; + const uint8_t clip_height = static_cast( + (static_cast(scroll->h_left) / (scroll->h_right - scroll_width)) * 255); + if (clip_height != gClipHeight) + { + gClipHeight = clip_height; + + // Update the main window accordingly. + rct_window* mainWindow = window_get_main(); + if (mainWindow != nullptr) + { + mainWindow->Invalidate(); + } + } + + // Restore previous selection if the tool has been interrupted + if (_toolActive && !IsActive()) + { + _toolActive = false; + gClipSelectionA = _previousClipSelectionA; + gClipSelectionB = _previousClipSelectionB; + } + + widget_invalidate(this, WIDX_CLIP_HEIGHT_SLIDER); + } + + void OnToolUpdate(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) + { + if (_dragging) + { + return; + } + + int32_t direction; + auto mapCoords = screen_pos_to_map_pos(screenCoords, &direction); + if (mapCoords.has_value()) + { + gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; + map_invalidate_tile_full(gMapSelectPositionA); + gMapSelectPositionA = gMapSelectPositionB = mapCoords.value(); + map_invalidate_tile_full(mapCoords.value()); + gMapSelectType = MAP_SELECT_TYPE_FULL; + } + } + + void OnToolDown(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) override + { + int32_t direction; + auto mapCoords = screen_pos_to_map_pos(screenCoords, &direction); + if (mapCoords.has_value()) + { + _dragging = true; + _selectionStart = mapCoords.value(); + } + } + + void OnToolDrag(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) + { + if (!_dragging) + { + return; + } + + int32_t direction; + auto mapCoords = screen_pos_to_map_pos(screenCoords, &direction); + if (mapCoords) + { + map_invalidate_selection_rect(); + gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; + gMapSelectPositionA.x = std::min(_selectionStart.x, mapCoords->x); + gMapSelectPositionB.x = std::max(_selectionStart.x, mapCoords->x); + gMapSelectPositionA.y = std::min(_selectionStart.y, mapCoords->y); + gMapSelectPositionB.y = std::max(_selectionStart.y, mapCoords->y); + gMapSelectType = MAP_SELECT_TYPE_FULL; + map_invalidate_selection_rect(); + } + } + + void OnToolUp(rct_widgetindex, const ScreenCoordsXY&) + { + gClipSelectionA = gMapSelectPositionA; + gClipSelectionB = gMapSelectPositionB; + _toolActive = false; + tool_cancel(); + gfx_invalidate_screen(); + } + + void OnInvalidate() + { + WidgetScrollUpdateThumbs(this, WIDX_CLIP_HEIGHT_SLIDER); + + rct_window* mainWindow = window_get_main(); + if (mainWindow != nullptr) + { + WidgetSetCheckboxValue(this, WIDX_CLIP_CHECKBOX_ENABLE, mainWindow->viewport->flags & VIEWPORT_FLAG_CLIP_VIEW); + } + + if (IsActive()) + { + this->pressed_widgets |= 1ULL << WIDX_CLIP_SELECTOR; + } + else + { + this->pressed_widgets &= ~(1ULL << WIDX_CLIP_SELECTOR); + } + } + + void OnPaint(rct_drawpixelinfo* dpi) + { + + WindowDrawWidgets(this, dpi); + + // Clip height value + auto screenCoords = this->windowPos + ScreenCoordsXY{ 8, this->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; + DrawTextBasic(dpi, screenCoords, STR_VIEW_CLIPPING_HEIGHT_VALUE, {}, { this->colours[0] }); + + screenCoords = this->windowPos + + ScreenCoordsXY{ this->widgets[WIDX_CLIP_HEIGHT_VALUE].left + 1, this->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; + + switch (gClipHeightDisplayType) + { + case DISPLAY_TYPE::DISPLAY_RAW: + default: + { + auto ft = Formatter(); + ft.Add(static_cast(gClipHeight)); + DrawTextBasic(dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); // Printing the raw value. + break; + } + case DISPLAY_TYPE::DISPLAY_UNITS: + { + // Print the value in the configured height label type: + if (gConfigGeneral.show_height_as_units == 1) + { + // Height label is Units. + auto ft = Formatter(); + ft.Add(static_cast(FIXED_1DP(gClipHeight, 0) / 2 - FIXED_1DP(7, 0))); + DrawTextBasic( + dpi, screenCoords, STR_UNIT1DP_NO_SUFFIX, ft, + { this->colours[0] }); // Printing the value in Height Units. + } + else + { + // Height label is Real Values. + // Print the value in the configured measurement units. + switch (gConfigGeneral.measurement_format) + { + case MeasurementFormat::Metric: + case MeasurementFormat::SI: + { + auto ft = Formatter(); + ft.Add( + static_cast(FIXED_2DP(gClipHeight, 0) / 2 * 1.5f - FIXED_2DP(10, 50))); + DrawTextBasic(dpi, screenCoords, STR_UNIT2DP_SUFFIX_METRES, ft, { this->colours[0] }); + break; + } + case MeasurementFormat::Imperial: + { + auto ft = Formatter(); + ft.Add( + static_cast(FIXED_1DP(gClipHeight, 0) / 2.0f * 5 - FIXED_1DP(35, 0))); + DrawTextBasic(dpi, screenCoords, STR_UNIT1DP_SUFFIX_FEET, ft, { this->colours[0] }); + break; + } + } + } + } + } + } + + ScreenSize OnScrollGetSize(int32_t scrollIndex) override //void OnScrollGetSize(int scrollIndex, int* width, int* height) + { + return { 1000, 0 }; + } + +private: + void OnClose() override + { + // Turn off view clipping when the window is closed. + rct_window* mainWindow = window_get_main(); + if (mainWindow != nullptr) + { + mainWindow->viewport->flags &= ~VIEWPORT_FLAG_CLIP_VIEW; + mainWindow->Invalidate(); + } + } + + void SetClipHeight(const uint8_t clipheight) + { + gClipHeight = clipheight; + rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + const float clip_height_ratio = static_cast(gClipHeight) / 255; + this->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + } + + bool IsActive() + { + if (!(input_test_flag(INPUT_FLAG_TOOL_ACTIVE))) + return false; + if (gCurrentToolWidget.window_classification != WC_VIEW_CLIPPING) + return false; + return _toolActive; + } + +}; rct_window* window_view_clipping_open() { + auto* window = window_bring_to_front_by_class(WC_VIEW_CLIPPING); + if (window == nullptr) + { + window = WindowCreate(WC_VIEW_CLIPPING, ScreenCoordsXY(32, 32), WW, WH); + } + return window; + /* rct_window* window; // Get the main viewport to set the view clipping flag. @@ -155,8 +462,19 @@ rct_window* window_view_clipping_open() _dragging = false; return window; + */ +} +/* +// Done +static void window_view_clipping_set_clipheight(rct_window* w, const uint8_t clipheight) +{ + gClipHeight = clipheight; + rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + const float clip_height_ratio = static_cast(gClipHeight) / 255; + w->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (w->scrolls[0].h_right - (widget->width() - 1)))); } +// Done static void window_view_clipping_close() { // Turn off view clipping when the window is closed. @@ -168,11 +486,13 @@ static void window_view_clipping_close() } } +// Done static void window_view_clipping_close_button(rct_window* w) { window_view_clipping_close(); } +// Done // Returns true when the tool is active static bool window_view_clipping_tool_is_active() { @@ -183,6 +503,7 @@ static bool window_view_clipping_tool_is_active() return _toolActive; } +// Done static void window_view_clipping_mouseup(rct_window* w, rct_widgetindex widgetIndex) { rct_window* mainWindow; @@ -241,6 +562,7 @@ static void window_view_clipping_mouseup(rct_window* w, rct_widgetindex widgetIn } } +// Done static void window_view_clipping_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { rct_window* mainWindow = window_get_main(); @@ -262,6 +584,7 @@ static void window_view_clipping_mousedown(rct_window* w, rct_widgetindex widget } } +// Done static void window_view_clipping_update(rct_window* w) { const rct_widget* const widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; @@ -292,6 +615,7 @@ static void window_view_clipping_update(rct_window* w) widget_invalidate(w, WIDX_CLIP_HEIGHT_SLIDER); } +// Done static void window_view_clipping_tool_update(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { if (_dragging) @@ -311,6 +635,7 @@ static void window_view_clipping_tool_update(rct_window* w, rct_widgetindex widg } } +// Done static void window_view_clipping_tool_down(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { int32_t direction; @@ -322,6 +647,7 @@ static void window_view_clipping_tool_down(rct_window* w, rct_widgetindex widget } } +// Done static void window_view_clipping_tool_drag(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { if (!_dragging) @@ -344,6 +670,7 @@ static void window_view_clipping_tool_drag(rct_window* w, rct_widgetindex widget } } +// Done static void window_view_clipping_tool_up(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&) { gClipSelectionA = gMapSelectPositionA; @@ -353,6 +680,7 @@ static void window_view_clipping_tool_up(struct rct_window*, rct_widgetindex, co gfx_invalidate_screen(); } +// Done static void window_view_clipping_invalidate(rct_window* w) { WidgetScrollUpdateThumbs(w, WIDX_CLIP_HEIGHT_SLIDER); @@ -373,6 +701,7 @@ static void window_view_clipping_invalidate(rct_window* w) } } +// Done static void window_view_clipping_paint(rct_window* w, rct_drawpixelinfo* dpi) { WindowDrawWidgets(w, dpi); @@ -430,7 +759,10 @@ static void window_view_clipping_paint(rct_window* w, rct_drawpixelinfo* dpi) } } +// Done static void window_view_clipping_scrollgetsize(rct_window* w, int scrollIndex, int* width, int* height) { *width = 1000; } +*/ + From 762005f25a2381474af140c8226a747da8755f5f Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Tue, 28 Sep 2021 21:25:07 +0200 Subject: [PATCH 02/10] Fixed crash caused by window not being properly initialized --- src/openrct2-ui/windows/ViewClipping.cpp | 61 +++++++++--------------- 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index ef0d668230..c3d9aacfe2 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -115,8 +115,9 @@ private: CoordsXY _selectionStart; CoordsXY _previousClipSelectionA; CoordsXY _previousClipSelectionB; - bool _toolActive; - bool _dragging; + bool _toolActive{ false }; + bool _dragging{ false }; + public: void OnCloseButton() { @@ -384,6 +385,14 @@ public: return { 1000, 0 }; } + void SetClipHeight(const uint8_t clipheight) + { + gClipHeight = clipheight; + rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + const float clip_height_ratio = static_cast(gClipHeight) / 255; + this->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + } + private: void OnClose() override { @@ -396,14 +405,6 @@ private: } } - void SetClipHeight(const uint8_t clipheight) - { - gClipHeight = clipheight; - rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; - const float clip_height_ratio = static_cast(gClipHeight) / 255; - this->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); - } - bool IsActive() { if (!(input_test_flag(INPUT_FLAG_TOOL_ACTIVE))) @@ -421,36 +422,22 @@ rct_window* window_view_clipping_open() if (window == nullptr) { window = WindowCreate(WC_VIEW_CLIPPING, ScreenCoordsXY(32, 32), WW, WH); + window->widgets = window_view_clipping_widgets; + window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CLIP_CHECKBOX_ENABLE) | (1ULL << WIDX_CLIP_HEIGHT_VALUE) + | (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1ULL << WIDX_CLIP_HEIGHT_DECREASE) | (1ULL << WIDX_CLIP_HEIGHT_SLIDER) + | (1ULL << WIDX_CLIP_SELECTOR) | (1ULL << WIDX_CLIP_CLEAR); + window->hold_down_widgets = (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1UL << WIDX_CLIP_HEIGHT_DECREASE); + WindowInitScrollWidgets(window); } - return window; - /* - rct_window* window; + + // Initialise the clip height slider from the current clip height value. + dynamic_cast(window)->SetClipHeight(gClipHeight); + + window_push_others_below(window); // Get the main viewport to set the view clipping flag. rct_window* mainWindow = window_get_main(); - // Check if window is already open - window = window_find_by_class(WC_VIEW_CLIPPING); - if (window != nullptr) - { - return window; - } - - // Window is not open - create it. - window = WindowCreate(ScreenCoordsXY(32, 32), WW, WH, &window_view_clipping_events, WC_VIEW_CLIPPING, 0); - window->widgets = window_view_clipping_widgets; - window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CLIP_CHECKBOX_ENABLE) | (1ULL << WIDX_CLIP_HEIGHT_VALUE) - | (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1ULL << WIDX_CLIP_HEIGHT_DECREASE) | (1ULL << WIDX_CLIP_HEIGHT_SLIDER) - | (1ULL << WIDX_CLIP_SELECTOR) | (1ULL << WIDX_CLIP_CLEAR); - window->hold_down_widgets = (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1UL << WIDX_CLIP_HEIGHT_DECREASE); - - WindowInitScrollWidgets(window); - - // Initialise the clip height slider from the current clip height value. - window_view_clipping_set_clipheight(window, gClipHeight); - - window_push_others_below(window); - // Turn on view clipping when the window is opened. if (mainWindow != nullptr) { @@ -458,11 +445,7 @@ rct_window* window_view_clipping_open() mainWindow->Invalidate(); } - _toolActive = false; - _dragging = false; - return window; - */ } /* // Done From dbe07554c9ba4b501514caace07901ecb22eeca6 Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Sun, 3 Oct 2021 14:11:53 +0200 Subject: [PATCH 03/10] Added OnOpen() to ViewClippingWindow --- src/openrct2-ui/windows/ViewClipping.cpp | 58 +++++++++++++----------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index c3d9aacfe2..4d60925b7e 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -385,12 +385,30 @@ public: return { 1000, 0 }; } - void SetClipHeight(const uint8_t clipheight) + void OnOpen() override { - gClipHeight = clipheight; - rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; - const float clip_height_ratio = static_cast(gClipHeight) / 255; - this->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + this->widgets = window_view_clipping_widgets; + this->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CLIP_CHECKBOX_ENABLE) | (1ULL << WIDX_CLIP_HEIGHT_VALUE) + | (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1ULL << WIDX_CLIP_HEIGHT_DECREASE) | (1ULL << WIDX_CLIP_HEIGHT_SLIDER) + | (1ULL << WIDX_CLIP_SELECTOR) | (1ULL << WIDX_CLIP_CLEAR); + this->hold_down_widgets = (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1UL << WIDX_CLIP_HEIGHT_DECREASE); + WindowInitScrollWidgets(this); + + // Initialise the clip height slider from the current clip height value. + this->SetClipHeight(gClipHeight); + + window_push_others_below(this); + + // Get the main viewport to set the view clipping flag. + rct_window* mainWindow = window_get_main(); + + // Turn on view clipping when the window is opened. + if (mainWindow != nullptr) + { + mainWindow->viewport->flags |= VIEWPORT_FLAG_CLIP_VIEW; + mainWindow->Invalidate(); + } + } private: @@ -405,6 +423,14 @@ private: } } + void SetClipHeight(const uint8_t clipheight) + { + gClipHeight = clipheight; + rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + const float clip_height_ratio = static_cast(gClipHeight) / 255; + this->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + } + bool IsActive() { if (!(input_test_flag(INPUT_FLAG_TOOL_ACTIVE))) @@ -422,29 +448,7 @@ rct_window* window_view_clipping_open() if (window == nullptr) { window = WindowCreate(WC_VIEW_CLIPPING, ScreenCoordsXY(32, 32), WW, WH); - window->widgets = window_view_clipping_widgets; - window->enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_CLIP_CHECKBOX_ENABLE) | (1ULL << WIDX_CLIP_HEIGHT_VALUE) - | (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1ULL << WIDX_CLIP_HEIGHT_DECREASE) | (1ULL << WIDX_CLIP_HEIGHT_SLIDER) - | (1ULL << WIDX_CLIP_SELECTOR) | (1ULL << WIDX_CLIP_CLEAR); - window->hold_down_widgets = (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1UL << WIDX_CLIP_HEIGHT_DECREASE); - WindowInitScrollWidgets(window); } - - // Initialise the clip height slider from the current clip height value. - dynamic_cast(window)->SetClipHeight(gClipHeight); - - window_push_others_below(window); - - // Get the main viewport to set the view clipping flag. - rct_window* mainWindow = window_get_main(); - - // Turn on view clipping when the window is opened. - if (mainWindow != nullptr) - { - mainWindow->viewport->flags |= VIEWPORT_FLAG_CLIP_VIEW; - mainWindow->Invalidate(); - } - return window; } /* From 0a392841c208e2a7acdec6613507434a449b89b9 Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Sun, 3 Oct 2021 23:05:48 +0200 Subject: [PATCH 04/10] Added functions OnToolUpdate, OnToolDrag, OnToolUp to rct_window --- src/openrct2/interface/Window_internal.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/openrct2/interface/Window_internal.h b/src/openrct2/interface/Window_internal.h index 56dab05199..5a4568ce27 100644 --- a/src/openrct2/interface/Window_internal.h +++ b/src/openrct2/interface/Window_internal.h @@ -176,9 +176,18 @@ struct rct_window virtual void OnScrollDraw(int32_t scrollIndex, rct_drawpixelinfo& dpi) { } + virtual void OnToolUpdate(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) + { + } virtual void OnToolDown(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { } + virtual void OnToolDrag(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) + { + } + virtual void OnToolUp(rct_widgetindex, const ScreenCoordsXY&) + { + } virtual void OnToolAbort(rct_widgetindex widgetIndex) { } From 4fe21e3274d2b8b2c22d84056f18a4f9710e50cd Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Sun, 3 Oct 2021 23:07:03 +0200 Subject: [PATCH 05/10] OnToolUpdate, OnToolDrag, OnToolUp now being used --- src/openrct2/interface/Window.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 68276a7d51..94cc1dbeb5 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -1462,9 +1462,10 @@ void window_event_unknown_08_call(rct_window* w) void window_event_tool_update_call(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { - if (w->event_handlers != nullptr) - if (w->event_handlers->tool_update != nullptr) - w->event_handlers->tool_update(w, widgetIndex, screenCoords); + if (w->event_handlers == nullptr) + w->OnToolUpdate(widgetIndex, screenCoords); + else if (w->event_handlers->tool_update != nullptr) + w->event_handlers->tool_update(w, widgetIndex, screenCoords); } void window_event_tool_down_call(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) @@ -1477,16 +1478,18 @@ void window_event_tool_down_call(rct_window* w, rct_widgetindex widgetIndex, con void window_event_tool_drag_call(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { - if (w->event_handlers != nullptr) - if (w->event_handlers->tool_drag != nullptr) - w->event_handlers->tool_drag(w, widgetIndex, screenCoords); + if (w->event_handlers == nullptr) + w->OnToolDrag(widgetIndex, screenCoords); + else if (w->event_handlers->tool_drag != nullptr) + w->event_handlers->tool_drag(w, widgetIndex, screenCoords); } void window_event_tool_up_call(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) { - if (w->event_handlers != nullptr) - if (w->event_handlers->tool_up != nullptr) - w->event_handlers->tool_up(w, widgetIndex, screenCoords); + if (w->event_handlers == nullptr) + w->OnToolUp(widgetIndex, screenCoords); + else if (w->event_handlers->tool_up != nullptr) + w->event_handlers->tool_up(w, widgetIndex, screenCoords); } void window_event_tool_abort_call(rct_window* w, rct_widgetindex widgetIndex) From 0195ce45a2a6acb1e609260c8b63735b2501e779 Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Sun, 3 Oct 2021 23:08:52 +0200 Subject: [PATCH 06/10] Added OnToolUpdate, OnToolDrag, OnToolUp, OnPrepareDraw to new window --- src/openrct2-ui/windows/ViewClipping.cpp | 369 +---------------------- 1 file changed, 12 insertions(+), 357 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index 4d60925b7e..efc6cb535b 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -64,50 +64,7 @@ static rct_widget window_view_clipping_widgets[] = { #pragma endregion -#pragma region Members -/* -static CoordsXY _selectionStart; -static CoordsXY _previousClipSelectionA; -static CoordsXY _previousClipSelectionB; -static bool _toolActive; -static bool _dragging; -*/ -#pragma endregion - -#pragma region Events -/* -static void window_view_clipping_close_button(rct_window* w); -static void window_view_clipping_mouseup(rct_window* w, rct_widgetindex widgetIndex); -static void window_view_clipping_mousedown(rct_window*w, rct_widgetindex widgetIndex, rct_widget *widget); -static void window_view_clipping_update(rct_window* w); -static void window_view_clipping_tool_update(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords); -static void window_view_clipping_tool_down(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords); -static void window_view_clipping_tool_drag(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords); -static void window_view_clipping_tool_up(rct_window* w, rct_widgetindex, const ScreenCoordsXY&); -static void window_view_clipping_invalidate(rct_window* w); -static void window_view_clipping_paint(rct_window* w, rct_drawpixelinfo* dpi); -static void window_view_clipping_scrollgetsize(rct_window* w, int scrollIndex, int* width, int* height); -static void window_view_clipping_close(); - -static rct_window_event_list window_view_clipping_events([](auto& events) -{ - events.close = &window_view_clipping_close_button; - events.mouse_up = &window_view_clipping_mouseup; - events.mouse_down = &window_view_clipping_mousedown; - events.update = &window_view_clipping_update; - events.tool_update = &window_view_clipping_tool_update; - events.tool_down = &window_view_clipping_tool_down; - events.tool_drag = &window_view_clipping_tool_drag; - events.tool_up = &window_view_clipping_tool_up; - events.get_scroll_size = &window_view_clipping_scrollgetsize; - events.invalidate = &window_view_clipping_invalidate; - events.paint = &window_view_clipping_paint; -}); -*/ // clang-format on - -#pragma endregion - class ViewClippingWindow final : public Window { private: @@ -132,7 +89,7 @@ public: switch (widgetIndex) { case WIDX_CLOSE: - window_close(this); // Unsure about this. ~hjort96 + window_close(this); break; case WIDX_CLIP_CHECKBOX_ENABLE: // Toggle height clipping. @@ -236,7 +193,7 @@ public: widget_invalidate(this, WIDX_CLIP_HEIGHT_SLIDER); } - void OnToolUpdate(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) + void OnToolUpdate(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) override { if (_dragging) { @@ -266,7 +223,7 @@ public: } } - void OnToolDrag(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) + void OnToolDrag(rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) override { if (!_dragging) { @@ -288,7 +245,7 @@ public: } } - void OnToolUp(rct_widgetindex, const ScreenCoordsXY&) + void OnToolUp(rct_widgetindex, const ScreenCoordsXY&) override { gClipSelectionA = gMapSelectPositionA; gClipSelectionB = gMapSelectPositionB; @@ -297,7 +254,7 @@ public: gfx_invalidate_screen(); } - void OnInvalidate() + void OnPrepareDraw() override { WidgetScrollUpdateThumbs(this, WIDX_CLIP_HEIGHT_SLIDER); @@ -317,14 +274,14 @@ public: } } - void OnPaint(rct_drawpixelinfo* dpi) + void OnDraw(rct_drawpixelinfo& dpi) override { - WindowDrawWidgets(this, dpi); + WindowDrawWidgets(this, &dpi); // Clip height value auto screenCoords = this->windowPos + ScreenCoordsXY{ 8, this->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; - DrawTextBasic(dpi, screenCoords, STR_VIEW_CLIPPING_HEIGHT_VALUE, {}, { this->colours[0] }); + DrawTextBasic(&dpi, screenCoords, STR_VIEW_CLIPPING_HEIGHT_VALUE, {}, { this->colours[0] }); screenCoords = this->windowPos + ScreenCoordsXY{ this->widgets[WIDX_CLIP_HEIGHT_VALUE].left + 1, this->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; @@ -336,7 +293,7 @@ public: { auto ft = Formatter(); ft.Add(static_cast(gClipHeight)); - DrawTextBasic(dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); // Printing the raw value. + DrawTextBasic(&dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); // Printing the raw value. break; } case DISPLAY_TYPE::DISPLAY_UNITS: @@ -348,7 +305,7 @@ public: auto ft = Formatter(); ft.Add(static_cast(FIXED_1DP(gClipHeight, 0) / 2 - FIXED_1DP(7, 0))); DrawTextBasic( - dpi, screenCoords, STR_UNIT1DP_NO_SUFFIX, ft, + &dpi, screenCoords, STR_UNIT1DP_NO_SUFFIX, ft, { this->colours[0] }); // Printing the value in Height Units. } else @@ -363,7 +320,7 @@ public: auto ft = Formatter(); ft.Add( static_cast(FIXED_2DP(gClipHeight, 0) / 2 * 1.5f - FIXED_2DP(10, 50))); - DrawTextBasic(dpi, screenCoords, STR_UNIT2DP_SUFFIX_METRES, ft, { this->colours[0] }); + DrawTextBasic(&dpi, screenCoords, STR_UNIT2DP_SUFFIX_METRES, ft, { this->colours[0] }); break; } case MeasurementFormat::Imperial: @@ -371,7 +328,7 @@ public: auto ft = Formatter(); ft.Add( static_cast(FIXED_1DP(gClipHeight, 0) / 2.0f * 5 - FIXED_1DP(35, 0))); - DrawTextBasic(dpi, screenCoords, STR_UNIT1DP_SUFFIX_FEET, ft, { this->colours[0] }); + DrawTextBasic(&dpi, screenCoords, STR_UNIT1DP_SUFFIX_FEET, ft, { this->colours[0] }); break; } } @@ -451,305 +408,3 @@ rct_window* window_view_clipping_open() } return window; } -/* -// Done -static void window_view_clipping_set_clipheight(rct_window* w, const uint8_t clipheight) -{ - gClipHeight = clipheight; - rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; - const float clip_height_ratio = static_cast(gClipHeight) / 255; - w->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (w->scrolls[0].h_right - (widget->width() - 1)))); -} - -// Done -static void window_view_clipping_close() -{ - // Turn off view clipping when the window is closed. - rct_window* mainWindow = window_get_main(); - if (mainWindow != nullptr) - { - mainWindow->viewport->flags &= ~VIEWPORT_FLAG_CLIP_VIEW; - mainWindow->Invalidate(); - } -} - -// Done -static void window_view_clipping_close_button(rct_window* w) -{ - window_view_clipping_close(); -} - -// Done -// Returns true when the tool is active -static bool window_view_clipping_tool_is_active() -{ - if (!(input_test_flag(INPUT_FLAG_TOOL_ACTIVE))) - return false; - if (gCurrentToolWidget.window_classification != WC_VIEW_CLIPPING) - return false; - return _toolActive; -} - -// Done -static void window_view_clipping_mouseup(rct_window* w, rct_widgetindex widgetIndex) -{ - rct_window* mainWindow; - - // mouseup appears to be used for buttons, checkboxes - switch (widgetIndex) - { - case WIDX_CLOSE: - window_close(w); - break; - case WIDX_CLIP_CHECKBOX_ENABLE: - // Toggle height clipping. - mainWindow = window_get_main(); - if (mainWindow != nullptr) - { - mainWindow->viewport->flags ^= VIEWPORT_FLAG_CLIP_VIEW; - mainWindow->Invalidate(); - } - w->Invalidate(); - break; - case WIDX_CLIP_HEIGHT_VALUE: - // Toggle display of the cut height value in RAW vs UNITS - if (gClipHeightDisplayType == DISPLAY_TYPE::DISPLAY_RAW) - { - gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; - } - else - { - gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_RAW; - } - w->Invalidate(); - break; - 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 - _previousClipSelectionA = gClipSelectionA; - _previousClipSelectionB = gClipSelectionB; - gClipSelectionA = { 0, 0 }; - gClipSelectionB = { MAXIMUM_MAP_SIZE_BIG - 1, MAXIMUM_MAP_SIZE_BIG - 1 }; - gfx_invalidate_screen(); - break; - case WIDX_CLIP_CLEAR: - if (window_view_clipping_tool_is_active()) - { - _toolActive = false; - tool_cancel(); - } - gClipSelectionA = { 0, 0 }; - gClipSelectionB = { MAXIMUM_MAP_SIZE_BIG - 1, MAXIMUM_MAP_SIZE_BIG - 1 }; - gfx_invalidate_screen(); - break; - } -} - -// Done -static void window_view_clipping_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) -{ - rct_window* mainWindow = window_get_main(); - - switch (widgetIndex) - { - case WIDX_CLIP_HEIGHT_INCREASE: - if (gClipHeight < 255) - window_view_clipping_set_clipheight(w, gClipHeight + 1); - if (mainWindow != nullptr) - mainWindow->Invalidate(); - break; - case WIDX_CLIP_HEIGHT_DECREASE: - if (gClipHeight > 0) - window_view_clipping_set_clipheight(w, gClipHeight - 1); - if (mainWindow != nullptr) - mainWindow->Invalidate(); - break; - } -} - -// Done -static void window_view_clipping_update(rct_window* w) -{ - const rct_widget* const widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; - const rct_scroll* const scroll = &w->scrolls[0]; - const int16_t scroll_width = widget->width() - 1; - const uint8_t clip_height = static_cast( - (static_cast(scroll->h_left) / (scroll->h_right - scroll_width)) * 255); - if (clip_height != gClipHeight) - { - gClipHeight = clip_height; - - // Update the main window accordingly. - rct_window* mainWindow = window_get_main(); - if (mainWindow != nullptr) - { - mainWindow->Invalidate(); - } - } - - // Restore previous selection if the tool has been interrupted - if (_toolActive && !window_view_clipping_tool_is_active()) - { - _toolActive = false; - gClipSelectionA = _previousClipSelectionA; - gClipSelectionB = _previousClipSelectionB; - } - - widget_invalidate(w, WIDX_CLIP_HEIGHT_SLIDER); -} - -// Done -static void window_view_clipping_tool_update(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) -{ - if (_dragging) - { - return; - } - - int32_t direction; - auto mapCoords = screen_pos_to_map_pos(screenCoords, &direction); - if (mapCoords.has_value()) - { - gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; - map_invalidate_tile_full(gMapSelectPositionA); - gMapSelectPositionA = gMapSelectPositionB = mapCoords.value(); - map_invalidate_tile_full(mapCoords.value()); - gMapSelectType = MAP_SELECT_TYPE_FULL; - } -} - -// Done -static void window_view_clipping_tool_down(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) -{ - int32_t direction; - auto mapCoords = screen_pos_to_map_pos(screenCoords, &direction); - if (mapCoords.has_value()) - { - _dragging = true; - _selectionStart = mapCoords.value(); - } -} - -// Done -static void window_view_clipping_tool_drag(rct_window* w, rct_widgetindex widgetIndex, const ScreenCoordsXY& screenCoords) -{ - if (!_dragging) - { - return; - } - - int32_t direction; - auto mapCoords = screen_pos_to_map_pos(screenCoords, &direction); - if (mapCoords) - { - map_invalidate_selection_rect(); - gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE; - gMapSelectPositionA.x = std::min(_selectionStart.x, mapCoords->x); - gMapSelectPositionB.x = std::max(_selectionStart.x, mapCoords->x); - gMapSelectPositionA.y = std::min(_selectionStart.y, mapCoords->y); - gMapSelectPositionB.y = std::max(_selectionStart.y, mapCoords->y); - gMapSelectType = MAP_SELECT_TYPE_FULL; - map_invalidate_selection_rect(); - } -} - -// Done -static void window_view_clipping_tool_up(struct rct_window*, rct_widgetindex, const ScreenCoordsXY&) -{ - gClipSelectionA = gMapSelectPositionA; - gClipSelectionB = gMapSelectPositionB; - _toolActive = false; - tool_cancel(); - gfx_invalidate_screen(); -} - -// Done -static void window_view_clipping_invalidate(rct_window* w) -{ - WidgetScrollUpdateThumbs(w, WIDX_CLIP_HEIGHT_SLIDER); - - rct_window* mainWindow = window_get_main(); - if (mainWindow != nullptr) - { - WidgetSetCheckboxValue(w, WIDX_CLIP_CHECKBOX_ENABLE, mainWindow->viewport->flags & VIEWPORT_FLAG_CLIP_VIEW); - } - - if (window_view_clipping_tool_is_active()) - { - w->pressed_widgets |= 1ULL << WIDX_CLIP_SELECTOR; - } - else - { - w->pressed_widgets &= ~(1ULL << WIDX_CLIP_SELECTOR); - } -} - -// Done -static void window_view_clipping_paint(rct_window* w, rct_drawpixelinfo* dpi) -{ - WindowDrawWidgets(w, dpi); - - // Clip height value - auto screenCoords = w->windowPos + ScreenCoordsXY{ 8, w->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; - DrawTextBasic(dpi, screenCoords, STR_VIEW_CLIPPING_HEIGHT_VALUE, {}, { w->colours[0] }); - - screenCoords = w->windowPos - + ScreenCoordsXY{ w->widgets[WIDX_CLIP_HEIGHT_VALUE].left + 1, w->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; - - switch (gClipHeightDisplayType) - { - case DISPLAY_TYPE::DISPLAY_RAW: - default: - { - auto ft = Formatter(); - ft.Add(static_cast(gClipHeight)); - DrawTextBasic(dpi, screenCoords, STR_FORMAT_INTEGER, ft, { w->colours[0] }); // Printing the raw value. - break; - } - case DISPLAY_TYPE::DISPLAY_UNITS: - // Print the value in the configured height label type: - if (gConfigGeneral.show_height_as_units == 1) - { - // Height label is Units. - auto ft = Formatter(); - ft.Add(static_cast(FIXED_1DP(gClipHeight, 0) / 2 - FIXED_1DP(7, 0))); - DrawTextBasic( - dpi, screenCoords, STR_UNIT1DP_NO_SUFFIX, ft, { w->colours[0] }); // Printing the value in Height Units. - } - else - { - // Height label is Real Values. - // Print the value in the configured measurement units. - switch (gConfigGeneral.measurement_format) - { - case MeasurementFormat::Metric: - case MeasurementFormat::SI: - { - auto ft = Formatter(); - ft.Add(static_cast(FIXED_2DP(gClipHeight, 0) / 2 * 1.5f - FIXED_2DP(10, 50))); - DrawTextBasic(dpi, screenCoords, STR_UNIT2DP_SUFFIX_METRES, ft, { w->colours[0] }); - break; - } - case MeasurementFormat::Imperial: - { - auto ft = Formatter(); - ft.Add(static_cast(FIXED_1DP(gClipHeight, 0) / 2.0f * 5 - FIXED_1DP(35, 0))); - DrawTextBasic(dpi, screenCoords, STR_UNIT1DP_SUFFIX_FEET, ft, { w->colours[0] }); - break; - } - } - } - } -} - -// Done -static void window_view_clipping_scrollgetsize(rct_window* w, int scrollIndex, int* width, int* height) -{ - *width = 1000; -} -*/ - From 9a2a12af98bc7459fc4dfad5666f346f6b775395 Mon Sep 17 00:00:00 2001 From: Jonathan Hjorth Date: Tue, 5 Oct 2021 11:09:37 +0200 Subject: [PATCH 07/10] Cleaning code --- src/openrct2-ui/windows/ViewClipping.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index efc6cb535b..abcd833148 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -141,7 +141,6 @@ public: void OnMouseDown(rct_widgetindex widgetIndex) override { - rct_window* mainWindow; switch (widgetIndex) @@ -276,7 +275,6 @@ public: void OnDraw(rct_drawpixelinfo& dpi) override { - WindowDrawWidgets(this, &dpi); // Clip height value @@ -293,7 +291,9 @@ public: { auto ft = Formatter(); ft.Add(static_cast(gClipHeight)); - DrawTextBasic(&dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); // Printing the raw value. + + // Printing the raw value. + DrawTextBasic(&dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); break; } case DISPLAY_TYPE::DISPLAY_UNITS: @@ -337,7 +337,7 @@ public: } } - ScreenSize OnScrollGetSize(int32_t scrollIndex) override //void OnScrollGetSize(int scrollIndex, int* width, int* height) + ScreenSize OnScrollGetSize(int32_t scrollIndex) override { return { 1000, 0 }; } @@ -365,7 +365,6 @@ public: mainWindow->viewport->flags |= VIEWPORT_FLAG_CLIP_VIEW; mainWindow->Invalidate(); } - } private: @@ -385,7 +384,8 @@ private: gClipHeight = clipheight; rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; const float clip_height_ratio = static_cast(gClipHeight) / 255; - this->scrolls[0].h_left = static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + this->scrolls[0].h_left = + static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); } bool IsActive() From 763c31ce5bcab3c5a37fae60cac66c8937deada3 Mon Sep 17 00:00:00 2001 From: hjort96 Date: Tue, 5 Oct 2021 20:06:17 +0200 Subject: [PATCH 08/10] Fix clang-format --- src/openrct2-ui/windows/ViewClipping.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index abcd833148..0f73b567c7 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -68,7 +68,6 @@ static rct_widget window_view_clipping_widgets[] = { class ViewClippingWindow final : public Window { private: - CoordsXY _selectionStart; CoordsXY _previousClipSelectionA; CoordsXY _previousClipSelectionB; @@ -89,7 +88,7 @@ public: switch (widgetIndex) { case WIDX_CLOSE: - window_close(this); + window_close(this); break; case WIDX_CLIP_CHECKBOX_ENABLE: // Toggle height clipping. @@ -293,7 +292,7 @@ public: ft.Add(static_cast(gClipHeight)); // Printing the raw value. - DrawTextBasic(&dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); + DrawTextBasic(&dpi, screenCoords, STR_FORMAT_INTEGER, ft, { this->colours[0] }); break; } case DISPLAY_TYPE::DISPLAY_UNITS: @@ -384,8 +383,8 @@ private: gClipHeight = clipheight; rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; const float clip_height_ratio = static_cast(gClipHeight) / 255; - this->scrolls[0].h_left = - static_cast(std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + this->scrolls[0].h_left = static_cast( + std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); } bool IsActive() @@ -396,7 +395,6 @@ private: return false; return _toolActive; } - }; rct_window* window_view_clipping_open() From 9d57e93df99a626a25272cc5698ace7492130461 Mon Sep 17 00:00:00 2001 From: hjort96 Date: Thu, 7 Oct 2021 16:21:19 +0200 Subject: [PATCH 09/10] Add suggestions from review. --- src/openrct2-ui/windows/ViewClipping.cpp | 33 +++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index 0f73b567c7..dab9964aca 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -41,7 +41,7 @@ enum class DISPLAY_TYPE { DISPLAY_UNITS }; -static DISPLAY_TYPE gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; +// static DISPLAY_TYPE gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; #pragma region Widgets @@ -73,6 +73,7 @@ private: CoordsXY _previousClipSelectionB; bool _toolActive{ false }; bool _dragging{ false }; + static inline DISPLAY_TYPE _clipHeightDisplayType; public: void OnCloseButton() @@ -82,8 +83,6 @@ public: void OnMouseUp(rct_widgetindex widgetIndex) override { - rct_window* mainWindow; - // mouseup appears to be used for buttons, checkboxes switch (widgetIndex) { @@ -91,8 +90,9 @@ public: window_close(this); break; case WIDX_CLIP_CHECKBOX_ENABLE: + { // Toggle height clipping. - mainWindow = window_get_main(); + rct_window* mainWindow = window_get_main(); if (mainWindow != nullptr) { mainWindow->viewport->flags ^= VIEWPORT_FLAG_CLIP_VIEW; @@ -100,15 +100,16 @@ public: } this->Invalidate(); break; + } case WIDX_CLIP_HEIGHT_VALUE: // Toggle display of the cut height value in RAW vs UNITS - if (gClipHeightDisplayType == DISPLAY_TYPE::DISPLAY_RAW) + if (_clipHeightDisplayType == DISPLAY_TYPE::DISPLAY_RAW) { - gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; + _clipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; } else { - gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_RAW; + _clipHeightDisplayType = DISPLAY_TYPE::DISPLAY_RAW; } this->Invalidate(); break; @@ -163,9 +164,9 @@ public: void OnUpdate() override { - const rct_widget* const widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + const auto& widget = widgets[WIDX_CLIP_HEIGHT_SLIDER]; const rct_scroll* const scroll = &this->scrolls[0]; - const int16_t scroll_width = widget->width() - 1; + const int16_t scroll_width = widget.width() - 1; const uint8_t clip_height = static_cast( (static_cast(scroll->h_left) / (scroll->h_right - scroll_width)) * 255); if (clip_height != gClipHeight) @@ -283,7 +284,7 @@ public: screenCoords = this->windowPos + ScreenCoordsXY{ this->widgets[WIDX_CLIP_HEIGHT_VALUE].left + 1, this->widgets[WIDX_CLIP_HEIGHT_VALUE].top }; - switch (gClipHeightDisplayType) + switch (_clipHeightDisplayType) { case DISPLAY_TYPE::DISPLAY_RAW: default: @@ -298,7 +299,7 @@ public: case DISPLAY_TYPE::DISPLAY_UNITS: { // Print the value in the configured height label type: - if (gConfigGeneral.show_height_as_units == 1) + if (gConfigGeneral.show_height_as_units) { // Height label is Units. auto ft = Formatter(); @@ -350,6 +351,8 @@ public: this->hold_down_widgets = (1ULL << WIDX_CLIP_HEIGHT_INCREASE) | (1UL << WIDX_CLIP_HEIGHT_DECREASE); WindowInitScrollWidgets(this); + _clipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; + // Initialise the clip height slider from the current clip height value. this->SetClipHeight(gClipHeight); @@ -378,13 +381,13 @@ private: } } - void SetClipHeight(const uint8_t clipheight) + void SetClipHeight(const uint8_t clipHeight) { - gClipHeight = clipheight; - rct_widget* widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER]; + gClipHeight = clipHeight; + const auto& widget = widgets[WIDX_CLIP_HEIGHT_SLIDER]; const float clip_height_ratio = static_cast(gClipHeight) / 255; this->scrolls[0].h_left = static_cast( - std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget->width() - 1)))); + std::ceil(clip_height_ratio * (this->scrolls[0].h_right - (widget.width() - 1)))); } bool IsActive() From dba34d2c17fb69013921a01644ce3e47745616fb Mon Sep 17 00:00:00 2001 From: hjort96 Date: Thu, 7 Oct 2021 22:38:12 +0200 Subject: [PATCH 10/10] Removed a line --- src/openrct2-ui/windows/ViewClipping.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/openrct2-ui/windows/ViewClipping.cpp b/src/openrct2-ui/windows/ViewClipping.cpp index dab9964aca..296dc786ac 100644 --- a/src/openrct2-ui/windows/ViewClipping.cpp +++ b/src/openrct2-ui/windows/ViewClipping.cpp @@ -41,8 +41,6 @@ enum class DISPLAY_TYPE { DISPLAY_UNITS }; -// static DISPLAY_TYPE gClipHeightDisplayType = DISPLAY_TYPE::DISPLAY_UNITS; - #pragma region Widgets static constexpr const rct_string_id WINDOW_TITLE = STR_VIEW_CLIPPING_TITLE;