triggerbox: change entire UI side to avoid using TriggerPtr

Lifetime management of Triggers is unlike anything(?) we've dealt with in
Ardour so far. The parent object (Triggerbox) has a normal lifetime
pattern, but Triggers can come and go in a way that few other objects
do (although Processors and particularly PluginInsert are somewhat similar).
We do not want the GUI to hold references to the actual Triggers, because the
end of life of a Trigger is not really a signal for the GUI element to go
away (the Trigger will be replaced in the slot). Consequently, we do not
want TriggerPtr used as a member variable anywhere in the UI. Instead we use a
TriggerReference which can "lookup" a Trigger on-demand (by box and slot
number). The (G)UI now uses these exclusively.

Work still needed to pick up trigger swap signals from the boxen.
This commit is contained in:
Paul Davis 2021-12-24 14:13:36 -07:00
parent 401411d5c3
commit c18823c0e0
16 changed files with 109 additions and 99 deletions

View File

@ -86,6 +86,8 @@ ClipEditorBox::register_clip_editor_actions (Bindings* clip_editor_bindings)
void
AudioClipEditor::ClipBBTMetric::get_marks (std::vector<ArdourCanvas::Ruler::Mark>& marks, int64_t lower, int64_t upper, int maxchars) const
{
TriggerPtr trigger = tref.trigger();
if (!trigger) {
std::cerr << "No trigger\n";
return;
@ -118,7 +120,8 @@ AudioClipEditor::ClipBBTMetric::get_marks (std::vector<ArdourCanvas::Ruler::Mark
}
AudioClipEditor::AudioClipEditor ()
: _spp (0)
: clip_metric (0)
, _spp (0)
, scroll_fraction (0)
, current_line_drag (0)
, current_scroll_drag (0)
@ -143,14 +146,8 @@ AudioClipEditor::AudioClipEditor ()
waves_container = new ArdourCanvas::ScrollGroup (frame, ScrollGroup::ScrollsHorizontally);
add_scroller (*waves_container);
/* A ruler, that scrolls with the waves and is overlapped by our
* various vertical lines
*/
clip_metric = new ClipBBTMetric ();
ruler_container = new ArdourCanvas::Container (waves_container);
ruler = new ArdourCanvas::Ruler (ruler_container, *clip_metric);
ruler = new ArdourCanvas::Ruler (ruler_container, 0);
ruler->name = "Clip Editor";
ruler->set_font_description (UIConfiguration::instance ().get_SmallerFont ());
ruler->set_fill_color (UIConfiguration::instance().color (X_("theme:bg1")));
@ -183,6 +180,7 @@ AudioClipEditor::AudioClipEditor ()
AudioClipEditor::~AudioClipEditor ()
{
drop_waves ();
delete clip_metric;
}
bool
@ -399,12 +397,13 @@ AudioClipEditor::drop_waves ()
}
void
AudioClipEditor::set_region (boost::shared_ptr<AudioRegion> r, TriggerPtr t)
AudioClipEditor::set_region (boost::shared_ptr<AudioRegion> r, TriggerReference tr)
{
drop_waves ();
audio_region = r;
clip_metric->set_trigger (t);
delete clip_metric;
clip_metric = new ClipBBTMetric (tr);
uint32_t n_chans = r->n_channels ();
samplecnt_t len;
@ -431,6 +430,8 @@ AudioClipEditor::set_region (boost::shared_ptr<AudioRegion> r, TriggerPtr t)
waves.push_back (wv);
}
TriggerPtr t (tr.trigger());
if (t) {
if (t->apparent_tempo() == 0.) {
/* tempo unknown, hide ruler */
@ -592,7 +593,7 @@ AudioClipEditorBox::zoom_out_click ()
}
void
AudioClipEditorBox::set_region (boost::shared_ptr<Region> r, TriggerPtr t)
AudioClipEditorBox::set_region (boost::shared_ptr<Region> r, TriggerReference tref)
{
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
@ -605,7 +606,7 @@ AudioClipEditorBox::set_region (boost::shared_ptr<Region> r, TriggerPtr t)
state_connection.disconnect ();
_region = r;
editor->set_region (ar, t);
editor->set_region (ar, tref);
PBD::PropertyChange interesting_stuff;
region_changed (interesting_stuff);

View File

@ -70,7 +70,7 @@ public:
ClipEditorBox () {}
~ClipEditorBox () {}
virtual void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerPtr) = 0;
virtual void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference) = 0;
static void init ();
static void register_clip_editor_actions (Gtkmm2ext::Bindings*);
@ -92,7 +92,7 @@ public:
AudioClipEditor ();
~AudioClipEditor ();
void set_region (boost::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::TriggerPtr);
void set_region (boost::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::TriggerReference);
void on_size_allocate (Gtk::Allocation&);
double sample_to_pixel (ARDOUR::samplepos_t);
@ -121,16 +121,14 @@ private:
class ClipBBTMetric : public ArdourCanvas::Ruler::Metric
{
public:
ClipBBTMetric() : trigger (0) {
ClipBBTMetric (ARDOUR::TriggerReference tr) : tref (tr) {
units_per_pixel = 1;
}
void set_trigger (ARDOUR::TriggerPtr t) { trigger = t; }
void get_marks (std::vector<ArdourCanvas::Ruler::Mark>& marks, int64_t lower, int64_t upper, int maxchars) const;
private:
ARDOUR::TriggerPtr trigger;
ARDOUR::TriggerReference tref;
};
@ -203,7 +201,7 @@ public:
AudioClipEditorBox ();
~AudioClipEditorBox ();
void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerPtr);
void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference);
void region_changed (const PBD::PropertyChange& what_changed);
private:

View File

@ -155,7 +155,10 @@ AudioTriggerPropertiesBox::~AudioTriggerPropertiesBox ()
void
AudioTriggerPropertiesBox::toggle_stretch ()
{
_trigger->set_stretchable (!_trigger->stretchable ());
TriggerPtr trigger (tref.trigger());
if (trigger) {
trigger->set_stretchable (!trigger->stretchable ());
}
}
void
@ -168,16 +171,16 @@ AudioTriggerPropertiesBox::set_session (Session* s)
}
void
AudioTriggerPropertiesBox::set_trigger (ARDOUR::TriggerPtr t)
AudioTriggerPropertiesBox::set_trigger (ARDOUR::TriggerReference tr)
{
boost::shared_ptr<ARDOUR::AudioTrigger> audio_trigger = boost::dynamic_pointer_cast<ARDOUR::AudioTrigger> (t);
boost::shared_ptr<ARDOUR::AudioTrigger> audio_trigger = boost::dynamic_pointer_cast<ARDOUR::AudioTrigger> (tr.trigger());
if (!audio_trigger) {
return;
}
_trigger = audio_trigger;
_trigger->PropertyChanged.connect (_state_connection, invalidator (*this), boost::bind (&AudioTriggerPropertiesBox::trigger_changed, this, _1), gui_context ());
tref = tr;
tref.trigger()->PropertyChanged.connect (_state_connection, invalidator (*this), boost::bind (&AudioTriggerPropertiesBox::trigger_changed, this, _1), gui_context ());
PBD::PropertyChange changed;
changed.add (ARDOUR::Properties::name);
@ -188,17 +191,19 @@ AudioTriggerPropertiesBox::set_trigger (ARDOUR::TriggerPtr t)
void
AudioTriggerPropertiesBox::trigger_changed (const PBD::PropertyChange& what_changed)
{
AudioClock::Mode mode = _trigger->box ().data_type () == ARDOUR::DataType::AUDIO ? AudioClock::Samples : AudioClock::BBT;
TriggerPtr trigger (tref.trigger());
AudioClock::Mode mode = trigger->box ().data_type () == ARDOUR::DataType::AUDIO ? AudioClock::Samples : AudioClock::BBT;
_start_clock.set_mode (mode);
_length_clock.set_mode (mode);
_start_clock.set (_trigger->start_offset ());
_length_clock.set (_trigger->current_length ()); // set_duration() ?
_start_clock.set (tref.trigger()->start_offset ());
_length_clock.set (tref.trigger()->current_length ()); // set_duration() ?
_bpm_button.set_text (string_compose ("%1", _trigger->apparent_tempo ()));
_abpm_label.set_text (string_compose ("%1", _trigger->apparent_tempo ()));
_bpm_button.set_text (string_compose ("%1", trigger->apparent_tempo ()));
_abpm_label.set_text (string_compose ("%1", trigger->apparent_tempo ()));
_metrum_button.set_text ("4/4");
_stretch_toggle.set_active (_trigger->stretchable () ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
_stretch_toggle.set_active (tref.trigger()->stretchable () ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
}

View File

@ -37,7 +37,7 @@ public:
TriggerPropertiesBox () {}
~TriggerPropertiesBox () {}
virtual void set_trigger (ARDOUR::TriggerPtr) = 0;
virtual void set_trigger (ARDOUR::TriggerReference) = 0;
};
class AudioTriggerPropertiesBox : public TriggerPropertiesBox
@ -46,7 +46,7 @@ public:
AudioTriggerPropertiesBox ();
~AudioTriggerPropertiesBox ();
void set_trigger (ARDOUR::TriggerPtr);
void set_trigger (ARDOUR::TriggerReference);
void set_session (ARDOUR::Session*);
@ -58,7 +58,7 @@ protected:
Gtk::Label _header_label;
private:
boost::shared_ptr<ARDOUR::AudioTrigger> _trigger;
ARDOUR::TriggerReference tref;
Gtk::Table _table;
Gtk::Label _abpm_label;

View File

@ -113,7 +113,7 @@ MidiClipEditorBox::set_session (Session* s)
}
void
MidiClipEditorBox::set_region (boost::shared_ptr<Region> r, TriggerPtr t)
MidiClipEditorBox::set_region (boost::shared_ptr<Region> r, TriggerReference /*notused*/)
{
set_session (&r->session ());

View File

@ -69,7 +69,7 @@ public:
void set_session (ARDOUR::Session*);
void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerPtr);
void set_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::TriggerReference);
void region_changed (const PBD::PropertyChange& what_changed);
private:

View File

@ -79,16 +79,15 @@ MidiTriggerPropertiesBox::~MidiTriggerPropertiesBox ()
}
void
MidiTriggerPropertiesBox::set_trigger (ARDOUR::TriggerPtr t)
MidiTriggerPropertiesBox::set_trigger (ARDOUR::TriggerReference tref)
{
boost::shared_ptr<ARDOUR::MIDITrigger> midi_trigger = boost::dynamic_pointer_cast<ARDOUR::MIDITrigger> (t);
boost::shared_ptr<ARDOUR::MIDITrigger> midi_trigger = boost::dynamic_pointer_cast<ARDOUR::MIDITrigger> (tref.trigger());
if (!midi_trigger) {
return;
}
_trigger = midi_trigger;
_trigger->PropertyChanged.connect (_midi_state_connection, invalidator (*this), boost::bind (&MidiTriggerPropertiesBox::trigger_changed, this, _1), gui_context ());
tref.trigger()->PropertyChanged.connect (_midi_state_connection, invalidator (*this), boost::bind (&MidiTriggerPropertiesBox::trigger_changed, this, _1), gui_context ());
PBD::PropertyChange changed;
changed.add (ARDOUR::Properties::name);

View File

@ -32,7 +32,7 @@ public:
MidiTriggerPropertiesBox ();
~MidiTriggerPropertiesBox ();
void set_trigger (ARDOUR::TriggerPtr);
void set_trigger (ARDOUR::TriggerReference);
private:
void trigger_changed (const PBD::PropertyChange& what_changed);

View File

@ -209,13 +209,13 @@ SelectionPropertiesBox::selection_changed ()
if (!selection.triggers.empty()) {
TriggerSelection ts = selection.triggers;
TriggerEntry* entry = *ts.begin();
TriggerPtr slot = entry->trigger();
TriggerReference ref = entry->trigger_reference();
//slot properties incl "Follow Actions"
_slot_prop_box->set_slot(slot);
_slot_prop_box->set_slot(ref);
_slot_prop_box->show();
selected_region = slot->region();
selected_region = ref.trigger()->region();
} else if (selection.regions.size()==1) {
selected_region = (*(selection.regions.begin()))->region();
}

View File

@ -74,7 +74,7 @@ SlotPropertiesBox::set_session (Session* s)
}
void
SlotPropertiesBox::set_slot (TriggerPtr t)
SlotPropertiesBox::set_slot (TriggerReference tref)
{
_triggerwidget->set_trigger (t);
_triggerwidget->set_trigger (tref);
}

View File

@ -48,7 +48,7 @@ public:
void set_session (ARDOUR::Session*);
void set_slot (ARDOUR::TriggerPtr);
void set_slot (ARDOUR::TriggerReference);
private:
Gtk::Table table;

View File

@ -346,23 +346,24 @@ TriggerPage::selection_changed ()
_parameter_box.hide ();
if (!selection.triggers.empty ()) {
TriggerSelection ts = selection.triggers;
TriggerEntry* entry = *ts.begin ();
TriggerPtr slot = entry->trigger ();
TriggerSelection ts = selection.triggers;
TriggerEntry* entry = *ts.begin ();
TriggerReference ref = entry->trigger_reference ();
TriggerPtr trigger = entry->trigger ();
_slot_prop_box.set_slot (slot);
_slot_prop_box.set_slot (ref);
_slot_prop_box.show ();
if (slot->region ()) {
if (slot->region ()->data_type () == DataType::AUDIO) {
_audio_trig_box.set_trigger (slot);
_audio_trim_box.set_region (slot->region (), slot);
if (trigger->region ()) {
if (trigger->region ()->data_type () == DataType::AUDIO) {
_audio_trig_box.set_trigger (ref);
_audio_trim_box.set_region (trigger->region (), ref);
_audio_trig_box.show ();
_audio_trim_box.show ();
_audio_ops_box.show ();
} else {
_midi_trig_box.set_trigger (slot);
_midi_trim_box.set_region (slot->region (), slot);
_midi_trig_box.set_trigger (ref);
_midi_trim_box.set_region (trigger->region (), ref);
_midi_trig_box.show ();
_midi_trim_box.show ();

View File

@ -63,8 +63,8 @@ static std::string longest_quantize;
static std::vector<std::string> launch_strings;
static std::string longest_launch;
TriggerUI::TriggerUI () :
_follow_action_button (ArdourButton::led_default_elements)
TriggerUI::TriggerUI ()
: _follow_action_button (ArdourButton::led_default_elements)
, _velocity_adjustment(1.,0.,1.0,0.01,0.1)
, _velocity_slider (&_velocity_adjustment, boost::shared_ptr<PBD::Controllable>(), 24/*length*/, 12/*girth*/ )
, _follow_probability_adjustment(0,0,100,2,5)
@ -74,8 +74,6 @@ TriggerUI::TriggerUI () :
, _legato_button (ArdourButton::led_default_elements)
{
trigger = NULL;
using namespace Gtk::Menu_Helpers;
if (follow_strings.empty()) {
@ -228,10 +226,16 @@ TriggerUI::~TriggerUI ()
{
}
void
TriggerUI::set_trigger (ARDOUR::TriggerPtr t)
TriggerPtr
TriggerUI::trigger() const
{
trigger = t;
return tref.trigger();
}
void
TriggerUI::set_trigger (ARDOUR::TriggerReference tr)
{
tref = tr;
PropertyChange pc;
@ -247,7 +251,7 @@ TriggerUI::set_trigger (ARDOUR::TriggerPtr t)
trigger_changed (pc);
trigger->PropertyChanged.connect (trigger_connections, invalidator (*this), boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context());
trigger()->PropertyChanged.connect (trigger_connections, invalidator (*this), boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context());
}
@ -261,25 +265,25 @@ TriggerUI::set_quantize (BBT_Offset bbo)
}
#endif
trigger->set_quantization (bbo);
trigger()->set_quantization (bbo);
}
void
TriggerUI::follow_count_event ()
{
trigger->set_follow_count ((int) _follow_count_adjustment.get_value());
trigger()->set_follow_count ((int) _follow_count_adjustment.get_value());
}
void
TriggerUI::velocity_adjusted ()
{
trigger->set_midi_velocity_effect (_velocity_adjustment.get_value());
trigger()->set_midi_velocity_effect (_velocity_adjustment.get_value());
}
void
TriggerUI::probability_adjusted ()
{
trigger->set_follow_action_probability ((int) _follow_probability_adjustment.get_value());
trigger()->set_follow_action_probability ((int) _follow_probability_adjustment.get_value());
}
bool
@ -287,7 +291,7 @@ TriggerUI::follow_action_button_event (GdkEvent* ev)
{
switch (ev->type) {
case GDK_BUTTON_PRESS:
trigger->set_use_follow (!trigger->use_follow());
trigger()->set_use_follow (!trigger()->use_follow());
return true;
default:
@ -302,7 +306,7 @@ TriggerUI::legato_button_event (GdkEvent* ev)
{
switch (ev->type) {
case GDK_BUTTON_PRESS:
trigger->set_legato (!trigger->legato());
trigger()->set_legato (!trigger()->legato());
return true;
default:
@ -315,7 +319,7 @@ TriggerUI::legato_button_event (GdkEvent* ev)
void
TriggerUI::set_launch_style (Trigger::LaunchStyle ls)
{
trigger->set_launch_style (ls);
trigger()->set_launch_style (ls);
}
void
@ -398,46 +402,46 @@ void
TriggerUI::trigger_changed (PropertyChange pc)
{
if (pc.contains (Properties::quantization)) {
BBT_Offset bbo (trigger->quantization());
BBT_Offset bbo (trigger()->quantization());
_quantize_button.set_active (quantize_length_to_string (bbo));
}
if (pc.contains (Properties::use_follow)) {
_follow_action_button.set_active_state (trigger->use_follow() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
_follow_action_button.set_active_state (trigger()->use_follow() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
}
if (pc.contains (Properties::follow_count)) {
_follow_count_adjustment.set_value (trigger->follow_count());
_follow_count_adjustment.set_value (trigger()->follow_count());
}
if (pc.contains (Properties::legato)) {
_legato_button.set_active_state (trigger->legato() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
_legato_button.set_active_state (trigger()->legato() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off);
}
if (pc.contains (Properties::launch_style)) {
_launch_style_button.set_active (launch_style_to_string (trigger->launch_style()));
_launch_style_button.set_active (launch_style_to_string (trigger()->launch_style()));
}
if (pc.contains (Properties::follow_action0)) {
_follow_left.set_text (follow_action_to_string (trigger->follow_action (0)));
_follow_left.set_text (follow_action_to_string (trigger()->follow_action (0)));
}
if (pc.contains (Properties::follow_action1)) {
_follow_right.set_text (follow_action_to_string (trigger->follow_action (1)));
_follow_right.set_text (follow_action_to_string (trigger()->follow_action (1)));
}
if (pc.contains (Properties::velocity_effect)) {
_velocity_adjustment.set_value (trigger->midi_velocity_effect());
_velocity_adjustment.set_value (trigger()->midi_velocity_effect());
}
if (pc.contains (Properties::follow_action_probability)) {
int pval = trigger->follow_action_probability();
int pval = trigger()->follow_action_probability();
_follow_probability_adjustment.set_value (pval);
_left_probability_label.set_text (string_compose(_("%1%% Left"), pval));
_right_probability_label.set_text (string_compose(_("%1%% Right"), 100-pval));
}
if (trigger->use_follow()) {
if (trigger()->use_follow()) {
_follow_left.set_sensitive(true);
_follow_right.set_sensitive(true);
_follow_count_spinner.set_sensitive(true);
@ -466,13 +470,14 @@ TriggerWidget::TriggerWidget ()
/* ------------ */
TriggerWindow::TriggerWindow (TriggerPtr slot)
TriggerWindow::TriggerWindow (TriggerReference tref)
{
set_title (string_compose (_("Trigger: %1"), slot->name()));
TriggerPtr trigger (tref.trigger());
set_title (string_compose (_("Trigger: %1"), trigger->name()));
SlotPropertiesBox* slot_prop_box = manage (new SlotPropertiesBox ());
slot_prop_box->set_slot(slot);
slot_prop_box->set_slot (tref);
Gtk::Table* table = manage (new Gtk::Table);
table->set_homogeneous (false);
@ -482,23 +487,23 @@ TriggerWindow::TriggerWindow (TriggerPtr slot)
int col = 0;
table->attach(*slot_prop_box, col, col+1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND ); col++;
if (slot->region()) {
if (slot->region()->data_type() == DataType::AUDIO) {
if (trigger->region()) {
if (trigger->region()->data_type() == DataType::AUDIO) {
_trig_box = manage(new AudioTriggerPropertiesBox ());
_ops_box = manage(new AudioRegionOperationsBox ());
_trim_box = manage(new AudioClipEditorBox ());
_trig_box->set_trigger(slot);
_trig_box->set_trigger (tref);
} else {
_trig_box = manage(new MidiTriggerPropertiesBox ());
_ops_box = manage(new MidiRegionOperationsBox ());
_trim_box = manage(new MidiClipEditorBox ());
_trig_box->set_trigger(slot);
_trig_box->set_trigger (tref);
}
_trim_box->set_region(slot->region(), slot);
_ops_box->set_session(&slot->region()->session());
_trim_box->set_region(trigger->region(), tref);
_ops_box->set_session(&trigger->region()->session());
table->attach(*_trig_box, col, col+1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND ); col++;
table->attach(*_trim_box, col, col+1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND ); col++;

View File

@ -39,7 +39,7 @@ class TriggerUI : public Gtk::Table //, public sigc::trackable
TriggerUI ();
~TriggerUI ();
void set_trigger (ARDOUR::TriggerPtr);
void set_trigger (ARDOUR::TriggerReference);
static std::string follow_action_to_string (ARDOUR::Trigger::FollowAction);
static ARDOUR::Trigger::FollowAction string_to_follow_action (std::string const &);
@ -47,7 +47,8 @@ class TriggerUI : public Gtk::Table //, public sigc::trackable
static std::string launch_style_to_string (ARDOUR::Trigger::LaunchStyle);
private:
ARDOUR::TriggerPtr trigger;
ARDOUR::TriggerReference tref;
ARDOUR::TriggerPtr trigger() const;
ArdourWidgets::ArdourButton _follow_action_button;
@ -91,7 +92,7 @@ class TriggerWidget : public Gtk::VBox
{
public:
TriggerWidget ();
void set_trigger (ARDOUR::TriggerPtr t) const {ui->set_trigger(t);}
void set_trigger (ARDOUR::TriggerReference tr) const { ui->set_trigger(tr); }
private:
TriggerUI* ui;
@ -102,7 +103,7 @@ class TriggerWidget : public Gtk::VBox
class TriggerWindow : public Gtk::Window
{
public:
TriggerWindow (ARDOUR::TriggerPtr);
TriggerWindow (ARDOUR::TriggerReference);
bool on_key_press_event (GdkEventKey*);
bool on_key_release_event (GdkEventKey*);

View File

@ -92,8 +92,8 @@ TriggerEntry::TriggerEntry (Item* item, TriggerReference tr)
set_default_colors ();
trigger()->PropertyChanged.connect (trigger_prop_connection, MISSING_INVALIDATOR, boost::bind (&TriggerEntry::prop_change, this, _1), gui_context ());
tref.box.TriggerSwapped.connect (trigger_swap_connection, MISSING_INVALIDATOR, boost::bind (&TriggerEntry::trigger_swap, this, _1), gui_context ());
dynamic_cast<Stripable*> (tref.box.owner ())->presentation_info ().Change.connect (owner_prop_connection, MISSING_INVALIDATOR, boost::bind (&TriggerEntry::owner_prop_change, this, _1), gui_context ());
tref.box->TriggerSwapped.connect (trigger_swap_connection, MISSING_INVALIDATOR, boost::bind (&TriggerEntry::trigger_swap, this, _1), gui_context ());
dynamic_cast<Stripable*> (tref.box->owner ())->presentation_info ().Change.connect (owner_prop_connection, MISSING_INVALIDATOR, boost::bind (&TriggerEntry::owner_prop_change, this, _1), gui_context ());
PropertyChange changed;
changed.add (ARDOUR::Properties::name);
@ -966,7 +966,7 @@ TriggerBoxUI::edit_trigger (uint64_t n)
TriggerWindow* tw = static_cast<TriggerWindow*> (trigger->ui ());
if (!tw) {
tw = new TriggerWindow (_triggerbox.trigger (n));
tw = new TriggerWindow (TriggerReference (_triggerbox, n));
trigger->set_ui (tw);
}

View File

@ -75,7 +75,7 @@ public:
void set_default_colors ();
private:
TriggerReference tref;
ARDOUR::TriggerReference tref;
double _poly_size;
double _poly_margin;