1 /* Flow Box
2  *
3  * Gtk::FlowBox allows flexible and responsive grids which reflow
4  * as needed and support sorting and filtering.
5  *
6  * The children of a FlowBox are regular widgets
7  */
8 
9 #include <gtkmm.h>
10 
11 class Example_FlowBox : public Gtk::Window
12 {
13 public:
14   Example_FlowBox();
15   ~Example_FlowBox() override;
16 
17 protected:
18   //Signal handlers:
19   bool on_drawing_area_draw(const Cairo::RefPtr<Cairo::Context>& cr, int swatch_i);
20 
21   // Containers
22   Gtk::ScrolledWindow m_scrolled_window;
23   Gtk::FlowBox m_flow_box;
24 
25 private:
26   void fill_color_names();
27   Gtk::Button* create_color_swatch(int swatch_i);
28 
29   std::vector<Glib::ustring> m_color_names;
30 };
31 
32 //Called by DemoWindow;
do_flowbox()33 Gtk::Window* do_flowbox()
34 {
35   return new Example_FlowBox();
36 }
37 
Example_FlowBox()38 Example_FlowBox::Example_FlowBox()
39 {
40   // Window properties
41   set_title("FlowBox Example");
42   set_default_size(600, 400);
43   set_border_width(6);
44 
45   // Scrolled window
46   m_scrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
47 
48   // Flow box
49   m_flow_box.set_max_children_per_line(30);
50   m_flow_box.set_selection_mode(Gtk::SELECTION_NONE);
51   m_flow_box.set_homogeneous();
52 
53   // Color swatches
54   fill_color_names();
55   for(std::size_t i = 0; i != m_color_names.size(); ++i)
56   {
57     Gtk::Button* color_swatch = create_color_swatch(i);
58     m_flow_box.add(*color_swatch);
59   }
60 
61   // Layout
62   m_scrolled_window.add(m_flow_box);
63   add(m_scrolled_window);
64 
65   show_all_children();
66 }
67 
~Example_FlowBox()68 Example_FlowBox::~Example_FlowBox()
69 {
70 }
71 
create_color_swatch(int swatch_i)72 Gtk::Button* Example_FlowBox::create_color_swatch(int swatch_i)
73 {
74   Gtk::DrawingArea* drawing_area = Gtk::make_managed<Gtk::DrawingArea>();
75   Gtk::Button* color_swatch = Gtk::make_managed<Gtk::Button>();
76 
77   drawing_area->set_size_request(24, 24);
78 
79   color_swatch->add(*drawing_area);
80   drawing_area->signal_draw().connect(sigc::bind(sigc::mem_fun(*this, &Example_FlowBox::on_drawing_area_draw), swatch_i));
81 
82   return color_swatch;
83 }
84 
on_drawing_area_draw(const Cairo::RefPtr<Cairo::Context> & cr,int swatch_i)85 bool Example_FlowBox::on_drawing_area_draw(const Cairo::RefPtr<Cairo::Context>& cr, int swatch_i)
86 {
87   Gdk::RGBA rgba(m_color_names[swatch_i]);
88   Gdk::Cairo::set_source_rgba(cr, rgba);
89   cr->paint();
90 
91   return true;
92 }
93 
fill_color_names()94 void Example_FlowBox::fill_color_names()
95 {
96   m_color_names.push_back("AliceBlue");
97   m_color_names.push_back("AntiqueWhite");
98   m_color_names.push_back("AntiqueWhite1");
99   m_color_names.push_back("AntiqueWhite2");
100   m_color_names.push_back("AntiqueWhite3");
101   m_color_names.push_back("AntiqueWhite4");
102   m_color_names.push_back("aqua");
103   m_color_names.push_back("aquamarine");
104   m_color_names.push_back("aquamarine1");
105   m_color_names.push_back("aquamarine2");
106   m_color_names.push_back("aquamarine3");
107   m_color_names.push_back("aquamarine4");
108   m_color_names.push_back("azure");
109   m_color_names.push_back("azure1");
110   m_color_names.push_back("azure2");
111   m_color_names.push_back("azure3");
112   m_color_names.push_back("azure4");
113   m_color_names.push_back("beige");
114   m_color_names.push_back("bisque");
115   m_color_names.push_back("bisque1");
116   m_color_names.push_back("bisque2");
117   m_color_names.push_back("bisque3");
118   m_color_names.push_back("bisque4");
119   m_color_names.push_back("black");
120   m_color_names.push_back("BlanchedAlmond");
121   m_color_names.push_back("blue");
122   m_color_names.push_back("blue1");
123   m_color_names.push_back("blue2");
124   m_color_names.push_back("blue3");
125   m_color_names.push_back("blue4");
126   m_color_names.push_back("BlueViolet");
127   m_color_names.push_back("brown");
128   m_color_names.push_back("brown1");
129   m_color_names.push_back("brown2");
130   m_color_names.push_back("brown3");
131   m_color_names.push_back("brown4");
132   m_color_names.push_back("burlywood");
133   m_color_names.push_back("burlywood1");
134   m_color_names.push_back("burlywood2");
135   m_color_names.push_back("burlywood3");
136   m_color_names.push_back("burlywood4");
137   m_color_names.push_back("CadetBlue");
138   m_color_names.push_back("CadetBlue1");
139   m_color_names.push_back("CadetBlue2");
140   m_color_names.push_back("CadetBlue3");
141   m_color_names.push_back("CadetBlue4");
142   m_color_names.push_back("chartreuse");
143   m_color_names.push_back("chartreuse1");
144   m_color_names.push_back("chartreuse2");
145   m_color_names.push_back("chartreuse3");
146   m_color_names.push_back("chartreuse4");
147   m_color_names.push_back("chocolate");
148   m_color_names.push_back("chocolate1");
149   m_color_names.push_back("chocolate2");
150   m_color_names.push_back("chocolate3");
151   m_color_names.push_back("chocolate4");
152   m_color_names.push_back("coral");
153   m_color_names.push_back("coral1");
154   m_color_names.push_back("coral2");
155   m_color_names.push_back("coral3");
156   m_color_names.push_back("coral4");
157   m_color_names.push_back("CornflowerBlue");
158   m_color_names.push_back("cornsilk");
159   m_color_names.push_back("cornsilk1");
160   m_color_names.push_back("cornsilk2");
161   m_color_names.push_back("cornsilk3");
162   m_color_names.push_back("cornsilk4");
163   m_color_names.push_back("crimson");
164   m_color_names.push_back("cyan");
165   m_color_names.push_back("cyan1");
166   m_color_names.push_back("cyan2");
167   m_color_names.push_back("cyan3");
168   m_color_names.push_back("cyan4");
169   m_color_names.push_back("DarkBlue");
170   m_color_names.push_back("DarkCyan");
171   m_color_names.push_back("DarkGoldenrod");
172   m_color_names.push_back("DarkGoldenrod1");
173   m_color_names.push_back("DarkGoldenrod2");
174   m_color_names.push_back("DarkGoldenrod3");
175   m_color_names.push_back("DarkGoldenrod4");
176   m_color_names.push_back("DarkGray");
177   m_color_names.push_back("DarkGreen");
178   m_color_names.push_back("DarkGrey");
179   m_color_names.push_back("DarkKhaki");
180   m_color_names.push_back("DarkMagenta");
181   m_color_names.push_back("DarkOliveGreen");
182   m_color_names.push_back("DarkOliveGreen1");
183   m_color_names.push_back("DarkOliveGreen2");
184   m_color_names.push_back("DarkOliveGreen3");
185   m_color_names.push_back("DarkOliveGreen4");
186   m_color_names.push_back("DarkOrange");
187   m_color_names.push_back("DarkOrange1");
188   m_color_names.push_back("DarkOrange2");
189   m_color_names.push_back("DarkOrange3");
190   m_color_names.push_back("DarkOrange4");
191   m_color_names.push_back("DarkOrchid");
192   m_color_names.push_back("DarkOrchid1");
193   m_color_names.push_back("DarkOrchid2");
194   m_color_names.push_back("DarkOrchid3");
195   m_color_names.push_back("DarkOrchid4");
196   m_color_names.push_back("DarkRed");
197   m_color_names.push_back("DarkSalmon");
198   m_color_names.push_back("DarkSeaGreen");
199   m_color_names.push_back("DarkSeaGreen1");
200 }
201