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