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