ardour
ardour_display.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 #include "gtkmm2ext/keyboard.h"
34 
35 #include "ardour/rc_configuration.h" // for widget prelight preference
36 
37 #include "ardour_display.h"
38 #include "ardour_ui.h"
39 #include "global_signals.h"
40 
41 #include "i18n.h"
42 
43 using namespace Gtkmm2ext;
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  add_elements(e);
56  add_elements(ArdourButton::Menu);
57  add_elements(ArdourButton::Text);
58 }
59 
61 {
62 }
63 
64 bool
66 {
67  _menu.popup (1, gtk_get_current_event_time());
68  return true;
69 }
70 
71 bool
72 ArdourDisplay::on_scroll_event (GdkEventScroll* ev)
73 {
74  /* mouse wheel */
75 
76  float scale = 1.0;
77  if (ev->state & Keyboard::GainFineScaleModifier) {
78  if (ev->state & Keyboard::GainExtraFineScaleModifier) {
79  scale *= 0.01;
80  } else {
81  scale *= 0.10;
82  }
83  }
84 
85  boost::shared_ptr<PBD::Controllable> c = binding_proxy.get_controllable();
86  if (c) {
87  float val = c->get_interface();
88 
89  if ( ev->direction == GDK_SCROLL_UP )
90  val += 0.05 * scale; //by default, we step in 1/20ths of the knob travel
91  else
92  val -= 0.05 * scale;
93 
94  c->set_interface(val);
95  }
96 
97  return true;
98 }
99 
100 
101 void
102 ArdourDisplay::add_controllable_preset (const char *txt, float val)
103 {
104  using namespace Menu_Helpers;
105 
106  MenuList& items = _menu.items ();
107 
108  items.push_back (MenuElem (txt, sigc::bind (sigc::mem_fun(*this, &ArdourDisplay::handle_controllable_preset), val)));
109 }
110 
111 
112 void
114 {
115  boost::shared_ptr<PBD::Controllable> c = binding_proxy.get_controllable();
116 
117  if (!c) return;
118 
119  c->set_user(p);
120 }
121 
122 
123 void
125 {
126  watch_connection.disconnect (); //stop watching the old controllable
127 
128  if (!c) return;
129 
130  binding_proxy.set_controllable (c);
131 
132  c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourDisplay::controllable_changed, this), gui_context());
133 
134  controllable_changed();
135 }
136 
137 void
139 {
140  boost::shared_ptr<PBD::Controllable> c = binding_proxy.get_controllable();
141 
142  if (!c) return;
143 
144  set_text(c->get_user_string());
145 
146  set_dirty();
147 }
virtual float get_interface() const
Definition: controllable.h:77
virtual void set_interface(float percent)
Definition: controllable.h:78
static uint32_t GainFineScaleModifier
Definition: keyboard.h:61
Definition: ardour_ui.h:130
Definition: Beats.hpp:239
virtual std::string get_user_string() const
Definition: controllable.h:83
#define invalidator(x)
Definition: gui_thread.h:40
bool on_scroll_event(GdkEventScroll *ev)
void add_controllable_preset(const char *, float)
void handle_controllable_preset(float p)
virtual ~ArdourDisplay()
void set_controllable(boost::shared_ptr< PBD::Controllable > c)
virtual void set_user(float user_v)
Definition: controllable.h:82
#define gui_context()
Definition: gui_thread.h:36
void controllable_changed()
ArdourDisplay(Element e=default_elements)
bool on_button_press_event(GdkEventButton *)
PBD::Signal0< void > Changed
Definition: controllable.h:94
Definition: debug.h:30
static uint32_t GainExtraFineScaleModifier
Definition: keyboard.h:62