caption interface-api separation
This commit is contained in:
parent
bb934d4f86
commit
0eb300ceeb
6 changed files with 29 additions and 52 deletions
|
@ -1,14 +1,14 @@
|
|||
#include <basic_widgets/w/caption.hpp>
|
||||
#include <basic_widgets/w/caption_impl.hpp>
|
||||
|
||||
#include "run.hpp"
|
||||
|
||||
using bwidgets::Caption;
|
||||
using bwidgets::CaptionImpl;
|
||||
|
||||
auto main() -> int
|
||||
{
|
||||
run_example<Caption>(
|
||||
run_example<CaptionImpl>(
|
||||
[](auto w, auto f, auto, auto) {
|
||||
w->alignment = Caption::Alignment::CENTER;
|
||||
w->alignment = CaptionImpl::Alignment::CENTER;
|
||||
w->text("¡jello!");
|
||||
w->font(f);
|
||||
},
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#include <basic_widgets/core/math.hpp>
|
||||
#include <basic_widgets/core/type/concepts.hpp>
|
||||
#include <basic_widgets/w/caption.hpp>
|
||||
#include <basic_widgets/w/caption_impl.hpp>
|
||||
#include <basic_widgets/w/feat/keyboard_handler_impl.hpp>
|
||||
#include <basic_widgets/w/feat/mouse_handler_impl.hpp>
|
||||
|
||||
|
@ -20,13 +20,13 @@ namespace bwidgets
|
|||
{
|
||||
|
||||
template<typename T>
|
||||
class Input : public WidgetImpl,
|
||||
class Input : public virtual WidgetImpl,
|
||||
public FontHandler,
|
||||
public KeyboardHandlerImpl,
|
||||
public MouseHandlerImpl
|
||||
{
|
||||
protected:
|
||||
Caption _input_caption;
|
||||
CaptionImpl _input_caption;
|
||||
|
||||
Input(Widget* parent = nullptr) : WidgetImpl {parent}, _input_caption {this}
|
||||
{
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#include <string>
|
||||
|
||||
#include <basic_widgets/core/type/color.hpp>
|
||||
#include <basic_widgets/w/caption.hpp>
|
||||
#include <basic_widgets/w/caption_impl.hpp>
|
||||
#include <basic_widgets/w/feat/mouse_handler_impl.hpp>
|
||||
|
||||
namespace bwidgets
|
||||
|
@ -15,7 +15,7 @@ namespace bwidgets
|
|||
public virtual MouseHandlerImpl
|
||||
{
|
||||
protected:
|
||||
Caption _caption;
|
||||
CaptionImpl _caption;
|
||||
SDL_Rect _caption_area {};
|
||||
Color _color_foreground = default_color_fg;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include <basic_widgets/core/texture.hpp>
|
||||
#include <basic_widgets/core/type/size.hpp>
|
||||
#include <basic_widgets/w/base/widget_impl.hpp>
|
||||
#include <basic_widgets/w/base/widget.hpp>
|
||||
#include <basic_widgets/w/feat/font_handler.hpp>
|
||||
#include <basic_widgets/w/feat/texture_handler.hpp>
|
||||
|
||||
|
@ -11,23 +11,10 @@ struct SDL_Surface;
|
|||
|
||||
namespace bwidgets
|
||||
{
|
||||
class Caption : public WidgetImpl,
|
||||
class Caption : public virtual Widget,
|
||||
public FontHandler,
|
||||
public TextureHandler
|
||||
{
|
||||
protected:
|
||||
Font::RenderMode _render_mode {Font::RenderMode::SHADED};
|
||||
std::string _text;
|
||||
std::shared_ptr<Texture> _text_texture {nullptr};
|
||||
|
||||
void _handle_font_change(const std::shared_ptr<Font>&) override;
|
||||
void _handle_font_color_change(Color, Color)
|
||||
override;
|
||||
void _handle_geometry_change(const SDL_Rect&) override;
|
||||
void _handle_renderer_change(const std::shared_ptr<Renderer>&) override;
|
||||
void _handle_rendering() override;
|
||||
void _handle_texture_update() override;
|
||||
|
||||
public:
|
||||
enum struct Alignment
|
||||
{
|
||||
|
@ -35,26 +22,18 @@ namespace bwidgets
|
|||
LEFT,
|
||||
RIGHT
|
||||
};
|
||||
|
||||
inline static const Color default_color_bg = {255, 255, 255, SDL_ALPHA_OPAQUE};
|
||||
inline static const Color default_color_fg = {0, 0, 0, SDL_ALPHA_OPAQUE};
|
||||
inline static const Size default_margins = {3, 3};
|
||||
|
||||
Alignment alignment {Alignment::LEFT};
|
||||
Size margins {3, 3};
|
||||
Size margins {default_margins};
|
||||
|
||||
Caption(WidgetImpl* parent = nullptr) noexcept;
|
||||
Caption(const Caption&) = delete;
|
||||
Caption(Caption&&) = delete;
|
||||
~Caption() override = default;
|
||||
auto operator=(const Caption&) = delete;
|
||||
auto operator=(Caption&&) = delete;
|
||||
using Widget::Widget;
|
||||
|
||||
virtual auto render_mode(Font::RenderMode) -> Caption*;
|
||||
[[nodiscard]] virtual auto text() const noexcept -> const std::string&;
|
||||
virtual auto text(const std::string&) -> Caption*;
|
||||
|
||||
[[nodiscard]] auto size() const noexcept -> Size override;
|
||||
virtual void render_mode(Font::RenderMode) = 0;
|
||||
[[nodiscard]] virtual auto text() const noexcept -> const std::string& = 0;
|
||||
virtual void text(const std::string&) = 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ libbasic_widgets = static_library('basic_widgets',
|
|||
'src/w/base/layout.cpp',
|
||||
'src/w/base/widget.cpp',
|
||||
'src/w/button.cpp',
|
||||
'src/w/caption.cpp',
|
||||
'src/w/caption_impl.cpp',
|
||||
'src/w/feat/event_handler_impl.cpp',
|
||||
'src/w/feat/keyboard_handler_impl.cpp',
|
||||
'src/w/feat/mouse_handler_impl.cpp',
|
||||
|
|
|
@ -2,27 +2,26 @@
|
|||
|
||||
#include <basic_widgets/core/math.hpp>
|
||||
#include <basic_widgets/core/texture.hpp>
|
||||
#include <basic_widgets/w/caption.hpp>
|
||||
#include <basic_widgets/w/caption_impl.hpp>
|
||||
#include <basic_widgets/w/numeric_input.hpp>
|
||||
|
||||
using namespace bwidgets;
|
||||
|
||||
Caption::Caption(WidgetImpl* parent) noexcept : WidgetImpl {parent}
|
||||
CaptionImpl::CaptionImpl(Widget* parent) noexcept : WidgetImpl {parent}
|
||||
{
|
||||
_font_color_bg = default_font_color_bg;
|
||||
_font_color_fg = default_font_color_fg;
|
||||
}
|
||||
|
||||
auto Caption::render_mode(Font::RenderMode m) -> Caption*
|
||||
void CaptionImpl::render_mode(Font::RenderMode m)
|
||||
{
|
||||
if (m != _render_mode) {
|
||||
_text_texture.reset();
|
||||
_render_mode = m;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
auto Caption::size() const noexcept -> Size
|
||||
auto CaptionImpl::size() const noexcept -> Size
|
||||
{
|
||||
if (_font == nullptr) return {0, 0};
|
||||
|
||||
|
@ -31,26 +30,25 @@ auto Caption::size() const noexcept -> Size
|
|||
return {size.w + 2 * margins.w, size.h + 2 * margins.h};
|
||||
}
|
||||
|
||||
auto Caption::text() const noexcept -> const std::string&
|
||||
auto CaptionImpl::text() const noexcept -> const std::string&
|
||||
{
|
||||
return _text;
|
||||
}
|
||||
|
||||
auto Caption::text(const std::string& t) -> Caption*
|
||||
void CaptionImpl::text(const std::string& t)
|
||||
{
|
||||
if (t != _text) {
|
||||
_text_texture.reset();
|
||||
_text = t;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
void Caption::_handle_font_change(const std::shared_ptr<Font>&)
|
||||
void CaptionImpl::_handle_font_change(const std::shared_ptr<Font>&)
|
||||
{
|
||||
_text_texture.reset();
|
||||
}
|
||||
|
||||
void Caption::_handle_font_color_change(Color fg, Color bg)
|
||||
void CaptionImpl::_handle_font_color_change(Color fg, Color bg)
|
||||
{
|
||||
if (fg != _font_color_fg
|
||||
|| (bg != _font_color_bg && _font_render_mode == Font::RenderMode::SHADED))
|
||||
|
@ -60,19 +58,19 @@ void Caption::_handle_font_color_change(Color fg, Color bg)
|
|||
}
|
||||
}
|
||||
|
||||
void Caption::_handle_geometry_change(const SDL_Rect& vp)
|
||||
void CaptionImpl::_handle_geometry_change(const SDL_Rect& vp)
|
||||
{
|
||||
if (vp.w != _viewport.w || vp.h != _viewport.h) {
|
||||
_widget_area = rect_margin({0, 0, vp.w, vp.h}, margins);
|
||||
}
|
||||
}
|
||||
|
||||
void Caption::_handle_renderer_change(const std::shared_ptr<Renderer>&)
|
||||
void CaptionImpl::_handle_renderer_change(const std::shared_ptr<Renderer>&)
|
||||
{
|
||||
_text_texture.reset();
|
||||
}
|
||||
|
||||
void Caption::_handle_rendering()
|
||||
void CaptionImpl::_handle_rendering()
|
||||
{
|
||||
if (_text_texture == nullptr) _handle_texture_update();
|
||||
|
||||
|
@ -99,7 +97,7 @@ void Caption::_handle_rendering()
|
|||
_renderer->copy(_text_texture.get(), nullptr, texture_dst);
|
||||
}
|
||||
|
||||
void Caption::_handle_texture_update()
|
||||
void CaptionImpl::_handle_texture_update()
|
||||
{
|
||||
SDL_assert_release(_font != nullptr && _text_texture == nullptr); // NOLINT
|
||||
SDL_Surface* s {nullptr};
|
Loading…
Reference in a new issue