1.10
slider.h
1/*
2 * Copyright (C) 2018 Microchip Technology Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef EGT_SLIDER_H
7#define EGT_SLIDER_H
8
14#include <egt/app.h>
15#include <egt/canvas.h>
16#include <egt/detail/alignment.h>
17#include <egt/detail/enum.h>
18#include <egt/detail/math.h>
19#include <egt/detail/meta.h>
20#include <egt/detail/screen/composerscreen.h>
21#include <egt/flags.h>
22#include <egt/frame.h>
23#include <egt/imagegroup.h>
24#include <egt/painter.h>
25#include <egt/serialize.h>
26#include <egt/textwidget.h>
27#include <egt/valuewidget.h>
28#include <egt/widgetflags.h>
29
30namespace egt
31{
32inline namespace v1
33{
34
71
84template <class T>
85class SliderType : protected SliderBase, public ValueRangeWidget<T>
86{
87public:
88
91
99 explicit SliderType(const Rect& rect, T start = 0, T end = 100, T value = 0,
101
108 explicit SliderType(T start = 0, T end = 100, T value = 0,
110 : SliderType(Rect(), start, end, value, orient)
111 {
112 }
113
122 SliderType(Frame& parent, const Rect& rect, T start = 0, T end = 100, T value = 0,
124 : SliderType(rect, start, end, value, orient)
125 {
126 parent.add(*this);
127 }
128
136 explicit SliderType(Frame& parent, T start = 0, T end = 100, T value = 0,
138 : SliderType(Rect(), start, end, value, orient)
139 {
140 parent.add(*this);
141 }
142
146 explicit SliderType(Serializer::Properties& props) noexcept
147 : SliderType(props, false)
148 {
149 }
150
151protected:
152
153 explicit SliderType(Serializer::Properties& props, bool is_derived) noexcept;
154
155public:
156
157 void handle(Event& event) override
158 {
159 Widget::handle(event);
160
161 switch (event.id())
162 {
165 {
166 m_invoke_pending = false;
167 this->on_value_changed.invoke();
168 }
169 break;
172 break;
175 {
176 const auto diff = event.pointer().point - event.pointer().drag_start;
177 if (slider_flags().is_set(SliderFlag::inverted))
179 else
181 }
182 else
183 {
184 const auto diff = event.pointer().point - event.pointer().drag_start;
185 if (slider_flags().is_set(SliderFlag::inverted))
187 else
189 }
190 break;
191 default:
192 break;
193 }
194 }
195
196 void draw(Painter& painter, const Rect& rect) override;
197
206 bool allow_fallback = false) const;
207
214 void handle_image(const Image& image,
216
223
225
226 T value(T value) override
227 {
228 T orig = this->value();
229
230 update_value(value);
231
233 {
234 m_invoke_pending = false;
235 this->on_value_changed.invoke();
236 }
237
238 return orig;
239 }
240
250 {
252 }
253
257 EGT_NODISCARD bool live_update() const { return m_live_update; }
258
262 EGT_NODISCARD Orientation orient() const { return m_orient; }
263
270 {
271 if (detail::change_if_diff<>(m_orient, orient))
272 this->damage();
273 }
274
276 EGT_NODISCARD const SliderFlags& slider_flags() const { return m_slider_flags; }
277
280
282
286 static void default_size(const Size& size);
287
288 EGT_NODISCARD Size min_size_hint() const override
289 {
290 if (!this->m_min_size.empty())
291 return this->m_min_size;
292
294 }
295
296 void serialize(Serializer& serializer) const override;
297
298protected:
299
300 bool internal_drag() const override { return true; }
301 bool internal_track_drag() const override { return true; }
302
304 EGT_NODISCARD int to_offset(T value) const
305 {
306 if (detail::float_equal(static_cast<float>(this->m_start), static_cast<float>(this->m_end)))
307 return 0;
308
309 const auto b = this->content_area();
311 return egt::detail::normalize<float>(value, this->m_start, this->m_end,
312 0, b.width() - handle_width());
313 else
314 return egt::detail::normalize<float>(value, this->m_start, this->m_end,
315 0, b.height() - handle_height());
316 }
317
319 EGT_NODISCARD T to_value(int offset) const
320 {
321 const auto b = this->content_area();
323 return egt::detail::normalize<float>(offset, 0, b.width() - handle_width(),
324 this->m_start, this->m_end);
325 else
326 return egt::detail::normalize<float>(offset, 0, b.height() - handle_height(),
327 this->m_start, this->m_end);
328 }
329
332 {
333 T prev_value = this->m_value;
334 if (this->set_value(value))
335 {
336 auto r = Rect::merge(handle_box(prev_value), handle_box());
337 this->damage(r);
338
339 if (slider_flags().is_set(SliderFlag::show_label))
340 {
341 std::string text;
342 Canvas canvas(Size(100, 100));
343 Painter painter(canvas.context());
344
345 auto label_rect = label_box(painter, prev_value, text);
346 this->damage(label_rect);
347
348 label_rect = label_box(painter, this->m_value, text);
349 this->damage(label_rect);
350 }
351
352 if (m_live_update)
353 {
354 this->on_value_changed.invoke();
355 }
356 else
357 m_invoke_pending = true;
358 }
359 }
360
362 EGT_NODISCARD int handle_width() const;
363
365 EGT_NODISCARD int handle_height() const;
366
368 EGT_NODISCARD Rect handle_box() const
369 {
370 return handle_box(this->m_value);
371 }
372
374 EGT_NODISCARD Rect handle_box(T value) const;
375
377 EGT_NODISCARD Rect label_box(Painter& painter, T value, std::string& text) const
378 {
379 const auto b = this->content_area();
380 auto handle_rect = handle_box(value);
381
383 handle_rect -= Point(0, b.height() / 2.);
384 else
385 handle_rect -= Point(b.width() / 2., 0);
386
387 text = format_label(value);
388
389 painter.set(this->color(Palette::ColorId::label_text));
390 painter.set(this->font());
391
392 const auto text_size = painter.text_size(text);
393 auto target = detail::align_algorithm(text_size,
394 handle_rect,
396 5);
397
399 if (target.width() <= b.width())
400 {
401 if (target.x() < b.x())
402 target.x(b.x());
403
404 if (target.x() + target.width() > b.x() + b.width())
405 target.x(b.x() + b.width() - target.width());
406 }
407
408 if (target.height() <= b.height())
409 {
410 if (target.y() < b.y())
411 target.y(b.y());
412
413 if (target.y() + target.height() > b.y() + b.height())
414 target.y(b.y() + b.height() - target.height());
415 }
416
417 return target;
418 }
419
421 void draw_label(Painter& painter, T value)
422 {
423 std::string text;
424 const auto target = label_box(painter, value, text);
425 painter.draw(target.point());
426 painter.draw(text);
427 }
428
430 void draw_handle(Painter& painter);
431
433 void draw_line(Painter& painter, float xp, float yp);
434
436 static std::string format_label(T value)
437 {
438 return std::to_string(value);
439 }
440
443
445 bool m_invoke_pending{false};
446
448 bool m_live_update{false};
449
452
455
456private:
458 static Size m_default_size;
459 static Signal<>::RegisterHandle m_default_size_handle;
460 static void register_handler();
461 static void unregister_handler();
462
464 ImageGroup m_handles{"handle"};
465
466 void deserialize(Serializer::Properties& props);
467};
468
474class EGT_API Slider : public SliderType<int>
475{
476public:
477 using SliderType<int>::SliderType;
478
479 EGT_NODISCARD std::string type() const override
480 {
481 return "Slider";
482 }
483};
484
490class EGT_API SliderF : public SliderType<float>
491{
492public:
493 using SliderType<float>::SliderType;
494
495 EGT_NODISCARD std::string type() const override
496 {
497 return "SliderF";
498 }
499};
500
501template <class T>
503
504template <class T>
506
507template <class T>
509{
510 if (m_default_size_handle == Signal<>::INVALID_HANDLE)
511 {
512 m_default_size_handle = detail::ComposerScreen::register_screen_resize_hook([]()
513 {
514 m_default_size.clear();
515 });
516 }
517}
518
519template <class T>
520void SliderType<T>::unregister_handler()
521{
523 m_default_size_handle = Signal<>::INVALID_HANDLE;
524}
525
526template <class T>
528{
530 {
531 register_handler();
532 auto ss = egt::Application::instance().screen()->size();
533 SliderType<T>::m_default_size = Size(ss.width() * 0.20, ss.height() * 0.10);
534 }
535
537}
538
539template <class T>
541{
542 if (!size.empty())
543 unregister_handler();
544
546}
547
548template <class T>
549SliderType<T>::SliderType(const Rect& rect, T start, T end, T value,
550 Orientation orient) noexcept
551 : ValueRangeWidget<T>(rect, start, end, value),
552 m_orient(orient)
553{
554 this->name("Slider" + std::to_string(this->m_widgetid));
555 this->fill_flags(Theme::FillFlag::blend);
556 this->grab_mouse(true);
557 this->slider_flags().set(SliderFlag::rectangle_handle);
558 this->border_radius(4.0);
559}
560
561template <class T>
562SliderType<T>::SliderType(Serializer::Properties& props, bool is_derived) noexcept
563 : ValueRangeWidget<T>(props, true)
564{
565 deserialize(props);
566
567 if (!is_derived)
568 this->deserialize_leaf(props);
569}
570
571
572template <class T>
573void SliderType<T>::draw(Painter& painter, const Rect& /*rect*/)
574{
575 auto b = this->content_area();
576 auto yp = b.y() + b.height() / 2.;
577 auto xp = b.x() + b.width() / 2.;
578
579 if (slider_flags().is_set(SliderFlag::show_labels) ||
580 slider_flags().is_set(SliderFlag::show_label))
581 {
582 if (m_orient == Orientation::horizontal)
583 yp += b.height() / 4.;
584 else
585 xp += b.width() / 4.;
586
587 if (slider_flags().is_set(SliderFlag::show_label))
588 {
589 draw_label(painter, this->value());
590 }
591 else
592 {
593 draw_label(painter, this->starting());
594 draw_label(painter, this->starting() + ((this->ending() - this->starting()) / 2));
595 draw_label(painter, this->ending());
596 }
597 }
598
599 // line
600 draw_line(painter, xp, yp);
601
602 // handle
603 draw_handle(painter);
604}
605
606template <class T>
608{
609 const auto b = this->content_area();
610 auto width = b.width();
611 auto height = b.height();
612
613 if (slider_flags().is_set(SliderFlag::show_labels) ||
614 slider_flags().is_set(SliderFlag::show_label))
615 {
616 if (m_orient == Orientation::horizontal)
617 height /= 2;
618 else
619 width /= 2;
620 }
621
622 if (slider_flags().is_set(SliderFlag::square_handle) ||
623 slider_flags().is_set(SliderFlag::round_handle))
624 {
625 if (m_orient == Orientation::horizontal)
626 return std::min<DefaultDim>(width / 6, height);
627 else
628 return std::min<DefaultDim>(height / 6, width);
629 }
630 else
631 {
632 if (m_orient == Orientation::horizontal)
633 return std::min<DefaultDim>(width / 6, height) * 2;
634 else
635 return std::min<DefaultDim>(height / 6, width);
636 }
637}
638
639template <class T>
641{
642 const auto b = this->content_area();
643 auto width = b.width();
644 auto height = b.height();
645
646 if (slider_flags().is_set(SliderFlag::show_labels) ||
647 slider_flags().is_set(SliderFlag::show_label))
648 {
649 if (m_orient == Orientation::horizontal)
650 height /= 2;
651 else
652 width /= 2;
653 }
654
655 if (slider_flags().is_set(SliderFlag::square_handle) ||
656 slider_flags().is_set(SliderFlag::round_handle))
657 {
658 if (m_orient == Orientation::horizontal)
659 return std::min<DefaultDim>(width / 6, height);
660 else
661 return std::min<DefaultDim>(height / 6, width);
662 }
663 else
664 {
665 if (m_orient == Orientation::horizontal)
666 return std::min<DefaultDim>(width / 6, height);
667 else
668 return std::min<DefaultDim>(height / 6, width) * 2;
669 }
670}
671
672template <class T>
674{
675 const auto b = this->content_area();
676 const auto dimw = handle_width();
677 const auto dimh = handle_height();
678
679 if (m_orient == Orientation::horizontal)
680 {
681 auto xv = b.x() + to_offset(value);
682 if (slider_flags().is_set(SliderFlag::inverted))
683 xv = b.x() + b.width() - to_offset(value) - dimw;
684
685 if (slider_flags().is_set(SliderFlag::show_labels) ||
686 slider_flags().is_set(SliderFlag::show_label))
687 {
688 return {xv,
689 b.y() + b.height() / 4 - dimh / 2 + b.height() / 2,
690 dimw,
691 dimh};
692 }
693 else
694 {
695 return {xv,
696 b.y() + b.height() / 2 - dimh / 2,
697 dimw,
698 dimh};
699 }
700 }
701 else
702 {
703 auto yv = b.y() + b.height() - to_offset(value) - dimh;
704 if (slider_flags().is_set(SliderFlag::inverted))
705 yv = b.y() + to_offset(value);
706
707 if (slider_flags().is_set(SliderFlag::show_labels) ||
708 slider_flags().is_set(SliderFlag::show_label))
709 {
710 return {b.x() + b.width() / 4 - dimw / 2 + b.width() / 2,
711 yv,
712 dimw,
713 dimh};
714 }
715 else
716 {
717 return {b.x() + b.width() / 2 - dimw / 2,
718 yv,
719 dimw,
720 dimh};
721 }
722 }
723}
724
725template <class T>
727{
728 const auto handle_rect = handle_box();
729
730 auto* image = handle_image(this->group(), true);
731 if (image)
732 {
733 this->theme().draw_box(painter,
735 handle_rect,
738 0, 0, 0, {},
739 image);
740 }
741 else if (slider_flags().is_set(SliderFlag::round_handle))
742 {
743 this->theme().draw_circle(painter,
745 handle_rect,
746 this->color(Palette::ColorId::border),
747 this->color(Palette::ColorId::button_bg),
748 this->border());
749 }
750 else
751 {
752 this->theme().draw_box(painter,
754 handle_rect,
755 this->color(Palette::ColorId::border),
756 this->color(Palette::ColorId::button_bg),
757 this->border(),
758 0,
759 this->border_radius());
760 }
761}
762
763template <class T>
764void SliderType<T>::draw_line(Painter& painter, float xp, float yp)
765{
766 const auto b = this->content_area();
767 const auto handle_rect = handle_box();
768
769 Point a1;
770 Point a2;
771 Point b1;
772 Point b2;
773
774 if (m_orient == Orientation::horizontal)
775 {
776 a1 = Point(b.x(), yp);
777 a2 = Point(handle_rect.x(), yp);
778 b1 = Point(handle_rect.x(), yp);
779 b2 = Point(b.x() + b.width(), yp);
780
781 painter.line_width(handle_rect.height() / 5.0);
782 }
783 else
784 {
785 a1 = Point(xp, b.y() + b.height());
786 a2 = Point(xp, handle_rect.y());
787 b1 = Point(xp, handle_rect.y());
788 b2 = Point(xp, b.y());
789
790 painter.line_width(handle_rect.width() / 5.0);
791 }
792
793 if (slider_flags().is_set(SliderFlag::inverted))
794 std::swap(a1, b2);
795
796 if (slider_flags().is_set(SliderFlag::consistent_line))
797 {
798 painter.set(this->color(Palette::ColorId::button_fg,
800 painter.draw(a1, b2);
801 painter.stroke();
802 }
803 else
804 {
805 painter.set(this->color(Palette::ColorId::button_fg));
806 painter.draw(a1, a2);
807 painter.stroke();
808 painter.set(this->color(Palette::ColorId::button_fg,
810 painter.draw(b1, b2);
811 painter.stroke();
812 }
813}
814
816template<>
817EGT_API std::string SliderType<float>::format_label(float value);
818
820template<>
821EGT_API std::string SliderType<double>::format_label(double value);
822
823template <class T>
825{
827
828 serializer.add_property("sliderflags", m_slider_flags.to_string());
829 serializer.add_property("orient", detail::enum_to_string(orient()));
830 m_handles.serialize(serializer);
831}
832
833template <class T>
835{
836 props.erase(std::remove_if(props.begin(), props.end(), [&](auto & p)
837 {
838 if (std::get<0>(p) == "sliderflags")
839 {
840 m_slider_flags.from_string(std::get<1>(p));
841 return true;
842 }
843 else if (std::get<0>(p) == "orient")
844 {
845 orient(detail::enum_from_string<Orientation>(std::get<1>(p)));
846 return true;
847 }
848 else if (m_handles.deserialize(std::get<0>(p), std::get<1>(p)))
849 {
850 return true;
851 }
852 return false;
853 }), props.end());
854}
855
856template <class T>
857Image* SliderType<T>::handle_image(Palette::GroupId group, bool allow_fallback) const
858{
859 return m_handles.get(group, allow_fallback);
860}
861
862template <class T>
864{
865 m_handles.set(group, image);
866 if (group == this->group())
867 this->damage(handle_box());
868}
869
870template <class T>
872{
873 auto changed = m_handles.reset(group);
874 if (changed && group == this->group())
875 this->damage(handle_box());
876}
877
879template<>
880EGT_API const std::pair<SliderBase::SliderFlag, char const*> detail::EnumStrings<SliderBase::SliderFlag>::data[7];
881
882}
883}
884
885#endif
static constexpr HVBitField center
Definition widgetflags.h:297
EGT_NODISCARD Screen * screen() const
Get a pointer to the Screen instance.
Definition app.h:119
Manages a unique drawing surface and context.
Definition canvas.h:41
EGT_NODISCARD shared_cairo_t context() const
Get the context for the Canvas.
Definition canvas.h:89
Utility class for managing a set of flags with the ability to observe changes to the flags.
Definition flags.h:40
A Frame is a Widget that has children widgets.
Definition frame.h:45
Definition imagegroup.h:25
Raster image resource used for drawing or displaying.
Definition image.h:39
Drawing interface for 2D graphics.
Definition painter.h:45
Painter & set(const Pattern &pattern)
Set the current color.
Painter & line_width(float width)
Set the current line width.
Painter & draw(const PointType< T, detail::Compatible::normal > &point)
Move to a point.
Definition painter.h:182
Painter & stroke()
Size text_size(const std::string &text)
GroupId
Used to define a category of patterns that usually relate to the state of a widget.
Definition palette.h:219
@ disabled
Color group usually associated with the Widget::Flag::disabled flag.
@ normal
Default color group associated with a normal Widget state.
@ button_bg
Button background color.
@ button_fg
Button foreground color.
@ label_text
Label text color.
static constexpr RectType merge(const RectType &lhs, const RectType &rhs) noexcept
Merge two rectangles together into one super rectangle that contains them both.
Definition geometry.h:858
EGT_NODISCARD Size size() const
Size of the screen.
Definition screen.h:75
Abstract base serializer class.
Definition serialize.h:34
virtual void add_property(const std::string &name, const std::string &value, const Attributes &attrs={})=0
Add a property.
std::list< std::tuple< std::string, std::string, Serializer::Attributes > > Properties
Definition serialize.h:47
Signal class used for defining a signal and dispatching events.
Definition signal.h:30
@ INVALID_HANDLE
Definition signal.h:35
void invoke(Args... args)
Invoke all handlers with the specified args.
Definition signal.h:85
uint32_t RegisterHandle
Handle type.
Definition signal.h:46
EGT_NODISCARD constexpr bool empty() const noexcept
Returns true if the size has no width or height.
Definition geometry.h:372
This is a slider that can be used to select floating value from a range.
Definition slider.h:491
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition slider.h:495
This is a slider that can be used to select value from a range.
Definition slider.h:86
void orient(Orientation orient)
Set the Orientation.
Definition slider.h:269
EGT_NODISCARD Size min_size_hint() const override
Get a minimum size hint for the Widget.
Definition slider.h:288
SliderFlags & slider_flags()
Get the current slider flags.
Definition slider.h:279
SliderType(Frame &parent, T start=0, T end=100, T value=0, Orientation orient=Orientation::horizontal) noexcept
Definition slider.h:136
void live_update(bool enable)
Enable or disable the live update feature.
Definition slider.h:249
void update_value(T value)
Update the value without notifying the handlers.
Definition slider.h:331
static Size default_size()
Default Slider size.
Definition slider.h:527
void draw(Painter &painter, const Rect &rect) override
Draw the widget.
Definition slider.h:573
EGT_NODISCARD int handle_width() const
Get the calculated handle width.
Definition slider.h:607
void draw_handle(Painter &painter)
Draw the handle.
Definition slider.h:726
EGT_NODISCARD bool live_update() const
get live update value.
Definition slider.h:257
static void default_size(const Size &size)
Change default Slider size.
Definition slider.h:540
void handle_image(const Image &image, Palette::GroupId group=Palette::GroupId::normal)
Set the image used to draw the slider's handle.
Definition slider.h:863
void reset_handle_image(Palette::GroupId group=Palette::GroupId::normal)
Remove the image, if any, used to draw the slider's handle.
Definition slider.h:871
EGT_NODISCARD Image * handle_image(Palette::GroupId group, bool allow_fallback=false) const
Get the image, if any, to draw the slider's handle for the given group.
Definition slider.h:857
EGT_NODISCARD Orientation orient() const
Get the Orientation.
Definition slider.h:262
void draw_label(Painter &painter, T value)
Draw the value label.
Definition slider.h:421
SliderType(Serializer::Properties &props, bool is_derived) noexcept
Definition slider.h:562
EGT_NODISCARD Rect handle_box() const
Get the handle box for the current value.
Definition slider.h:368
EGT_NODISCARD Rect handle_box(T value) const
Get the handle box for the specified value.
Definition slider.h:673
Orientation m_orient
Orientation of the slider.
Definition slider.h:442
SliderType(T start=0, T end=100, T value=0, Orientation orient=Orientation::horizontal) noexcept
Definition slider.h:108
EGT_NODISCARD int handle_height() const
Get the calculated handle height.
Definition slider.h:640
T value(T value) override
Set value.
Definition slider.h:226
void draw_line(Painter &painter, float xp, float yp)
Draw the line.
Definition slider.h:764
static std::string format_label(T value)
Format the label text.
Definition slider.h:436
SliderType(const Rect &rect, T start=0, T end=100, T value=0, Orientation orient=Orientation::horizontal) noexcept
Definition slider.h:549
int m_start_offset
When dragging, the offset at the drag start.
Definition slider.h:454
bool internal_drag() const override
Definition slider.h:300
void serialize(Serializer &serializer) const override
Serialize the widget to the specified serializer.
Definition slider.h:824
SliderType(Serializer::Properties &props) noexcept
Definition slider.h:146
bool internal_track_drag() const override
Definition slider.h:301
EGT_NODISCARD T to_value(int offset) const
Convert an offset to value.
Definition slider.h:319
EGT_NODISCARD int to_offset(T value) const
Convert a value to an offset.
Definition slider.h:304
void handle(Event &event) override
Handle an event.
Definition slider.h:157
bool m_live_update
When true, notify handlers even during drag.
Definition slider.h:448
EGT_NODISCARD Rect label_box(Painter &painter, T value, std::string &text) const
Get the label box and text for the specified value.
Definition slider.h:377
SliderType(Frame &parent, const Rect &rect, T start=0, T end=100, T value=0, Orientation orient=Orientation::horizontal) noexcept
Definition slider.h:122
EGT_NODISCARD const SliderFlags & slider_flags() const
Get the current slider flags.
Definition slider.h:276
SliderFlags m_slider_flags
Slider flags.
Definition slider.h:451
bool m_invoke_pending
When true, an invoke of events has been queued to occur.
Definition slider.h:445
This is a slider that can be used to select integer value from a range.
Definition slider.h:475
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition slider.h:479
@ blend
perform a blend
Manages a value in a range.
Definition valuewidget.h:93
T m_start
The start value.
Definition valuewidget.h:258
bool set_value(T v)
Definition valuewidget.h:242
void serialize(Serializer &serializer) const override
Serialize the widget to the specified serializer.
Definition valuewidget.h:275
Signal on_value_changed
Event signal.
Definition valuewidget.h:103
EGT_NODISCARD T value() const
Get the current value.
Definition valuewidget.h:233
T m_end
The end value.
Definition valuewidget.h:261
T m_value
The current value.
Definition valuewidget.h:264
virtual void handle(Event &event)
Handle an event.
void enable()
Set the disabled state to false.
EGT_NODISCARD const Size & size() const
Get the size of the widget's box().
Definition widget.h:739
Widget * parent()
Get a pointer to the parent Widget, or nullptr if none exists.
EGT_NODISCARD Palette::GroupId group() const
Get the current Palette::GroupId depending on the widget's state.
Size m_min_size
Minimum size of the widget when not an empty value.
Definition widget.h:1815
EGT_NODISCARD const Font & font() const
Get the widget Font.
virtual EGT_NODISCARD Rect content_area() const
Return the area that content is allowed to be positioned into.
EGT_NODISCARD const Pattern & color(Palette::ColorId id) const
Get a Widget color.
virtual EGT_NODISCARD Size min_size_hint() const
Get a minimum size hint for the Widget.
virtual void damage()
Damage the box() of the widget and cause a redraw.
static Signal ::RegisterHandle register_screen_resize_hook(const Signal<>::EventCallback &handler)
Register a handler to manage screen size changes.
static void unregister_screen_resize_hook(Signal<>::RegisterHandle handle)
Unregister a handler that managed screen size changes.
@ raw_pointer_up
Raw pointer event.
@ pointer_drag
Pointer event.
@ pointer_drag_start
Pointer event.
SizeType< DefaultDim, detail::Compatible::normal > Size
Helper type alias.
Definition geometry.h:573
RectType< DefaultDim, detail::Compatible::normal > Rect
Helper type alias.
Definition geometry.h:1023
PointType< DefaultDim, detail::Compatible::normal > Point
Helper type alias.
Definition geometry.h:314
static constexpr Color transparent
Predefined color.
Definition palette.h:59
constexpr T bit(T n)
Utility to create a bit mask for the specified bit.
Definition meta.h:306
constexpr bool float_equal(const float f1, const float f2)
Safe equal comparison of float values.
Definition math.h:107
constexpr const char * enum_to_string(T const &e)
Convert an enum to a string.
Definition enum.h:55
EGT_API Rect align_algorithm(const Rect &orig, const Rect &bounding, const AlignFlags &align, DefaultDim padding=0, DefaultDim horizontal_ratio=0, DefaultDim vertical_ratio=0, DefaultDim xratio=0, DefaultDim yratio=0)
Given an item size, and a bounding box, and an alignment parameter, return the rectangle the item box...
Orientation
Generic orientation flags.
Definition widgetflags.h:652
EGT framework namespace.
Definition animation.h:24
A single event that has information about the event and state for the event.
Definition event.h:255
EGT_NODISCARD const EventId & id() const noexcept
Get the id of the event.
Definition event.h:284
Base class for SliderType.
Definition slider.h:39
SliderFlag
Slider flags.
Definition slider.h:42
@ inverted
Horizontal slider origin (value start()), is to the left.
@ round_handle
Draw a round handle.
@ consistent_line
Solid color line.
@ square_handle
Draw a square handle.
@ show_labels
Show range labels.
@ rectangle_handle
Draw a rectangle handle.
@ show_label
Show value label.
When using enum_to_string() and enum_from_string(), this type needs to be defined and specialized to ...
Definition enum.h:48