use shared_ptr for widgets

This commit is contained in:
Andrea Blankenstijn 2022-02-04 18:26:19 +01:00
parent de607fdeb2
commit 72dd10ef06
10 changed files with 40 additions and 39 deletions

View file

@ -12,7 +12,7 @@ template<typename T>
concept WidgetType = std::derived_from<T, bwidgets::Widget>; concept WidgetType = std::derived_from<T, bwidgets::Widget>;
template<WidgetType W> template<WidgetType W>
void run_example(std::function<std::unique_ptr<W>()> factory, void run_example(std::function<std::shared_ptr<W>()> factory,
std::function<void(W*, const std::shared_ptr<bwidgets::Font>&, int, int, std::function<void(W*, const std::shared_ptr<bwidgets::Font>&, int, int,
const std::shared_ptr<bwidgets::Renderer>)> const std::shared_ptr<bwidgets::Renderer>)>
setup, setup,

View file

@ -22,7 +22,7 @@ namespace bwidgets
public: public:
using LayoutImpl::LayoutImpl; using LayoutImpl::LayoutImpl;
void add_widget(std::unique_ptr<Widget> widget_ptr) override void add_widget(std::shared_ptr<Widget> widget_ptr) override
{ {
if (renderer()) widget_ptr->renderer(renderer()); if (renderer()) widget_ptr->renderer(renderer());
_widgets.emplace_back(std::move(widget_ptr)); _widgets.emplace_back(std::move(widget_ptr));
@ -68,7 +68,7 @@ namespace bwidgets
} }
private: private:
std::vector<std::unique_ptr<Widget>> _widgets; std::vector<std::shared_ptr<Widget>> _widgets;
void _handle_geometry_change(const SDL_Rect& vp) override void _handle_geometry_change(const SDL_Rect& vp) override
{ {

View file

@ -116,7 +116,7 @@ namespace bwidgets
} }
protected: protected:
std::unique_ptr<Caption> _input_caption; std::shared_ptr<Caption> _input_caption;
SDL_Rect _text_area {}; SDL_Rect _text_area {};
InputImpl(Widget* parent = nullptr) InputImpl(Widget* parent = nullptr)
@ -203,8 +203,9 @@ namespace bwidgets
void _handle_rendering() override void _handle_rendering() override
{ {
const auto& color_end = const auto& color_end = focus() || hovered()
focus() || hovered() ? theme()->color_input_bg_active() : theme()->color_input_bg(); ? theme()->color_input_bg_active()
: theme()->color_input_bg();
fill_rect_gradient(*renderer(), _text_area, theme()->color_widget_border(), fill_rect_gradient(*renderer(), _text_area, theme()->color_widget_border(),
color_end, theme()->size_widget_border()); color_end, theme()->size_widget_border());

View file

@ -10,7 +10,7 @@ namespace bwidgets
{ {
public: public:
// Add widget to the layout // Add widget to the layout
virtual void add_widget(std::unique_ptr<Widget>) = 0; virtual void add_widget(std::shared_ptr<Widget>) = 0;
// Apply a function to every layout widget. // Apply a function to every layout widget.
virtual void for_widgets(const std::function<void(Widget*)>&) = 0; virtual void for_widgets(const std::function<void(Widget*)>&) = 0;
virtual void for_widgets(const std::function<void(const Widget*)>&) const = 0; virtual void for_widgets(const std::function<void(const Widget*)>&) const = 0;

View file

@ -23,7 +23,7 @@ namespace bwidgets
void text(std::string) override; void text(std::string) override;
protected: protected:
std::unique_ptr<Caption> _caption; std::shared_ptr<Caption> _caption;
SDL_Rect _caption_area {}; SDL_Rect _caption_area {};
SDL_Rect _mouse_area; SDL_Rect _mouse_area;

View file

@ -125,9 +125,9 @@ namespace bwidgets
} }
protected: protected:
std::unique_ptr<Button> _increment_button; std::shared_ptr<Button> _increment_button;
SDL_Rect _increment_button_area {}; SDL_Rect _increment_button_area {};
std::unique_ptr<Button> _decrement_button; std::shared_ptr<Button> _decrement_button;
SDL_Rect _decrement_button_area {}; SDL_Rect _decrement_button_area {};
std::pair<T, T> _value_range {std::numeric_limits<T>::lowest(), std::pair<T, T> _value_range {std::numeric_limits<T>::lowest(),
std::numeric_limits<T>::max()}; std::numeric_limits<T>::max()};

View file

@ -28,8 +28,8 @@ namespace bwidgets
private: private:
Alignment _alignment; Alignment _alignment;
std::unique_ptr<ScrollBar> _scrollbar_h; std::shared_ptr<ScrollBar> _scrollbar_h;
std::unique_ptr<ScrollBar> _scrollbar_v; std::shared_ptr<ScrollBar> _scrollbar_v;
std::shared_ptr<Texture> _texture; std::shared_ptr<Texture> _texture;
SDL_Rect _texture_area; SDL_Rect _texture_area;
}; };

View file

@ -18,7 +18,7 @@ namespace bwidgets
public: public:
ScrollBarImpl(Widget* parent = nullptr); ScrollBarImpl(Widget* parent = nullptr);
auto cursor_area() const -> SDL_Rect; [[nodiscard]] auto cursor_area() const -> SDL_Rect;
void handle_event(const SDL_Event&) override; void handle_event(const SDL_Event&) override;
void on_scroll(std::function<void(float)>) override; void on_scroll(std::function<void(float)>) override;
[[nodiscard]] auto orientation() const -> Orientation override; [[nodiscard]] auto orientation() const -> Orientation override;
@ -31,8 +31,8 @@ namespace bwidgets
protected: protected:
SDL_Rect _bar_area; SDL_Rect _bar_area;
std::unique_ptr<Button> _button_minus; std::shared_ptr<Button> _button_minus;
std::unique_ptr<Button> _button_plus; std::shared_ptr<Button> _button_plus;
const Size _cursor_size {16, 16}; const Size _cursor_size {16, 16};
// TODO: cursor_area // TODO: cursor_area
std::function<void(float)> _on_scroll; std::function<void(float)> _on_scroll;

View file

@ -10,14 +10,14 @@
namespace bwidgets namespace bwidgets
{ {
auto create_button(Widget* p = nullptr) -> std::unique_ptr<Button>; auto create_button(Widget* p = nullptr) -> std::shared_ptr<Button>;
auto create_caption(Widget* p = nullptr) -> std::unique_ptr<Caption>; auto create_caption(Widget* p = nullptr) -> std::shared_ptr<Caption>;
auto create_horizontal_layout(Widget* p = nullptr) -> std::unique_ptr<AlignedLayout>; auto create_horizontal_layout(Widget* p = nullptr) -> std::shared_ptr<AlignedLayout>;
auto create_input_float(Widget* p = nullptr) -> std::unique_ptr<NumericInput<float>>; auto create_input_float(Widget* p = nullptr) -> std::shared_ptr<NumericInput<float>>;
auto create_input_int(Widget* p = nullptr) -> std::unique_ptr<NumericInput<int>>; auto create_input_int(Widget* p = nullptr) -> std::shared_ptr<NumericInput<int>>;
auto create_scrollable_area(Widget* p = nullptr) -> std::unique_ptr<ScrollableArea>; auto create_scrollable_area(Widget* p = nullptr) -> std::shared_ptr<ScrollableArea>;
auto create_scrollbar(Widget* p = nullptr) -> std::unique_ptr<ScrollBar>; auto create_scrollbar(Widget* p = nullptr) -> std::shared_ptr<ScrollBar>;
auto create_vertical_layout(Widget* p = nullptr) -> std::unique_ptr<AlignedLayout>; auto create_vertical_layout(Widget* p = nullptr) -> std::shared_ptr<AlignedLayout>;
} }
#endif #endif

View file

@ -10,43 +10,43 @@ using namespace std;
namespace bwidgets namespace bwidgets
{ {
auto create_horizontal_layout(Widget* parent) -> unique_ptr<AlignedLayout> auto create_horizontal_layout(Widget* parent) -> shared_ptr<AlignedLayout>
{ {
return make_unique<AlignedLayoutImpl<LayoutAlignment::HORIZONTAL>>(parent); return make_shared<AlignedLayoutImpl<LayoutAlignment::HORIZONTAL>>(parent);
} }
auto create_vertical_layout(Widget* parent) -> unique_ptr<AlignedLayout> auto create_vertical_layout(Widget* parent) -> shared_ptr<AlignedLayout>
{ {
return make_unique<AlignedLayoutImpl<LayoutAlignment::VERTICAL>>(parent); return make_shared<AlignedLayoutImpl<LayoutAlignment::VERTICAL>>(parent);
} }
auto create_button(Widget* parent) -> unique_ptr<Button> auto create_button(Widget* parent) -> shared_ptr<Button>
{ {
return make_unique<ButtonImpl>(parent); return make_shared<ButtonImpl>(parent);
} }
auto create_caption(Widget* parent) -> unique_ptr<Caption> auto create_caption(Widget* parent) -> shared_ptr<Caption>
{ {
return make_unique<CaptionImpl>(parent); return make_shared<CaptionImpl>(parent);
} }
auto create_input_float(Widget* parent) -> unique_ptr<NumericInput<float>> auto create_input_float(Widget* parent) -> shared_ptr<NumericInput<float>>
{ {
return make_unique<NumericInputImpl<float>>(parent); return make_shared<NumericInputImpl<float>>(parent);
} }
auto create_scrollable_area(Widget* parent) -> unique_ptr<ScrollableArea> auto create_scrollable_area(Widget* parent) -> shared_ptr<ScrollableArea>
{ {
return make_unique<ScrollableAreaImpl>(parent); return make_shared<ScrollableAreaImpl>(parent);
} }
auto create_scrollbar(Widget* parent) -> unique_ptr<ScrollBar> auto create_scrollbar(Widget* parent) -> shared_ptr<ScrollBar>
{ {
return make_unique<ScrollBarImpl>(parent); return make_shared<ScrollBarImpl>(parent);
} }
auto create_input_int(Widget* parent) -> unique_ptr<NumericInput<int>> auto create_input_int(Widget* parent) -> shared_ptr<NumericInput<int>>
{ {
return make_unique<NumericInputImpl<int>>(parent); return make_shared<NumericInputImpl<int>>(parent);
} }
} }