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>;
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,
const std::shared_ptr<bwidgets::Renderer>)>
setup,

View file

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

View file

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

View file

@ -10,7 +10,7 @@ namespace bwidgets
{
public:
// 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.
virtual void for_widgets(const std::function<void(Widget*)>&) = 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;
protected:
std::unique_ptr<Caption> _caption;
std::shared_ptr<Caption> _caption;
SDL_Rect _caption_area {};
SDL_Rect _mouse_area;

View file

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

View file

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

View file

@ -18,7 +18,7 @@ namespace bwidgets
public:
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 on_scroll(std::function<void(float)>) override;
[[nodiscard]] auto orientation() const -> Orientation override;
@ -31,8 +31,8 @@ namespace bwidgets
protected:
SDL_Rect _bar_area;
std::unique_ptr<Button> _button_minus;
std::unique_ptr<Button> _button_plus;
std::shared_ptr<Button> _button_minus;
std::shared_ptr<Button> _button_plus;
const Size _cursor_size {16, 16};
// TODO: cursor_area
std::function<void(float)> _on_scroll;

View file

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

View file

@ -10,43 +10,43 @@ using namespace std;
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);
}
}