deep, somewhat subtle changes for transport control. Everything should use Session...
[ardour.git] / libs / gtkmm2ext / binding_proxy.cc
1 /*
2     Copyright (C) 2006 Paul Davis
3     This program is free software; you can redistribute it and/or modify
4     it under the terms of the GNU General Public License as published by
5     the Free Software Foundation; either version 2 of the License, or
6     (at your option) any later version.
7
8     This program is distributed in the hope that it will be useful,
9     but WITHOUT ANY WARRANTY; without even the implied warranty of
10     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11     GNU General Public License for more details.
12
13     You should have received a copy of the GNU General Public License
14     along with this program; if not, write to the Free Software
15     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
17     $Id$
18 */
19
20 #include <string>
21 #include <climits>
22 #include <iostream>
23
24 #include <pbd/controllable.h>
25
26 #include <gtkmm2ext/binding_proxy.h>
27
28 #include "i18n.h"
29
30 using namespace Gtkmm2ext;
31 using namespace std;
32 using namespace PBD;
33
34 BindingProxy::BindingProxy (Controllable* c)
35         : prompter (0),
36           controllable (c),
37           bind_button (2),
38           bind_statemask (Gdk::CONTROL_MASK)
39
40 {                         
41 }
42
43 BindingProxy::BindingProxy (Controllable& c)
44         : prompter (0),
45           controllable (&c),
46           bind_button (2),
47           bind_statemask (Gdk::CONTROL_MASK)
48
49 {                         
50 }
51
52 BindingProxy::~BindingProxy ()
53 {
54         if (prompter) {
55                 delete prompter;
56         }
57 }
58
59 void
60 BindingProxy::set_controllable (Controllable* c)
61 {
62         learning_finished ();
63         controllable = c;
64 }
65
66 void
67 BindingProxy::set_bind_button_state (guint button, guint statemask)
68 {
69         bind_button = button;
70         bind_statemask = statemask;
71 }
72
73 void
74 BindingProxy::get_bind_button_state (guint &button, guint &statemask)
75 {
76         button = bind_button;
77         statemask = bind_statemask;
78 }
79
80 bool
81 BindingProxy::button_press_handler (GdkEventButton *ev)
82 {
83         if ((ev->state & bind_statemask) && ev->button == bind_button) { 
84                 if (Controllable::StartLearning (controllable)) {
85                         string prompt = _("operate controller now");
86                         if (prompter == 0) {
87                                 prompter = new PopUp (Gtk::WIN_POS_MOUSE, 30000, false);
88                                 prompter->signal_unmap_event().connect (mem_fun (*this, &BindingProxy::prompter_hiding));
89                         }
90                         prompter->set_text (prompt);
91                         prompter->touch (); // shows popup
92                         learning_connection = controllable->LearningFinished.connect (mem_fun (*this, &BindingProxy::learning_finished));
93                 }
94                 return true;
95         }
96         
97         return false;
98 }
99
100 void
101 BindingProxy::learning_finished ()
102 {
103         learning_connection.disconnect ();
104         if (prompter) {
105                 prompter->touch (); // hides popup
106         }
107 }
108
109
110 bool
111 BindingProxy::prompter_hiding (GdkEventAny *ev)
112 {
113         learning_connection.disconnect ();
114         Controllable::StopLearning (controllable);
115         return false;
116 }
117