overhaul meterbridge:

* rotate labels, fix size
* identical total width for mono + stereo meters
* show metric area only every 8th meter
* ...
This commit is contained in:
Robin Gareus 2013-06-28 21:00:17 +02:00
parent 446aed52f3
commit bc2ff6a554
3 changed files with 62 additions and 7 deletions

View File

@ -26,6 +26,9 @@
#include "ardour/route_group.h"
#include "ardour/meter.h"
#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>
@ -55,11 +58,16 @@ MeterStrip::MeterStrip (Meterbridge& mtr, Session* sess, boost::shared_ptr<ARDOU
{
set_spacing(2);
int meter_width = 6;
if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
meter_width = 12;
}
// add level meter
level_meter = new LevelMeter(sess);
level_meter->set_meter (_route->shared_peak_meter().get());
level_meter->clear_meters();
level_meter->setup_meters (350, 6);
level_meter->setup_meters (350, meter_width, 6);
level_meter->pack_start (meter_metric_area, false, false);
Gtk::Alignment *meter_align = Gtk::manage (new Gtk::Alignment());
@ -71,13 +79,17 @@ MeterStrip::MeterStrip (Meterbridge& mtr, Session* sess, boost::shared_ptr<ARDOU
// * fixed-height labels (or table layout)
// * print lables at angle (allow longer text)
label.set_text(_route->name().c_str());
label.set_name("MeterbridgeLabel");
#if 0
label.set_ellipsize(Pango::ELLIPSIZE_MIDDLE);
label.set_max_width_chars(7);
label.set_width_chars(7);
label.set_alignment(0.5, 0.5);
label.set_name("MeterbridgeLabel");
//ellipsize & angle are incompatible :(
//label.property_angle().set_value(90.0);
#else //ellipsize & angle are incompatible :(
label.set_angle(90.0);
label.set_alignment(0.5, 0.0);
#endif
label.set_size_request(12, 36);
pack_start(*meter_align, true, true);
pack_start (label, false, false);
@ -131,6 +143,16 @@ MeterStrip::fast_update ()
// TODO peak indicator if mpeak > 0
}
void
MeterStrip::display_metrics (bool show)
{
if (show) {
meter_metric_area.show();
} else {
meter_metric_area.hide();
}
}
void
MeterStrip::on_theme_changed()
{
@ -150,8 +172,13 @@ MeterStrip::meter_configuration_changed (ChanCount c)
}
}
// TODO draw Inactive routes and busses with different styles
if (type == (1 << DataType::AUDIO)) {
// 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");
}
else if (type == (1 << DataType::AUDIO)) {
meter_metric_area.set_name ("AudioTrackMetrics");
}
else if (type == (1 << DataType::MIDI)) {

View File

@ -49,6 +49,7 @@ class MeterStrip : public Gtk::VBox
~MeterStrip ();
void fast_update ();
void display_metrics (bool);
boost::shared_ptr<ARDOUR::Route> route() { return _route; }
static PBD::Signal1<void,MeterStrip*> CatchDeletion;

View File

@ -38,6 +38,9 @@
#include "ardour/route_group.h"
#include "ardour/session.h"
#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
#include "meterbridge.h"
#include "monitor_section.h"
@ -137,7 +140,7 @@ Meterbridge::Meterbridge ()
MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
global_hpacker.set_spacing(1);
global_hpacker.set_spacing(3);
scroller.add (global_hpacker);
scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER);
global_vpacker.pack_start (scroller, true, true);
@ -405,6 +408,17 @@ Meterbridge::add_strips (RouteList& routes)
continue;
}
if (route->is_master()) {
/* always show master */
}
else
if (boost::dynamic_pointer_cast<AudioTrack>(route) == 0
&& boost::dynamic_pointer_cast<MidiTrack>(route) == 0
) {
// non-master bus
if (0) continue; // TODO allow to skip busses
}
strip = new MeterStrip (*this, _session, route);
strips.push_back (strip);
@ -437,6 +451,19 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src)
int pos = 0;
for (list<MeterStrip *>::iterator i = copy.begin(); i != copy.end(); ++i) {
#if 0 // TODO subscribe to route active,inactive changes
if (! (*i)->route()->active()) {
(*i)->hide();
} else {
(*i)->show();
}
#endif
if (pos%8 == 0) {
(*i)->display_metrics(true);
} else {
(*i)->display_metrics(false);
}
global_hpacker.reorder_child(*(*i), pos++);
}
}