From 3a7cf727526d2d21cd50e2155cc3768d90c408a6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 27 Sep 2016 14:31:17 -0500 Subject: [PATCH] push2: tweak layout APIs etc. --- libs/surfaces/push2/layout.cc | 3 +- libs/surfaces/push2/layout.h | 5 +- libs/surfaces/push2/mix.cc | 4 +- libs/surfaces/push2/mix.h | 2 +- libs/surfaces/push2/push2.cc | 8 +-- libs/surfaces/push2/scale.cc | 4 +- libs/surfaces/push2/scale.h | 2 +- libs/surfaces/push2/splash.cc | 4 +- libs/surfaces/push2/splash.h | 2 +- libs/surfaces/push2/track_mix.cc | 101 ++++++++++++++++++++----------- libs/surfaces/push2/track_mix.h | 5 +- 11 files changed, 87 insertions(+), 53 deletions(-) diff --git a/libs/surfaces/push2/layout.cc b/libs/surfaces/push2/layout.cc index be5ff6fdaf..10ff7a8771 100644 --- a/libs/surfaces/push2/layout.cc +++ b/libs/surfaces/push2/layout.cc @@ -24,10 +24,11 @@ using namespace ARDOUR; using namespace ArdourSurface; using namespace ArdourCanvas; -Push2Layout::Push2Layout (Push2& p, Session& s) +Push2Layout::Push2Layout (Push2& p, Session& s, std::string const & name) : Container (p.canvas()) , p2 (p) , session (s) + , _name (name) { } diff --git a/libs/surfaces/push2/layout.h b/libs/surfaces/push2/layout.h index e655a6de8f..91970f5d53 100644 --- a/libs/surfaces/push2/layout.h +++ b/libs/surfaces/push2/layout.h @@ -46,7 +46,7 @@ class Push2; class Push2Layout : public sigc::trackable, public ArdourCanvas::Container { public: - Push2Layout (Push2& p, ARDOUR::Session& s); + Push2Layout (Push2& p, ARDOUR::Session& s, std::string const & name); virtual ~Push2Layout (); int display_width () const; @@ -71,9 +71,12 @@ class Push2Layout : public sigc::trackable, public ArdourCanvas::Container virtual void update_meters () {} virtual void update_clocks () {} + std::string name() const { return _name; } + protected: Push2& p2; ARDOUR::Session& session; + std::string _name; }; } /* namespace */ diff --git a/libs/surfaces/push2/mix.cc b/libs/surfaces/push2/mix.cc index 847586f0e5..1ec4868a6c 100644 --- a/libs/surfaces/push2/mix.cc +++ b/libs/surfaces/push2/mix.cc @@ -66,8 +66,8 @@ using namespace Glib; using namespace ArdourSurface; using namespace ArdourCanvas; -MixLayout::MixLayout (Push2& p, Session& s) - : Push2Layout (p, s) +MixLayout::MixLayout (Push2& p, Session & s, std::string const & name) + : Push2Layout (p, s, name) , bank_start (0) , vpot_mode (Volume) { diff --git a/libs/surfaces/push2/mix.h b/libs/surfaces/push2/mix.h index 836709d929..c3d12cea49 100644 --- a/libs/surfaces/push2/mix.h +++ b/libs/surfaces/push2/mix.h @@ -40,7 +40,7 @@ class LevelMeter; class MixLayout : public Push2Layout { public: - MixLayout (Push2& p, ARDOUR::Session&); + MixLayout (Push2& p, ARDOUR::Session&, std::string const &); ~MixLayout (); void render (ArdourCanvas::Rect const &, Cairo::RefPtr) const; diff --git a/libs/surfaces/push2/push2.cc b/libs/surfaces/push2/push2.cc index f7606fa641..47bff25580 100644 --- a/libs/surfaces/push2/push2.cc +++ b/libs/surfaces/push2/push2.cc @@ -233,10 +233,10 @@ Push2::open () try { _canvas = new Push2Canvas (*this, 960, 160); - mix_layout = new MixLayout (*this, *session); - scale_layout = new ScaleLayout (*this, *session); - track_mix_layout = new TrackMixLayout (*this, *session); - splash_layout = new SplashLayout (*this, *session); + mix_layout = new MixLayout (*this, *session, "globalmix"); + scale_layout = new ScaleLayout (*this, *session, "scale"); + track_mix_layout = new TrackMixLayout (*this, *session, "trackmix"); + splash_layout = new SplashLayout (*this, *session, "splash"); } catch (...) { error << _("Cannot construct Canvas for display") << endmsg; libusb_release_interface (handle, 0x00); diff --git a/libs/surfaces/push2/scale.cc b/libs/surfaces/push2/scale.cc index 659d800e5d..005efca3c1 100644 --- a/libs/surfaces/push2/scale.cc +++ b/libs/surfaces/push2/scale.cc @@ -38,8 +38,8 @@ using namespace ArdourCanvas; static double unselected_root_alpha = 0.5; -ScaleLayout::ScaleLayout (Push2& p, Session& s) - : Push2Layout (p, s) +ScaleLayout::ScaleLayout (Push2& p, Session & s, std::string const & name) + : Push2Layout (p, s, name) , last_vpot (-1) , vpot_delta_cnt (0) , root_button (0) diff --git a/libs/surfaces/push2/scale.h b/libs/surfaces/push2/scale.h index 9f229b4091..b039fb4348 100644 --- a/libs/surfaces/push2/scale.h +++ b/libs/surfaces/push2/scale.h @@ -36,7 +36,7 @@ namespace ArdourSurface { class ScaleLayout : public Push2Layout { public: - ScaleLayout (Push2& p, ARDOUR::Session&); + ScaleLayout (Push2& p, ARDOUR::Session&, std::string const &); ~ScaleLayout (); void render (ArdourCanvas::Rect const &, Cairo::RefPtr) const; diff --git a/libs/surfaces/push2/splash.cc b/libs/surfaces/push2/splash.cc index 8b25e6eac6..0c3e36d9fc 100644 --- a/libs/surfaces/push2/splash.cc +++ b/libs/surfaces/push2/splash.cc @@ -35,8 +35,8 @@ using namespace std; using namespace ArdourSurface; using namespace ArdourCanvas; -SplashLayout::SplashLayout (Push2& p, Session& s) - : Push2Layout (p, s) +SplashLayout::SplashLayout (Push2& p, Session& s, std::string const & name) + : Push2Layout (p, s, name) { std::string splash_file; diff --git a/libs/surfaces/push2/splash.h b/libs/surfaces/push2/splash.h index e587cd2344..b68a0e6566 100644 --- a/libs/surfaces/push2/splash.h +++ b/libs/surfaces/push2/splash.h @@ -33,7 +33,7 @@ namespace ArdourSurface { class SplashLayout : public Push2Layout { public: - SplashLayout (Push2& p, ARDOUR::Session&); + SplashLayout (Push2& p, ARDOUR::Session&, std::string const &); ~SplashLayout (); void render (ArdourCanvas::Rect const &, Cairo::RefPtr) const; diff --git a/libs/surfaces/push2/track_mix.cc b/libs/surfaces/push2/track_mix.cc index 50688a008f..85cbf4697c 100644 --- a/libs/surfaces/push2/track_mix.cc +++ b/libs/surfaces/push2/track_mix.cc @@ -71,8 +71,8 @@ using namespace Glib; using namespace ArdourSurface; using namespace ArdourCanvas; -TrackMixLayout::TrackMixLayout (Push2& p, Session& s) - : Push2Layout (p, s) +TrackMixLayout::TrackMixLayout (Push2& p, Session & s, std::string const & name) + : Push2Layout (p, s, name) { Pango::FontDescription fd ("Sans 10"); @@ -169,11 +169,8 @@ TrackMixLayout::~TrackMixLayout () void TrackMixLayout::selection_changed () { - if (!parent()) { - return; - } - boost::shared_ptr s = ControlProtocol::first_selected_stripable(); + if (s) { set_stripable (s); } @@ -192,7 +189,7 @@ TrackMixLayout::show () p2.write (b->state_msg()); } - selection_changed (); + show_state (); Container::show (); } @@ -200,7 +197,7 @@ TrackMixLayout::show () void TrackMixLayout::hide () { - set_stripable (boost::shared_ptr()); + } void @@ -225,23 +222,31 @@ TrackMixLayout::button_lower (uint32_t n) switch (n) { case 0: - stripable->mute_control()->set_value (!stripable->mute_control()->get_value(), PBD::Controllable::UseGroup); + if (stripable->mute_control()) { + stripable->mute_control()->set_value (!stripable->mute_control()->get_value(), PBD::Controllable::UseGroup); + } break; case 1: - stripable->solo_control()->set_value (!stripable->solo_control()->get_value(), PBD::Controllable::UseGroup); + if (stripable->solo_control()) { + stripable->solo_control()->set_value (!stripable->solo_control()->get_value(), PBD::Controllable::UseGroup); + } break; case 2: - stripable->rec_enable_control()->set_value (!stripable->rec_enable_control()->get_value(), PBD::Controllable::UseGroup); + if (stripable->rec_enable_control()) { + stripable->rec_enable_control()->set_value (!stripable->rec_enable_control()->get_value(), PBD::Controllable::UseGroup); + } break; case 3: - mc = stripable->monitoring_control()->monitoring_choice(); - switch (mc) { - case MonitorInput: - stripable->monitoring_control()->set_value (MonitorAuto, PBD::Controllable::UseGroup); - break; - default: - stripable->monitoring_control()->set_value (MonitorInput, PBD::Controllable::UseGroup); - break; + if (stripable->monitor_control()) { + mc = stripable->monitoring_control()->monitoring_choice(); + switch (mc) { + case MonitorInput: + stripable->monitoring_control()->set_value (MonitorAuto, PBD::Controllable::UseGroup); + break; + default: + stripable->monitoring_control()->set_value (MonitorInput, PBD::Controllable::UseGroup); + break; + } } break; case 4: @@ -256,10 +261,14 @@ TrackMixLayout::button_lower (uint32_t n) } break; case 5: - stripable->solo_isolate_control()->set_value (!stripable->solo_isolate_control()->get_value(), PBD::Controllable::UseGroup); + if (stripable->solo_isolate_control()) { + stripable->solo_isolate_control()->set_value (!stripable->solo_isolate_control()->get_value(), PBD::Controllable::UseGroup); + } break; case 6: - stripable->solo_safe_control()->set_value (!stripable->solo_safe_control()->get_value(), PBD::Controllable::UseGroup); + if (stripable->solo_safe_control()) { + stripable->solo_safe_control()->set_value (!stripable->solo_safe_control()->get_value(), PBD::Controllable::UseGroup); + } break; case 7: /* nothing here */ @@ -434,6 +443,28 @@ TrackMixLayout::monitoring_change () p2.write (b2->state_msg()); } +void +TrackMixLayout::show_state () +{ + if (!parent()) { + return; + } + + if (stripable) { + name_changed (); + color_changed (); + solo_mute_change (); + rec_enable_change (); + solo_iso_change (); + solo_safe_change (); + monitoring_change (); + + meter->set_meter (stripable->peak_meter ().get()); + } else { + meter->set_meter (0); + } +} + void TrackMixLayout::set_stripable (boost::shared_ptr s) { @@ -471,19 +502,9 @@ TrackMixLayout::set_stripable (boost::shared_ptr s) knobs[5]->set_controllable (boost::shared_ptr()); knobs[6]->set_controllable (boost::shared_ptr()); knobs[7]->set_controllable (boost::shared_ptr()); - - name_changed (); - color_changed (); - solo_mute_change (); - rec_enable_change (); - solo_iso_change (); - solo_safe_change (); - monitoring_change (); - - meter->set_meter (stripable->peak_meter ().get()); - } else { - meter->set_meter (0); } + + show_state (); } void @@ -497,10 +518,16 @@ void TrackMixLayout::name_changed () { if (stripable) { - /* poor-man's right justification */ - char buf[92]; - snprintf (buf, sizeof (buf), "%*s", (int) sizeof (buf) - 1, stripable->name().c_str()); - name_text->set (buf); + + name_text->set (stripable->name()); + + /* right justify */ + + Duple pos; + pos.y = name_text->position().y; + pos.x = display_width() - 10 - name_text->width(); + + name_text->set_position (pos); } } diff --git a/libs/surfaces/push2/track_mix.h b/libs/surfaces/push2/track_mix.h index 417c394f95..ec945f4cab 100644 --- a/libs/surfaces/push2/track_mix.h +++ b/libs/surfaces/push2/track_mix.h @@ -43,7 +43,7 @@ class LevelMeter; class TrackMixLayout : public Push2Layout { public: - TrackMixLayout (Push2& p, ARDOUR::Session&); + TrackMixLayout (Push2& p, ARDOUR::Session&, std::string const &); ~TrackMixLayout (); void set_stripable (boost::shared_ptr); @@ -63,6 +63,8 @@ class TrackMixLayout : public Push2Layout void update_meters (); void update_clocks (); + boost::shared_ptr current_stripable() const { return stripable; } + private: boost::shared_ptr stripable; PBD::ScopedConnectionList stripable_connections; @@ -84,6 +86,7 @@ class TrackMixLayout : public Push2Layout PBD::ScopedConnection selection_connection; void selection_changed (); + void show_state (); void drop_stripable (); void name_changed (); -- 2.30.2