first vaguely working version using PresentationInfo
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 159984fbb63d0d62c799370a72e480b030a6f6cf..3ca1bd9394f685d934ba8289ed940b22219a0c8d 100644 (file)
@@ -92,6 +92,9 @@
 #include "ardour/source_factory.h"
 #include "ardour/slave.h"
 #include "ardour/system_exec.h"
+#include "ardour/track.h"
+#include "ardour/vca_manager.h"
+#include "ardour/utils.h"
 
 #include "LuaBridge/LuaBridge.h"
 
@@ -252,6 +255,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        , video_timeline(0)
        , global_actions (X_("global"))
        , ignore_dual_punch (false)
+       , main_window_visibility (0)
        , editor (0)
        , mixer (0)
        , nsm (0)
@@ -326,6 +330,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
                theArdourUI = this;
        }
 
+       /* track main window visibility */
+
+       main_window_visibility = new VisibilityTracker (_main_window);
+
        /* stop libxml from spewing to stdout/stderr */
 
        xmlSetGenericErrorFunc (this, libxml_generic_error_func);
@@ -683,6 +691,7 @@ ARDOUR_UI::~ARDOUR_UI ()
                delete mixer; mixer = 0;
                delete nsm; nsm = 0;
                delete gui_object_state; gui_object_state = 0;
+               delete main_window_visibility;
                FastMeter::flush_pattern_cache ();
                PixFader::flush_pattern_cache ();
        }
@@ -1563,7 +1572,7 @@ void
 ARDOUR_UI::count_recenabled_streams (Route& route)
 {
        Track* track = dynamic_cast<Track*>(&route);
-       if (track && track->record_enabled()) {
+       if (track && track->rec_enable_control()->get_value()) {
                rec_enabled_streams += track->n_inputs().n_total();
        }
 }
@@ -1790,6 +1799,16 @@ ARDOUR_UI::open_session ()
        }
 }
 
+void
+ARDOUR_UI::session_add_vca (const string& name_template, uint32_t n)
+{
+       if (!_session) {
+               return;
+       }
+
+       _session->vca_manager().create_vca (n, name_template);
+}
+
 void
 ARDOUR_UI::session_add_mixed_track (
                const ChanCount& input,
@@ -1798,7 +1817,9 @@ ARDOUR_UI::session_add_mixed_track (
                uint32_t how_many,
                const string& name_template,
                bool strict_io,
-               PluginInfoPtr instrument)
+               PluginInfoPtr instrument,
+               Plugin::PresetRecord* pset,
+               ARDOUR::PresentationInfo::order_t order)
 {
        list<boost::shared_ptr<MidiTrack> > tracks;
 
@@ -1808,7 +1829,7 @@ ARDOUR_UI::session_add_mixed_track (
        }
 
        try {
-               tracks = _session->new_midi_track (input, output, instrument, ARDOUR::Normal, route_group, how_many, name_template);
+               tracks = _session->new_midi_track (input, output, instrument, pset, route_group, how_many, name_template, order, ARDOUR::Normal);
 
                if (tracks.size() != how_many) {
                        error << string_compose(P_("could not create %1 new mixed track", "could not create %1 new mixed tracks", how_many), how_many) << endmsg;
@@ -1833,7 +1854,9 @@ ARDOUR_UI::session_add_midi_bus (
                uint32_t how_many,
                const string& name_template,
                bool strict_io,
-               PluginInfoPtr instrument)
+               PluginInfoPtr instrument,
+               Plugin::PresetRecord* pset,
+               ARDOUR::PresentationInfo::order_t order)
 {
        RouteList routes;
 
@@ -1843,7 +1866,8 @@ ARDOUR_UI::session_add_midi_bus (
        }
 
        try {
-               routes = _session->new_midi_route (route_group, how_many, name_template, instrument);
+
+               routes = _session->new_midi_route (route_group, how_many, name_template, instrument, pset, PresentationInfo::MidiBus, order);
                if (routes.size() != how_many) {
                        error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg;
                }
@@ -1868,15 +1892,17 @@ ARDOUR_UI::session_add_midi_route (
                uint32_t how_many,
                const string& name_template,
                bool strict_io,
-               PluginInfoPtr instrument)
+               PluginInfoPtr instrument,
+               Plugin::PresetRecord* pset,
+               ARDOUR::PresentationInfo::order_t order)
 {
        ChanCount one_midi_channel;
        one_midi_channel.set (DataType::MIDI, 1);
 
        if (disk) {
-               session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument);
+               session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, order, instrument, pset);
        } else {
-               session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument);
+               session_add_midi_bus (route_group, how_many, name_template, strict_io, order, instrument, pset);
        }
 }
 
@@ -1889,8 +1915,8 @@ ARDOUR_UI::session_add_audio_route (
        RouteGroup* route_group,
        uint32_t how_many,
        string const & name_template,
-       bool strict_io
-       )
+       bool strict_io,
+       ARDOUR::PresentationInfo::order_t order)
 {
        list<boost::shared_ptr<AudioTrack> > tracks;
        RouteList routes;
@@ -1902,7 +1928,7 @@ ARDOUR_UI::session_add_audio_route (
 
        try {
                if (track) {
-                       tracks = _session->new_audio_track (input_channels, output_channels, mode, route_group, how_many, name_template);
+                       tracks = _session->new_audio_track (input_channels, output_channels, route_group, how_many, name_template, order, mode);
 
                        if (tracks.size() != how_many) {
                                error << string_compose (P_("could not create %1 new audio track", "could not create %1 new audio tracks", how_many), how_many)
@@ -1911,7 +1937,7 @@ ARDOUR_UI::session_add_audio_route (
 
                } else {
 
-                       routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template);
+                       routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template, PresentationInfo::AudioBus, order);
 
                        if (routes.size() != how_many) {
                                error << string_compose (P_("could not create %1 new audio bus", "could not create %1 new audio busses", how_many), how_many)
@@ -2063,14 +2089,14 @@ ARDOUR_UI::trx_record_enable_all_tracks ()
                boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*r);
                assert (t);
 
-               if (t->record_enabled()) {
+               if (t->rec_enable_control()->get_value()) {
                        none_record_enabled = false;
                        break;
                }
        }
 
        if (none_record_enabled) {
-               _session->set_record_enabled (rl, true, Session::rt_cleanup);
+               _session->set_controls (route_list_to_control_list (rl, &Track::rec_enable_control), 1.0, Controllable::NoGroup);
        }
 
        return none_record_enabled;
@@ -2355,7 +2381,7 @@ ARDOUR_UI::transport_forward (int option)
 }
 
 void
-ARDOUR_UI::toggle_record_enable (uint32_t rid)
+ARDOUR_UI::toggle_record_enable (uint16_t rid)
 {
        if (!_session) {
                return;
@@ -2363,12 +2389,12 @@ ARDOUR_UI::toggle_record_enable (uint32_t rid)
 
        boost::shared_ptr<Route> r;
 
-       if ((r = _session->route_by_remote_id (rid)) != 0) {
+       if ((r = _session->get_remote_nth_route (rid)) != 0) {
 
                boost::shared_ptr<Track> t;
 
                if ((t = boost::dynamic_pointer_cast<Track>(r)) != 0) {
-                       t->set_record_enabled (!t->record_enabled(), Controllable::UseGroup);
+                       t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup);
                }
        }
 }
@@ -3880,15 +3906,15 @@ ARDOUR_UI::cleanup_peakfiles ()
        }
 }
 
-void
-ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place)
+PresentationInfo::order_t
+ARDOUR_UI::translate_order (AddRouteDialog::InsertAt place)
 {
-       uint32_t order_hint = UINT32_MAX;
-
        if (editor->get_selection().tracks.empty()) {
-               return;
+               return PresentationInfo::max_order;
        }
 
+       PresentationInfo::order_t order_hint = PresentationInfo::max_order;
+
        /*
          we want the new routes to have their order keys set starting from
          the highest order key in the selection + 1 (if available).
@@ -3897,42 +3923,21 @@ ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place)
        if (place == AddRouteDialog::AfterSelection) {
                RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView*> (editor->get_selection().tracks.back());
                if (rtav) {
-                       order_hint = rtav->route()->order_key();
+                       order_hint = rtav->route()->presentation_info().group_order();
                        order_hint++;
                }
        } else if (place == AddRouteDialog::BeforeSelection) {
                RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView*> (editor->get_selection().tracks.front());
                if (rtav) {
-                       order_hint = rtav->route()->order_key();
+                       order_hint = rtav->route()->presentation_info().group_order();
                }
        } else if (place == AddRouteDialog::First) {
                order_hint = 0;
        } else {
-               /* leave order_hint at UINT32_MAX */
+               /* leave order_hint at max_order */
        }
 
-       if (order_hint == UINT32_MAX) {
-               /** AddRouteDialog::Last or selection with first/last not a RouteTimeAxisView
-                * not setting an order hint will place new routes last.
-                */
-               return;
-       }
-
-       _session->set_order_hint (order_hint);
-
-       /* create a gap in the existing route order keys to accomodate new routes.*/
-       boost::shared_ptr <RouteList> rd = _session->get_routes();
-       for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) {
-               boost::shared_ptr<Route> rt (*ri);
-
-               if (rt->is_monitor()) {
-                       continue;
-               }
-
-               if (rt->order_key () >= order_hint) {
-                       rt->set_order_key (rt->order_key () + add_route_dialog->count());
-               }
-       }
+       return order_hint;
 }
 
 void
@@ -3979,7 +3984,7 @@ ARDOUR_UI::add_route ()
                return;
        }
 
-       setup_order_hint(add_route_dialog->insert_at());
+       PresentationInfo::order_t order = translate_order (add_route_dialog->insert_at());
        string template_path = add_route_dialog->track_template();
        DisplaySuspender ds;
 
@@ -4011,19 +4016,22 @@ ARDOUR_UI::add_route ()
 
        switch (add_route_dialog->type_wanted()) {
        case AddRouteDialog::AudioTrack:
-               session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template, strict_io);
+               session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template, strict_io, order);
                break;
        case AddRouteDialog::MidiTrack:
-               session_add_midi_track (route_group, count, name_template, strict_io, instrument);
+               session_add_midi_track (route_group, count, name_template, strict_io, instrument, 0, order);
                break;
        case AddRouteDialog::MixedTrack:
-               session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument);
+               session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument, 0, order);
                break;
        case AddRouteDialog::AudioBus:
-               session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io);
+               session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io, order);
                break;
        case AddRouteDialog::MidiBus:
-               session_add_midi_bus (route_group, count, name_template, strict_io, instrument);
+               session_add_midi_bus (route_group, count, name_template, strict_io, instrument, 0, order);
+               break;
+       case AddRouteDialog::VCAMaster:
+               session_add_vca (name_template, count);
                break;
        }
 }
@@ -5300,16 +5308,16 @@ ARDOUR_UI::setup_toplevel_window (Gtk::Window& window, const string& name, void*
 
        if (window_icons.empty()) {
                Glib::RefPtr<Gdk::Pixbuf> icon;
-               if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
+               if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px")) != 0) {
                        window_icons.push_back (icon);
                }
-               if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
+               if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px")) != 0) {
                        window_icons.push_back (icon);
                }
-               if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
+               if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px")) != 0) {
                        window_icons.push_back (icon);
                }
-               if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
+               if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px")) != 0) {
                        window_icons.push_back (icon);
                }
        }
@@ -5564,12 +5572,9 @@ void
 ARDOUR_UI::cancel_solo ()
 {
        if (_session) {
-               if (_session->soloing()) {
-                       _session->set_solo (_session->get_routes(), false);
-               } else if (_session->listening()) {
-                       _session->set_listen (_session->get_routes(), false);
+               if (_session) {
+                       _session->set_controls (route_list_to_control_list (_session->get_routes(), &Route::solo_control), 0.0, Controllable::NoGroup);
                }
-
                _session->clear_all_solo_state (_session->get_routes()); // safeguard, ideally this won't do anything, check the log-window
        }
 }