summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-03-12 18:21:48 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-03-12 18:21:48 +0000
commita505e1469d362cc32acb01252d192c73729fbc43 (patch)
treea92b0dd4cd289950d453ea2c9c1f913628cb023c /gtk2_ardour
parentfd9d6433a15ae5e3f02e5a15aa25d35197c48bc3 (diff)
remove varispeed control; shuttle controller now has a context menu with max speed options; rearrange and optimize meter metric displays
git-svn-id: svn://localhost/trunk/ardour2@382 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour2_ui.rc11
-rw-r--r--gtk2_ardour/ardour_ui.cc1
-rw-r--r--gtk2_ardour/ardour_ui.h5
-rw-r--r--gtk2_ardour/ardour_ui2.cc89
-rw-r--r--gtk2_ardour/gain_meter.cc115
-rw-r--r--gtk2_ardour/gain_meter.h4
-rw-r--r--gtk2_ardour/mixer_strip.cc12
7 files changed, 174 insertions, 63 deletions
diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc
index 27431a8427..929a1b5a06 100644
--- a/gtk2_ardour/ardour2_ui.rc
+++ b/gtk2_ardour/ardour2_ui.rc
@@ -480,8 +480,8 @@ style "editor_time_ruler" = "small_text"
style "audio_track_base" = "default_base"
{
- font_name = "sans medium 8"
- fg[NORMAL] = { 0.80, 0.80, 0.80 }
+ font_name = "sans 6"
+ fg[NORMAL] = { 0.77, 0.77, 0.72 }
bg[NORMAL] = { 0.18, 0.18, 0.22 }
bg[ACTIVE] = { 0.20, 0.20, 0.20 }
bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
@@ -491,7 +491,8 @@ style "audio_track_base" = "default_base"
style "audio_bus_base"
{
- font_name = "sans medium 8"
+ font_name = "sans 6"
+ fg[NORMAL] = { 0.77, 0.77, 0.72 }
fg[NORMAL] = { 0.7, 0.8, 0.2 }
bg[NORMAL] = {0, 0.36, 0.40 }
}
@@ -778,8 +779,8 @@ style "tearoff_arrow" = "medium_bold_entry"
style "meter_metrics_strip" = "default_base"
{
- font = "sans medium 10"
- fg[NORMAL] = { 0.7, 0.8, 0.2 }
+ font_name = "sans 4"
+ fg[NORMAL] = { 1.0, 0.8, 0.2 }
}
style "location_row_button" = "default_buttons_menus"
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index f99d199681..78fad232fb 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -177,6 +177,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
shuttle_grabbed = false;
shuttle_fract = 0.0;
+ shuttle_max_speed = 8.0f;
set_shuttle_units (Percentage);
set_shuttle_behaviour (Sprung);
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index ab505480cb..b676faed11 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -388,11 +388,16 @@ class ARDOUR_UI : public Gtkmm2ext::UI
Gtk::Menu* shuttle_style_menu;
ShuttleBehaviour shuttle_behaviour;
ShuttleUnits shuttle_units;
+ float shuttle_max_speed;
+ Gtk::Menu* shuttle_context_menu;
+ void build_shuttle_context_menu ();
+ void show_shuttle_context_menu ();
void shuttle_style_changed();
void shuttle_unit_clicked ();
void set_shuttle_behaviour (ShuttleBehaviour);
void set_shuttle_units (ShuttleUnits);
+ void set_shuttle_max_speed (float);
void update_speed_display ();
float last_speed_displayed;
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index cc2a990326..7655931904 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -56,8 +56,6 @@ using namespace sigc;
int
ARDOUR_UI::setup_windows ()
{
- using namespace Menu_Helpers;
-
if (create_editor ()) {
error << _("UI: cannot setup editor") << endmsg;
return -1;
@@ -556,12 +554,73 @@ ARDOUR_UI::audition_blink (bool onoff)
}
}
+void
+ARDOUR_UI::build_shuttle_context_menu ()
+{
+ using namespace Menu_Helpers;
+
+ shuttle_context_menu = new Menu();
+ MenuList& items = shuttle_context_menu->items();
+
+ Menu* speed_menu = manage (new Menu());
+ MenuList& speed_items = speed_menu->items();
+
+ RadioMenuItem::Group group;
+
+ speed_items.push_back (RadioMenuElem (group, "8", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 8.0f)));
+ if (shuttle_max_speed == 8.0) {
+ static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
+ }
+ speed_items.push_back (RadioMenuElem (group, "6", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 6.0f)));
+ if (shuttle_max_speed == 6.0) {
+ static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
+ }
+ speed_items.push_back (RadioMenuElem (group, "4", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 4.0f)));
+ if (shuttle_max_speed == 4.0) {
+ static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
+ }
+ speed_items.push_back (RadioMenuElem (group, "3", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 3.0f)));
+ if (shuttle_max_speed == 3.0) {
+ static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
+ }
+ speed_items.push_back (RadioMenuElem (group, "2", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 2.0f)));
+ if (shuttle_max_speed == 2.0) {
+ static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
+ }
+ speed_items.push_back (RadioMenuElem (group, "1.5", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 1.5f)));
+ if (shuttle_max_speed == 1.5) {
+ static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
+ }
+
+ items.push_back (MenuElem (_("Maximum speed"), *speed_menu));
+}
+
+void
+ARDOUR_UI::show_shuttle_context_menu ()
+{
+ if (shuttle_context_menu == 0) {
+ build_shuttle_context_menu ();
+ }
+
+ shuttle_context_menu->popup (1, 0);
+}
+
+void
+ARDOUR_UI::set_shuttle_max_speed (float speed)
+{
+ shuttle_max_speed = speed;
+}
gint
ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev)
{
if (!session) {
- return TRUE;
+ return true;
+ }
+
+ if (Keyboard::is_context_menu_event (ev)) {
+ show_shuttle_context_menu ();
+ return true;
}
switch (ev->button) {
@@ -573,20 +632,20 @@ ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev)
case 2:
case 3:
- return TRUE;
+ return true;
break;
}
- return TRUE;
+ return true;
}
gint
ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
{
if (!session) {
- return TRUE;
+ return true;
}
-
+
switch (ev->button) {
case 1:
mouse_shuttle (ev->x, true);
@@ -597,7 +656,7 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
session->request_transport_speed (1.0);
shuttle_box.queue_draw ();
}
- return TRUE;
+ return true;
case 2:
if (session->transport_rolling()) {
@@ -607,10 +666,10 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
shuttle_fract = 0;
}
shuttle_box.queue_draw ();
- return TRUE;
+ return true;
case 3:
- return TRUE;
+ return true;
case 4:
shuttle_fract += 0.005;
@@ -622,14 +681,14 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
use_shuttle_fract (true);
- return TRUE;
+ return true;
}
gint
ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev)
{
if (!session || !shuttle_grabbed) {
- return TRUE;
+ return true;
}
return mouse_shuttle (ev->x, false);
@@ -649,7 +708,7 @@ ARDOUR_UI::mouse_shuttle (double x, bool force)
shuttle_fract = distance / half_width;
use_shuttle_fract (force);
- return TRUE;
+ return true;
}
void
@@ -679,7 +738,7 @@ ARDOUR_UI::use_shuttle_fract (bool force)
fract = -fract;
}
- session->request_transport_speed (8.0 * fract); // Formula A2
+ session->request_transport_speed (shuttle_max_speed * fract); // Formula A2
shuttle_box.queue_draw ();
}
@@ -706,7 +765,7 @@ ARDOUR_UI::shuttle_box_expose (GdkEventExpose* event)
0,
x,
shuttle_box.get_height());
- return TRUE;
+ return true;
}
void
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index df219d3e7e..07b7751b29 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -52,10 +52,12 @@ using namespace ARDOUR;
using namespace Gtkmm2ext;
using namespace Gtk;
using namespace sigc;
+using namespace std;
sigc::signal<void> GainMeter::ResetAllPeakDisplays;
sigc::signal<void,RouteGroup*> GainMeter::ResetGroupPeakDisplays;
Pix* GainMeter::slider_pix = 0;
+map<string,Glib::RefPtr<Gdk::Pixmap> > GainMeter::metric_pixmaps;
int
GainMeter::setup_slider_pix ()
@@ -74,6 +76,12 @@ GainMeter::setup_slider_pix ()
return 0;
}
+void
+was_pressed ()
+{
+ cerr << "was pressed\n";
+}
+
GainMeter::GainMeter (IO& io, Session& s)
: _io (io),
_session (s),
@@ -113,6 +121,8 @@ GainMeter::GainMeter (IO& io, Session& s)
gain_unit_button.set_name ("MixerStripGainUnitButton");
gain_unit_label.set_name ("MixerStripGainUnitButton");
+ gain_unit_button.signal_clicked().connect (ptr_fun (was_pressed));
+
top_table.set_col_spacings (2);
top_table.set_homogeneous (true);
top_table.attach (gain_unit_button, 0, 1, 0, 1);
@@ -120,6 +130,7 @@ GainMeter::GainMeter (IO& io, Session& s)
Route* r;
if ((r = dynamic_cast<Route*> (&_io)) != 0) {
+
r->meter_change.connect (mem_fun(*this, &GainMeter::meter_changed));
meter_point_button.add (meter_point_label);
meter_point_button.set_name ("MixerStripMeterPreButton");
@@ -168,17 +179,14 @@ GainMeter::GainMeter (IO& io, Session& s)
gain_display_box.pack_end (peak_display_frame, Gtk::PACK_SHRINK);
- meter_metric_area.set_size_request (18, -1);
+ meter_metric_area.set_size_request (25, -1);
meter_metric_area.set_name ("MeterMetricsStrip");
meter_packer.set_spacing (2);
- fader_box.set_spacing (2);
-
- fader_box.pack_start (*gain_slider, Gtk::PACK_SHRINK);
hbox.set_spacing (4);
- hbox.pack_start (fader_box, Gtk::PACK_SHRINK);
- hbox.pack_start (meter_packer, Gtk::PACK_SHRINK);
+ hbox.pack_start (*gain_slider, false, false, 2);
+ hbox.pack_start (meter_packer, true, false);
set_spacing (4);
@@ -217,56 +225,80 @@ GainMeter::set_width (Width w)
setup_meters ();
}
-gint
-GainMeter::meter_metrics_expose (GdkEventExpose *ev)
+Glib::RefPtr<Gdk::Pixmap>
+GainMeter::render_metrics (Gtk::Widget& w)
{
- /* XXX optimize this so that it doesn't do it all everytime */
-
- double fraction;
- Glib::RefPtr<Gdk::Window> win (meter_metric_area.get_window());
- Glib::RefPtr<Gdk::GC> fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
- Glib::RefPtr<Gdk::GC> bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
+ Glib::RefPtr<Gdk::Window> win (w.get_window());
+ Glib::RefPtr<Gdk::GC> fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
+ Glib::RefPtr<Gdk::GC> bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
gint x, y, width, height, depth;
- gint pos;
- int db_points[] = { -50, -10, -3, 0, 6 };
- uint32_t i;
+ int db_points[] = { -50, -40, -20, -30, -10, -3, 0, 4 };
char buf[32];
- GdkRectangle base_rect;
- GdkRectangle draw_rect;
int theight;
int twidth;
win->get_geometry (x, y, width, height, depth);
- base_rect.width = width;
- base_rect.height = height;
- base_rect.x = 0;
- base_rect.y = 0;
+ Glib::RefPtr<Gdk::Pixmap> pixmap = Gdk::Pixmap::create (win, width, height);
- gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect);
- win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
+ metric_pixmaps[w.get_name()] = pixmap;
+
+ pixmap->draw_rectangle (bg_gc, true, 0, 0, width, height);
- Glib::RefPtr<Pango::Layout> layout = meter_metric_area.create_pango_layout("");
+ Glib::RefPtr<Pango::Layout> layout = w.create_pango_layout("");
- for (i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) {
+ for (uint32_t i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) {
- fraction = log_meter (db_points[i]);
- pos = height - (gint) floor (height * fraction);
+ float fraction = log_meter (db_points[i]);
+ gint pos = height - (gint) floor (height * fraction);
- snprintf (buf, sizeof (buf), "%d", db_points[i]);
+ snprintf (buf, sizeof (buf), "%d", abs (db_points[i]));
layout->set_text (buf);
layout->get_pixel_size (twidth, theight);
- win->draw_layout (fg_gc, width - twidth, pos + theight, layout);
+ pixmap->draw_line (fg_gc, 0, pos, 4, pos);
+ pixmap->draw_layout (fg_gc, 6, pos - (theight/2), layout);
+ }
+
+ return pixmap;
+}
+
+gint
+GainMeter::meter_metrics_expose (GdkEventExpose *ev)
+{
+ Glib::RefPtr<Gdk::Window> win (meter_metric_area.get_window());
+ Glib::RefPtr<Gdk::GC> fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
+ Glib::RefPtr<Gdk::GC> bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
+ GdkRectangle base_rect;
+ GdkRectangle draw_rect;
+ gint x, y, width, height, depth;
+
+ win->get_geometry (x, y, width, height, depth);
+
+ base_rect.width = width;
+ base_rect.height = height;
+ base_rect.x = 0;
+ base_rect.y = 0;
+
+ Glib::RefPtr<Gdk::Pixmap> pixmap;
+ std::map<string,Glib::RefPtr<Gdk::Pixmap> >::iterator i = metric_pixmaps.find (meter_metric_area.get_name());
+
+ if (i == metric_pixmaps.end()) {
+ pixmap = render_metrics (meter_metric_area);
+ } else {
+ pixmap = i->second;
}
+ gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect);
+ win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
+ win->draw_drawable (bg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
+
return true;
}
GainMeter::~GainMeter ()
{
-
if (meter_menu) {
delete meter_menu;
}
@@ -398,11 +430,6 @@ GainMeter::setup_meters ()
return;
}
- if (_width == Wide) {
- meter_packer.pack_start (meter_metric_area, Gtk::PACK_SHRINK);
- meter_metric_area.show_all ();
- }
-
if (nmeters <= 2) {
width = regular_meter_width;
} else {
@@ -427,6 +454,11 @@ GainMeter::setup_meters ()
meters[n].meter->show_all ();
meters[n].packed = true;
}
+
+ if (_width == Wide) {
+ meter_packer.pack_start (meter_metric_area, Gtk::PACK_SHRINK);
+ meter_metric_area.show_all ();
+ }
}
gint
@@ -596,6 +628,8 @@ GainMeter::meter_press(GdkEventButton* ev)
wait_for_release = false;
+ cerr << "meter point button press\n";
+
if ((_route = dynamic_cast<Route*>(&_io)) == 0) {
return FALSE;
}
@@ -647,21 +681,22 @@ GainMeter::meter_press(GdkEventButton* ev)
}
}
- return stop_signal (meter_point_button, "button-press-event");
+ return true;
}
gint
GainMeter::meter_release(GdkEventButton* ev)
{
+ cerr << "meter point button release\n";
+
if(!ignore_toggle){
if (wait_for_release){
wait_for_release = false;
set_meter_point (*(dynamic_cast<Route*>(&_io)), old_meter_point);
- stop_signal (meter_point_button, "button-release-event");
}
}
- return TRUE;
+ return true;
}
void
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index 597cb06cb3..a1a91ced08 100644
--- a/gtk2_ardour/gain_meter.h
+++ b/gtk2_ardour/gain_meter.h
@@ -22,6 +22,7 @@
#define __ardour_gtk_gain_meter_h__
#include <vector>
+#include <map>
#include <gtkmm/box.h>
#include <gtkmm/adjustment.h>
@@ -96,6 +97,9 @@ class GainMeter : public Gtk::VBox
Gtk::Table top_table;
Width _width;
+ static std::map<std::string,Glib::RefPtr<Gdk::Pixmap> > metric_pixmaps;
+ static Glib::RefPtr<Gdk::Pixmap> render_metrics (Gtk::Widget&);
+
gint meter_metrics_expose (GdkEventExpose *);
static void _gain_printer (char buf[32], Gtk::Adjustment&, void *);
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 2ca903ea73..a82baa2dae 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -65,6 +65,7 @@ using namespace ARDOUR;
using namespace Gtk;
using namespace Gtkmm2ext;
+#ifdef VARISPEED_IN_MIXER_STRIP
static void
speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg)
{
@@ -76,6 +77,7 @@ speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg)
snprintf (buf, 32, "%.3f", val);
}
}
+#endif
MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
: AxisView(sess),
@@ -85,7 +87,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
post_redirect_box (PostFader, sess, rt, mx.plugin_selector(), mx.selection(), in_mixer),
gpm (_route, sess),
panners (_route, sess),
- button_table (8, 2),
+ button_table (7, 2),
gain_automation_style_button (""),
gain_automation_state_button (""),
pan_automation_style_button (""),
@@ -157,6 +159,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
polarity_button.unset_flags (Gtk::CAN_FOCUS);
button_table.set_homogeneous (true);
+ button_table.set_spacings (0);
button_table.attach (name_button, 0, 2, 0, 1);
button_table.attach (group_button, 0, 2, 1, 2);
@@ -214,6 +217,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
at->FreezeChange.connect (mem_fun(*this, &MixerStrip::map_frozen));
+#ifdef VARISPEED_IN_MIXER_STRIP
speed_adjustment.signal_value_changed().connect (mem_fun(*this, &MixerStrip::speed_adjustment_changed));
speed_frame.set_name ("BaseFrame");
@@ -225,7 +229,9 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
ARDOUR_UI::instance()->tooltips().set_tip (speed_spinner, _("varispeed"));
button_table.attach (speed_frame, 0, 2, 6, 7);
- button_table.attach (*rec_enable_button, 0, 2, 7, 8);
+#endif /* VARISPEED_IN_MIXER_STRIP */
+
+ button_table.attach (*rec_enable_button, 0, 2, 6, 7);
}
name_button.add (name_label);
@@ -264,7 +270,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
global_vpacker.pack_start (*whvbox, Gtk::PACK_SHRINK);
global_vpacker.pack_start (button_table,Gtk::PACK_SHRINK);
global_vpacker.pack_start (pre_redirect_box, true, true);
- global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK, 4);
global_vpacker.pack_start (post_redirect_box, true, true);
global_vpacker.pack_start (panners, Gtk::PACK_SHRINK);
global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);