ignore_toggle = false;
- mute_button->set_name ("TrackMuteButton");
- solo_button->set_name ("SoloButton");
edit_group_button.set_name ("TrackGroupButton");
playlist_button.set_name ("TrackPlaylistButton");
automation_button.set_name ("TrackAutomationButton");
visual_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::visual_click));
hide_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::hide_click));
- solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press));
+ solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press), false);
solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release));
- mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press));
+ mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press), false);
mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release));
if (is_track()) {
}
rec_enable_button->show_all ();
- rec_enable_button->set_name ("TrackRecordEnableButton");
- rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press));
+ rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press), false);
+ rec_enable_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::rec_enable_release));
controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
ARDOUR_UI::instance()->tooltips().set_tip(*rec_enable_button, _("Record"));
}
/* remove focus from the buttons */
- automation_button.unset_flags (Gtk::CAN_FOCUS);
- solo_button->unset_flags (Gtk::CAN_FOCUS);
- mute_button->unset_flags (Gtk::CAN_FOCUS);
- edit_group_button.unset_flags (Gtk::CAN_FOCUS);
- size_button.unset_flags (Gtk::CAN_FOCUS);
- playlist_button.unset_flags (Gtk::CAN_FOCUS);
- hide_button.unset_flags (Gtk::CAN_FOCUS);
- visual_button.unset_flags (Gtk::CAN_FOCUS);
-
- /* map current state of the route */
-
- update_diskstream_display ();
- redirects_changed (0);
- reset_redirect_automation_curves ();
y_position = -1;
+ _route->mute_changed.connect (mem_fun(*this, &RouteUI::mute_changed));
+ _route->solo_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
_route->redirects_changed.connect (mem_fun(*this, &RouteTimeAxisView::redirects_changed));
_route->name_changed.connect (mem_fun(*this, &RouteTimeAxisView::route_name_changed));
+ _route->solo_safe_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
+
if (is_track()) {
track()->DiskstreamChanged.connect (mem_fun(*this, &RouteTimeAxisView::diskstream_changed));
get_diskstream()->SpeedChanged.connect (mem_fun(*this, &RouteTimeAxisView::speed_changed));
- /* ask for notifications of any new RegionViews */
- // FIXME: _view is NULL, but it would be nice to attach this here :/
- //_view->RegionViewAdded.connect (mem_fun(*this, &RouteTimeAxisView::region_view_added));
- //_view->attach ();
-
/* pick up the correct freeze state */
map_frozen ();
editor.ZoomChanged.connect (mem_fun(*this, &RouteTimeAxisView::reset_samples_per_unit));
ColorChanged.connect (mem_fun (*this, &RouteTimeAxisView::color_handler));
-
}
RouteTimeAxisView::~RouteTimeAxisView ()
}
void
-RouteTimeAxisView::set_playlist (Playlist *newplaylist)
+RouteTimeAxisView::post_construct ()
+{
+ /* map current state of the route */
+
+ update_diskstream_display ();
+ _route->foreach_redirect (this, &RouteTimeAxisView::add_redirect_to_subplugin_menu);
+ _route->foreach_redirect (this, &RouteTimeAxisView::add_existing_redirect_automation_curves);
+ reset_redirect_automation_curves ();
+}
+
+void
+RouteTimeAxisView::set_playlist (boost::shared_ptr<Playlist> newplaylist)
{
- Playlist *pl = playlist();
+ boost::shared_ptr<Playlist> pl = playlist();
assert(pl);
modified_connection.disconnect ();
label_view ();
if (is_track()) {
- set_playlist (dynamic_cast<Playlist*>(get_diskstream()->playlist()));
+ set_playlist (get_diskstream()->playlist());
}
}
static bool __reset_item (RadioMenuItem* item)
{
- cerr << "reset item to true\n";
item->set_active ();
return false;
}
ensure_xml_node ();
- _view->set_height ((double) height);
+ if (_view) {
+ _view->set_height ((double) height);
+ }
switch (height_style) {
case Largest:
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<Playlist> pl = ds->playlist();
if (!pl)
return;
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<const Playlist> pl = ds->playlist();
if (!pl)
return;
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<const Playlist> pl = ds->playlist();
if (!pl)
return;
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<Playlist> pl = ds->playlist();
if (!pl)
return;
- editor.clear_playlist (*pl);
+ editor.clear_playlist (pl);
}
void
void
RouteTimeAxisView::selection_click (GdkEventButton* ev)
{
+ if (Keyboard::modifier_state_equals (ev->state, (Keyboard::Shift|Keyboard::Control))) {
+
+ /* special case: select/deselect all tracks */
+ if (editor.get_selection().selected (this)) {
+ editor.get_selection().clear_tracks ();
+ } else {
+ editor.select_all_tracks ();
+ }
+
+ return;
+ }
+
PublicEditor::TrackViewList* tracks = editor.get_valid_views (this, _route->edit_group());
switch (Keyboard::selection_type (ev->state)) {
break;
case Selection::Extend:
- /* not defined yet */
+ if (tracks->size() > 1) {
+ /* add each one, do not "extend" */
+ editor.get_selection().add (*tracks);
+ } else {
+ /* extend to the single track */
+ editor.extend_selection_to_track (*tracks->front());
+ }
break;
case Selection::Add:
void
RouteTimeAxisView::set_selected_regionviews (RegionSelection& regions)
{
- _view->set_selected_regionviews (regions);
+ if (_view) {
+ _view->set_selected_regionviews (regions);
+ }
}
+/** Add the selectable things that we have to a list.
+ * @param results List to add things to.
+ */
void
RouteTimeAxisView::get_selectables (nframes_t start, nframes_t end, double top, double bot, list<Selectable*>& results)
{
return _route->name();
}
-Playlist *
+boost::shared_ptr<Playlist>
RouteTimeAxisView::playlist () const
{
boost::shared_ptr<Diskstream> ds;
if ((ds = get_diskstream()) != 0) {
return ds->playlist();
} else {
- return 0;
+ return boost::shared_ptr<Playlist> ();
}
}
RouteTimeAxisView::find_next_region (nframes_t pos, RegionPoint point, int32_t dir)
{
boost::shared_ptr<Diskstream> stream;
- Playlist *playlist;
+ boost::shared_ptr<Playlist> playlist;
if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) {
return playlist->find_next_region (pos, point, dir);
bool
RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
{
- Playlist* what_we_got;
+ boost::shared_ptr<Playlist> what_we_got;
boost::shared_ptr<Diskstream> ds = get_diskstream();
- Playlist* playlist;
+ boost::shared_ptr<Playlist> playlist;
bool ret = false;
if (ds == 0) {
playlist = ds->playlist();
-
TimeSelection time (selection.time);
float speed = ds->speed();
if (speed != 1.0f) {
case Cut:
if ((what_we_got = playlist->cut (time)) != 0) {
editor.get_cut_buffer().add (what_we_got);
- _session.add_command( new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
+ _session.add_command( new MementoCommand<Playlist>(*playlist.get(), &before, &playlist->get_state()));
ret = true;
}
break;
case Clear:
if ((what_we_got = playlist->cut (time)) != 0) {
_session.add_command( new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
- what_we_got->unref ();
+ what_we_got->release ();
ret = true;
}
break;
return false;
}
- Playlist* playlist = get_diskstream()->playlist();
+ boost::shared_ptr<Playlist> playlist = get_diskstream()->playlist();
PlaylistSelection::iterator p;
for (p = selection.playlists.begin(); p != selection.playlists.end() && nth; ++p, --nth);
pos = session_frame_to_track_frame(pos, get_diskstream()->speed() );
XMLNode &before = playlist->get_state();
- playlist->paste (**p, pos, times);
+ playlist->paste (*p, pos, times);
_session.add_command( new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
return true;
playlist_menu = new Menu;
playlist_menu->set_name ("ArdourContextMenu");
- vector<Playlist*> playlists;
+ vector<boost::shared_ptr<Playlist> > playlists;
boost::shared_ptr<Diskstream> ds = get_diskstream();
RadioMenuItem::Group playlist_group;
_session.get_playlists (playlists);
- for (vector<Playlist*>::iterator i = playlists.begin(); i != playlists.end(); ++i) {
+ for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
if ((*i)->get_orig_diskstream_id() == ds->id()) {
- playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), (*i))));
+ playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist),
+ boost::weak_ptr<Playlist> (*i))));
if (ds->playlist()->id() == (*i)->id()) {
static_cast<RadioMenuItem*>(&playlist_items.back())->set_active();
}
} else if (ds->playlist()->id() == (*i)->id()) {
- playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), (*i))));
+ playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist),
+ boost::weak_ptr<Playlist>(*i))));
static_cast<RadioMenuItem*>(&playlist_items.back())->set_active();
}
}
-
-
playlist_items.push_back (SeparatorElem());
playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
playlist_items.push_back (SeparatorElem());
}
void
-RouteTimeAxisView::use_playlist (Playlist* pl)
+RouteTimeAxisView::use_playlist (boost::weak_ptr<Playlist> wpl)
{
- AudioPlaylist* apl = dynamic_cast<AudioPlaylist*> (pl);
-
assert (is_track());
+ boost::shared_ptr<Playlist> pl (wpl.lock());
+
+ if (!pl) {
+ return;
+ }
+
+ boost::shared_ptr<AudioPlaylist> apl = boost::dynamic_pointer_cast<AudioPlaylist> (pl);
+
if (apl) {
get_diskstream()->use_playlist (apl);
}
add_child (ran->view);
- _view->foreach_regionview (bind (mem_fun(*this, &RouteTimeAxisView::add_ghost_to_redirect), ran->view));
+ if (_view) {
+ _view->foreach_regionview (bind (mem_fun(*this, &RouteTimeAxisView::add_ghost_to_redirect), ran->view));
+ }
redirect->mark_automation_visible (what, true);
}
}
}
+void
+RouteTimeAxisView::update_rec_display ()
+{
+ RouteUI::update_rec_display ();
+ name_entry.set_sensitive (!_route->record_enabled());
+}
+