#include <gtkmm2ext/utils.h>
#include <ardour/playlist.h>
+#include <ardour/audioplaylist.h>
#include <ardour/diskstream.h>
#include <ardour/insert.h>
#include <ardour/ladspa_plugin.h>
#include <ardour/session.h>
#include <ardour/session_playlist.h>
#include <ardour/utils.h>
+#include <ardour/profile.h>
#include "ardour_ui.h"
#include "route_time_axis.h"
#include "gui_thread.h"
#include "keyboard.h"
#include "playlist_selector.h"
-#include "plugin_selector.h"
-#include "plugin_ui.h"
#include "point_selection.h"
#include "prompter.h"
#include "public_editor.h"
playlist_button (_("p")),
size_button (_("h")), // height
automation_button (_("a")),
- visual_button (_("v"))
+ visual_button (_("v")),
+ lm (rt, sess)
{
+ lm.set_no_show_all();
+ lm.setup_meters(50);
_has_state = true;
playlist_menu = 0;
playlist_action_menu = 0;
ignore_toggle = false;
- mute_button->set_active (false);
- solo_button->set_active (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.set_name ("TrackVisualButton");
hide_button.set_name ("TrackRemoveButton");
- hide_button.add (*(manage (new Image (get_xpm("small_x.xpm")))));
-
- solo_button->signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- mute_button->signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- playlist_button.signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- automation_button.signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- size_button.signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- visual_button.signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- hide_button.signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
+ hide_button.add (*(manage (new Image (::get_icon("hide")))));
+ hide_button.show_all ();
- 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), false);
- 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), false);
edit_group_button.signal_button_release_event().connect (mem_fun(*this, &RouteTimeAxisView::edit_click), false);
playlist_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::playlist_click));
automation_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::automation_click));
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), 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), false);
+ mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release));
+
if (is_track()) {
- rec_enable_button->set_active (false);
- rec_enable_button->set_name ("TrackRecordEnableButton");
- rec_enable_button->signal_button_press_event().connect (mem_fun (*this, &RouteTimeAxisView::select_me), false);
- rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press));
- controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+
+ /* use icon */
+
+ rec_enable_button->remove ();
+ switch (track()->mode()) {
+ case ARDOUR::Normal:
+ rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red"))))));
+ break;
+ case ARDOUR::Destructive:
+ rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red"))))));
+ break;
+ }
+ rec_enable_button->show_all ();
+
+ 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, 4, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
ARDOUR_UI::instance()->tooltips().set_tip(*rec_enable_button, _("Record"));
+
}
- controls_table.attach (*mute_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
- controls_table.attach (*solo_button, 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::FILL|Gtk::EXPAND, 0, 0);
+ controls_hbox.pack_start(lm, false, false);
+ _route->meter_change.connect (mem_fun(*this, &RouteTimeAxisView::meter_changed));
+ _route->input_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
+ _route->output_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
+
+ controls_table.attach (*mute_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+ controls_table.attach (*solo_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
controls_table.attach (edit_group_button, 6, 7, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
/* 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 ();
- solo_changed(0);
- mute_changed(0);
- //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()->TrackModeChanged.connect (mem_fun(*this, &RouteTimeAxisView::track_mode_changed));
track()->FreezeChange.connect (mem_fun(*this, &RouteTimeAxisView::map_frozen));
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));
+ ColorsChanged.connect (mem_fun (*this, &RouteTimeAxisView::color_handler));
}
RouteTimeAxisView::~RouteTimeAxisView ()
}
void
-RouteTimeAxisView::set_playlist (Playlist *newplaylist)
+RouteTimeAxisView::post_construct ()
{
- Playlist *pl = playlist();
+ /* 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)
+{
+ boost::shared_ptr<Playlist> pl = playlist();
assert(pl);
modified_connection.disconnect ();
- state_changed_connection.disconnect ();
-
- state_changed_connection = pl->StateChanged.connect (mem_fun(*this, &RouteTimeAxisView::playlist_state_changed));
modified_connection = pl->Modified.connect (mem_fun(*this, &RouteTimeAxisView::playlist_modified));
}
gint
RouteTimeAxisView::edit_click (GdkEventButton *ev)
{
- if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_route->set_edit_group (0, this);
return FALSE;
}
MenuList &items = edit_group_menu.items();
- cerr << "adding edit group " << eg->name() << endl;
-
items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), eg)));
if (_route->edit_group() == eg) {
static_cast<RadioMenuItem*>(&items.back())->set_active ();
void
RouteTimeAxisView::set_edit_group_from_menu (RouteGroup *eg)
-
{
_route->set_edit_group (eg, this);
}
-void
-RouteTimeAxisView::playlist_state_changed (Change ignored)
-{
- // ENSURE_GUI_THREAD (bind (mem_fun(*this, &RouteTimeAxisView::playlist_state_changed), ignored));
- // why are we here ?
-}
-
void
RouteTimeAxisView::playlist_changed ()
-
{
label_view ();
if (is_track()) {
- set_playlist (dynamic_cast<Playlist*>(get_diskstream()->playlist()));
+ set_playlist (get_diskstream()->playlist());
}
}
{
// always build a new action menu
- if (playlist_action_menu == 0) {
- playlist_action_menu = new Menu;
- playlist_action_menu->set_name ("ArdourContextMenu");
- }
-
- build_playlist_menu(playlist_action_menu);
+ if (playlist_action_menu != 0) {
+ delete playlist_action_menu;
+ }
- playlist_action_menu->popup (1, 0);
+ playlist_action_menu = new Menu;
+ playlist_action_menu->set_name ("ArdourContextMenu");
+
+ build_playlist_menu (playlist_action_menu);
+ editor.set_selected_track (*this, Selection::Add);
+ playlist_action_menu->popup (1, gtk_get_current_event_time());
}
void
*/
build_display_menu ();
}
- automation_action_menu->popup (1, 0);
+ editor.set_selected_track (*this, Selection::Add);
+ automation_action_menu->popup (1, gtk_get_current_event_time());
}
void
items.push_back (SeparatorElem());
build_remote_control_menu ();
- items.push_back (MenuElem (_("Remote Control ID"), *remote_control_menu));
+ if (!Profile->get_sae()) {
+ items.push_back (MenuElem (_("Remote Control ID"), *remote_control_menu));
+ }
build_automation_action_menu ();
items.push_back (MenuElem (_("Automation"), *automation_action_menu));
if (get_diskstream()->alignment_style() == CaptureTime)
align_capture_item->set_active();
- items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+ if (!Profile->get_sae()) {
+ items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+ get_diskstream()->AlignmentStyleChanged.connect (mem_fun(*this, &RouteTimeAxisView::align_style_changed));
+ }
- get_diskstream()->AlignmentStyleChanged.connect (
- mem_fun(*this, &RouteTimeAxisView::align_style_changed));
+ RadioMenuItem::Group mode_group;
+ items.push_back (RadioMenuElem (mode_group, _("Normal mode"),
+ bind (mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal)));
+ normal_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
+ items.push_back (RadioMenuElem (mode_group, _("Tape mode"),
+ bind (mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive)));
+ destructive_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
+
+
+ switch (track()->mode()) {
+ case ARDOUR::Destructive:
+ destructive_track_mode_item->set_active ();
+ break;
+ case ARDOUR::Normal:
+ normal_track_mode_item->set_active ();
+ break;
+ }
}
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Remove"), mem_fun(*this, &RouteUI::remove_this_route)));
}
+static bool __reset_item (RadioMenuItem* item)
+{
+ item->set_active ();
+ return false;
+}
+
+void
+RouteTimeAxisView::set_track_mode (TrackMode mode)
+{
+ RadioMenuItem* item;
+ RadioMenuItem* other_item;
+
+ switch (mode) {
+ case ARDOUR::Normal:
+ item = normal_track_mode_item;
+ other_item = destructive_track_mode_item;
+ break;
+ case ARDOUR::Destructive:
+ item = destructive_track_mode_item;
+ other_item = normal_track_mode_item;
+ break;
+ default:
+ fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", mode) << endmsg;
+ /*NOTREACHED*/
+ return;
+ }
+
+ if (item->get_active () && track()->mode() != mode) {
+ _set_track_mode (track(), mode, other_item);
+ }
+}
+
+void
+RouteTimeAxisView::_set_track_mode (boost::shared_ptr<Track> track, TrackMode mode, RadioMenuItem* reset_item)
+{
+ bool needs_bounce;
+
+ if (!track->can_use_mode (mode, needs_bounce)) {
+
+ if (!needs_bounce) {
+ /* cannot be done */
+ Glib::signal_idle().connect (bind (sigc::ptr_fun (__reset_item), reset_item));
+ return;
+ } else {
+ cerr << "would bounce this one\n";
+ return;
+ }
+ }
+
+ track->set_mode (mode);
+
+ rec_enable_button->remove ();
+ switch (mode) {
+ case ARDOUR::Normal:
+ rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_normal_red"))))));
+ break;
+ case ARDOUR::Destructive:
+ rec_enable_button->add (*(manage (new Image (::get_icon (X_("record_tape_red"))))));
+ break;
+ }
+ rec_enable_button->show_all ();
+
+}
+
+void
+RouteTimeAxisView::track_mode_changed ()
+{
+ RadioMenuItem* item;
+
+ switch (track()->mode()) {
+ case ARDOUR::Normal:
+ item = normal_track_mode_item;
+ break;
+ case ARDOUR::Destructive:
+ item = destructive_track_mode_item;
+ break;
+ default:
+ fatal << string_compose (_("programming error: %1 %2"), "illegal track mode in RouteTimeAxisView::set_track_mode", track()->mode()) << endmsg;
+ /*NOTREACHED*/
+ return;
+ }
+
+ item->set_active ();
+}
void
-RouteTimeAxisView::show_timestretch (jack_nframes_t start, jack_nframes_t end)
+RouteTimeAxisView::show_timestretch (nframes_t start, nframes_t end)
{
double x1;
double x2;
timestretch_rect->property_y1() = 0.0;
timestretch_rect->property_x2() = 0.0;
timestretch_rect->property_y2() = 0.0;
- timestretch_rect->property_fill_color_rgba() = color_map[cTimeStretchFill];
- timestretch_rect->property_outline_color_rgba() = color_map[cTimeStretchOutline];
+ timestretch_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchFill.get();
+ timestretch_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchOutline.get();
}
timestretch_rect->show ();
void
RouteTimeAxisView::set_height (TrackHeight h)
{
+ int gmlen = (height_to_pixels (h)) - 5;
bool height_changed = (height == 0) || (h != height_style);
-
+ lm.setup_meters (gmlen);
TimeAxisView::set_height (h);
ensure_xml_node ();
- _view->set_height ((double) height);
+ if (_view) {
+ _view->set_height ((double) height);
+ }
switch (height_style) {
case Largest:
case Large:
case Larger:
case Normal:
+ reset_meter();
show_name_entry ();
hide_name_label ();
- mute_button->show_all();
- solo_button->show_all();
+ mute_button->show();
+ solo_button->show();
if (rec_enable_button)
- rec_enable_button->show_all();
+ rec_enable_button->show();
- edit_group_button.show_all();
- hide_button.show_all();
- visual_button.show_all();
- size_button.show_all();
- automation_button.show_all();
+ edit_group_button.show();
+ hide_button.show();
+ visual_button.show();
+ size_button.show();
+ automation_button.show();
if (is_track() && track()->mode() == ARDOUR::Normal) {
- playlist_button.show_all();
+ playlist_button.show();
}
break;
case Smaller:
+ reset_meter();
show_name_entry ();
hide_name_label ();
- mute_button->show_all();
- solo_button->show_all();
+ mute_button->show();
+ solo_button->show();
if (rec_enable_button)
- rec_enable_button->show_all();
+ rec_enable_button->show();
edit_group_button.hide ();
hide_button.hide ();
break;
case Small:
+ hide_meter ();
hide_name_entry ();
show_name_label ();
void
RouteTimeAxisView::set_align_style (AlignStyle style)
{
- get_diskstream()->set_align_style (style);
+ RadioMenuItem* item;
+
+ switch (style) {
+ case ExistingMaterial:
+ item = align_existing_item;
+ break;
+ case CaptureTime:
+ item = align_capture_item;
+ break;
+ default:
+ fatal << string_compose (_("programming error: %1 %2"), "illegal align style in RouteTimeAxisView::set_align_style", style) << endmsg;
+ /*NOTREACHED*/
+ return;
+ }
+
+ if (item->get_active()) {
+ get_diskstream()->set_align_style (style);
+ }
}
void
ArdourPrompter prompter (true);
string name;
- Diskstream *const ds = get_diskstream();
+ boost::shared_ptr<Diskstream> ds = get_diskstream();
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<Playlist> pl = ds->playlist();
if (!pl)
return;
{
string name;
- Diskstream *const ds = get_diskstream();
+ boost::shared_ptr<Diskstream> ds = get_diskstream();
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<const Playlist> pl = ds->playlist();
if (!pl)
return;
- name = Playlist::bump_name (pl->name(), _session);
+ name = pl->name();
+
+ do {
+ name = Playlist::bump_name (name, _session);
+ } while (_session.playlist_by_name(name));
+
+ // TODO: The prompter "new" button should be de-activated if the user
+ // specifies a playlist name which already exists in the session.
if (prompt) {
prompter.set_prompt (_("Name for Playlist"));
prompter.set_initial_text (name);
prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
- prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true);
prompter.show_all ();
switch (prompter.run ()) {
if (name.length()) {
ds->use_copy_playlist ();
- pl->set_name (name);
+ ds->playlist()->set_name (name);
}
}
{
string name;
- Diskstream *const ds = get_diskstream();
+ boost::shared_ptr<Diskstream> ds = get_diskstream();
if (!ds || ds->destructive())
return;
- Playlist *const pl = ds->playlist();
+ boost::shared_ptr<const Playlist> pl = ds->playlist();
if (!pl)
return;
- name = Playlist::bump_name (pl->name(), _session);
+ name = pl->name();
+
+ do {
+ name = Playlist::bump_name (name, _session);
+ } while (_session.playlist_by_name(name));
+
if (prompt) {
prompter.set_prompt (_("Name for Playlist"));
prompter.set_initial_text (name);
prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
- prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
-
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true);
+
switch (prompter.run ()) {
case Gtk::RESPONSE_ACCEPT:
prompter.get_result (name);
if (name.length()) {
ds->use_new_playlist ();
- pl->set_name (name);
+ ds->playlist()->set_name (name);
}
}
void
RouteTimeAxisView::clear_playlist ()
{
- Diskstream *const ds = get_diskstream();
+ boost::shared_ptr<Diskstream> ds = get_diskstream();
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::TertiaryModifier|Keyboard::PrimaryModifier))) {
+
+ /* 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)) {
case Selection::Toggle:
- /* XXX this is not right */
- editor.get_selection().add (*tracks);
+ editor.get_selection().toggle (*tracks);
break;
case Selection::Set:
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:
+ editor.get_selection().add (*tracks);
break;
}
void
RouteTimeAxisView::set_selected_regionviews (RegionSelection& regions)
{
- _view->set_selected_regionviews (regions);
+ if (_view) {
+ _view->set_selected_regionviews (regions);
+ }
}
void
-RouteTimeAxisView::get_selectables (jack_nframes_t start, jack_nframes_t end, double top, double bot, list<Selectable*>& results)
+RouteTimeAxisView::get_selectables (nframes_t start, nframes_t end, double top, double bot, list<Selectable*>& results)
{
double speed = 1.0;
speed = get_diskstream()->speed();
}
- jack_nframes_t start_adjusted = session_frame_to_track_frame(start, speed);
- jack_nframes_t end_adjusted = session_frame_to_track_frame(end, speed);
+ nframes_t start_adjusted = session_frame_to_track_frame(start, speed);
+ nframes_t end_adjusted = session_frame_to_track_frame(end, speed);
if (_view && ((top < 0.0 && bot < 0.0)) || touched (top, bot)) {
_view->get_selectables (start_adjusted, end_adjusted, results);
return _route->name();
}
-Playlist *
+boost::shared_ptr<Playlist>
RouteTimeAxisView::playlist () const
{
- Diskstream *ds;
+ boost::shared_ptr<Diskstream> ds;
if ((ds = get_diskstream()) != 0) {
return ds->playlist();
} else {
- return 0;
+ return boost::shared_ptr<Playlist> ();
}
}
return;
}
+ strip_whitespace_edges(x);
+
if (x.length() == 0) {
name_entry.set_text (_route->name());
return;
}
- strip_whitespace_edges(x);
-
if (_session.route_name_unique (x)) {
_route->set_name (x, this);
} else {
- ARDOUR_UI::instance()->popup_error (_("a track already exists with that name"));
+ ARDOUR_UI::instance()->popup_error (_("A track already exists with that name"));
name_entry.set_text (_route->name());
}
}
void
RouteTimeAxisView::hide_click ()
{
+ // LAME fix for hide_button refresh fix
+ hide_button.set_sensitive(false);
+
editor.hide_track_in_display (*this);
+
+ hide_button.set_sensitive(true);
}
-Region*
-RouteTimeAxisView::find_next_region (jack_nframes_t pos, RegionPoint point, int32_t dir)
+boost::shared_ptr<Region>
+RouteTimeAxisView::find_next_region (nframes_t pos, RegionPoint point, int32_t dir)
{
- Diskstream *stream;
- Playlist *playlist;
+ boost::shared_ptr<Diskstream> stream;
+ boost::shared_ptr<Playlist> playlist;
if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) {
return playlist->find_next_region (pos, point, dir);
}
- return 0;
+ return boost::shared_ptr<Region> ();
+}
+
+nframes64_t
+RouteTimeAxisView::find_next_region_boundary (nframes64_t pos, int32_t dir)
+{
+ boost::shared_ptr<Diskstream> stream;
+ boost::shared_ptr<Playlist> playlist;
+
+ if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) {
+ return playlist->find_next_region_boundary (pos, dir);
+ }
+
+ return -1;
}
bool
RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
{
- Playlist* what_we_got;
- Diskstream* ds = get_diskstream();
- Playlist* playlist;
+ boost::shared_ptr<Playlist> what_we_got;
+ boost::shared_ptr<Diskstream> ds = get_diskstream();
+ 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 ();
+ _session.add_command( new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
+ what_we_got->release ();
ret = true;
}
break;
}
bool
-RouteTimeAxisView::paste (jack_nframes_t pos, float times, Selection& selection, size_t nth)
+RouteTimeAxisView::paste (nframes_t pos, float times, Selection& selection, size_t nth)
{
if (!is_track()) {
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);
- _session.add_command( new MementoCommand<Playlist>(*playlist, before, playlist->get_state()));
+ playlist->paste (*p, pos, times);
+ _session.add_command( new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
return true;
}
if (playlist_menu) {
delete playlist_menu;
}
+
playlist_menu = new Menu;
playlist_menu->set_name ("ArdourContextMenu");
- playlist_items.push_back (MenuElem (string_compose (_("Current: %1"), get_diskstream()->playlist()->name())));
- playlist_items.push_back (SeparatorElem());
+ vector<boost::shared_ptr<Playlist> > playlists;
+ boost::shared_ptr<Diskstream> ds = get_diskstream();
+ RadioMenuItem::Group playlist_group;
+
+ _session.get_playlists (playlists);
+ 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),
+ 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),
+ 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());
- playlist_items.push_back (MenuElem (_("New"), mem_fun(editor, &PublicEditor::new_playlists)));
- playlist_items.push_back (MenuElem (_("New Copy"), mem_fun(editor, &PublicEditor::copy_playlists)));
+ playlist_items.push_back (MenuElem (_("New"), bind(mem_fun(editor, &PublicEditor::new_playlists), this)));
+ playlist_items.push_back (MenuElem (_("New Copy"), bind(mem_fun(editor, &PublicEditor::copy_playlists), this)));
playlist_items.push_back (SeparatorElem());
- playlist_items.push_back (MenuElem (_("Clear Current"), mem_fun(editor, &PublicEditor::clear_playlists)));
+ playlist_items.push_back (MenuElem (_("Clear Current"), bind(mem_fun(editor, &PublicEditor::clear_playlists), this)));
playlist_items.push_back (SeparatorElem());
- playlist_items.push_back (MenuElem(_("Select"), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
+ playlist_items.push_back (MenuElem(_("Select from all ..."), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
+}
+
+void
+RouteTimeAxisView::use_playlist (boost::weak_ptr<Playlist> wpl)
+{
+ 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);
+ }
}
void
}
void
-RouteTimeAxisView::color_handler (ColorID id, uint32_t val)
+RouteTimeAxisView::color_handler ()
{
- switch (id) {
- case cTimeStretchOutline:
- timestretch_rect->property_outline_color_rgba() = val;
- break;
- case cTimeStretchFill:
- timestretch_rect->property_fill_color_rgba() = val;
- break;
- default:
- break;
+ if (timestretch_rect) {
+ timestretch_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchOutline.get();
}
-}
-bool
-RouteTimeAxisView::select_me (GdkEventButton* ev)
-{
- editor.get_selection().add (this);
- return false;
+ if (timestretch_rect) {
+ timestretch_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchFill.get();
+ }
+
+ reset_meter();
}
void
legalize_for_xml_node (string str)
{
string::size_type pos;
- string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=:";
+ string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_=:";
string legal;
legal = str;
*redirect, what, _session, *ran->view,
*ran->view->canvas_display, redirect->automation_list (what));
- ral->set_line_color (color_map[cRedirectAutomationLine]);
+ ral->set_line_color (ARDOUR_UI::config()->canvasvar_RedirectAutomationLine.get());
ral->queue_reset ();
ran->view->add_line (*ral);
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());
+}
+
+void
+RouteTimeAxisView::fast_update ()
+{
+ lm.update_meters ();
+}
+
+void
+RouteTimeAxisView::hide_meter ()
+{
+ clear_meter ();
+ lm.hide_meters ();
+}
+
+void
+RouteTimeAxisView::show_meter ()
+{
+ reset_meter ();
+}
+
+void
+RouteTimeAxisView::reset_meter ()
+{
+ if (Config->get_show_track_meters()) {
+ lm.setup_meters (height-5);
+ } else {
+ hide_meter ();
+ }
+}
+
+void
+RouteTimeAxisView::clear_meter ()
+{
+ lm.clear_meters ();
+}
+
+void
+RouteTimeAxisView::meter_changed (void *src)
+{
+ ENSURE_GUI_THREAD (bind (mem_fun(*this, &RouteTimeAxisView::meter_changed), src));
+ reset_meter();
+}
+
+void
+RouteTimeAxisView::io_changed (IOChange change, void *src)
+{
+ reset_meter ();
+}