/***************************************************************************** * Copyright (c) 2014-2020 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 * * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // clang-format off enum WINDOW_TRANSPARENCY_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, WIDX_SEE_THROUGH_RIDES, WIDX_SEE_THROUGH_VEHICLES, WIDX_SEE_THROUGH_SCENERY, WIDX_SEE_THROUGH_TREES, WIDX_SEE_THROUGH_PATHS, WIDX_SEE_THROUGH_SUPPORTS, WIDX_INVISIBLE_GUESTS, WIDX_INVISIBLE_STAFF, WIDX_INVISIBLE_RIDES, WIDX_INVISIBLE_VEHICLES, WIDX_INVISIBLE_SCENERY, WIDX_INVISIBLE_TREES, WIDX_INVISIBLE_PATHS, WIDX_INVISIBLE_SUPPORTS, }; #pragma region MEASUREMENTS static constexpr const rct_string_id WINDOW_TITLE = STR_TRANSPARENCY_OPTIONS_TITLE; static constexpr const int32_t WW = 204; static constexpr const int32_t WH = 57; static constexpr ScreenSize ICON_BUTTON = {24, 24}; static constexpr ScreenSize FLAT_BUTTON = {24, 12}; #pragma endregion static rct_widget window_transparency_main_widgets[] = { WINDOW_SHIM(WINDOW_TITLE, WW, WH), MakeWidget({ 77, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_RIDE, STR_SEE_THROUGH_RIDES), MakeWidget({102, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_COASTER_TRAIN, STR_SEE_THROUGH_VEHICLES), MakeWidget({ 27, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_LARGE_SCENERY, STR_SEE_THROUGH_SCENERY), MakeWidget({ 2, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_TREES, STR_SEE_THROUGH_TREES), MakeWidget({ 52, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_FOOTPATH, STR_SEE_THROUGH_PATHS), MakeWidget({127, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_G2_BUTTON_SUPPORTS, STR_SEE_THROUGH_SUPPORTS), MakeWidget({152, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, SPR_GUESTS, STR_INVISIBLE_GUESTS), MakeWidget({177, 17}, ICON_BUTTON, WindowWidgetType::ImgBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_INVISIBLE_STAFF), MakeWidget({ 77, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_RIDES), MakeWidget({102, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_VEHICLES), MakeWidget({ 27, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_SCENERY), MakeWidget({ 2, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_TREES), MakeWidget({ 52, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_PATHS), MakeWidget({127, 42}, FLAT_BUTTON, WindowWidgetType::Button, WindowColour::Tertiary, STR_NONE, STR_INVISIBLE_SUPPORTS), { WIDGETS_END }, }; // clang-format on class TransparencyWindow final : public Window { private: public: void OnOpen() override { widgets = window_transparency_main_widgets; enabled_widgets = (1ULL << WIDX_CLOSE) | (1ULL << WIDX_SEE_THROUGH_RIDES) | (1ULL << WIDX_SEE_THROUGH_VEHICLES) | (1ULL << WIDX_SEE_THROUGH_SCENERY) | (1ULL << WIDX_SEE_THROUGH_TREES) | (1ULL << WIDX_SEE_THROUGH_PATHS) | (1ULL << WIDX_INVISIBLE_RIDES) | (1ULL << WIDX_INVISIBLE_VEHICLES) | (1ULL << WIDX_INVISIBLE_SCENERY) | (1ULL << WIDX_INVISIBLE_TREES) | (1ULL << WIDX_INVISIBLE_PATHS) | (1ULL << WIDX_INVISIBLE_SUPPORTS) | (1ULL << WIDX_INVISIBLE_GUESTS) | (1ULL << WIDX_INVISIBLE_STAFF) | (1ULL << WIDX_SEE_THROUGH_SUPPORTS); window_push_others_below(this); auto* w = window_get_main(); if (w != nullptr) windowPos.x = ((w->width / 2) - (width / 2)); } void OnMouseUp(rct_widgetindex widgetIndex) override { switch (widgetIndex) { case WIDX_CLOSE: Close(); break; default: OnMouseUpMain(widgetIndex); break; } } void OnPrepareDraw() override { uint32_t wflags = 0; rct_window* w = window_get_main(); pressed_widgets = 0; disabled_widgets = 0; if (w != nullptr) wflags = w->viewport->flags; SetWidgetPressed(WIDX_SEE_THROUGH_RIDES, (wflags & VIEWPORT_FLAG_SEETHROUGH_RIDES)); SetWidgetPressed(WIDX_SEE_THROUGH_VEHICLES, (wflags & VIEWPORT_FLAG_SEETHROUGH_VEHICLES)); SetWidgetPressed(WIDX_SEE_THROUGH_SCENERY, (wflags & VIEWPORT_FLAG_SEETHROUGH_SCENERY)); SetWidgetPressed(WIDX_SEE_THROUGH_TREES, (wflags & VIEWPORT_FLAG_SEETHROUGH_TREES)); SetWidgetPressed(WIDX_SEE_THROUGH_PATHS, (wflags & VIEWPORT_FLAG_SEETHROUGH_PATHS)); SetWidgetPressed(WIDX_SEE_THROUGH_SUPPORTS, (wflags & VIEWPORT_FLAG_SEETHROUGH_SUPPORTS)); SetWidgetPressed(WIDX_INVISIBLE_RIDES, (wflags & VIEWPORT_FLAG_INVISIBLE_RIDES)); SetWidgetPressed(WIDX_INVISIBLE_VEHICLES, (wflags & VIEWPORT_FLAG_INVISIBLE_VEHICLES)); SetWidgetPressed(WIDX_INVISIBLE_SCENERY, (wflags & VIEWPORT_FLAG_INVISIBLE_SCENERY)); SetWidgetPressed(WIDX_INVISIBLE_TREES, (wflags & VIEWPORT_FLAG_INVISIBLE_TREES)); SetWidgetPressed(WIDX_INVISIBLE_PATHS, (wflags & VIEWPORT_FLAG_INVISIBLE_PATHS)); SetWidgetPressed(WIDX_INVISIBLE_SUPPORTS, (wflags & VIEWPORT_FLAG_INVISIBLE_SUPPORTS)); SetWidgetPressed(WIDX_INVISIBLE_GUESTS, (wflags & VIEWPORT_FLAG_INVISIBLE_GUESTS)); SetWidgetPressed(WIDX_INVISIBLE_STAFF, (wflags & VIEWPORT_FLAG_INVISIBLE_STAFF)); } void OnDraw(rct_drawpixelinfo& dpi) override { DrawWidgets(dpi); // Locate mechanic button image const auto& widget = widgets[WIDX_INVISIBLE_STAFF]; auto screenCoords = windowPos + ScreenCoordsXY{ widget.left, widget.top }; gfx_draw_sprite( &dpi, (gStaffMechanicColour << 24) | IMAGE_TYPE_REMAP | IMAGE_TYPE_REMAP_2_PLUS | SPR_MECHANIC, screenCoords, 0); } private: void OnMouseUpMain(rct_widgetindex widgetIndex) { uint32_t wflags = 0; rct_window* w = window_get_main(); if (w == nullptr) return; wflags = w->viewport->flags; switch (widgetIndex) { case WIDX_SEE_THROUGH_RIDES: wflags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES; break; case WIDX_SEE_THROUGH_VEHICLES: wflags ^= VIEWPORT_FLAG_SEETHROUGH_VEHICLES; break; case WIDX_SEE_THROUGH_SCENERY: wflags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY; break; case WIDX_SEE_THROUGH_TREES: wflags ^= VIEWPORT_FLAG_SEETHROUGH_TREES; break; case WIDX_SEE_THROUGH_PATHS: wflags ^= VIEWPORT_FLAG_SEETHROUGH_PATHS; break; case WIDX_SEE_THROUGH_SUPPORTS: wflags ^= VIEWPORT_FLAG_SEETHROUGH_SUPPORTS; break; case WIDX_INVISIBLE_RIDES: wflags ^= VIEWPORT_FLAG_INVISIBLE_RIDES; break; case WIDX_INVISIBLE_VEHICLES: wflags ^= VIEWPORT_FLAG_INVISIBLE_VEHICLES; break; case WIDX_INVISIBLE_SCENERY: wflags ^= VIEWPORT_FLAG_INVISIBLE_SCENERY; break; case WIDX_INVISIBLE_TREES: wflags ^= VIEWPORT_FLAG_INVISIBLE_TREES; break; case WIDX_INVISIBLE_PATHS: wflags ^= VIEWPORT_FLAG_INVISIBLE_PATHS; break; case WIDX_INVISIBLE_SUPPORTS: wflags ^= VIEWPORT_FLAG_INVISIBLE_SUPPORTS; break; case WIDX_INVISIBLE_GUESTS: wflags ^= VIEWPORT_FLAG_INVISIBLE_GUESTS; break; case WIDX_INVISIBLE_STAFF: wflags ^= VIEWPORT_FLAG_INVISIBLE_STAFF; break; } if (w->viewport->flags == wflags) return; w->viewport->flags = wflags; w->Invalidate(); } }; rct_window* WindowTransparencyOpen() { auto* window = window_bring_to_front_by_class(WC_TRANSPARENCY); if (window == nullptr) window = WindowCreate(WC_TRANSPARENCY, ScreenCoordsXY(32, 32), WW, WH); return window; }