1.10
progressbar.h
1/*
2 * Copyright (C) 2018 Microchip Technology Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef EGT_PROGRESSBAR_H
7#define EGT_PROGRESSBAR_H
8
13#include <egt/app.h>
14#include <egt/detail/alignment.h>
15#include <egt/detail/enum.h>
16#include <egt/detail/math.h>
17#include <egt/detail/meta.h>
18#include <egt/detail/screen/composerscreen.h>
19#include <egt/frame.h>
20#include <egt/painter.h>
21#include <egt/serialize.h>
22#include <egt/textwidget.h>
23#include <egt/valuewidget.h>
24#include <string>
25
26namespace egt
27{
28inline namespace v1
29{
30
33{
34 left_to_right = 0, /* default */
38};
39
47template<class T>
48class EGT_API ProgressBarType : public ValueRangeWidget<T>
49{
50public:
51
58 explicit ProgressBarType<T>(const Rect& rect = {},
59 T start = {}, T end = 100, T value = {}) noexcept
60 : ValueRangeWidget<T>(rect, start, end, value)
61 {
62 this->name("ProgressBar" + std::to_string(this->m_widgetid));
63 this->fill_flags(Theme::FillFlag::blend);
64 this->border(this->theme().default_border());
65 }
66
74 explicit ProgressBarType(Frame& parent, const Rect& rect = {},
75 T start = {}, T end = 100, T value = {}) noexcept
76 : ProgressBarType(rect, start, end, value)
77 {
78 parent.add(*this);
79 }
80
84 explicit ProgressBarType(Serializer::Properties& props) noexcept
85 : ProgressBarType(props, false)
86 {
87 }
88
89protected:
90
91 explicit ProgressBarType(Serializer::Properties& props, bool is_derived) noexcept
92 : ValueRangeWidget<T>(props, true)
93 {
94 deserialize(props);
95
96 if (!is_derived)
97 this->deserialize_leaf(props);
98 }
99
100public:
101
102 void draw(Painter& painter, const Rect& rect) override
103 {
104 Drawer<ProgressBarType<T>>::draw(*this, painter, rect);
105 }
106
108 static void default_draw(ProgressBarType<T>& widget, Painter& painter, const Rect&)
109 {
110 widget.draw_box(painter, Palette::ColorId::bg, Palette::ColorId::border);
111
112 auto b = widget.content_area();
113 auto style = widget.style();
114 auto draw_bar = false;
115 Rect r;
116
117 if (style == ProgressBarStyle::left_to_right ||
118 style == ProgressBarStyle::right_to_left)
119 {
120 /*
121 * Convert directly into DefaultDim to avoid rounding issues
122 * of '- width' when computing 'x' for the 'right_to_left' style.
123 */
124 DefaultDim width = detail::normalize<float>(widget.value(),
125 widget.starting(),
126 widget.ending(), 0, b.width());
127
128 if (width && b.height())
129 {
130 auto x = b.x();
131 if (style == ProgressBarStyle::right_to_left)
132 x = b.x() + b.width() - width;
133 r = Rect(x, b.y(), width, b.height());
134 draw_bar = true;
135 }
136 }
137 else if (style == ProgressBarStyle::top_to_bottom ||
138 style == ProgressBarStyle::bottom_to_top)
139 {
140 /*
141 * Convert directly into DefaultDim to avoid rounding issues
142 * of '- height' when computing 'y' for the 'bottom_to_top' style.
143 */
144 DefaultDim height = detail::normalize<float>(widget.value(),
145 widget.starting(),
146 widget.ending(), 0, b.height());
147
148 if (height && b.width())
149 {
150 auto y = b.y();
151 if (style == ProgressBarStyle::bottom_to_top)
152 y = b.y() + b.height() - height;
153 r = Rect(b.x(), y, b.width(), height);
154 draw_bar = true;
155 }
156 }
157
158 if (draw_bar)
159 {
160 widget.theme().draw_box(painter,
161 Theme::FillFlag::blend,
162 r,
163 Color(),
164 widget.color(Palette::ColorId::button_bg),
165 0,
166 0,
167 widget.border_radius());
168 }
169
170 if (widget.show_label())
171 {
172 std::string text = std::to_string(widget.value());
173 if (widget.show_percentage())
174 {
175 auto percentage = detail::normalize<float>(widget.value(),
176 widget.starting(),
177 widget.ending(), 0, 100);
178 text = std::to_string(static_cast<int>(percentage)) + "%";
179 }
180 auto f = TextWidget::scale_font(Size(b.width() * 0.75,
181 b.height() * 0.75),
182 text, widget.font());
183
184 painter.set(widget.color(Palette::ColorId::label_text));
185 painter.set(f);
186 auto size = painter.text_size(text);
187 auto target = detail::align_algorithm(size, b, AlignFlag::center);
188 painter.draw(target.point());
189 painter.draw(text);
190 }
191 }
192
193 using ValueRangeWidget<T>::min_size_hint;
194
198 static void default_size(const Size& size);
199
200 EGT_NODISCARD Size min_size_hint() const override
201 {
202 if (!this->m_min_size.empty())
203 return this->m_min_size;
204
205 return default_size() + Widget::min_size_hint();
206 }
207
213 void show_label(bool value)
214 {
215 if (m_show_label != value)
216 {
217 m_show_label = value;
218 this->damage();
219 }
220 }
221
225 EGT_NODISCARD bool show_label() const { return m_show_label; }
226
232 void show_percentage(bool enable)
233 {
234 if (m_show_percentage != enable)
235 {
236 m_show_percentage = enable;
237 this->damage();
238 }
239 }
240
244 EGT_NODISCARD bool show_percentage() const { return m_show_percentage; }
245
252 {
253 if (detail::change_if_diff<>(m_style, style))
254 {
255 this->damage();
256 }
257 }
258
262 EGT_NODISCARD ProgressBarStyle style() const { return m_style; }
263
264 void serialize(Serializer& serializer) const override;
265
266protected:
270 bool m_show_label{true};
271
275 bool m_show_percentage{false};
276
280 ProgressBarStyle m_style{ProgressBarStyle::left_to_right};
281
282private:
284 static Size m_default_size;
285 static Signal<>::RegisterHandle m_default_size_handle;
286 static void register_handler();
287 static void unregister_handler();
288
289 void deserialize(Serializer::Properties& props);
290};
291
292template <class T>
294{
296
297 serializer.add_property("show_label", detail::to_string(this->m_show_label));
298 if (show_percentage())
299 serializer.add_property("show_percentage", show_percentage());
300 if (style() != ProgressBarStyle::left_to_right)
301 serializer.add_property("style", detail::enum_to_string(style()));
302}
303
304template <class T>
306{
307 props.erase(std::remove_if(props.begin(), props.end(), [&](auto & p)
308 {
309 if (std::get<0>(p) == "show_label")
310 {
311 m_show_label = detail::from_string(std::get<1>(p));
312 return true;
313 }
314 else if (std::get<0>(p) == "show_percentage")
315 {
316 show_percentage(detail::from_string(std::get<1>(p)));
317 return true;
318 }
319 else if (std::get<0>(p) == "style")
320 {
321 style(detail::enum_from_string<ProgressBarStyle>(std::get<1>(p)));
322 return true;
323 }
324 return false;
325 }), props.end());
326}
327
333class EGT_API ProgressBar : public ProgressBarType<int>
334{
335public:
336 using ProgressBarType<int>::ProgressBarType;
337
338 EGT_NODISCARD std::string type() const override
339 {
340 return "ProgressBar";
341 }
342};
343
349class EGT_API ProgressBarF : public ProgressBarType<float>
350{
351public:
352 using ProgressBarType<float>::ProgressBarType;
353
354 EGT_NODISCARD std::string type() const override
355 {
356 return "ProgressBarF";
357 }
358};
359
360template <class T>
362
363template <class T>
365
366template <class T>
368{
369 if (m_default_size_handle == Signal<>::INVALID_HANDLE)
370 {
371 m_default_size_handle = detail::ComposerScreen::register_screen_resize_hook([]()
372 {
373 m_default_size.clear();
374 });
375 }
376}
377
378template <class T>
379void ProgressBarType<T>::unregister_handler()
380{
382 m_default_size_handle = Signal<>::INVALID_HANDLE;
383}
384
385template <class T>
387{
389 {
390 register_handler();
391 auto ss = egt::Application::instance().screen()->size();
392 ProgressBarType<T>::m_default_size = Size(ss.width() * 0.25, ss.height() * 0.05);
393 }
394
396}
397
398template <class T>
400{
401 if (!size.empty())
402 unregister_handler();
403
405}
406
408template<>
409EGT_API const std::pair<ProgressBarStyle, char const*> detail::EnumStrings<ProgressBarStyle>::data[4];
410
418template <class T>
419class EGT_API SpinProgressType : public ValueRangeWidget<T>
420{
421public:
422
429 explicit SpinProgressType(const Rect& rect = {},
430 T start = 0, T end = 100, T value = 0) noexcept
431 : ValueRangeWidget<T>(rect, start, end, value)
432 {
433 this->name("SpinProgress" + std::to_string(this->m_widgetid));
434 this->fill_flags(Theme::FillFlag::blend);
435 }
436
444 explicit SpinProgressType(Frame& parent, const Rect& rect = {},
445 T start = 0, T end = 100, T value = 0) noexcept
446 : SpinProgressType(rect, start, end, value)
447 {
448 parent.add(*this);
449 }
450
454 explicit SpinProgressType(Serializer::Properties& props) noexcept
455 : SpinProgressType(props, false)
456 {
457 }
458
459protected:
460
461 explicit SpinProgressType(Serializer::Properties& props, bool is_derived) noexcept
462 : ValueRangeWidget<T>(props, true)
463 {
464 deserialize(props);
465
466 if (!is_derived)
467 this->deserialize_leaf(props);
468 }
469
470public:
471
472 void draw(Painter& painter, const Rect& rect) override
473 {
474 Drawer<SpinProgressType<T>>::draw(*this, painter, rect);
475 }
476
478 static void default_draw(SpinProgressType<T>& widget, Painter& painter, const Rect& rect)
479 {
480 detail::ignoreparam(rect);
481
482 widget.draw_box(painter, Palette::ColorId::bg, Palette::ColorId::border);
483
484 auto b = widget.content_area();
485
486 auto dim = std::min(b.width(), b.height());
487 float linew = dim / 10.0f;
488 float radius = dim / 2.0f - (linew / 2.0f);
489 auto angle1 = detail::to_radians<float>(180, 0);
490
491 auto min = std::min(widget.starting(), widget.ending());
492 auto max = std::max(widget.starting(), widget.ending());
493 auto angle2 = detail::to_radians<float>(180.0f,
494 detail::normalize_to_angle(static_cast<float>(widget.value()),
495 static_cast<float>(min), static_cast<float>(max), 0.0f, 360.0f, true));
496
497 painter.line_width(linew);
498 painter.set(widget.color(Palette::ColorId::button_fg, Palette::GroupId::disabled));
499 painter.draw(Arc(widget.center(), radius, 0.0f, 2 * detail::pi<float>()));
500 painter.stroke();
501
502 painter.set(widget.color(Palette::ColorId::button_fg));
503 painter.draw(Arc(widget.center(), radius, angle1, angle2));
504 painter.stroke();
505
506 if (widget.show_label())
507 {
508 std::string text = std::to_string(widget.value());
509 auto f = TextWidget::scale_font(Size(dim * 0.75f, dim * 0.75f), text, widget.font());
510 painter.set(f);
511 painter.set(widget.color(Palette::ColorId::text));
512 auto size = painter.text_size(text);
513 auto target = detail::align_algorithm(size, b, AlignFlag::center);
514 painter.draw(target.point());
515 painter.draw(text);
516 }
517 }
518
522 static void default_size(const Size& size);
523
524 using ValueRangeWidget<T>::min_size_hint;
525
526 EGT_NODISCARD Size min_size_hint() const override
527 {
528 if (!this->m_min_size.empty())
529 return this->m_min_size;
530
531 return default_size() + Widget::min_size_hint();
532 }
533
539 void show_label(bool value)
540 {
541 if (m_show_label != value)
542 {
543 m_show_label = value;
544 this->damage();
545 }
546 }
547
551 EGT_NODISCARD bool show_label() const { return m_show_label; }
552
553 void serialize(Serializer& serializer) const override;
554
555protected:
557 bool m_show_label{true};
558
559private:
561 static Size m_default_size;
562 static Signal<>::RegisterHandle m_default_size_handle;
563 static void register_handler();
564 static void unregister_handler();
565
566 void deserialize(Serializer::Properties& props);
567};
568
574class EGT_API SpinProgress : public SpinProgressType<int>
575{
576public:
577 using SpinProgressType<int>::SpinProgressType;
578
579 EGT_NODISCARD std::string type() const override
580 {
581 return "SpinProgress";
582 }
583};
584
590class EGT_API SpinProgressF : public SpinProgressType<float>
591{
592public:
593 using SpinProgressType<float>::SpinProgressType;
594
595 EGT_NODISCARD std::string type() const override
596 {
597 return "SpinProgressF";
598 }
599};
600
601template <class T>
603
604template <class T>
606
607template <class T>
609{
610 if (m_default_size_handle == Signal<>::INVALID_HANDLE)
611 {
612 m_default_size_handle = detail::ComposerScreen::register_screen_resize_hook([]()
613 {
614 m_default_size.clear();
615 });
616 }
617}
618
619template <class T>
620void SpinProgressType<T>::unregister_handler()
621{
623 m_default_size_handle = Signal<>::INVALID_HANDLE;
624}
625
626template <class T>
628{
630 {
631 register_handler();
632 auto ss = egt::Application::instance().screen()->size();
633 SpinProgressType<T>::m_default_size = Size(ss.width() * 0.12, ss.height() * 0.20);
634 }
636}
637
638template <class T>
640{
641 if (!size.empty())
642 unregister_handler();
643
645}
646
647template <class T>
649{
651
652 serializer.add_property("show_label", detail::to_string(this->m_show_label));
653}
654
655template <class T>
657{
658 props.erase(std::remove_if(props.begin(), props.end(), [&](auto & p)
659 {
660 if (std::get<0>(p) == "show_label")
661 {
662 m_show_label = detail::from_string(std::get<1>(p));
663 return true;
664 }
665 return false;
666 }), props.end());
667}
668
679template <class T>
680class EGT_API LevelMeterType : public ValueRangeWidget<T>
681{
682public:
683
690 explicit LevelMeterType(const Rect& rect = {},
691 T start = 0, T end = 100, T value = 0) noexcept
692 : ValueRangeWidget<T>(rect, start, end, value)
693 {
694 this->name("LevelMeter" + std::to_string(this->m_widgetid));
695 this->fill_flags(Theme::FillFlag::blend);
696 this->padding(2);
697 }
698
699
707 explicit LevelMeterType(Frame& parent, const Rect& rect = {},
708 T start = 0, T end = 100, T value = 0) noexcept
709 : LevelMeterType(rect, start, end, value)
710 {
711 parent.add(*this);
712 }
713
717 explicit LevelMeterType(Serializer::Properties& props) noexcept
718 : LevelMeterType(props, false)
719 {
720 }
721
722protected:
723
724 explicit LevelMeterType(Serializer::Properties& props, bool is_derived) noexcept
725 : ValueRangeWidget<T>(props, true)
726 {
727 deserialize(props);
728
729 if (!is_derived)
730 this->deserialize_leaf(props);
731 }
732
733public:
734
735 void draw(Painter& painter, const Rect& rect) override
736 {
737 Drawer<LevelMeterType<T>>::draw(*this, painter, rect);
738 }
739
741 static void default_draw(LevelMeterType<T>& widget, Painter& painter, const Rect&)
742 {
743 widget.draw_box(painter, Palette::ColorId::bg, Palette::ColorId::border);
744
745 const auto b = widget.content_area();
746
747 const auto limit = egt::detail::normalize<float>(widget.value(),
748 widget.starting(),
749 widget.ending(),
750 widget.num_bars(), 0);
751 const auto barheight = b.height() / widget.num_bars();
752
753 if (static_cast<DefaultDim>(barheight) > widget.padding())
754 {
755 for (size_t i = 0; i < widget.num_bars(); i++)
756 {
757 auto color = widget.color(Palette::ColorId::button_fg, Palette::GroupId::disabled);
758 if (i >= limit)
759 color = widget.color(Palette::ColorId::button_fg);
760
761 Rect rect(b.x(), b.y() + i * barheight, b.width(), barheight - widget.padding());
762
763 widget.theme().draw_box(painter,
764 Theme::FillFlag::blend,
765 rect,
766 widget.color(Palette::ColorId::border),
767 color);
768 }
769 }
770 }
771
775 void num_bars(size_t bars)
776 {
777 if (bars && detail::change_if_diff(m_num_bars, bars))
778 this->damage();
779 }
780
784 EGT_NODISCARD size_t num_bars() const { return m_num_bars; }
785
789 static void default_size(const Size& size);
790
792
793 EGT_NODISCARD Size min_size_hint() const override
794 {
795 if (!this->m_min_size.empty())
796 return this->m_min_size;
797
798 return default_size() + Widget::min_size_hint();
799 }
800
801 void serialize(Serializer& serializer) const override;
802
803protected:
804
806 size_t m_num_bars{10};
807
808private:
810 static Size m_default_size;
811 static Signal<>::RegisterHandle m_default_size_handle;
812 static void register_handler();
813 static void unregister_handler();
814
815 void deserialize(Serializer::Properties& props);
816};
817
823class EGT_API LevelMeter : public LevelMeterType<int>
824{
825public:
826 using LevelMeterType<int>::LevelMeterType;
827
828 EGT_NODISCARD std::string type() const override
829 {
830 return "LevelMeter";
831 }
832};
833
839class EGT_API LevelMeterF : public LevelMeterType<float>
840{
841public:
842 using LevelMeterType<float>::LevelMeterType;
843
844 EGT_NODISCARD std::string type() const override
845 {
846 return "LevelMeterF";
847 }
848};
849
850template <class T>
852
853template <class T>
855
856template <class T>
858{
859 if (m_default_size_handle == Signal<>::INVALID_HANDLE)
860 {
861 m_default_size_handle = detail::ComposerScreen::register_screen_resize_hook([]()
862 {
863 m_default_size.clear();
864 });
865 }
866}
867
868template <class T>
869void LevelMeterType<T>::unregister_handler()
870{
871 detail::ComposerScreen::unregister_screen_resize_hook(m_default_size_handle);
872 m_default_size_handle = Signal<>::INVALID_HANDLE;
873}
874
875template <class T>
877{
879 {
880 register_handler();
881 auto ss = egt::Application::instance().screen()->size();
882 LevelMeterType<T>::m_default_size = Size(ss.width() * 0.05, ss.height() * 0.20);
883 }
885}
886
887template <class T>
889{
890 if (!size.empty())
891 unregister_handler();
892
894}
895
896template <class T>
898{
900
901 serializer.add_property("num_bars", std::to_string(this->m_num_bars));
902}
903
904template <class T>
906{
907 props.erase(std::remove_if(props.begin(), props.end(), [&](auto & p)
908 {
909 if (std::get<0>(p) == "num_bars")
910 {
911 m_num_bars = std::stoi(std::get<1>(p));
912 return true;
913 }
914 return false;
915 }), props.end());
916}
917
928template <class T>
929class EGT_API AnalogMeterType : public ValueRangeWidget<T>
930{
931public:
932
936 explicit AnalogMeterType(const Rect& rect = {}) noexcept
937 : ValueRangeWidget<T>(rect, 0, 100, 0)
938 {
939 this->name("AnalogMeter" + std::to_string(this->m_widgetid));
940 this->fill_flags(Theme::FillFlag::blend);
941 }
942
947 explicit AnalogMeterType(Frame& parent, const Rect& rect = {}) noexcept
948 : AnalogMeterType(rect)
949 {
950 parent.add(*this);
951 }
952
956 explicit AnalogMeterType(Serializer::Properties& props) noexcept
957 : AnalogMeterType(props, false)
958 {
959 }
960
961protected:
962
963 explicit AnalogMeterType(Serializer::Properties& props, bool is_derived) noexcept
964 : ValueRangeWidget<T>(props, true)
965 {
966 this->name("AnalogMeter" + std::to_string(this->m_widgetid));
967 this->fill_flags(Theme::FillFlag::blend);
968
969 if (!is_derived)
970 this->deserialize_leaf(props);
971 }
972
973public:
974
975 void draw(Painter& painter, const Rect& rect) override
976 {
977 Drawer<AnalogMeterType<T>>::draw(*this, painter, rect);
978 }
979
981 static void default_draw(AnalogMeterType<T>& widget, Painter& painter, const Rect& rect)
982 {
983 detail::ignoreparam(rect);
984
985 static const auto tick_width = 1.0f;
986
987 widget.draw_box(painter, Palette::ColorId::bg, Palette::ColorId::border);
988
989 const auto b = widget.content_area();
990 painter.line_width(tick_width);
991 painter.set(widget.font());
992 const auto text_size = painter.text_size("999");
993
994 painter.translate(Point(b.center().x(), b.y() + b.height() - text_size.height()));
995
996 const auto dim = std::min<DefaultDim>(b.width() / 2, b.height());
997 const float hw = dim - (text_size.width() * 2.0);
998
999 // ticks and labels
1000 for (auto tick = 0; tick <= 100; tick += 10)
1001 {
1002 const auto xangle = std::cos(detail::pi<float>() * tick * 0.01f);
1003 const auto yangle = std::sin(detail::pi<float>() * tick * 0.01f);
1004 painter.set(widget.color(Palette::ColorId::button_fg,
1005 Palette::GroupId::disabled));
1006 painter.draw(Point(hw * xangle,
1007 -hw * yangle),
1008 Point((hw + 10.0f) * xangle,
1009 -(hw + 10.0f) * yangle));
1010 painter.stroke();
1011
1012 int text = static_cast<int>(detail::normalize<float>(tick, 0, 100, widget.starting(), widget.ending()));
1013 painter.set(widget.color(Palette::ColorId::text));
1014 const auto size = painter.text_size(std::to_string(text));
1015 painter.draw(Point(-(hw + 30.0f) * xangle - size.width() / 2.0f,
1016 -(hw + 30.0f) * yangle - size.height() / 2.0f));
1017 painter.draw(std::to_string(text));
1018 painter.stroke();
1019 }
1020
1021 // needle
1022 auto avalue = detail::normalize<float>(widget.value(), widget.starting(), widget.ending(), 0, 100);
1023 const auto dest = Point((-hw - 15.0f) * std::cos(detail::pi<float>() * avalue * 0.01f),
1024 (-hw - 15.0f) * std::sin(detail::pi<float>() * avalue * 0.01f));
1025
1026 painter.set(widget.color(Palette::ColorId::button_fg));
1027 painter.line_width(tick_width * 2.0f);
1028 painter.draw(Point(), dest);
1029 painter.stroke();
1030 painter.draw(Circle(Point(), 5));
1031 painter.draw(Circle(dest, 2));
1032 painter.fill();
1033 }
1034
1038 static void default_size(const Size& size);
1039
1041
1042 EGT_NODISCARD Size min_size_hint() const override
1043 {
1044 if (!this->m_min_size.empty())
1045 return this->m_min_size;
1046
1047 return default_size() + Widget::min_size_hint();
1048 }
1049
1050private:
1051
1053 static Size m_default_size;
1054 static Signal<>::RegisterHandle m_default_size_handle;
1055 static void register_handler();
1056 static void unregister_handler();
1057};
1058
1064class EGT_API AnalogMeter : public AnalogMeterType<int>
1065{
1066public:
1067 using AnalogMeterType<int>::AnalogMeterType;
1068
1069 EGT_NODISCARD std::string type() const override
1070 {
1071 return "AnalogMeter";
1072 }
1073};
1074
1080class EGT_API AnalogMeterF : public AnalogMeterType<float>
1081{
1082public:
1083 using AnalogMeterType<float>::AnalogMeterType;
1084
1085 EGT_NODISCARD std::string type() const override
1086 {
1087 return "AnalogMeterF";
1088 }
1089};
1090
1091template <class T>
1093
1094template <class T>
1096
1097template <class T>
1099{
1100 if (m_default_size_handle == Signal<>::INVALID_HANDLE)
1101 {
1102 m_default_size_handle = detail::ComposerScreen::register_screen_resize_hook([]()
1103 {
1104 m_default_size.clear();
1105 });
1106 }
1107}
1108
1109template <class T>
1110void AnalogMeterType<T>::unregister_handler()
1111{
1112 detail::ComposerScreen::unregister_screen_resize_hook(m_default_size_handle);
1113 m_default_size_handle = Signal<>::INVALID_HANDLE;
1114}
1115
1116template <class T>
1118{
1120 {
1121 register_handler();
1122 auto ss = egt::Application::instance().screen()->size();
1123 AnalogMeterType<T>::m_default_size = Size(ss.width() * 0.25, ss.height() * 0.20);
1124 }
1126}
1127
1128template <class T>
1130{
1131 if (!size.empty())
1132 unregister_handler();
1133
1135}
1136
1137}
1138}
1139
1140#endif
This is a level meter that can be used to display floating values.
Definition progressbar.h:1081
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:1085
Displays an analog meter based on a percentage value.
Definition progressbar.h:930
EGT_NODISCARD Size min_size_hint() const override
Get a minimum size hint for the Widget.
Definition progressbar.h:1042
static void default_draw(AnalogMeterType< T > &widget, Painter &painter, const Rect &rect)
Default draw method for the widget.
Definition progressbar.h:981
AnalogMeterType(Frame &parent, const Rect &rect={}) noexcept
Definition progressbar.h:947
static Size default_size()
Default ProgressBar size.
Definition progressbar.h:1117
void draw(Painter &painter, const Rect &rect) override
Draw the widget.
Definition progressbar.h:975
static void default_size(const Size &size)
Change default ProgressBar size.
Definition progressbar.h:1129
AnalogMeterType(const Rect &rect={}) noexcept
Definition progressbar.h:936
AnalogMeterType(Serializer::Properties &props) noexcept
Definition progressbar.h:956
AnalogMeterType(Serializer::Properties &props, bool is_derived) noexcept
Definition progressbar.h:963
This is a level meter that can be used to display integer values.
Definition progressbar.h:1065
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:1069
EGT_NODISCARD Screen * screen() const
Get a pointer to the Screen instance.
Definition app.h:119
An Arc consists of a radius and two angles.
Definition geometry.h:1123
32 bit RGBA color.
Definition color.h:41
Manager of the Drawable for each widget type.
Definition theme.h:104
A Frame is a Widget that has children widgets.
Definition frame.h:45
virtual void add(const std::shared_ptr< Widget > &widget)
Add a child widget.
This is a level meter that can be used to display floating values.
Definition progressbar.h:840
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:844
Displays a level meter based on a value.
Definition progressbar.h:681
EGT_NODISCARD Size min_size_hint() const override
Get a minimum size hint for the Widget.
Definition progressbar.h:793
static Size default_size()
Default LevelMeter size.
Definition progressbar.h:876
void draw(Painter &painter, const Rect &rect) override
Draw the widget.
Definition progressbar.h:735
static void default_size(const Size &size)
Change default LevelMeter size.
Definition progressbar.h:888
EGT_NODISCARD size_t num_bars() const
Get the number of bars to show.
Definition progressbar.h:784
LevelMeterType(Serializer::Properties &props) noexcept
Definition progressbar.h:717
LevelMeterType(Frame &parent, const Rect &rect={}, T start=0, T end=100, T value=0) noexcept
Definition progressbar.h:707
static void default_draw(LevelMeterType< T > &widget, Painter &painter, const Rect &)
Default draw method for the widget.
Definition progressbar.h:741
LevelMeterType(const Rect &rect={}, T start=0, T end=100, T value=0) noexcept
Definition progressbar.h:690
void serialize(Serializer &serializer) const override
Serialize the widget to the specified serializer.
Definition progressbar.h:897
void num_bars(size_t bars)
Set the number of bars to show.
Definition progressbar.h:775
LevelMeterType(Serializer::Properties &props, bool is_derived) noexcept
Definition progressbar.h:724
This is a level meter that can be used to display integer values.
Definition progressbar.h:824
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:828
EGT_NODISCARD const std::string & name() const
Get the name of the Object.
Definition object.h:42
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 & fill()
Painter & draw(const PointType< T, detail::Compatible::normal > &point)
Move to a point.
Definition painter.h:182
Painter & translate(const PointF &point)
Painter & stroke()
Size text_size(const std::string &text)
This is a progress bar that can be used to display floating values.
Definition progressbar.h:350
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:354
Displays a progress bar based on a value.
Definition progressbar.h:49
EGT_NODISCARD Size min_size_hint() const override
Get a minimum size hint for the Widget.
Definition progressbar.h:200
ProgressBarType(Serializer::Properties &props) noexcept
Definition progressbar.h:84
static Size default_size()
Default ProgressBar size.
Definition progressbar.h:386
void draw(Painter &painter, const Rect &rect) override
Draw the widget.
Definition progressbar.h:102
EGT_NODISCARD bool show_label() const
Get the show label state.
Definition progressbar.h:225
static void default_size(const Size &size)
Change default ProgressBar size.
Definition progressbar.h:399
static void default_draw(ProgressBarType< T > &widget, Painter &painter, const Rect &)
Default draw method for the widget.
Definition progressbar.h:108
void show_percentage(bool enable)
Enable/disable showing the label text in percentage.
Definition progressbar.h:232
ProgressBarType(Serializer::Properties &props, bool is_derived) noexcept
Definition progressbar.h:91
EGT_NODISCARD ProgressBarStyle style() const
Get the style of the progress bar.
Definition progressbar.h:262
void serialize(Serializer &serializer) const override
Serialize the widget to the specified serializer.
Definition progressbar.h:293
void show_label(bool value)
Enable/disable showing the label text.
Definition progressbar.h:213
void style(ProgressBarStyle style)
Set the style of the progress bar.
Definition progressbar.h:251
ProgressBarType(Frame &parent, const Rect &rect={}, T start={}, T end=100, T value={}) noexcept
Definition progressbar.h:74
EGT_NODISCARD bool show_percentage() const
Get the show label in percentage.
Definition progressbar.h:244
This is a progess bar that can be used to display integer values.
Definition progressbar.h:334
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:338
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
uint32_t RegisterHandle
Handle type.
Definition signal.h:46
This is a spinning progress meter that can be used to display floating values.
Definition progressbar.h:591
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:595
Displays a spinning progress meter.
Definition progressbar.h:420
EGT_NODISCARD Size min_size_hint() const override
Get a minimum size hint for the Widget.
Definition progressbar.h:526
static Size default_size()
Default SpinProgress size.
Definition progressbar.h:627
void draw(Painter &painter, const Rect &rect) override
Draw the widget.
Definition progressbar.h:472
EGT_NODISCARD bool show_label() const
Get the show label state.
Definition progressbar.h:551
static void default_size(const Size &size)
Change default SpinProgress size.
Definition progressbar.h:639
SpinProgressType(const Rect &rect={}, T start=0, T end=100, T value=0) noexcept
Definition progressbar.h:429
SpinProgressType(Serializer::Properties &props) noexcept
Definition progressbar.h:454
void serialize(Serializer &serializer) const override
Serialize the widget to the specified serializer.
Definition progressbar.h:648
void show_label(bool value)
Enable/disable showing the label text.
Definition progressbar.h:539
static void default_draw(SpinProgressType< T > &widget, Painter &painter, const Rect &rect)
Default draw method for the widget.
Definition progressbar.h:478
SpinProgressType(Serializer::Properties &props, bool is_derived) noexcept
Definition progressbar.h:461
SpinProgressType(Frame &parent, const Rect &rect={}, T start=0, T end=100, T value=0) noexcept
Definition progressbar.h:444
This is a spinning progress meter that can be used to display integer values.
Definition progressbar.h:575
EGT_NODISCARD std::string type() const override
Returns a string representation of the type of this widget.
Definition progressbar.h:579
virtual void draw_box(Painter &painter, const Widget &widget, Palette::ColorId bg, Palette::ColorId border) const
Draw a box using properties directly from the widget.
Manages a value in a range.
Definition valuewidget.h:93
virtual T value(T value)
Set value.
Definition valuewidget.h:157
EGT_NODISCARD T ending() const
Get the end value.
Definition valuewidget.h:178
EGT_NODISCARD T starting() const
Get the start value.
Definition valuewidget.h:173
void serialize(Serializer &serializer) const override
Serialize the widget to the specified serializer.
Definition valuewidget.h:275
void border_radius(float radius)
Set the border radius.
Definition widget.h:997
EGT_NODISCARD Point center() const
Get the center point of the widget's box().
Definition widget.h:775
EGT_NODISCARD const Theme & theme() const
Get the Widget Theme.
virtual void draw(Painter &painter, const Rect &rect)
Draw the widget.
Size m_min_size
Minimum size of the widget when not an empty value.
Definition widget.h:1815
void padding(DefaultDim padding)
Set the padding width.
Definition widget.h:936
EGT_NODISCARD const Theme::FillFlags & fill_flags() const
Get the fill flags.
Definition widget.h:1215
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.
void deserialize_leaf(Serializer::Properties &props)
Deserialize widget properties that require to call overridden methods.
EGT_NODISCARD DefaultDim padding() const
Return the padding width.
Definition widget.h:950
virtual void damage()
Damage the box() of the widget and cause a redraw.
void draw_box(Painter &painter, Palette::ColorId bg, Palette::ColorId border) const
Helper function to draw this widget's box using the appropriate theme.
virtual void serialize(Serializer &serializer) const
Serialize the widget to the specified serializer.
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.
CircleType< DefaultDim > Circle
Helper type alias.
Definition geometry.h:1259
SizeType< DefaultDim, detail::Compatible::normal > Size
Helper type alias.
Definition geometry.h:573
PointType< DefaultDim, detail::Compatible::normal > Point
Helper type alias.
Definition geometry.h:314
EGT_API bool from_string(const std::string &x)
Convert a lexical std::string to a bool.
constexpr const char * enum_to_string(T const &e)
Convert an enum to a string.
Definition enum.h:55
std::string to_string(const T &x)
Convert a type to a std::string using std::ostringstream.
Definition detail/string.h:110
ProgressBarStyle
ProgressBar Style.
Definition progressbar.h:33
int DefaultDim
Define the default dimension type used for geometry.
Definition geometry.h:34
EGT framework namespace.
Definition animation.h:24
When using enum_to_string() and enum_from_string(), this type needs to be defined and specialized to ...
Definition enum.h:48