1 /*
2  * Copyright (C) 2016 Paul Davis <paul@linuxaudiosystems.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #ifndef __ardour_push2_menu_h__
20 #define __ardour_push2_menu_h__
21 
22 #include <vector>
23 
24 namespace Cairo {
25 	class Context;
26 }
27 
28 #include <pangomm/fontdescription.h>
29 
30 #include "pbd/signals.h"
31 
32 #include "canvas/container.h"
33 
34 namespace ArdourCanvas {
35 	class Text;
36 	class Rectangle;
37 	class Rect;
38 }
39 
40 namespace ArdourSurface {
41 
42 class Push2Menu : public ArdourCanvas::Container
43 {
44    public:
45 	Push2Menu (ArdourCanvas::Item* parent, std::vector<std::string>);
46 
47 	void render (ArdourCanvas::Rect const& area, Cairo::RefPtr<Cairo::Context> context) const;
48 
49 	void set_wrap (bool);
50 	void set_active (uint32_t index);
51 
active()52 	uint32_t active () const { return _active; }
items()53 	uint32_t items() const { return displays.size(); }
54 
rows()55 	uint32_t rows() const { return nrows; }
cols()56 	uint32_t cols() const { return ncols; }
57 
58 	void set_layout (int cols, int rows);
59 	void set_font_description (Pango::FontDescription);
60 	void set_text_color (Gtkmm2ext::Color);
61 	void set_active_color (Gtkmm2ext::Color);
62 
can_scroll_left()63 	bool can_scroll_left() const { return first >= nrows; }
can_scroll_right()64 	bool can_scroll_right() const { return last < displays.size() - 1; }
65 
66 	enum Direction { DirectionUp, DirectionDown, DirectionLeft, DirectionRight };
67 	void scroll (Direction, bool page = false);
68 
69 	PBD::Signal0<void> ActiveChanged;
70 	PBD::Signal0<void> Rearranged;
71 
72    private:
73 	std::vector<ArdourCanvas::Text*> displays;
74 	ArdourCanvas::Rectangle* active_bg;
75 
76 	void rearrange (uint32_t initial_display);
77 
78 	double   baseline;
79 	int      row_start;
80 	int      col_start;
81 	uint32_t ncols;
82 	uint32_t nrows;
83 	bool     wrap;
84 	uint32_t first;
85 	uint32_t last;
86 	uint32_t _active;
87 
88 	Gtkmm2ext::Color text_color;
89 	Gtkmm2ext::Color active_color;
90 	Gtkmm2ext::Color contrast_color;
91 	Pango::FontDescription font_description;
92 
active_row()93 	inline int active_row () const { return _active % nrows; }
active_col()94 	inline int active_col () const { return (_active / nrows); }
active_top()95 	inline int active_top () const { return active_col() * nrows; }
96 };
97 
98 } // namespace
99 
100 #endif /* __ardour_push2_menu_h__ */
101