#include "ardour_ui.h"
#include "ardour_button.h"
+#include "audio_streamview.h"
#include "debug.h"
-#include "global_signals.h"
#include "route_time_axis.h"
#include "automation_time_axis.h"
#include "enums.h"
#include "rgb_macros.h"
#include "selection.h"
#include "streamview.h"
+#include "tooltips.h"
+#include "ui_config.h"
#include "utils.h"
#include "route_group_menu.h"
, gm (sess, true, 75, 14)
, _ignore_set_layer_display (false)
, gain_automation_item(NULL)
+ , trim_automation_item(NULL)
, mute_automation_item(NULL)
, pan_automation_item(NULL)
{
if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
meter_width = 6;
}
- gm.set_controls (_route, _route->shared_peak_meter(), _route->amp());
+ gm.set_controls (_route, _route->shared_peak_meter(), _route->amp(), _route->gain_control());
gm.get_level_meter().set_no_show_all();
gm.get_level_meter().setup_meters(50, meter_width);
gm.update_gain_sensitive ();
}
if (is_midi_track()) {
- ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record (Right-click for Step Edit)"));
+ set_tooltip(*rec_enable_button, _("Record (Right-click for Step Edit)"));
gm.set_fader_name ("MidiTrackFader");
} else {
- ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record"));
+ set_tooltip(*rec_enable_button, _("Record"));
gm.set_fader_name ("AudioTrackFader");
}
rec_enable_button->set_sensitive (_session->writable());
-
+
/* set playlist button tip to the current playlist, and make it update when it changes */
update_playlist_tip ();
track()->PlaylistChanged.connect (*this, invalidator (*this), ui_bind(&RouteTimeAxisView::update_playlist_tip, this), gui_context());
controls_table.attach (route_group_button, 4, 5, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
controls_table.attach (gm.get_gain_slider(), 0, 2, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 1, 0);
}
-
- ARDOUR_UI::instance()->set_tip(*solo_button,_("Solo"));
- ARDOUR_UI::instance()->set_tip(*mute_button,_("Mute"));
- ARDOUR_UI::instance()->set_tip(route_group_button, _("Route Group"));
+
+ set_tooltip(*solo_button,_("Solo"));
+ set_tooltip(*mute_button,_("Mute"));
+ set_tooltip(route_group_button, _("Route Group"));
mute_button->set_tweaks(ArdourButton::TrackHeader);
solo_button->set_tweaks(ArdourButton::TrackHeader);
route_group_button.set_tweaks(ArdourButton::TrackHeader);
if (is_midi_track()) {
- ARDOUR_UI::instance()->set_tip(automation_button, _("MIDI Controllers and Automation"));
+ set_tooltip(automation_button, _("MIDI Controllers and Automation"));
} else {
- ARDOUR_UI::instance()->set_tip(automation_button, _("Automation"));
+ set_tooltip(automation_button, _("Automation"));
}
update_track_number_visibility();
/* pick up the correct freeze state */
map_frozen ();
- }
+ }
_editor.ZoomChanged.connect (sigc::mem_fun(*this, &RouteTimeAxisView::reset_samples_per_pixel));
- ColorsChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::color_handler));
+ UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::color_handler));
PropertyList* plist = new PropertyList();
RouteTimeAxisView::~RouteTimeAxisView ()
{
cleanup_gui_properties ();
-
+
for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
delete *i;
}
sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection)));
/* Attach the plugin submenu. It may have previously been used elsewhere,
- so it was detached above
+ so it was detached above
*/
-
+
if (!subplugin_menu.items().empty()) {
items.push_back (SeparatorElem ());
items.push_back (MenuElem (_("Processor automation"), subplugin_menu));
if (gain_track) {
items.push_back (CheckMenuElem (_("Fader"), sigc::mem_fun (*this, &RouteTimeAxisView::update_gain_track_visibility)));
gain_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
- gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
+ gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
(gain_track && string_is_affirmative (gain_track->gui_property ("visible"))));
_main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item;
}
+ if (trim_track) {
+ items.push_back (CheckMenuElem (_("Trim"), sigc::mem_fun (*this, &RouteTimeAxisView::update_trim_track_visibility)));
+ trim_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+ trim_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
+ (trim_track && string_is_affirmative (trim_track->gui_property ("visible"))));
+
+ _main_automation_menu_map[Evoral::Parameter(TrimAutomation)] = trim_automation_item;
+ }
+
if (mute_track) {
items.push_back (CheckMenuElem (_("Mute"), sigc::mem_fun (*this, &RouteTimeAxisView::update_mute_track_visibility)));
mute_automation_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
- mute_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
+ mute_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) &&
(mute_track && string_is_affirmative (mute_track->gui_property ("visible"))));
_main_automation_menu_map[Evoral::Parameter(MuteAutomation)] = mute_automation_item;
items.push_back (SeparatorElem());
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog)));
- items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
- items.push_back (SeparatorElem());
- }
+ items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog)));
+ items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
+ items.push_back (SeparatorElem());
// Hook for derived classes to add type specific stuff
append_extra_display_menu_items ();
*/
_ignore_set_layer_display = true;
-
+
layers_items.push_back (RadioMenuElem (layers_group, _("Overlaid")));
RadioMenuItem* i = dynamic_cast<RadioMenuItem*> (&layers_items.back ());
i->set_active (overlaid != 0 && stacked == 0);
i->set_active (overlaid == 0 && stacked != 0);
i->set_inconsistent (overlaid != 0 && stacked != 0);
i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_layer_display), Stacked, true));
-
+
_ignore_set_layer_display = false;
items.push_back (MenuElem (_("Layers"), *layers_menu));
- if (!Profile->get_sae()) {
-
- Menu* alignment_menu = manage (new Menu);
- MenuList& alignment_items = alignment_menu->items();
- alignment_menu->set_name ("ArdourContextMenu");
+ Menu* alignment_menu = manage (new Menu);
+ MenuList& alignment_items = alignment_menu->items();
+ alignment_menu->set_name ("ArdourContextMenu");
- RadioMenuItem::Group align_group;
+ RadioMenuItem::Group align_group;
- /* Same verbose hacks as for the layering options above */
+ /* Same verbose hacks as for the layering options above */
- int existing = 0;
- int capture = 0;
- int automatic = 0;
- int styles = 0;
- boost::shared_ptr<Track> first_track;
+ int existing = 0;
+ int capture = 0;
+ int automatic = 0;
+ int styles = 0;
+ boost::shared_ptr<Track> first_track;
- TrackSelection const & s = _editor.get_selection().tracks;
- for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
- RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
- if (!r || !r->is_track ()) {
- continue;
- }
+ for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) {
+ RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*t);
+ if (!r || !r->is_track ()) {
+ continue;
+ }
- if (!first_track) {
- first_track = r->track();
- }
-
- switch (r->track()->alignment_choice()) {
- case Automatic:
- ++automatic;
- styles |= 0x1;
- switch (r->track()->alignment_style()) {
- case ExistingMaterial:
- ++existing;
- break;
- case CaptureTime:
- ++capture;
- break;
- }
- break;
- case UseExistingMaterial:
- ++existing;
- styles |= 0x2;
- break;
- case UseCaptureTime:
- ++capture;
- styles |= 0x4;
- break;
- }
+ if (!first_track) {
+ first_track = r->track();
}
- bool inconsistent;
- switch (styles) {
- case 1:
- case 2:
- case 4:
- inconsistent = false;
- break;
- default:
- inconsistent = true;
- break;
- }
-
- RadioMenuItem* i;
-
- if (!inconsistent && first_track) {
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->set_active (automatic != 0 && existing == 0 && capture == 0);
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
-
- switch (first_track->alignment_choice()) {
- case Automatic:
- switch (first_track->alignment_style()) {
- case ExistingMaterial:
- alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
- break;
- case CaptureTime:
- alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
- break;
- }
- break;
- default:
- break;
- }
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->set_active (existing != 0 && capture == 0 && automatic == 0);
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
-
- alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time")));
- i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
- i->set_active (existing == 0 && capture != 0 && automatic == 0);
- i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
-
- items.push_back (MenuElem (_("Alignment"), *alignment_menu));
-
- } else {
- /* show nothing */
- }
-
- Menu* mode_menu = manage (new Menu);
- MenuList& mode_items = mode_menu->items ();
- mode_menu->set_name ("ArdourContextMenu");
-
- RadioMenuItem::Group mode_group;
-
- int normal = 0;
- int tape = 0;
- int non_layered = 0;
-
- for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
- RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
- if (!r || !r->is_track ()) {
- continue;
+ switch (r->track()->alignment_choice()) {
+ case Automatic:
+ ++automatic;
+ styles |= 0x1;
+ switch (r->track()->alignment_style()) {
+ case ExistingMaterial:
+ ++existing;
+ break;
+ case CaptureTime:
+ ++capture;
+ break;
}
+ break;
+ case UseExistingMaterial:
+ ++existing;
+ styles |= 0x2;
+ break;
+ case UseCaptureTime:
+ ++capture;
+ styles |= 0x4;
+ break;
+ }
+ }
- switch (r->track()->mode()) {
- case Normal:
- ++normal;
- break;
- case Destructive:
- ++tape;
+ bool inconsistent;
+ switch (styles) {
+ case 1:
+ case 2:
+ case 4:
+ inconsistent = false;
+ break;
+ default:
+ inconsistent = true;
+ break;
+ }
+
+ if (!inconsistent && first_track) {
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (automatic != 0 && existing == 0 && capture == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
+
+ switch (first_track->alignment_choice()) {
+ case Automatic:
+ switch (first_track->alignment_style()) {
+ case ExistingMaterial:
+ alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
break;
- case NonLayered:
- ++non_layered;
+ case CaptureTime:
+ alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
break;
}
+ break;
+ default:
+ break;
}
- mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
- i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true));
- i->set_active (normal != 0 && tape == 0 && non_layered == 0);
- i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (existing != 0 && capture == 0 && automatic == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
- mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode")));
- i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true));
- i->set_active (normal == 0 && tape != 0 && non_layered == 0);
- i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time")));
+ i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+ i->set_active (existing == 0 && capture != 0 && automatic == 0);
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
- mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
- i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
- i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true));
- i->set_active (normal == 0 && tape == 0 && non_layered != 0);
- i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
+ items.push_back (MenuElem (_("Alignment"), *alignment_menu));
- items.push_back (MenuElem (_("Record Mode"), *mode_menu));
+ } else {
+ /* show nothing */
}
+ Menu* mode_menu = manage (new Menu);
+ MenuList& mode_items = mode_menu->items ();
+ mode_menu->set_name ("ArdourContextMenu");
+
+ RadioMenuItem::Group mode_group;
+
+ int normal = 0;
+ int tape = 0;
+ int non_layered = 0;
+
+ for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) {
+ RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*t);
+ if (!r || !r->is_track ()) {
+ continue;
+ }
+
+ switch (r->track()->mode()) {
+ case Normal:
+ ++normal;
+ break;
+ case Destructive:
+ ++tape;
+ break;
+ case NonLayered:
+ ++non_layered;
+ break;
+ }
+ }
+
+ mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true));
+ i->set_active (normal != 0 && tape == 0 && non_layered == 0);
+ i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
+
+ mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true));
+ i->set_active (normal == 0 && tape != 0 && non_layered == 0);
+ i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
+
+ mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
+ i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+ i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true));
+ i->set_active (normal == 0 && tape == 0 && non_layered != 0);
+ i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
+
+ items.push_back (MenuElem (_("Record Mode"), *mode_menu));
items.push_back (SeparatorElem());
}
route_group_menu->detach ();
-
+
WeakRouteList r;
for (TrackSelection::iterator i = _editor.get_selection().tracks.begin(); i != _editor.get_selection().tracks.end(); ++i) {
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
r.push_back (rtv->route ());
}
}
-
+
if (r.empty ()) {
r.push_back (route ());
}
route_group_menu->build (r);
items.push_back (MenuElem (_("Group"), *route_group_menu->menu ()));
-
+
build_automation_action_menu (true);
items.push_back (MenuElem (_("Automation"), *automation_action_menu));
-
+
items.push_back (SeparatorElem());
-
+
int active = 0;
int inactive = 0;
TrackSelection const & s = _editor.get_selection().tracks;
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Hide"), sigc::bind (sigc::mem_fun(_editor, &PublicEditor::hide_track_in_display), this, true)));
- items.push_front (SeparatorElem());
- items.push_front (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks)));
+ if (_route && !_route->is_master()) {
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Duplicate..."), boost::bind (&ARDOUR_UI::start_duplicate_routes, ARDOUR_UI::instance())));
+ }
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks)));
}
void
if (timestretch_rect == 0) {
timestretch_rect = new ArdourCanvas::Rectangle (canvas_display ());
- timestretch_rect->set_fill_color (ArdourCanvas::HSV (ARDOUR_UI::config()->color ("time stretch fill")).mod (ARDOUR_UI::config()->modifier ("time stretch fill")).color());
- timestretch_rect->set_outline_color (ARDOUR_UI::config()->color ("time stretch outline"));
+ timestretch_rect->set_fill_color (ArdourCanvas::HSV (UIConfiguration::instance().color ("time stretch fill")).mod (UIConfiguration::instance().modifier ("time stretch fill")).color());
+ timestretch_rect->set_outline_color (UIConfiguration::instance().color ("time stretch outline"));
}
timestretch_rect->show ();
for (Children::iterator i = children.begin(); i != children.end(); ++i) {
(*i)->set_selected_points (points);
}
+ AudioStreamView* asv = dynamic_cast<AudioStreamView*>(_view);
+ if (asv) {
+ asv->set_selected_points (points);
+ }
}
void
vector<Command*> cmds;
playlist->rdiff (cmds);
_session->add_commands (cmds);
-
+
_session->add_command (new StatefulDiffCommand (playlist));
}
break;
-
+
case Cut:
if ((what_we_got = playlist->cut (time)) != 0) {
_editor.get_cut_buffer().add (what_we_got);
pos += _editor.get_paste_offset(pos, ctx.count, duration);
pl->clear_changes ();
+ pl->clear_owned_changes ();
if (Config->get_edit_mode() == Ripple) {
std::pair<framepos_t, framepos_t> extent = (*p)->get_extent_with_endspace();
framecnt_t amount = extent.second - extent.first;
playlist_items.push_back (MenuElem (_("Clear Current"), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::clear_playlists), this)));
playlist_items.push_back (SeparatorElem());
- playlist_items.push_back (MenuElem(_("Select From All..."), sigc::mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
+ playlist_items.push_back (MenuElem(_("Select from All..."), sigc::mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
}
void
}
track()->use_playlist (pl);
-
+
RouteGroup* rg = route_group();
-
+
if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) {
std::string group_string = "." + rg->name() + ".";
-
+
std::string take_name = pl->name();
std::string::size_type idx = take_name.find(group_string);
-
+
if (idx == std::string::npos)
return;
-
+
take_name = take_name.substr(idx + group_string.length()); // find the bit containing the take number / name
-
+
boost::shared_ptr<RouteList> rl (rg->route_list());
-
+
for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
if ((*i) == this->route()) {
continue;
}
std::string playlist_name = (*i)->name()+group_string+take_name;
-
+
boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track>(*i);
if (!track) {
continue;
/* Don't change playlists of frozen tracks */
continue;
}
-
+
boost::shared_ptr<Playlist> ipl = session()->playlists->by_name(playlist_name);
if (!ipl) {
// No playlist for this track for this take yet, make it
RouteGroup* rg = route_group ();
if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) {
string group_string = "." + rg->name() + ".";
-
+
string take_name = track()->playlist()->name();
string::size_type idx = take_name.find(group_string);
-
+
if (idx != string::npos) {
/* find the bit containing the take number / name */
take_name = take_name.substr (idx + group_string.length());
/* set the playlist button tooltip to the take name */
- ARDOUR_UI::instance()->set_tip (
+ set_tooltip (
playlist_button,
string_compose(_("Take: %1.%2"),
- Glib::Markup::escape_text(rg->name()),
- Glib::Markup::escape_text(take_name))
+ Gtkmm2ext::markup_escape_text (rg->name()),
+ Gtkmm2ext::markup_escape_text (take_name))
);
-
+
return;
}
}
/* set the playlist button tooltip to the playlist name */
- ARDOUR_UI::instance()->set_tip (playlist_button, _("Playlist") + std::string(": ") + Glib::Markup::escape_text(track()->playlist()->name()));
+ set_tooltip (playlist_button, _("Playlist") + std::string(": ") + Gtkmm2ext::markup_escape_text (track()->playlist()->name()));
}
{
//case cTimeStretchOutline:
if (timestretch_rect) {
- timestretch_rect->set_outline_color (ARDOUR_UI::config()->color ("time stretch outline"));
+ timestretch_rect->set_outline_color (UIConfiguration::instance().color ("time stretch outline"));
}
//case cTimeStretchFill:
if (timestretch_rect) {
- timestretch_rect->set_fill_color (ARDOUR_UI::config()->color ("time stretch fill"));
+ timestretch_rect->set_fill_color (UIConfiguration::instance().color ("time stretch fill"));
}
reset_meter();
}
}
+void
+RouteTimeAxisView::update_trim_track_visibility ()
+{
+ bool const showit = trim_automation_item->get_active();
+
+ if (showit != string_is_affirmative (trim_track->gui_property ("visible"))) {
+ trim_track->set_marked_for_display (showit);
+
+ /* now trigger a redisplay */
+
+ if (!no_redraw) {
+ _route->gui_changed (X_("visible_tracks"), (void *) 0); /* EMIT_SIGNAL */
+ }
+ }
+}
+
void
RouteTimeAxisView::update_mute_track_visibility ()
{
boost::shared_ptr<AutomationControl> control
= boost::dynamic_pointer_cast<AutomationControl>(processor->control(what, true));
-
+
pan->view = boost::shared_ptr<AutomationTimeAxisView>(
new AutomationTimeAxisView (_session, _route, processor, control, control->parameter (),
- _editor, *this, false, parent_canvas,
+ _editor, *this, false, parent_canvas,
processor->describe_parameter (what), processor->name()));
pan->view->Hiding.connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::processor_automation_track_hidden), pan, processor));
processor->what_has_data (existing);
for (set<Evoral::Parameter>::iterator i = existing.begin(); i != existing.end(); ++i) {
-
+
Evoral::Parameter param (*i);
boost::shared_ptr<AutomationLine> al;
/* existing state overrides "show" argument */
string s = track->gui_property ("visible");
- if (!s.empty()) {
+ if (!s.empty()) {
show = string_is_affirmative (s);
}
}
if (x == processor_automation.end()) {
-
rai = new ProcessorAutomationInfo (processor);
processor_automation.push_back (rai);
-
} else {
-
rai = *x;
-
}
/* any older menu was deleted at the top of processors_changed()
string name = processor->describe_parameter (*i);
+ if (name == X_("hidden")) {
+ continue;
+ }
+
items.push_back (CheckMenuElem (name));
mitem = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
-
+
_subplugin_menu_map[*i] = mitem;
if (has_visible_automation.find((*i)) != has_visible_automation.end()) {
mitem->signal_toggled().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::processor_menu_item_toggled), rai, pan));
}
+ if (items.size() == 0) {
+ return;
+ }
+
/* add the menu for this processor, because the subplugin
menu is always cleared at the top of processors_changed().
this is the result of some poor design in gtkmm and/or
if (pan->view && pan->view->set_marked_for_display (showit)) {
redraw = true;
}
-
+
if (redraw && !no_redraw) {
request_redraw ();
}
if (_ignore_set_layer_display) {
return;
}
-
+
if (apply_to_selection) {
_editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_layer_display, _1, d, false));
} else {
void
RouteTimeAxisView::reset_meter ()
{
- if (ARDOUR_UI::config()->get_show_track_meters()) {
+ if (UIConfiguration::instance().get_show_track_meters()) {
int meter_width = 3;
if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
meter_width = 6;
{
ENSURE_GUI_THREAD (*this, &RouteTimeAxisView::meter_changed)
reset_meter();
- if (_route && !no_redraw) {
+ if (_route && !no_redraw && UIConfiguration::instance().get_show_track_meters()) {
request_redraw ();
}
// reset peak when meter point changes
switch (Config->get_listen_position()) {
case AfterFaderListen:
solo_button->set_text (S_("AfterFader|A"));
- ARDOUR_UI::instance()->set_tip (*solo_button, _("After-fade listen (AFL)"));
+ set_tooltip (*solo_button, _("After-fade listen (AFL)"));
break;
case PreFaderListen:
solo_button->set_text (S_("PreFader|P"));
- ARDOUR_UI::instance()->set_tip (*solo_button, _("Pre-fade listen (PFL)"));
+ set_tooltip (*solo_button, _("Pre-fade listen (PFL)"));
break;
}
} else {
solo_button->set_text (S_("Solo|S"));
- ARDOUR_UI::instance()->set_tip (*solo_button, _("Solo"));
+ set_tooltip (*solo_button, _("Solo"));
}
mute_button->set_text (S_("Mute|M"));
}
add_automation_child (Evoral::Parameter(GainAutomation), gain_track, show);
}
+void
+RouteTimeAxisView::create_trim_automation_child (const Evoral::Parameter& param, bool show)
+{
+ boost::shared_ptr<AutomationControl> c = _route->trim()->gain_control();
+ if (!c || ! _route->trim()->active()) {
+ return;
+ }
+
+ trim_track.reset (new AutomationTimeAxisView (_session,
+ _route, _route->trim(), c, param,
+ _editor,
+ *this,
+ false,
+ parent_canvas,
+ _route->trim()->describe_parameter(param)));
+
+ if (_view) {
+ _view->foreach_regionview (sigc::mem_fun (*trim_track.get(), &TimeAxisView::add_ghost));
+ }
+
+ add_automation_child (Evoral::Parameter(TrimAutomation), trim_track, show);
+}
+
void
RouteTimeAxisView::create_mute_automation_child (const Evoral::Parameter& param, bool show)
{
RouteTimeAxisView::remove_child (boost::shared_ptr<TimeAxisView> c)
{
TimeAxisView::remove_child (c);
-
+
boost::shared_ptr<AutomationTimeAxisView> a = boost::dynamic_pointer_cast<AutomationTimeAxisView> (c);
if (a) {
for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {