summaryrefslogtreecommitdiff
path: root/libs/surfaces/push2/menu.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/push2/menu.h')
-rw-r--r--libs/surfaces/push2/menu.h67
1 files changed, 46 insertions, 21 deletions
diff --git a/libs/surfaces/push2/menu.h b/libs/surfaces/push2/menu.h
index 1e6e3d6d10..a3a08abb73 100644
--- a/libs/surfaces/push2/menu.h
+++ b/libs/surfaces/push2/menu.h
@@ -19,12 +19,14 @@
#ifndef __ardour_push2_menu_h__
#define __ardour_push2_menu_h__
+#include <vector>
+
namespace Cairo {
class Context;
class Region;
}
-#include <pangomm/layout.h>
+#include <pangomm/fontdescription.h>
#include "pbd/signals.h"
@@ -40,34 +42,57 @@ namespace ArdourSurface {
class Push2Menu : public ArdourCanvas::Container
{
public:
- Push2Menu (ArdourCanvas::Item* parent);
+ Push2Menu (ArdourCanvas::Item* parent, std::vector<std::string>);
void render (ArdourCanvas::Rect const& area, Cairo::RefPtr<Cairo::Context> context) const;
- void fill_column (int col, std::vector<std::string>);
- void set_active (int col, int index);
- void step_active (int col, int dir);
- int get_active (int col);
+ void set_wrap (bool);
+ void set_active (uint32_t index);
- PBD::Signal0<void> ActiveChanged;
- PBD::Signal0<void> Selected;
+ uint32_t active () const { return _active; }
+ uint32_t items() const { return displays.size(); }
- private:
- struct Column {
- std::vector<std::string> text;
- ArdourCanvas::Rectangle* active_bg;
- ArdourCanvas::Text* lines;
- int top;
- int active;
- };
+ uint32_t rows() const { return nrows; }
+ uint32_t cols() const { return ncols; }
+
+ void set_layout (int cols, int rows);
+ void set_font_description (Pango::FontDescription);
+ void set_text_color (ArdourCanvas::Color);
+ void set_active_color (ArdourCanvas::Color);
- Column columns[8];
+ bool can_scroll_left() const { return first >= nrows; }
+ bool can_scroll_right() const { return last < displays.size() - 1; }
- void scroll (int col, int dir);
- void set_text (int col, int top);
+ enum Direction { DirectionUp, DirectionDown, DirectionLeft, DirectionRight };
+ void scroll (Direction, bool page = false);
- int nrows;
- mutable double baseline;
+ PBD::Signal0<void> ActiveChanged;
+ PBD::Signal0<void> Rearranged;
+
+ private:
+ std::vector<ArdourCanvas::Text*> displays;
+ ArdourCanvas::Rectangle* active_bg;
+
+ void rearrange (uint32_t initial_display);
+
+ double baseline;
+ int row_start;
+ int col_start;
+ uint32_t ncols;
+ uint32_t nrows;
+ bool wrap;
+ uint32_t first;
+ uint32_t last;
+ uint32_t _active;
+
+ ArdourCanvas::Color text_color;
+ ArdourCanvas::Color active_color;
+ ArdourCanvas::Color contrast_color;
+ Pango::FontDescription font_description;
+
+ inline int active_row () const { return _active % nrows; }
+ inline int active_col () const { return (_active / nrows); }
+ inline int active_top () const { return active_col() * nrows; }
};
} // namespace