enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / gtkmm2ext / barcontroller.cc
1 /*
2     Copyright (C) 2004 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
18 #include <string>
19 #include <sstream>
20 #include <climits>
21 #include <cstdio>
22 #include <cmath>
23 #include <algorithm>
24
25 #include <pbd/controllable.h>
26 #include <pbd/locale_guard.h>
27
28 #include "gtkmm2ext/gtk_ui.h"
29 #include "gtkmm2ext/utils.h"
30 #include "gtkmm2ext/keyboard.h"
31 #include "gtkmm2ext/barcontroller.h"
32 #include "gtkmm2ext/cairo_widget.h"
33
34 #include "pbd/i18n.h"
35
36 using namespace std;
37 using namespace Gtk;
38 using namespace Gtkmm2ext;
39
40 BarController::BarController (Gtk::Adjustment& adj,
41                 boost::shared_ptr<PBD::Controllable> mc)
42         : _slider (&adj, mc, 60, 16)
43         , _switching (false)
44         , _switch_on_release (false)
45 {
46
47         add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
48         set (.5, .5, 1.0, 1.0);
49         set_border_width (0);
50         _slider.set_tweaks (PixFader::NoShowUnityLine);
51
52         _slider.StartGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_start));
53         _slider.StopGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_stop));
54         _slider.OnExpose.connect (sigc::mem_fun(*this, &BarController::before_expose));
55         _slider.set_name (get_name());
56
57         Gtk::SpinButton& spinner = _slider.get_spin_button();
58         spinner.signal_activate().connect (mem_fun (*this, &BarController::entry_activated));
59         spinner.signal_focus_out_event().connect (mem_fun (*this, &BarController::entry_focus_out));
60         spinner.set_digits (9);
61         spinner.set_numeric (true);
62         spinner.set_name ("BarControlSpinner");
63         add (_slider);
64         show_all ();
65 }
66
67 BarController::~BarController ()
68 {
69 }
70
71 bool
72 BarController::on_button_press_event (GdkEventButton* ev)
73 {
74         if (get_child() != &_slider) {
75                 return false;
76         }
77         if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) {
78                 _switch_on_release = true;
79                 return true;
80         } else {
81                 _switch_on_release = false;
82         }
83         return false;
84 }
85
86 bool
87 BarController::on_button_release_event (GdkEventButton* ev)
88 {
89         if (get_child() != &_slider) {
90                 return false;
91         }
92         if (ev->button == 1 && _switch_on_release) {
93                 Glib::signal_idle().connect (mem_fun (*this, &BarController::switch_to_spinner));
94                 return true;
95         }
96         return false;
97 }
98
99 void
100 BarController::on_style_changed (const Glib::RefPtr<Gtk::Style>&)
101 {
102         _slider.set_name (get_name());
103 }
104
105 gint
106 BarController::switch_to_bar ()
107 {
108         if (_switching || get_child() == &_slider) {
109                 return FALSE;
110         }
111         _switching = true;
112         remove ();
113         add (_slider);
114         _slider.show ();
115         _slider.queue_draw ();
116         _switching = false;
117         SpinnerActive (false); /* EMIT SIGNAL */
118         return FALSE;
119 }
120
121 gint
122 BarController::switch_to_spinner ()
123 {
124         if (_switching || get_child() != &_slider) {
125                 return FALSE;
126         }
127
128         _switching = true;
129         Gtk::SpinButton& spinner = _slider.get_spin_button();
130         if (spinner.get_parent()) {
131                 spinner.get_parent()->remove(spinner);
132         }
133         remove ();
134         add (spinner);
135         spinner.show ();
136         spinner.select_region (0, spinner.get_text_length());
137         spinner.grab_focus ();
138         _switching = false;
139         SpinnerActive (true); /* EMIT SIGNAL */
140         return FALSE;
141 }
142
143 void
144 BarController::entry_activated ()
145 {
146         switch_to_bar ();
147 }
148
149 bool
150 BarController::entry_focus_out (GdkEventFocus* /*ev*/)
151 {
152         entry_activated ();
153         return true;
154 }
155
156 void
157 BarController::before_expose ()
158 {
159         double xpos = -1;
160         _slider.set_text (get_label (xpos), false, false);
161 }
162
163 void
164 BarController::set_sensitive (bool yn)
165 {
166         Alignment::set_sensitive (yn);
167         _slider.set_sensitive (yn);
168 }