From be350f7e2e0579ad2afe73b69b4309169b7c2c9a Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 23 Jan 2021 12:21:18 +0000 Subject: [PATCH] Add widget visible flag --- distribution/openrct2.d.ts | 1 + src/openrct2-ui/input/MouseInput.cpp | 5 ++- src/openrct2-ui/interface/Widget.cpp | 19 +++++++++ src/openrct2-ui/interface/Window.cpp | 12 +++--- src/openrct2-ui/scripting/CustomWindow.cpp | 46 +++++++++++++--------- src/openrct2-ui/scripting/ScWidget.hpp | 33 ++++++++++++++++ src/openrct2/interface/Widget.h | 2 + src/openrct2/interface/Window.cpp | 2 +- src/openrct2/interface/Window.h | 6 +++ 9 files changed, 99 insertions(+), 27 deletions(-) diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index acbd7de6ca..5ba2d63844 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -1872,6 +1872,7 @@ declare global { name?: string; tooltip?: string; isDisabled?: boolean; + isVisible?: boolean; } interface ButtonWidget extends Widget { diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index cd2f66bbb9..24f5ea96fa 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1442,7 +1442,7 @@ static void InputUpdateTooltip(rct_window* w, rct_widgetindex widgetIndex, const if (gTooltipCursor == screenCoords) { _tooltipNotShownTicks++; - if (_tooltipNotShownTicks > 50) + if (_tooltipNotShownTicks > 50 && WidgetIsVisible(w, widgetIndex)) { gTooltipTimeout = 0; window_tooltip_open(w, widgetIndex, screenCoords); @@ -1457,7 +1457,8 @@ static void InputUpdateTooltip(rct_window* w, rct_widgetindex widgetIndex, const reset_tooltip_not_shown(); if (w == nullptr || gTooltipWidget.window_classification != w->classification - || gTooltipWidget.window_number != w->number || gTooltipWidget.widget_index != widgetIndex) + || gTooltipWidget.window_number != w->number || gTooltipWidget.widget_index != widgetIndex + || !WidgetIsVisible(w, widgetIndex)) { window_tooltip_close(); } diff --git a/src/openrct2-ui/interface/Widget.cpp b/src/openrct2-ui/interface/Widget.cpp index 4c7edf6563..6d117741ac 100644 --- a/src/openrct2-ui/interface/Widget.cpp +++ b/src/openrct2-ui/interface/Widget.cpp @@ -829,6 +829,8 @@ static void WidgetDrawImage(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetind bool WidgetIsEnabled(rct_window* w, rct_widgetindex widgetIndex) { + if (!WidgetIsVisible(w, widgetIndex)) + return false; return (w->enabled_widgets & (1LL << widgetIndex)) != 0; } @@ -837,6 +839,11 @@ bool WidgetIsDisabled(rct_window* w, rct_widgetindex widgetIndex) return (w->disabled_widgets & (1LL << widgetIndex)) != 0; } +bool WidgetIsVisible(rct_window* w, rct_widgetindex widgetIndex) +{ + return w->widgets[widgetIndex].IsVisible(); +} + bool WidgetIsPressed(rct_window* w, rct_widgetindex widgetIndex) { if (w->pressed_widgets & (1LL << widgetIndex)) @@ -1026,6 +1033,18 @@ void WidgetSetDisabled(rct_window* w, rct_widgetindex widgetIndex, bool value) } } +void WidgetSetVisible(rct_window* w, rct_widgetindex widgetIndex, bool value) +{ + if (value) + { + w->widgets[widgetIndex].flags &= ~WIDGET_FLAGS::IS_HIDDEN; + } + else + { + w->widgets[widgetIndex].flags |= WIDGET_FLAGS::IS_HIDDEN; + } +} + void WidgetSetCheckboxValue(rct_window* w, rct_widgetindex widgetIndex, int32_t value) { if (value) diff --git a/src/openrct2-ui/interface/Window.cpp b/src/openrct2-ui/interface/Window.cpp index f954cda263..c1f9d09b60 100644 --- a/src/openrct2-ui/interface/Window.cpp +++ b/src/openrct2-ui/interface/Window.cpp @@ -628,11 +628,13 @@ void WindowDrawWidgets(rct_window* w, rct_drawpixelinfo* dpi) widgetIndex = 0; for (widget = w->widgets; widget->type != WindowWidgetType::Last; widget++) { - // Check if widget is outside the draw region - if (w->windowPos.x + widget->left < dpi->x + dpi->width && w->windowPos.x + widget->right >= dpi->x) - if (w->windowPos.y + widget->top < dpi->y + dpi->height && w->windowPos.y + widget->bottom >= dpi->y) - WidgetDraw(dpi, w, widgetIndex); - + if (widget->IsVisible()) + { + // Check if widget is outside the draw region + if (w->windowPos.x + widget->left < dpi->x + dpi->width && w->windowPos.x + widget->right >= dpi->x) + if (w->windowPos.y + widget->top < dpi->y + dpi->height && w->windowPos.y + widget->bottom >= dpi->y) + WidgetDraw(dpi, w, widgetIndex); + } widgetIndex++; } diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index 4933586301..4adb8eab22 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -101,6 +101,7 @@ namespace OpenRCT2::Ui::Windows std::optional SelectedCell; bool IsChecked{}; bool IsDisabled{}; + bool IsVisible{}; bool IsPressed{}; bool HasBorder{}; bool ShowColumnHeaders{}; @@ -123,6 +124,7 @@ namespace OpenRCT2::Ui::Windows result.Width = desc["width"].as_int(); result.Height = desc["height"].as_int(); result.IsDisabled = AsOrDefault(desc["isDisabled"], false); + result.IsVisible = AsOrDefault(desc["isVisible"], true); result.Name = AsOrDefault(desc["name"], ""); result.Tooltip = AsOrDefault(desc["tooltip"], ""); if (result.Type == "button") @@ -723,25 +725,6 @@ namespace OpenRCT2::Ui::Windows } } - static void window_custom_paint(rct_window* w, rct_drawpixelinfo* dpi) - { - WindowDrawWidgets(w, dpi); - window_custom_draw_tab_images(w, dpi); - if (w->viewport != nullptr) - { - window_draw_viewport(dpi, w); - } - } - - static void window_custom_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex) - { - const auto& info = GetInfo(w); - if (scrollIndex < static_cast(info.ListViews.size())) - { - info.ListViews[scrollIndex].Paint(w, dpi, &w->scrolls[scrollIndex]); - } - } - static std::optional GetViewportWidgetIndex(rct_window* w) { rct_widgetindex widgetIndex = 0; @@ -756,6 +739,29 @@ namespace OpenRCT2::Ui::Windows return std::nullopt; } + static void window_custom_paint(rct_window* w, rct_drawpixelinfo* dpi) + { + WindowDrawWidgets(w, dpi); + window_custom_draw_tab_images(w, dpi); + if (w->viewport != nullptr) + { + auto widgetIndex = GetViewportWidgetIndex(w); + if (WidgetIsVisible(w, widgetIndex.value_or(false))) + { + window_draw_viewport(dpi, w); + } + } + } + + static void window_custom_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int32_t scrollIndex) + { + const auto& info = GetInfo(w); + if (scrollIndex < static_cast(info.ListViews.size())) + { + info.ListViews[scrollIndex].Paint(w, dpi, &w->scrolls[scrollIndex]); + } + } + static void window_custom_update_viewport(rct_window* w) { auto viewportWidgetIndex = GetViewportWidgetIndex(w); @@ -833,6 +839,8 @@ namespace OpenRCT2::Ui::Windows widget.flags |= WIDGET_FLAGS::IS_ENABLED; if (desc.IsDisabled) widget.flags |= WIDGET_FLAGS::IS_DISABLED; + if (!desc.IsVisible) + widget.flags |= WIDGET_FLAGS::IS_HIDDEN; if (desc.Type == "button") { diff --git a/src/openrct2-ui/scripting/ScWidget.hpp b/src/openrct2-ui/scripting/ScWidget.hpp index c06ff93695..115e0a84d3 100644 --- a/src/openrct2-ui/scripting/ScWidget.hpp +++ b/src/openrct2-ui/scripting/ScWidget.hpp @@ -318,6 +318,38 @@ namespace OpenRCT2::Scripting } } + bool isVisible_get() const + { + auto w = GetWindow(); + if (w != nullptr) + { + return WidgetIsVisible(w, _widgetIndex); + } + return false; + } + void isVisible_set(bool value) + { + auto w = GetWindow(); + if (w != nullptr) + { + WidgetSetVisible(w, _widgetIndex, value); + + auto widget = GetWidget(); + if (widget != nullptr) + { + if (widget->type == WindowWidgetType::DropdownMenu) + { + WidgetSetVisible(w, _widgetIndex + 1, value); + } + else if (widget->type == WindowWidgetType::Spinner) + { + WidgetSetVisible(w, _widgetIndex + 1, value); + WidgetSetVisible(w, _widgetIndex + 2, value); + } + } + } + } + std::string text_get() const { if (IsCustomWindow()) @@ -364,6 +396,7 @@ namespace OpenRCT2::Scripting dukglue_register_property(ctx, &ScWidget::width_get, &ScWidget::width_set, "width"); dukglue_register_property(ctx, &ScWidget::height_get, &ScWidget::height_set, "height"); dukglue_register_property(ctx, &ScWidget::isDisabled_get, &ScWidget::isDisabled_set, "isDisabled"); + dukglue_register_property(ctx, &ScWidget::isVisible_get, &ScWidget::isVisible_set, "isVisible"); // No so common dukglue_register_property(ctx, &ScWidget::text_get, &ScWidget::text_set, "text"); diff --git a/src/openrct2/interface/Widget.h b/src/openrct2/interface/Widget.h index 7bb87829f9..565c203242 100644 --- a/src/openrct2/interface/Widget.h +++ b/src/openrct2/interface/Widget.h @@ -137,6 +137,7 @@ void WidgetDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetInd bool WidgetIsEnabled(rct_window* w, rct_widgetindex widgetIndex); bool WidgetIsDisabled(rct_window* w, rct_widgetindex widgetIndex); +bool WidgetIsVisible(rct_window* w, rct_widgetindex widgetIndex); bool WidgetIsPressed(rct_window* w, rct_widgetindex widgetIndex); bool WidgetIsHighlighted(rct_window* w, rct_widgetindex widgetIndex); bool WidgetIsActiveTool(rct_window* w, rct_widgetindex widgetIndex); @@ -146,6 +147,7 @@ void WidgetScrollGetPart( void WidgetSetEnabled(rct_window* w, rct_widgetindex widgetIndex, bool enabled); void WidgetSetDisabled(rct_window* w, rct_widgetindex widgetIndex, bool value); +void WidgetSetVisible(rct_window* w, rct_widgetindex widgetIndex, bool value); void WidgetSetCheckboxValue(rct_window* w, rct_widgetindex widgetIndex, int32_t value); #endif diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 96465e6441..835eb83514 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -435,7 +435,7 @@ rct_widgetindex window_find_widget_from_point(rct_window* w, const ScreenCoordsX { break; } - else if (widget->type != WindowWidgetType::Empty) + else if (widget->type != WindowWidgetType::Empty && widget->IsVisible()) { if (screenCoords.x >= w->windowPos.x + widget->left && screenCoords.x <= w->windowPos.x + widget->right && screenCoords.y >= w->windowPos.y + widget->top && screenCoords.y <= w->windowPos.y + widget->bottom) diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 137b3e111a..1993e2d178 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -76,6 +76,7 @@ namespace WIDGET_FLAGS const WidgetFlags IS_PRESSED = 1 << 2; const WidgetFlags IS_DISABLED = 1 << 3; const WidgetFlags TOOLTIP_IS_STRING = 1 << 4; + const WidgetFlags IS_HIDDEN = 1 << 5; } // namespace WIDGET_FLAGS enum class WindowWidgetType : uint8_t; @@ -132,6 +133,11 @@ struct rct_widget else return top - 1; } + + bool IsVisible() const + { + return !(flags & WIDGET_FLAGS::IS_HIDDEN); + } }; /**