ardour
ardour_dropdown.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2014 Paul Davis
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
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #include <iostream>
21 #include <cmath>
22 #include <algorithm>
23 
24 #include <pangomm/layout.h>
25 
26 #include "pbd/compose.h"
27 #include "pbd/error.h"
28 #include "pbd/stacktrace.h"
29 
30 #include "gtkmm2ext/utils.h"
31 #include "gtkmm2ext/rgb_macros.h"
32 #include "gtkmm2ext/gui_thread.h"
33 
34 #include "ardour/rc_configuration.h" // for widget prelight preference
35 
36 #include "ardour_dropdown.h"
37 #include "ardour_ui.h"
38 #include "global_signals.h"
39 
40 #include "i18n.h"
41 
42 #define REFLECTION_HEIGHT 2
43 
44 using namespace Gdk;
45 using namespace Gtk;
46 using namespace Glib;
47 using namespace PBD;
48 using std::max;
49 using std::min;
50 using namespace std;
51 
52 
54 {
55 // signal_button_press_event().connect (sigc::mem_fun(*this, &ArdourDropdown::on_mouse_pressed));
56 
57  add_elements(e);
58  add_elements(ArdourButton::Menu);
59 }
60 
62 {
63 }
64 
65 bool
67 {
68  if (ev->type == GDK_BUTTON_PRESS) {
69  _menu.popup (1, gtk_get_current_event_time());
70  }
71  return true;
72 }
73 
74 bool
75 ArdourDropdown::on_scroll_event (GdkEventScroll* ev)
76 {
77  using namespace Menu_Helpers;
78 
79  const MenuItem * current_active = _menu.get_active();
80  const MenuList& items = _menu.items ();
81  int c = 0;
82 
83  if (!current_active) {
84  return true;
85  }
86 
87  /* work around another gtkmm API clusterfuck
88  * const MenuItem* get_active () const
89  * void set_active (guint index)
90  *
91  * also MenuList.activate_item does not actually
92  * set it as active in the menu.
93  *
94  */
95 
96  switch (ev->direction) {
97  case GDK_SCROLL_UP:
98 
99  for (MenuList::const_reverse_iterator i = items.rbegin(); i != items.rend(); ++i, ++c) {
100  if ( &(*i) != current_active) {
101  continue;
102  }
103  if (++i != items.rend()) {
104  c = items.size() - 2 - c;
105  assert(c >= 0);
106  _menu.set_active(c);
107  _menu.activate_item(*i);
108  }
109  break;
110  }
111  break;
112  case GDK_SCROLL_DOWN:
113  for (MenuList::const_iterator i = items.begin(); i != items.end(); ++i, ++c) {
114  if ( &(*i) != current_active) {
115  continue;
116  }
117  if (++i != items.end()) {
118  assert(c + 1 < (int) items.size());
119  _menu.set_active(c + 1);
120  _menu.activate_item(*i);
121  }
122  break;
123  }
124  break;
125  default:
126  break;
127  }
128  return true;
129 }
130 
131 void
133 {
134  _menu.items ().clear ();
135 }
136 
137 void
138 ArdourDropdown::AddMenuElem (Menu_Helpers::MenuElem e)
139 {
140  using namespace Menu_Helpers;
141 
142  MenuList& items = _menu.items ();
143 
144  items.push_back (e);
145 }
146 
147 
bool on_button_press_event(GdkEventButton *)
Definition: ardour_ui.h:130
Definition: Beats.hpp:239
virtual ~ArdourDropdown()
ArdourDropdown(Element e=default_elements)
Definition: debug.h:30
bool on_scroll_event(GdkEventScroll *)
void AddMenuElem(Gtk::Menu_Helpers::MenuElem e)