#pragma once #include #include #include namespace OpenVic { class GFXCorneredTileSupportingTexture : public godot::AtlasTexture { GDCLASS(GFXCorneredTileSupportingTexture, godot::AtlasTexture) protected: godot::Vector2i PROPERTY_ACCESS(cornered_tile_border_size, protected); static void _bind_methods(); public: GFXCorneredTileSupportingTexture(); /* Returns true if the texture has a non-zero 9 patch border. */ bool is_cornered_tile_texture() const; /* Equivalent to draw_rect, but draws a 9 patch texture if this is a cornered tile texture. */ void draw_rect_cornered(godot::RID const& to_canvas_item, godot::Rect2 const& rect) const; }; class GFXButtonStateTexture : public GFXCorneredTileSupportingTexture { GDCLASS(GFXButtonStateTexture, GFXCorneredTileSupportingTexture) public: enum ButtonState { HOVER, PRESSED, DISABLED, BUTTON_STATE_COUNT }; private: ButtonState PROPERTY(button_state); godot::Ref state_image; godot::Ref state_texture; protected: static void _bind_methods(); public: GFXButtonStateTexture(); /* Create a GFXButtonStateTexture using the specified godot::Image. Returns nullptr if generate_state_image fails. */ static godot::Ref make_gfx_button_state_texture( ButtonState button_state, godot::Ref const& source_image, godot::Rect2i const& region, godot::Vector2i const& cornered_tile_border_size ); /* Set the ButtonState to be generated by this class (calling this does not trigger state image generation). */ void set_button_state(ButtonState new_button_state); /* Generate a modified version of the given region of source_image * and update the underlying godot::ImageTexture to use it. */ godot::Error generate_state_image( godot::Ref const& source_image, godot::Rect2i const& region, godot::Vector2i const& new_cornered_tile_border_size ); static godot::StringName const& button_state_to_theme_name(ButtonState button_state); godot::StringName const& get_button_state_theme() const; }; class GFXButtonStateHavingTexture : public GFXCorneredTileSupportingTexture { GDCLASS(GFXButtonStateHavingTexture, GFXCorneredTileSupportingTexture) std::array, GFXButtonStateTexture::BUTTON_STATE_COUNT> button_state_textures; protected: static void _bind_methods(); godot::Ref button_image; void _update_button_states(); void _clear_button_states(); GFXButtonStateHavingTexture(); public: godot::Ref get_button_state_texture(GFXButtonStateTexture::ButtonState button_state); }; } VARIANT_ENUM_CAST(OpenVic::GFXButtonStateTexture::ButtonState);