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