/***************************************************************************** * Copyright (c) 2014-2025 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. *****************************************************************************/ #pragma once #ifdef ENABLE_SCRIPTING #include #include #include #include #include #include #include enum class CursorID : uint8_t; namespace OpenRCT2::Scripting { enum class CustomToolbarMenuItemKind { Standard, Toolbox, }; class CustomToolbarMenuItem { public: std::shared_ptr Owner; CustomToolbarMenuItemKind Kind; std::string Text; DukValue Callback; CustomToolbarMenuItem( std::shared_ptr owner, CustomToolbarMenuItemKind kind, const std::string& text, DukValue callback) : Owner(owner) , Kind(kind) , Text(text) , Callback(callback) { } void Invoke() const { auto& scriptEngine = GetContext()->GetScriptEngine(); scriptEngine.ExecutePluginCall(Owner, Callback, {}, false); } }; class CustomShortcut { public: std::shared_ptr Owner; std::string Id; std::string Text; std::vector Bindings; DukValue Callback; CustomShortcut( std::shared_ptr owner, std::string_view id, std::string_view text, const std::vector& bindings, DukValue callback); CustomShortcut(CustomShortcut&&) = default; CustomShortcut(const CustomShortcut&) = delete; ~CustomShortcut(); CustomShortcut& operator=(const CustomShortcut&) = delete; CustomShortcut& operator=(CustomShortcut&& other) = default; void Invoke() const; }; struct CustomTool { std::shared_ptr Owner; std::string Id; CursorID Cursor = CursorID::Undefined; uint32_t Filter{}; bool MouseDown{}; // Event handlers DukValue onStart; DukValue onDown; DukValue onMove; DukValue onUp; DukValue onFinish; void Start(); void OnUpdate(const ScreenCoordsXY& screenCoords); void OnDown(const ScreenCoordsXY& screenCoords); void OnDrag(const ScreenCoordsXY& screenCoords); void OnUp(const ScreenCoordsXY& screenCoords); void OnAbort(); private: void InvokeEventHandler(const DukValue& dukHandler, const ScreenCoordsXY& screenCoords); }; extern std::optional ActiveCustomTool; extern std::vector CustomMenuItems; extern std::vector> CustomShortcuts; void InitialiseCustomMenuItems(ScriptEngine& scriptEngine); void InitialiseCustomTool(ScriptEngine& scriptEngine, const DukValue& dukValue); template<> DukValue ToDuk(duk_context* ctx, const CursorID& value); template<> CursorID FromDuk(const DukValue& s); } // namespace OpenRCT2::Scripting #endif