1 #ifndef DEMOS_GLYPH_PAINT_PAINT_AREA_HPP 2 #define DEMOS_GLYPH_PAINT_PAINT_AREA_HPP 3 #include <cstddef> 4 #include <cstdint> 5 #include <iostream> 6 #include <unordered_map> 7 8 #include <cppurses/painter/attribute.hpp> 9 #include <cppurses/painter/color.hpp> 10 #include <cppurses/painter/glyph.hpp> 11 #include <cppurses/system/events/key.hpp> 12 #include <cppurses/system/events/mouse.hpp> 13 #include <cppurses/widget/widget.hpp> 14 15 #include <signals/signals.hpp> 16 17 namespace demos { 18 namespace glyph_paint { 19 20 class Paint_area : public cppurses::Widget { 21 public: 22 Paint_area(); 23 24 void set_glyph(cppurses::Glyph glyph); 25 void set_symbol(const cppurses::Glyph& symbol); 26 void set_foreground_color(cppurses::Color c); 27 void set_background_color(cppurses::Color c); 28 void set_attribute(cppurses::Attribute attr); 29 void remove_attribute(cppurses::Attribute attr); 30 31 void clear(); 32 33 cppurses::Glyph glyph() const; 34 void toggle_clone(); 35 void enable_erase(); 36 void disable_erase(); 37 void enable_grid(); 38 void disable_grid(); 39 40 void write(std::ostream& os); 41 void read(std::istream& is); 42 43 // Signals 44 sig::Signal<void(cppurses::Glyph)> glyph_changed; 45 sig::Signal<void()> erase_enabled; 46 sig::Signal<void()> erase_disabled; 47 48 protected: 49 bool paint_event() override; 50 51 bool mouse_press_event(const cppurses::Mouse::State& mouse) override; 52 53 bool key_press_event(const cppurses::Key::State& keyboard) override; 54 55 private: 56 std::unordered_map<cppurses::Point, cppurses::Glyph> glyphs_painted_; 57 cppurses::Glyph current_glyph_{L'x'}; 58 cppurses::Glyph before_erase_{L'x'}; 59 bool clone_enabled_{false}; 60 bool erase_enabled_{false}; 61 62 void place_glyph(std::size_t x, std::size_t y); 63 void remove_glyph(cppurses::Point coords); 64 }; 65 66 namespace slot { 67 68 sig::Slot<void(cppurses::Glyph)> set_glyph(Paint_area& pa); 69 sig::Slot<void()> set_glyph(Paint_area& pa, const cppurses::Glyph& glyph); 70 71 sig::Slot<void(cppurses::Glyph)> set_symbol(Paint_area& pa); 72 sig::Slot<void()> set_symbol(Paint_area& pa, const cppurses::Glyph& symbol); 73 74 sig::Slot<void(cppurses::Color)> set_foreground_color(Paint_area& pa); 75 sig::Slot<void()> set_foreground_color(Paint_area& pa, cppurses::Color c); 76 77 sig::Slot<void(cppurses::Color)> set_background_color(Paint_area& pa); 78 sig::Slot<void()> set_background_color(Paint_area& pa, cppurses::Color c); 79 80 sig::Slot<void(cppurses::Attribute)> set_attribute(Paint_area& pa); 81 sig::Slot<void()> set_attribute(Paint_area& pa, cppurses::Attribute attr); 82 83 sig::Slot<void(cppurses::Attribute)> remove_attribute(Paint_area& pa); 84 sig::Slot<void()> remove_attribute(Paint_area& pa, cppurses::Attribute attr); 85 86 sig::Slot<void()> toggle_clone(Paint_area& pa); 87 88 sig::Slot<void()> clear(Paint_area& pa); 89 90 sig::Slot<void()> enable_erase(Paint_area& pa); 91 sig::Slot<void()> disable_erase(Paint_area& pa); 92 93 sig::Slot<void()> enable_grid(Paint_area& pa); 94 sig::Slot<void()> disable_grid(Paint_area& pa); 95 96 sig::Slot<void(std::ostream&)> write(Paint_area& pa); 97 sig::Slot<void(std::istream&)> read(Paint_area& pa); 98 99 } // namespace slot 100 } // namespace glyph_paint 101 } // namespace demos 102 #endif // DEMOS_GLYPH_PAINT_PAINT_AREA_HPP 103