{
return *ARDOUR_UI::instance()->gui_object_state;
}
+
+void
+AxisView::set_selected (bool yn)
+{
+ if (selected() == yn) {
+ return;
+ }
+
+ Selectable::set_selected (yn);
+
+ boost::shared_ptr<Stripable> s = stripable ();
+
+ if (s) {
+ s->presentation_info().set_selected (yn);
+ }
+}
namespace ARDOUR {
class Session;
+ class Stripable;
+ class PresentationInfo;
}
/**
- * AxisView defines the abstract base class for time-axis trackviews and routes.
+ * AxisView defines the abstract base class for horizontal and vertical
+ * presentations of Stripables.
*
*/
class AxisView : public virtual PBD::ScopedConnectionList, public virtual ARDOUR::SessionHandlePtr, public virtual Selectable
sigc::signal<void> Hiding;
+ virtual boost::shared_ptr<ARDOUR::Stripable> stripable() const = 0;
+
virtual std::string state_id() const = 0;
/* for now, we always return properties in string form.
*/
property_hashtable.clear ();
}
+ void set_selected (bool yn);
+
virtual bool marked_for_display () const;
virtual bool set_marked_for_display (bool);
ControlProtocol::VerticalZoomInSelected.connect (*this, invalidator (*this), boost::bind (&Editor::control_vertical_zoom_in_selected, this), gui_context());
ControlProtocol::VerticalZoomOutSelected.connect (*this, invalidator (*this), boost::bind (&Editor::control_vertical_zoom_out_selected, this), gui_context());
+ ControlProtocol::AddStripableToSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Add), gui_context());
+ ControlProtocol::RemoveStripableFromSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
+ ControlProtocol::SetStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Set), gui_context());
+ ControlProtocol::ToggleStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
+ ControlProtocol::ClearStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_unselect, this), gui_context());
+
BasicUI::AccessAction.connect (*this, invalidator (*this), boost::bind (&Editor::access_action, this, _1, _2), gui_context());
/* handle escape */
selection->clear_tracks ();
}
+void
+Editor::control_select (boost::shared_ptr<Stripable> s, Selection::Operation op)
+{
+ TimeAxisView* tav = axis_view_from_stripable (s);
+
+ if (tav) {
+ switch (op) {
+ case Selection::Add:
+ selection->add (tav);
+ break;
+ case Selection::Toggle:
+ selection->toggle (tav);
+ break;
+ case Selection::Extend:
+ break;
+ case Selection::Set:
+ selection->set (tav);
+ break;
+ }
+ } else {
+ selection->clear_tracks ();
+ }
+}
+
void
Editor::control_step_tracks_up ()
{
_summary->set_background_dirty ();
}
-RouteTimeAxisView*
-Editor::axis_view_from_route (boost::shared_ptr<Route> r) const
+TimeAxisView*
+Editor::axis_view_from_stripable (boost::shared_ptr<Stripable> s) const
{
- TrackViewList::const_iterator j = track_views.begin ();
- while (j != track_views.end()) {
- RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*j);
- if (rtv && rtv->route() == r) {
- return rtv;
+ for (TrackViewList::const_iterator j = track_views.begin (); j != track_views.end(); ++j) {
+ if ((*j)->stripable() == s) {
+ return *j;
}
- ++j;
}
return 0;
TrackViewList t;
for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
- TimeAxisView* tv = axis_view_from_route (*i);
+ TimeAxisView* tv = axis_view_from_stripable (*i);
if (tv) {
t.push_back (tv);
}
void control_step_tracks_down ();
void control_view (uint32_t);
void control_scroll (float);
+ void control_select (boost::shared_ptr<ARDOUR::Stripable>, Selection::Operation);
void control_unselect ();
void access_action (std::string,std::string);
bool deferred_control_scroll (framepos_t);
/* track views */
TrackViewList track_views;
std::pair<TimeAxisView*, double> trackview_by_y_position (double, bool trackview_relative_offset = true) const;
- RouteTimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
+ TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
TrackViewList get_tracks_for_range_action () const;
}
list<boost::shared_ptr<AudioTrack> > audio_tracks;
audio_tracks = session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order);
- rtav = axis_view_from_route (audio_tracks.front());
+ rtav = dynamic_cast<RouteTimeAxisView*> (axis_view_from_stripable (audio_tracks.front()));
} else if (boost::dynamic_pointer_cast<MidiRegion> (region)) {
ChanCount one_midi_port (DataType::MIDI, 1);
list<boost::shared_ptr<MidiTrack> > midi_tracks;
midi_tracks = session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(),
(ARDOUR::Plugin::PresetRecord*) 0,
(ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order);
- rtav = axis_view_from_route (midi_tracks.front());
+ rtav = dynamic_cast<RouteTimeAxisView*> (axis_view_from_stripable (midi_tracks.front()));
} else {
return;
}
struct PresentationInfoTimeAxisViewSorter {
bool operator() (TimeAxisView* a, TimeAxisView* b) {
- return a->presentation_info().order() < b->presentation_info().order();
+ return a->stripable()->presentation_info().order() < b->stripable()->presentation_info().order();
}
};
output_chan = _editor->session()->master_out()->n_inputs().n_audio();
}
audio_tracks = _editor->session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order);
- RouteTimeAxisView* rtav = _editor->axis_view_from_route (audio_tracks.front());
- if (rtav) {
- rtav->set_height (original->current_height());
+ TimeAxisView* tav =_editor->axis_view_from_stripable (audio_tracks.front());
+ if (tav) {
+ tav->set_height (original->current_height());
}
- return rtav;
+ return dynamic_cast<RouteTimeAxisView*>(tav);
} else {
ChanCount one_midi_port (DataType::MIDI, 1);
list<boost::shared_ptr<MidiTrack> > midi_tracks;
midi_tracks = _editor->session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(),
(ARDOUR::Plugin::PresetRecord*) 0,
(ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order);
- RouteTimeAxisView* rtav = _editor->axis_view_from_route (midi_tracks.front());
- if (rtav) {
- rtav->set_height (original->current_height());
+ TimeAxisView* tav = _editor->axis_view_from_stripable (midi_tracks.front());
+ if (tav) {
+ tav->set_height (original->current_height());
}
- return rtav;
+ return dynamic_cast<RouteTimeAxisView*> (tav);
}
} catch (...) {
error << _("Could not create new track after region placed in the drop zone") << endmsg;
#include "ardour/rc_configuration.h"
+#include "control_protocol/control_protocol.h"
+
#include "actions.h"
#include "ardour_ui.h"
#include "audio_time_axis.h"
}
}
- _session->set_editor_mixer (route);
+ /* Typically this is set by changing the TAV selection but if for any
+ reason we decide to show a different strip for some reason, make
+ sure that control surfaces can find it.
+ */
+ ARDOUR::ControlProtocol::set_first_selected_stripable (route);
Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
_following_mixer_selection = true;
selection->block_tracks_changed (true);
- RouteUISelection& s (Mixer_UI::instance()->selection().routes);
+ AxisViewSelection& s (Mixer_UI::instance()->selection().axes);
selection->clear_tracks ();
- for (RouteUISelection::iterator i = s.begin(); i != s.end(); ++i) {
- TimeAxisView* tav = get_route_view_by_route_id ((*i)->route()->id());
+ for (AxisViewSelection::iterator i = s.begin(); i != s.end(); ++i) {
+ TimeAxisView* tav = axis_view_from_stripable ((*i)->stripable());
if (tav) {
selection->add (tav);
}
set<TimeAxisView*> show;
for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
- TimeAxisView* tav = _editor->axis_view_from_route (*i);
+ TimeAxisView* tav = _editor->axis_view_from_stripable (*i);
if (tav) {
show.insert (tav);
}
{
return RouteUI::route_color ();
}
+
std::string name() const;
Gdk::Color color () const;
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
+
void set_session (ARDOUR::Session* s);
void fast_update ();
boost::shared_ptr<ARDOUR::Route> route() { return _route; }
void
MixerActor::solo_action ()
{
- GdkEventButton ev;
-
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- ev.state = 0;
-
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- r->solo_press (&ev);
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ boost::shared_ptr<Stripable> s = r->stripable();
+ if (s) {
+ boost::shared_ptr<AutomationControl> ac = s->solo_control();
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
+ }
+ }
}
}
void
MixerActor::mute_action ()
{
- GdkEventButton ev;
-
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- ev.state = 0;
-
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- r->mute_press (&ev);
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ boost::shared_ptr<Stripable> s = r->stripable();
+ if (s) {
+ boost::shared_ptr<AutomationControl> ac = s->mute_control();
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
+ }
+ }
}
}
void
MixerActor::rec_enable_action ()
{
- GdkEventButton ev;
-
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- ev.state = 0;
-
- set_route_targets_for_operation ();
-
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- r->rec_enable_press (&ev);
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ boost::shared_ptr<Stripable> s = r->stripable();
+ if (s) {
+ boost::shared_ptr<AutomationControl> ac = s->rec_enable_control();
+ if (ac) {
+ ac->set_value (!ac->get_value(), Controllable::UseGroup);
+ }
+ }
}
}
void
MixerActor::step_gain_up_action ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->step_gain_up ();
void
MixerActor::step_gain_down_action ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->step_gain_down ();
void
MixerActor::unity_gain_action ()
{
- set_route_targets_for_operation ();
-
-printf("setting gain to unity (?)");
- BOOST_FOREACH(RouteUI* r, _route_targets) {
- boost::shared_ptr<Route> rp = r->route();
- if (rp) {
- rp->gain_control()->set_value (1.0, Controllable::NoGroup);
+ set_axis_targets_for_operation ();
+
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
+ boost::shared_ptr<Stripable> s = r->stripable();
+ if (s) {
+ boost::shared_ptr<AutomationControl> ac = s->gain_control();
+ if (ac) {
+ ac->set_value (1.0, Controllable::UseGroup);
+ }
}
}
}
void
MixerActor::copy_processors ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->copy_processors ();
void
MixerActor::cut_processors ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->cut_processors ();
void
MixerActor::paste_processors ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->paste_processors ();
void
MixerActor::select_all_processors ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->select_all_processors ();
void
MixerActor::toggle_processors ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->toggle_processors ();
void
MixerActor::ab_plugins ()
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->ab_plugins ();
void
MixerActor::vca_assign (boost::shared_ptr<VCA> vca)
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
#if 0
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->vca_assign (vca);
void
MixerActor::vca_unassign (boost::shared_ptr<VCA> vca)
{
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
#if 0
- BOOST_FOREACH(RouteUI* r, _route_targets) {
+ BOOST_FOREACH(AxisView* r, _axis_targets) {
MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
if (ms) {
ms->vca_unassign (vca);
protected:
Gtkmm2ext::ActionMap myactions;
RouteProcessorSelection _selection;
- RouteUISelection _route_targets;
+ AxisViewSelection _axis_targets;
- virtual void set_route_targets_for_operation () = 0;
+ virtual void set_axis_targets_for_operation () = 0;
void vca_assign (boost::shared_ptr<ARDOUR::VCA>);
void vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
MixerGroupTabs::selected_routes () const
{
RouteList rl;
- BOOST_FOREACH (RouteUI* r, _mixer->selection().routes) {
- boost::shared_ptr<Route> rp = r->route();
+ BOOST_FOREACH (AxisView* r, _mixer->selection().axes) {
+ boost::shared_ptr<Route> rp = boost::dynamic_pointer_cast<Route> (r->stripable());
if (rp) {
rl.push_back (rp);
}
}
void
-MixerStrip::show_selected ()
+MixerStrip::set_selected (bool yn)
{
+ AxisView::set_selected (yn);
+
if (selected()) {
global_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
global_frame.set_name ("MixerStripSelectedFrame");
bool marked_for_display () const;
bool set_marked_for_display (bool);
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
+
void set_width_enum (Width, void* owner);
Width get_width_enum () const { return _width; }
void* width_owner () const { return _width_owner; }
void toggle_processors ();
void ab_plugins ();
- void show_selected ();
+ void set_selected (bool yn);
static MixerStrip* entered_mixer_strip() { return _entered_mixer_strip; }
_selection.clear_routes ();
for (TrackViewList::iterator i = s.begin(); i != s.end(); ++i) {
- RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
- if (rtav) {
- MixerStrip* ms = strip_by_route (rtav->route());
- if (ms) {
- _selection.add (ms);
+ TimeAxisView* tav = dynamic_cast<TimeAxisView*> (*i);
+ if (tav) {
+ AxisView* axis = axis_by_stripable (tav->stripable());
+ if (axis) {
+ _selection.add (axis);
}
}
}
MixerStrip*
-Mixer_UI::strip_by_route (boost::shared_ptr<Route> r)
+Mixer_UI::strip_by_route (boost::shared_ptr<Route> r) const
{
- for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ for (list<MixerStrip *>::const_iterator i = strips.begin(); i != strips.end(); ++i) {
if ((*i)->route() == r) {
return (*i);
}
return 0;
}
+AxisView*
+Mixer_UI::axis_by_stripable (boost::shared_ptr<Stripable> s) const
+{
+ for (list<MixerStrip *>::const_iterator i = strips.begin(); i != strips.end(); ++i) {
+ if ((*i)->stripable() == s) {
+ return (*i);
+ }
+ }
+
+ return 0;
+}
+
bool
Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
{
/* primary-click: toggle selection state of strip */
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_selection.remove (strip);
- } else if (_selection.routes.size() > 1) {
+ } else if (_selection.axes.size() > 1) {
/* de-select others */
_selection.set (strip);
}
}
void
-Mixer_UI::set_route_targets_for_operation ()
+Mixer_UI::set_axis_targets_for_operation ()
{
- _route_targets.clear ();
+ _axis_targets.clear ();
if (!_selection.empty()) {
- _route_targets = _selection.routes;
+ _axis_targets = _selection.axes;
return;
}
boost::shared_ptr<RouteList> rl (new RouteList);
bool onoff = false;
- set_route_targets_for_operation ();
+ set_axis_targets_for_operation ();
- for (RouteUISelection::iterator r = _route_targets.begin(); r != _route_targets.end(); ++r) {
- boost::shared_ptr<MidiTrack> mt = (*r)->midi_track();
+ for (AxisViewSelection::iterator r = _axis_targets.begin(); r != _axis_targets.end(); ++r) {
+ boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> ((*r)->stripable());
if (mt) {
- rl->push_back ((*r)->route());
+ rl->push_back (mt);
onoff = !mt->input_active();
}
}
Gtk::Menu* m = manage (new Menu);
MenuList& items = m->items ();
- if (_selection.routes.empty()) {
+ if (_selection.axes.empty()) {
items.push_back (MenuElem (_("No Track/Bus is selected.")));
} else {
items.push_back (MenuElem (_("Add at the top"),
void
Mixer_UI::add_favorite_processor (ARDOUR::PluginPresetPtr ppp, ProcessorPosition pos)
{
- if (!_session || _selection.routes.empty()) {
+ if (!_session || _selection.axes.empty()) {
return;
}
PluginInfoPtr pip = ppp->_pip;
- for (RouteUISelection::iterator i = _selection.routes.begin(); i != _selection.routes.end(); ++i) {
- boost::shared_ptr<ARDOUR::Route> rt = (*i)->route();
- if (!rt) { continue; }
+ for (AxisViewSelection::iterator i = _selection.axes.begin(); i != _selection.axes.end(); ++i) {
+ boost::shared_ptr<ARDOUR::Route> rt = boost::dynamic_pointer_cast<ARDOUR::Route> ((*i)->stripable());
+
+ if (!rt) {
+ continue;
+ }
PluginPtr p = pip->load (*_session);
- if (!p) { continue; }
+
+ if (!p) {
+ continue;
+ }
if (ppp->_preset.valid) {
p->load_preset (ppp->_preset);
sigc::signal1<void,boost::shared_ptr<ARDOUR::VCA> > show_vca_change;
protected:
- void set_route_targets_for_operation ();
+ void set_axis_targets_for_operation ();
private:
Mixer_UI ();
void add_masters (ARDOUR::VCAList&);
void remove_master (VCAMasterStrip*);
- MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route>);
+ MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route>) const;
+ AxisView* axis_by_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
void hide_all_strips (bool with_select);
void unselect_all_strips();
*/
for (list<RouteIOs>::iterator i = route_ios.begin(); i != route_ios.end(); ++i) {
- TimeAxisView* tv = PublicEditor::instance().axis_view_from_route (i->route);
+ TimeAxisView* tv = PublicEditor::instance().axis_view_from_stripable (i->route);
/* Work out which group to put these IOs' bundles in */
boost::shared_ptr<PortGroup> g;
class RouteGroup;
class Trimmable;
class Movable;
+ class Stripable;
}
namespace Gtk {
virtual ArdourCanvas::GtkCanvasViewport* get_track_canvas() const = 0;
- virtual TimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const = 0;
+ virtual TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const = 0;
virtual void set_current_trimmable (boost::shared_ptr<ARDOUR::Trimmable>) = 0;
virtual void set_current_movable (boost::shared_ptr<ARDOUR::Movable>) = 0;
{
if (&other != this) {
processors = other.processors;
- routes = other.routes;
+ axes = other.axes;
}
return *this;
}
operator== (const RouteProcessorSelection& a, const RouteProcessorSelection& b)
{
// XXX MUST TEST PROCESSORS SOMEHOW
- return a.routes == b.routes;
+ return a.axes == b.axes;
}
void
void
RouteProcessorSelection::clear_routes ()
{
- for (RouteUISelection::iterator i = routes.begin(); i != routes.end(); ++i) {
+ for (AxisViewSelection::iterator i = axes.begin(); i != axes.end(); ++i) {
(*i)->set_selected (false);
}
- routes.clear ();
+ axes.clear ();
drop_connections ();
if (!_no_route_change_signal) {
RoutesChanged ();
}
void
-RouteProcessorSelection::add (RouteUI* r)
+RouteProcessorSelection::add (AxisView* r)
{
- if (find (routes.begin(), routes.end(), r) == routes.end()) {
- if (routes.insert (r).second) {
- r->set_selected (true);
+ if (axes.insert (r).second) {
- MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+ r->set_selected (true);
- if (ms) {
- ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
- }
+ MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
- if (!_no_route_change_signal) {
- RoutesChanged();
- }
+ if (ms) {
+ ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
+ }
+
+ if (!_no_route_change_signal) {
+ RoutesChanged();
}
}
}
void
-RouteProcessorSelection::remove (RouteUI* r)
+RouteProcessorSelection::remove (AxisView* r)
{
ENSURE_GUI_THREAD (*this, &RouteProcessorSelection::remove, r);
- RouteUISelection::iterator i;
- if ((i = find (routes.begin(), routes.end(), r)) != routes.end()) {
+ AxisViewSelection::iterator i;
+ if ((i = find (axes.begin(), axes.end(), r)) != axes.end()) {
(*i)->set_selected (false);
- routes.erase (i);
+ axes.erase (i);
if (!_no_route_change_signal) {
RoutesChanged ();
}
}
void
-RouteProcessorSelection::set (RouteUI* r)
+RouteProcessorSelection::set (AxisView* r)
{
clear_routes ();
add (r);
}
bool
-RouteProcessorSelection::selected (RouteUI* r)
+RouteProcessorSelection::selected (AxisView* r)
{
- return find (routes.begin(), routes.end(), r) != routes.end();
+ return find (axes.begin(), axes.end(), r) != axes.end();
}
bool
RouteProcessorSelection::empty ()
{
- return processors.empty () && routes.empty ();
+ return processors.empty () && axes.empty ();
}
void
{
public:
ProcessorSelection processors;
- RouteUISelection routes;
+ AxisViewSelection axes;
RouteProcessorSelection();
void set (XMLNode* node);
void add (XMLNode* node);
- void set (RouteUI*);
- void add (RouteUI*);
- void remove (RouteUI*);
+ void set (AxisView*);
+ void add (AxisView*);
+ void remove (AxisView*);
void clear_processors ();
void clear_routes ();
- bool selected (RouteUI*);
+ bool selected (AxisView*);
private:
- void removed (RouteUI*);
+ void removed (AxisView*);
bool _no_route_change_signal;
};
}
}
-PresentationInfo const &
-RouteTimeAxisView::presentation_info () const
-{
- return _route->presentation_info();
-}
-
-boost::shared_ptr<Stripable>
-RouteTimeAxisView::stripable () const
-{
- return _route;
-}
-
Gdk::Color
RouteTimeAxisView::color () const
{
bool marked_for_display () const;
bool set_marked_for_display (bool);
- void set_route (boost::shared_ptr<ARDOUR::Route>);
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
- boost::shared_ptr<ARDOUR::Stripable> stripable() const;
- ARDOUR::PresentationInfo const & presentation_info () const;
+ void set_route (boost::shared_ptr<ARDOUR::Route>);
void show_selection (TimeSelection&);
void set_button_names ();
route_color_changed ();
}
}
-
- if (what_changed.contains (Properties::selected)) {
- show_selected ();
- }
-}
-
-void
-RouteUI::set_selected (bool yn)
-{
- Selectable::set_selected (yn);
- if (_route) {
- _route->presentation_info().set_selected (yn);
- }
-}
-
-bool
-RouteUI::selected () const
-{
- /* XXX not sure if this is a wise design. Probably don't really want
- * the cached _selected value from Selectable.
- */
-
- if (!_route) {
- return _selected;
- }
-
- return _route->presentation_info().selected();
}
void
}
return false;
}
+
+boost::shared_ptr<Stripable>
+RouteUI::stripable () const
+{
+ return _route;
+}
+
PBD::ScopedConnection going_away_connection;
};
-class RouteUI : public virtual ARDOUR::SessionHandlePtr, public virtual Selectable, public virtual PBD::ScopedConnectionList
+class RouteUI : public virtual ARDOUR::SessionHandlePtr, public virtual PBD::ScopedConnectionList, public virtual Selectable, public virtual sigc::trackable
{
public:
RouteUI (ARDOUR::Session*);
virtual ~RouteUI();
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+
virtual void set_route (boost::shared_ptr<ARDOUR::Route>);
virtual void set_button_names () = 0;
Gdk::Color route_color () const;
void choose_color ();
- bool selected () const;
- void set_selected (bool);
-
bool ignore_toggle;
bool wait_for_release;
bool multiple_mute_change;
#include <set>
-class RouteUI;
+class AxisView;
-struct RouteUISelection : std::set<RouteUI*> {};
+struct AxisViewSelection : std::set<AxisView*> {};
#endif /* __ardour_gtk_route_ui_selection_h__ */
return _selected;
}
- virtual void show_selected() {}
-
protected:
bool _selected;
};
#include "ardour/playlist.h"
#include "ardour/rc_configuration.h"
+#include "control_protocol/control_protocol.h"
+
#include "audio_region_view.h"
#include "debug.h"
#include "gui_thread.h"
if ((i = find (tracks.begin(), tracks.end(), track)) != tracks.end()) {
track->set_selected (false);
tracks.erase (i);
+
if (!_no_tracks_changed) {
TracksChanged();
}
}
void
-TimeAxisView::show_selected ()
+TimeAxisView::set_selected (bool yn)
{
- if (selected()) {
+ if (yn == selected()) {
+ return;
+ }
+
+ Selectable::set_selected (yn);
+
+ if (_selected) {
time_axis_frame.set_shadow_type (Gtk::SHADOW_IN);
time_axis_frame.set_name ("MixerStripSelectedFrame");
controls_ebox.set_name (controls_base_selected_name);
}
time_axis_frame.show();
+
}
void
static void setup_sizes ();
- virtual boost::shared_ptr<ARDOUR::Stripable> stripable() const = 0;
- virtual ARDOUR::PresentationInfo const & presentation_info () const = 0;
-
/** @return index of this TimeAxisView within its parent */
int order () const { return _order; }
/** @return true if hidden, otherwise false */
bool hidden () const { return _hidden; }
+ void set_selected (bool);
+
virtual bool selectable() const { return true; }
/**
void build_size_menu ();
- protected:
- void show_selected ();
-
private:
Gtk::VBox* control_parent;
int _order;
*/
#include <algorithm>
+
#include "ardour/route_group.h"
+#include "control_protocol/control_protocol.h"
+
#include "track_selection.h"
#include "time_axis_view.h"
#include "public_editor.h"
return added;
}
-
}
return false;
}
+
+PresentationInfo const &
+VCAMasterStrip::presentation_info () const
+{
+ return _vca->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+VCAMasterStrip::stripable () const
+{
+ return _vca;
+}
+
VCAMasterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::VCA>);
~VCAMasterStrip ();
+ boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+ ARDOUR::PresentationInfo const & presentation_info () const;
+
std::string name() const;
Gdk::Color color () const;
std::string state_id() const;