From a505e1469d362cc32acb01252d192c73729fbc43 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 12 Mar 2006 18:21:48 +0000 Subject: 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 --- gtk2_ardour/gain_meter.cc | 115 ++++++++++++++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 40 deletions(-) (limited to 'gtk2_ardour/gain_meter.cc') 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 GainMeter::ResetAllPeakDisplays; sigc::signal GainMeter::ResetGroupPeakDisplays; Pix* GainMeter::slider_pix = 0; +map > 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 (&_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 +GainMeter::render_metrics (Gtk::Widget& w) { - /* XXX optimize this so that it doesn't do it all everytime */ - - double fraction; - Glib::RefPtr win (meter_metric_area.get_window()); - Glib::RefPtr fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); - Glib::RefPtr bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr win (w.get_window()); + Glib::RefPtr fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr 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 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 layout = meter_metric_area.create_pango_layout(""); + Glib::RefPtr 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 win (meter_metric_area.get_window()); + Glib::RefPtr fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr 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 pixmap; + std::map >::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(&_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(&_io)), old_meter_point); - stop_signal (meter_point_button, "button-release-event"); } } - return TRUE; + return true; } void -- cgit v1.2.3