diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-02 22:56:35 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-10 15:27:04 +0200 |
commit | 08167d6ac45f9577a09c65b7a66de85e980a8f3b (patch) | |
tree | 524d1dd3da11e2f93077aab271da5bbc238191d7 /gtk2_ardour | |
parent | 3c82b99a3b42106b5e287206b24e91f31d4d2f3c (diff) |
overhaul meterbridge metrics part one.
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/meter_strip.cc | 149 | ||||
-rw-r--r-- | gtk2_ardour/meter_strip.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/meterbridge.cc | 21 | ||||
-rw-r--r-- | gtk2_ardour/meterbridge.h | 3 | ||||
-rw-r--r-- | gtk2_ardour/route_ui.cc | 2 |
5 files changed, 118 insertions, 63 deletions
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index cc43a8896e..e88e69a2e8 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -43,8 +43,6 @@ #include "i18n.h" -#define WITH_METRICS 1 - using namespace ARDOUR; using namespace PBD; using namespace Gtk; @@ -56,11 +54,69 @@ PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion; MeterStrip::MetricPatterns MeterStrip::metric_patterns; MeterStrip::TickPatterns MeterStrip::ticks_patterns; -MeterStrip::MeterStrip (Meterbridge& mtr, Session* sess, boost::shared_ptr<ARDOUR::Route> rt) +MeterStrip::MeterStrip (int metricmode) + : AxisView(0) + , RouteUI(0) +{ + level_meter = 0; + set_spacing(2); + peakbx.set_size_request(-1, 16); + btnbox.set_size_request(-1, 16); + + _types.clear (); + switch(metricmode) { + case 1: + meter_metric_area.set_name ("AudioBusMetrics"); + _types.push_back (DataType::AUDIO); + break; + case 2: + meter_metric_area.set_name ("AudioTrackMetrics"); + _types.push_back (DataType::AUDIO); + break; + case 3: + meter_metric_area.set_name ("MidiTrackMetrics"); + _types.push_back (DataType::MIDI); + break; + default: + meter_metric_area.set_name ("AudioMidiTrackMetrics"); + _types.push_back (DataType::AUDIO); + _types.push_back (DataType::MIDI); + break; + } + //meter_metric_area.queue_draw (); + + set_size_request_to_display_given_text (meter_metric_area, "8888", 1, 0); + meter_metric_area.signal_expose_event().connect ( + sigc::mem_fun(*this, &MeterStrip::meter_metrics_expose)); + + meterbox.pack_start(meter_metric_area, true, false); + + label.set_text(""); + label.set_name("MeterbridgeLabel"); + label.set_angle(90.0); + label.set_alignment(0.5, 1.0); + label.set_size_request(12, 52); + + pack_start (peakbx, false, false); + pack_start (meterbox, true, true); + pack_start (btnbox, false, false); + pack_start (label, false, false, 2); + + peakbx.show(); + btnbox.show(); + label.show(); + meter_metric_area.show(); + meterbox.show(); + + UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); + ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); + DPIReset.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); +} + +MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt) : AxisView(sess) , RouteUI(sess) , _route(rt) - , style_changed (false) { set_spacing(2); RouteUI::set_route (rt); @@ -75,20 +131,14 @@ MeterStrip::MeterStrip (Meterbridge& mtr, Session* sess, boost::shared_ptr<ARDOU level_meter->set_meter (_route->shared_peak_meter().get()); level_meter->clear_meters(); level_meter->setup_meters (400, meter_width, 6); -#ifdef WITH_METRICSINMETER - level_meter->pack_start (meter_metric_area, false, false); -#endif Gtk::Alignment *meter_align = Gtk::manage (new Gtk::Alignment()); meter_align->set(0.5, 0.5, 0.0, 1.0); meter_align->add(*level_meter); -#ifdef WITH_METRICS - meterbox.pack_start(meter_metric_area, true, false); meterbox.pack_start(meter_ticks1_area, true, false); meterbox.pack_start(*meter_align, true, true); meterbox.pack_start(meter_ticks2_area, true, false); -#endif // peak display peak_display.set_name ("MixerStripPeakDisplay"); @@ -112,22 +162,15 @@ MeterStrip::MeterStrip (Meterbridge& mtr, Session* sess, boost::shared_ptr<ARDOU btnbox.set_size_request(-1, 16); pack_start (peakbx, false, false); -#ifdef WITH_METRICS pack_start (meterbox, true, true); -#else - pack_start (*meter_align, true, true); -#endif pack_start (btnbox, false, false); pack_start (label, false, false, 2); peak_display.show(); peakbx.show(); -#ifdef WITH_METRICS meter_ticks1_area.show(); meter_ticks2_area.show(); - meter_metric_area.hide(); meterbox.show(); -#endif level_meter->show(); meter_align->show(); btnbox.show(); @@ -138,16 +181,10 @@ MeterStrip::MeterStrip (Meterbridge& mtr, Session* sess, boost::shared_ptr<ARDOU ); meter_configuration_changed (_route->shared_peak_meter()->input_streams ()); -#ifdef WITH_METRICS - set_size_request_to_display_given_text (meter_metric_area, "-8888", 1, 0); - meter_metric_area.signal_expose_event().connect ( - sigc::mem_fun(*this, &MeterStrip::meter_metrics_expose)); - meter_ticks1_area.set_size_request(3,-1); meter_ticks2_area.set_size_request(3,-1); meter_ticks1_area.signal_expose_event().connect (sigc::mem_fun(*this, &MeterStrip::meter_ticks1_expose)); meter_ticks2_area.signal_expose_event().connect (sigc::mem_fun(*this, &MeterStrip::meter_ticks2_expose)); -#endif _route->DropReferences.connect (route_connections, invalidator (*this), boost::bind (&MeterStrip::self_delete, this), gui_context()); _route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&MeterStrip::strip_property_changed, this, _1), gui_context()); @@ -222,24 +259,28 @@ MeterStrip::fast_update () void MeterStrip::display_metrics (bool show) { +#if 0 if (show) { meter_metric_area.show(); } else { meter_metric_area.hide(); } +#endif } void MeterStrip::on_theme_changed() { - style_changed = true; + metric_patterns.clear(); + ticks_patterns.clear(); - // TODO save meter_width as private var?! - int meter_width = 6; - if (_route->shared_peak_meter()->input_streams().n_total() == 1) { - meter_width = 12; + if (level_meter && _route) { + int meter_width = 6; + if (_route->shared_peak_meter()->input_streams().n_total() == 1) { + meter_width = 12; + } + level_meter->setup_meters (400, meter_width, 6); } - level_meter->setup_meters (400, meter_width, 6); } void @@ -255,45 +296,43 @@ MeterStrip::meter_configuration_changed (ChanCount c) } } -#ifdef WITH_METRICS // TODO draw Inactive routes or busses with different styles if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0 && boost::dynamic_pointer_cast<MidiTrack>(_route) == 0 ) { - meter_metric_area.set_name ("AudioBusMetrics"); meter_ticks1_area.set_name ("AudioBusMetrics"); meter_ticks2_area.set_name ("AudioBusMetrics"); } else if (type == (1 << DataType::AUDIO)) { - meter_metric_area.set_name ("AudioTrackMetrics"); meter_ticks1_area.set_name ("AudioTrackMetrics"); meter_ticks2_area.set_name ("AudioTrackMetrics"); } else if (type == (1 << DataType::MIDI)) { - meter_metric_area.set_name ("MidiTrackMetrics"); meter_ticks1_area.set_name ("MidiTrackMetrics"); meter_ticks2_area.set_name ("MidiTrackMetrics"); } else { - meter_metric_area.set_name ("AudioMidiTrackMetrics"); meter_ticks1_area.set_name ("AudioMidiTrackMetrics"); meter_ticks2_area.set_name ("AudioMidiTrackMetrics"); } - meter_metric_area.queue_draw (); -#endif - style_changed = true; + meter_ticks1_area.queue_draw(); + meter_ticks2_area.queue_draw(); + metric_patterns.clear(); + ticks_patterns.clear(); } void MeterStrip::on_size_request (Gtk::Requisition* r) { - style_changed = true; + metric_patterns.clear(); + ticks_patterns.clear(); VBox::on_size_request(r); } void MeterStrip::on_size_allocate (Gtk::Allocation& a) { - style_changed = true; + metric_patterns.clear(); + ticks_patterns.clear(); VBox::on_size_allocate(a); } @@ -330,7 +369,7 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types) //font = w.get_style()->get_font(); font.set_weight (Pango::WEIGHT_NORMAL); - font.set_size (10.0 * PANGO_SCALE); + font.set_size (9.0 * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); audio_font_attributes.change (*font_attr); delete font_attr; @@ -444,7 +483,7 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector<DataType> types) p = min (p, height - th); p = max (p, 0); - cairo_move_to (cr, width-2-tw, p + .5); + cairo_move_to (cr, width-1-tw, p + .5); pango_cairo_show_layout (cr, layout->gobj()); } } @@ -500,7 +539,7 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev) cairo_pattern_t* pattern; MetricPatterns::iterator i = metric_patterns.find (meter_metric_area.get_name()); - if (i == metric_patterns.end() || style_changed) { + if (i == metric_patterns.end()) { pattern = render_metrics (meter_metric_area, _types); } else { pattern = i->second; @@ -515,8 +554,6 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev) cairo_rectangle (cr, 0, 0, width, height); cairo_fill (cr); - style_changed = false; - cairo_destroy (cr); return true; @@ -569,22 +606,35 @@ MeterStrip::render_ticks (Gtk::Widget& w, vector<DataType> types) switch (*i) { case DataType::AUDIO: + points.insert (std::pair<int,float>(-60, 0.5)); points.insert (std::pair<int,float>(-50, 0.5)); points.insert (std::pair<int,float>(-40, 0.5)); points.insert (std::pair<int,float>(-30, 0.5)); - points.insert (std::pair<int,float>(-20, 0.5)); + points.insert (std::pair<int,float>(-25, 0.5)); + points.insert (std::pair<int,float>(-20, 1.0)); + + points.insert (std::pair<int,float>(-19, 0.5)); points.insert (std::pair<int,float>(-18, 1.0)); - points.insert (std::pair<int,float>(-15, 0.5)); + points.insert (std::pair<int,float>(-17, 0.5)); + points.insert (std::pair<int,float>(-16, 0.5)); + points.insert (std::pair<int,float>(-15, 1.0)); + + points.insert (std::pair<int,float>(-14, 0.5)); + points.insert (std::pair<int,float>(-13, 0.5)); + points.insert (std::pair<int,float>(-12, 0.5)); + points.insert (std::pair<int,float>(-11, 0.5)); points.insert (std::pair<int,float>(-10, 1.0)); + points.insert (std::pair<int,float>( -9, 0.5)); points.insert (std::pair<int,float>( -8, 0.5)); points.insert (std::pair<int,float>( -7, 0.5)); points.insert (std::pair<int,float>( -6, 0.5)); points.insert (std::pair<int,float>( -5, 1.0)); points.insert (std::pair<int,float>( -4, 0.5)); - points.insert (std::pair<int,float>( -3, 1.0)); + points.insert (std::pair<int,float>( -3, 0.5)); points.insert (std::pair<int,float>( -2, 0.5)); points.insert (std::pair<int,float>( -1, 0.5)); + points.insert (std::pair<int,float>( 0, 1.0)); points.insert (std::pair<int,float>( 1, 0.5)); points.insert (std::pair<int,float>( 2, 0.5)); @@ -679,7 +729,7 @@ MeterStrip::meter_ticks_expose (GdkEventExpose *ev, Gtk::DrawingArea *mta) cairo_pattern_t* pattern; TickPatterns::iterator i = ticks_patterns.find (mta->get_name()); - if (i == ticks_patterns.end() || style_changed) { + if (i == ticks_patterns.end()) { pattern = render_ticks (*mta, _types); } else { pattern = i->second; @@ -694,8 +744,6 @@ MeterStrip::meter_ticks_expose (GdkEventExpose *ev, Gtk::DrawingArea *mta) cairo_rectangle (cr, 0, 0, width, height); cairo_fill (cr); - style_changed = false; - cairo_destroy (cr); return true; @@ -704,6 +752,7 @@ MeterStrip::meter_ticks_expose (GdkEventExpose *ev, Gtk::DrawingArea *mta) void MeterStrip::reset_group_peak_display (RouteGroup* group) { + /* UNUSED -- need connection w/mixer || other meters */ if (_route && group == _route->route_group()) { reset_peak_display (); } diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index c27c7346af..43d9ebbf36 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -41,12 +41,11 @@ namespace Gtk { class Style; } -class Meterbridge; - class MeterStrip : public Gtk::VBox, public RouteUI { public: - MeterStrip (Meterbridge&, ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>); + MeterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>); + MeterStrip (int); ~MeterStrip (); void fast_update (); @@ -75,7 +74,6 @@ class MeterStrip : public Gtk::VBox, public RouteUI static cairo_pattern_t* render_ticks (Gtk::Widget &, std::vector<ARDOUR::DataType>); void on_theme_changed (); - bool style_changed; void on_size_allocate (Gtk::Allocation&); void on_size_request (Gtk::Requisition*); diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 1c06fb593a..73256789be 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -135,13 +135,20 @@ Meterbridge::Meterbridge () */ set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY); + metrics_left = manage(new MeterStrip (2)); + global_hpacker.pack_start (*metrics_left, false, false); + metrics_left->show(); + + metrics_right = manage(new MeterStrip (3)); + global_hpacker.pack_start (*metrics_right, false, false); + metrics_right->show(); + signal_delete_event().connect (sigc::mem_fun (*this, &Meterbridge::hide_window)); signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); - MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); - global_hpacker.set_spacing(3); + global_hpacker.set_spacing(4); scroller.add (global_hpacker); scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER); global_vpacker.pack_start (scroller, true, true); @@ -411,7 +418,7 @@ Meterbridge::add_strips (RouteList& routes) continue; } - strip = new MeterStrip (*this, _session, route); + strip = new MeterStrip (_session, route); strips.push_back (strip); global_hpacker.pack_start (*strip, false, false); @@ -442,6 +449,8 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) copy.sort(sorter); int pos = 0; + global_hpacker.reorder_child(*metrics_left, pos++); + for (list<MeterStrip *>::iterator i = copy.begin(); i != copy.end(); ++i) { #if 0 // TODO subscribe to route active,inactive changes, merge w/ bus @@ -471,13 +480,9 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) (*i)->show(); } - if (pos == 0) { - (*i)->display_metrics(true); - } else { - (*i)->display_metrics(false); - } global_hpacker.reorder_child(*(*i), pos++); } + global_hpacker.reorder_child(*metrics_right, pos); } void diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index 9239ebc788..43fdef3c42 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -79,6 +79,9 @@ class Meterbridge : std::list<MeterStrip *> strips; + MeterStrip *metrics_left; + MeterStrip *metrics_right; + static const int32_t default_width = 600; static const int32_t default_height = 400; diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index b10906192b..bceebc21fb 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -67,7 +67,7 @@ boost::weak_ptr<Route> RouteUI::_showing_sends_to; RouteUI::RouteUI (ARDOUR::Session* sess) : AxisView(sess) { - init (); + if (sess) init (); } RouteUI::~RouteUI() |