// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #pragma once #ifndef NDK_BASEWIDGET_HPP #define NDK_BASEWIDGET_HPP #include #include #include #include #include #include #include #include #include namespace Ndk { class Canvas; class NDK_API BaseWidget : public Nz::Node { friend Canvas; public: struct Padding; BaseWidget(BaseWidget* parent); BaseWidget(const BaseWidget&) = delete; BaseWidget(BaseWidget&&) = default; virtual ~BaseWidget(); template T* Add(Args&&... args); inline void AddChild(std::unique_ptr&& widget); inline void Center(); inline void CenterHorizontal(); inline void CenterVertical(); void ClearFocus(); void Destroy(); void EnableBackground(bool enable); //virtual BaseWidget* Clone() const = 0; inline const Nz::Color& GetBackgroundColor() const; inline Canvas* GetCanvas(); inline Nz::SystemCursor GetCursor() const; inline const Padding& GetPadding() const; inline Nz::Vector2f GetContentOrigin() const; inline const Nz::Vector2f& GetContentSize() const; inline Nz::Vector2f GetSize() const; bool HasFocus() const; inline bool IsVisible() const; virtual void ResizeToContent() = 0; void SetBackgroundColor(const Nz::Color& color); void SetCursor(Nz::SystemCursor systemCursor); inline void SetContentSize(const Nz::Vector2f& size); void SetFocus(); inline void SetPadding(float left, float top, float right, float bottom); void SetSize(const Nz::Vector2f& size); void Show(bool show = true); BaseWidget& operator=(const BaseWidget&) = delete; BaseWidget& operator=(BaseWidget&&) = default; struct Padding { float left; float top; float right; float bottom; }; protected: const EntityHandle& CreateEntity(); void DestroyEntity(Entity* entity); virtual void Layout(); void InvalidateNode() override; virtual void OnFocusLost(); virtual void OnFocusReceived(); virtual void OnKeyPressed(const Nz::WindowEvent::KeyEvent& key); virtual void OnKeyReleased(const Nz::WindowEvent::KeyEvent& key); virtual void OnMouseEnter(); virtual void OnMouseMoved(int x, int y, int deltaX, int deltaY); virtual void OnMouseButtonPress(int x, int y, Nz::Mouse::Button button); virtual void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button); virtual void OnMouseExit(); virtual void OnParentResized(const Nz::Vector2f& newSize); virtual void OnTextEntered(char32_t character, bool repeated); private: inline BaseWidget(); inline void DestroyChild(BaseWidget* widget); void DestroyChildren(); inline bool IsRegisteredToCanvas() const; inline void NotifyParentResized(const Nz::Vector2f& newSize); void RegisterToCanvas(); inline void UpdateCanvasIndex(std::size_t index); void UnregisterFromCanvas(); static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits::max(); std::size_t m_canvasIndex; std::vector m_entities; std::vector> m_children; Canvas* m_canvas; EntityOwner m_backgroundEntity; Padding m_padding; WorldHandle m_world; Nz::Color m_backgroundColor; Nz::SpriteRef m_backgroundSprite; Nz::SystemCursor m_cursor; Nz::Vector2f m_contentSize; BaseWidget* m_widgetParent; bool m_visible; }; } #include #endif // NDK_BASEWIDGET_HPP