1 #ifndef CPPURSES_DEMOS_PALETTE_VALUE_CONTROL_HPP
2 #define CPPURSES_DEMOS_PALETTE_VALUE_CONTROL_HPP
3 #include <signals/signal.hpp>
4 
5 #include <cppurses/painter/glyph_string.hpp>
6 #include <cppurses/widget/layouts/horizontal.hpp>
7 #include <cppurses/widget/layouts/vertical.hpp>
8 #include <cppurses/widget/widgets/fixed_width.hpp>
9 #include <cppurses/widget/widgets/label.hpp>
10 #include <cppurses/widget/widgets/line_edit.hpp>
11 #include <cppurses/widget/widgets/vertical_slider.hpp>
12 
13 namespace palette {
14 namespace detail {
15 /// Vertical_slider with extra space around the sides.
16 struct Buffered_slider : cppurses::layout::Horizontal {
17     using Bar_t = cppurses::Fixed_width;
18     using Slider_t = cppurses::Vertical_slider;
19 
20     Bar_t& left{this->make_child<Bar_t>(1)};
21     Slider_t& slider{this->make_child<Slider_t>(0, 255)};
22     Bar_t& right{this->make_child<Bar_t>(1)};
23 };
24 
25 /// Line_edit with extra space on the left side.
26 struct Buffered_edit_box : cppurses::layout::Horizontal {
27     Buffered_edit_box();
28     cppurses::Fixed_width& left{this->make_child<cppurses::Fixed_width>(1)};
29     cppurses::Line_edit& box{this->make_child<cppurses::Line_edit>("0")};
30 };
31 }  // namespace detail
32 
33 /// Provides user interface to change a color value from [0, 255].
34 /** Emits signal when changed. */
35 class Value_control : public cppurses::layout::Vertical {
36     detail::Buffered_slider& slider_{
37         this->make_child<detail::Buffered_slider>()};
38 
39     detail::Buffered_edit_box& value_edit_{
40         this->make_child<detail::Buffered_edit_box>()};
41 
42     cppurses::Label& label_;
43 
44    public:
45     explicit Value_control(const cppurses::Glyph_string& label);
46 
47     /// Set the current value being held.
set_value(int value)48     void set_value(int value) { slider_.slider.set_value(value); }
49 
50     sig::Signal<void(int)>& value_changed{slider_.slider.value_changed};
51 };
52 }  // namespace palette
53 #endif  // CPPURSES_DEMOS_PALETTE_VALUE_CONTROL_HPP
54