Move ARDOUR::touch_file to pbd/file_utils.h
[ardour.git] / gtk2_ardour / route_time_axis.cc
index 20c98765190ddfaadb49965cbe3ab161c8c8f195..94ed2a86f044abc8909cf70b6496e1293a8bc77f 100644 (file)
@@ -59,6 +59,7 @@
 
 #include "ardour_ui.h"
 #include "ardour_button.h"
+#include "audio_streamview.h"
 #include "debug.h"
 #include "global_signals.h"
 #include "route_time_axis.h"
@@ -100,9 +101,9 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
        , parent_canvas (canvas)
        , no_redraw (false)
        , button_table (3, 3)
-       , route_group_button (_("G"))
-       , playlist_button (_("P"))
-       , automation_button (_("A"))
+       , route_group_button (S_("RTAV|G"))
+       , playlist_button (S_("RTAV|P"))
+       , automation_button (S_("RTAV|A"))
        , automation_action_menu (0)
        , plugins_submenu_item (0)
        , route_group_menu (0)
@@ -112,6 +113,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
        , 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)
 {
@@ -156,9 +158,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
                set_gui_property ("visible", false);
        }
 
-       mute_changed (0);
-       update_solo_display ();
-
        timestretch_rect = 0;
        no_redraw = false;
 
@@ -323,6 +322,8 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 
 RouteTimeAxisView::~RouteTimeAxisView ()
 {
+       cleanup_gui_properties ();
+       
        for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
                delete *i;
        }
@@ -523,6 +524,15 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection)
                _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 ());
@@ -853,12 +863,8 @@ RouteTimeAxisView::build_display_menu ()
 
        items.push_back (SeparatorElem());
        items.push_back (MenuElem (_("Hide"), sigc::bind (sigc::mem_fun(_editor, &PublicEditor::hide_track_in_display), this, true)));
-       if (!Profile->get_sae()) {
-               items.push_back (MenuElem (_("Remove"), sigc::bind (sigc::mem_fun(*this, &RouteUI::remove_this_route), true)));
-       } else {
-               items.push_front (SeparatorElem());
-               items.push_front (MenuElem (_("Delete"), sigc::bind (sigc::mem_fun(*this, &RouteUI::remove_this_route), true)));
-       }
+       items.push_front (SeparatorElem());
+       items.push_front (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks)));
 }
 
 void
@@ -961,7 +967,7 @@ RouteTimeAxisView::show_selection (TimeSelection& ts)
 }
 
 void
-RouteTimeAxisView::set_height (uint32_t h)
+RouteTimeAxisView::set_height (uint32_t h, TrackHeightMode m)
 {
        int gmlen = h - 9;
        bool height_changed = (height == 0) || (h != height);
@@ -972,7 +978,7 @@ RouteTimeAxisView::set_height (uint32_t h)
        }
        gm.get_level_meter().setup_meters (gmlen, meter_width);
 
-       TimeAxisView::set_height (h);
+       TimeAxisView::set_height (h, m);
 
        if (_view) {
                _view->set_height ((double) current_height());
@@ -1337,6 +1343,10 @@ RouteTimeAxisView::set_selected_points (PointSelection& points)
        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
@@ -1609,6 +1619,7 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte
        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;
@@ -1901,6 +1912,22 @@ RouteTimeAxisView::update_gain_track_visibility ()
        }
 }
 
+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 ()
 {
@@ -2556,7 +2583,7 @@ RouteTimeAxisView::meter_changed ()
 {
        ENSURE_GUI_THREAD (*this, &RouteTimeAxisView::meter_changed)
        reset_meter();
-       if (_route && !no_redraw) {
+       if (_route && !no_redraw && ARDOUR_UI::config()->get_show_track_meters()) {
                request_redraw ();
        }
        // reset peak when meter point changes
@@ -2699,19 +2726,19 @@ RouteTimeAxisView::set_button_names ()
        if (Config->get_solo_control_is_listen_control()) {
                switch (Config->get_listen_position()) {
                        case AfterFaderListen:
-                               solo_button->set_text (_("A"));
+                               solo_button->set_text (S_("AfterFader|A"));
                                ARDOUR_UI::instance()->set_tip (*solo_button, _("After-fade listen (AFL)"));
                                break;
                        case PreFaderListen:
-                               solo_button->set_text (_("P"));
+                               solo_button->set_text (S_("PreFader|P"));
                                ARDOUR_UI::instance()->set_tip (*solo_button, _("Pre-fade listen (PFL)"));
                        break;
                }
        } else {
-               solo_button->set_text (_("S"));
+               solo_button->set_text (S_("Solo|S"));
                ARDOUR_UI::instance()->set_tip (*solo_button, _("Solo"));
        }
-       mute_button->set_text (_("M"));
+       mute_button->set_text (S_("Mute|M"));
 }
 
 Gtk::CheckMenuItem*
@@ -2754,6 +2781,29 @@ RouteTimeAxisView::create_gain_automation_child (const Evoral::Parameter& param,
        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)
 {