start shaping up VCA assign process
[ardour.git] / gtk2_ardour / mixer_ui.cc
index a848ede49ed5582ce76119eab110244f0c7f9a9e..a321085e23cd5218a67b35ca61ca7271b701e164 100644 (file)
@@ -47,6 +47,8 @@
 #include "ardour/route_group.h"
 #include "ardour/route_sorters.h"
 #include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
 #include "keyboard.h"
 #include "mixer_ui.h"
@@ -63,6 +65,7 @@
 #include "mixer_group_tabs.h"
 #include "timers.h"
 #include "ui_config.h"
+#include "vca_master_strip.h"
 
 #include "i18n.h"
 
@@ -117,6 +120,13 @@ Mixer_UI::Mixer_UI ()
        scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
        scroller_base.set_name ("MixerWindow");
        scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
+
+       /* set up drag-n-drop */
+       vector<TargetEntry> target_table;
+       target_table.push_back (TargetEntry ("PluginFavoritePtr"));
+       scroller_base.drag_dest_set (target_table);
+       scroller_base.signal_drag_data_received().connect (sigc::mem_fun(*this, &Mixer_UI::scroller_drag_data_received));
+
        // add as last item of strip packer
        strip_packer.pack_end (scroller_base, true, true);
 
@@ -196,6 +206,10 @@ Mixer_UI::Mixer_UI ()
        group_display_frame.set_shadow_type (Gtk::SHADOW_IN);
        group_display_frame.add (group_display_vbox);
 
+
+       list<TargetEntry> target_list;
+       target_list.push_back (TargetEntry ("PluginPresetPtr"));
+
        favorite_plugins_model = PluginTreeStore::create (favorite_plugins_columns);
        favorite_plugins_display.set_model (favorite_plugins_model);
        favorite_plugins_display.append_column (_("Favorite Plugins"), favorite_plugins_columns.name);
@@ -205,8 +219,9 @@ Mixer_UI::Mixer_UI ()
        favorite_plugins_display.set_headers_visible (true);
        favorite_plugins_display.set_rules_hint (true);
        favorite_plugins_display.set_can_focus (false);
-       favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginPresetPtr");
+       favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginFavoritePtr");
        favorite_plugins_display.set_drag_column (favorite_plugins_columns.name.index());
+       favorite_plugins_display.add_drop_targets (target_list);
        favorite_plugins_display.signal_row_activated().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_activated));
        favorite_plugins_display.signal_button_press_event().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_button_press), false);
        favorite_plugins_display.signal_drop.connect (sigc::mem_fun (*this, &Mixer_UI::plugin_drop));
@@ -229,6 +244,7 @@ Mixer_UI::Mixer_UI ()
        list_vpacker.pack_start (rhs_pane2, true, true);
 
        global_hpacker.pack_start (scroller, true, true);
+       global_hpacker.pack_start (vca_packer, false, false);
        global_hpacker.pack_start (out_packer, false, false);
 
        list_hpane.pack1(list_vpacker, false, true);
@@ -268,6 +284,7 @@ Mixer_UI::Mixer_UI ()
        rhs_pane1.show();
        rhs_pane2.show();
        strip_packer.show();
+       vca_packer.show();
        out_packer.show();
        list_hpane.show();
        group_display.show();
@@ -336,6 +353,9 @@ Mixer_UI::show_window ()
 
        for (ri = rows.begin(); ri != rows.end(); ++ri) {
                ms = (*ri)[track_columns.strip];
+               if (!ms) {
+                       continue;
+               }
                ms->set_width_enum (ms->get_width_enum (), ms->width_owner());
                /* Fix visibility of mixer strip stuff */
                ms->parameter_changed (X_("mixer-element-visibility"));
@@ -345,6 +365,29 @@ Mixer_UI::show_window ()
        scroller_base.grab_focus ();
 }
 
+void
+Mixer_UI::add_masters (VCAList& vcas)
+{
+       cerr << vcas.size() << " VCAs added\n";
+
+       for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+
+               VCAMasterStrip* vms = new VCAMasterStrip (_session, *v);
+
+               TreeModel::Row row = *(track_model->append());
+               row[track_columns.text] = (*v)->name();
+               row[track_columns.visible] = true;
+               row[track_columns.vca] = vms;
+       }
+
+       redisplay_track_list ();
+}
+
+void
+Mixer_UI::remove_master (VCAMasterStrip* vms)
+{
+}
+
 void
 Mixer_UI::add_strips (RouteList& routes)
 {
@@ -354,6 +397,10 @@ Mixer_UI::add_strips (RouteList& routes)
        for (Gtk::TreeModel::Children::iterator it = track_model->children().begin(); it != track_model->children().end(); ++it) {
                boost::shared_ptr<Route> r = (*it)[track_columns.route];
 
+               if (!r) {
+                       continue;
+               }
+
                if (r->order_key() == (routes.front()->order_key() + routes.size())) {
                        insert_iter = it;
                        break;
@@ -420,6 +467,7 @@ Mixer_UI::add_strips (RouteList& routes)
                        row[track_columns.visible] = strip->route()->is_master() ? true : strip->marked_for_display();
                        row[track_columns.route] = route;
                        row[track_columns.strip] = strip;
+                       row[track_columns.vca] = 0;
 
                        if (!from_scratch) {
                                _selection.add (strip);
@@ -526,6 +574,10 @@ Mixer_UI::reset_remote_control_ids ()
                boost::shared_ptr<Route> route = (*ri)[track_columns.route];
                bool visible = (*ri)[track_columns.visible];
 
+               if (!route) {
+                       continue;
+               }
+
                if (!route->is_master() && !route->is_monitor()) {
 
                        uint32_t new_rid = (visible ? rid : invisible_key--);
@@ -573,6 +625,10 @@ Mixer_UI::sync_order_keys_from_treeview ()
                boost::shared_ptr<Route> route = (*ri)[track_columns.route];
                bool visible = (*ri)[track_columns.visible];
 
+               if (!route) {
+                       continue;
+               }
+
                uint32_t old_key = route->order_key ();
 
                if (order != old_key) {
@@ -636,6 +692,9 @@ Mixer_UI::sync_treeview_from_order_keys ()
 
        for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
                boost::shared_ptr<Route> route = (*ri)[track_columns.route];
+               if (!route) {
+                       continue;
+               }
                sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
        }
 
@@ -812,6 +871,8 @@ Mixer_UI::set_session (Session* sess)
        _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::update_title, this), gui_context());
        _session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::update_title, this), gui_context());
 
+       _session->vca_manager().VCAAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_masters, this, _1), gui_context());
+
        Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::parameter_changed, this, _1), gui_context ());
 
        route_groups_changed ();
@@ -886,7 +947,9 @@ Mixer_UI::update_track_visibility ()
 
                for (i = rows.begin(); i != rows.end(); ++i) {
                        MixerStrip *strip = (*i)[track_columns.strip];
-                       (*i)[track_columns.visible] = strip->marked_for_display ();
+                       if (strip) {
+                               (*i)[track_columns.visible] = strip->marked_for_display ();
+                       }
                }
 
                /* force route order keys catch up with visibility changes
@@ -970,7 +1033,7 @@ Mixer_UI::set_all_strips_visibility (bool yn)
                        TreeModel::Row row = (*i);
                        MixerStrip* strip = row[track_columns.strip];
 
-                       if (strip == 0) {
+                       if (!strip) {
                                continue;
                        }
 
@@ -999,7 +1062,7 @@ Mixer_UI::set_all_audio_midi_visibility (int tracks, bool yn)
                        TreeModel::Row row = (*i);
                        MixerStrip* strip = row[track_columns.strip];
 
-                       if (strip == 0) {
+                       if (!strip) {
                                continue;
                        }
 
@@ -1120,11 +1183,22 @@ Mixer_UI::redisplay_track_list ()
                return;
        }
 
+       container_clear (vca_packer);
+
        for (i = rows.begin(); i != rows.end(); ++i) {
 
+               VCAMasterStrip* vms = (*i)[track_columns.vca];
+
+               if (vms) {
+                       vca_packer.pack_start (*vms, false, false);
+                       vms->show ();
+                       cerr << "Packed vca " << vms->vca()->number() << " into vca_packer\n";
+                       continue;
+               }
+
                MixerStrip* strip = (*i)[track_columns.strip];
 
-               if (strip == 0) {
+               if (!strip) {
                        /* we're in the middle of changing a row, don't worry */
                        continue;
                }
@@ -1212,6 +1286,8 @@ Mixer_UI::initial_track_display ()
                Unwinder<bool> uw2 (ignore_reorder, true);
 
                track_model->clear ();
+               VCAList vcas = _session->vca_manager().vcas();
+               add_masters (vcas);
                add_strips (copy);
        }
 
@@ -1609,13 +1685,45 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
        using namespace Menu_Helpers;
 
        if (Keyboard::is_context_menu_event (ev)) {
-               // ARDOUR_UI::instance()->add_route (this);
+               ARDOUR_UI::instance()->add_route ();
                return true;
        }
 
        return false;
 }
 
+void
+Mixer_UI::scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& data, guint info, guint time)
+{
+       printf ("Mixer_UI::scroller_drag_data_received\n");
+       if (data.get_target() != "PluginFavoritePtr") {
+               context->drag_finish (false, false, time);
+               return;
+       }
+
+       const void * d = data.get_data();
+       const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>* tv = reinterpret_cast<const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>*>(d);                                                   
+
+       PluginPresetList nfos;
+       TreeView* source;
+       tv->get_object_drag_data (nfos, &source);
+
+       Route::ProcessorList pl;
+       bool ok = false;
+
+       for (list<PluginPresetPtr>::const_iterator i = nfos.begin(); i != nfos.end(); ++i) {
+               PluginPresetPtr ppp = (*i);
+               PluginInfoPtr pip = ppp->_pip;
+               if (!pip->is_instrument ()) {
+                       continue;
+               }
+               ARDOUR_UI::instance()->session_add_midi_track (NULL, 1, _("MIDI"), Config->get_strict_io (), pip, ppp->_preset.valid ? &ppp->_preset : 0);
+               ok = true;
+       }
+
+       context->drag_finish (ok, false, time);
+}
+
 void
 Mixer_UI::set_strip_width (Width w, bool save)
 {
@@ -1652,7 +1760,7 @@ private:
 int
 Mixer_UI::set_state (const XMLNode& node, int version)
 {
-       const XMLProperty* prop;
+       XMLProperty const * prop;
 
        Tabbable::set_state (node, version);
 
@@ -1754,7 +1862,7 @@ void
 Mixer_UI::pane_allocation_handler (Allocation&, Gtk::Paned* which)
 {
        int pos;
-       XMLProperty* prop = 0;
+       XMLProperty const * prop = 0;
        XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
        XMLNode* geometry;
        int height;
@@ -1965,7 +2073,7 @@ Mixer_UI::setup_track_display ()
 void
 Mixer_UI::new_track_or_bus ()
 {
-       // ARDOUR_UI::instance()->add_route (this);
+       ARDOUR_UI::instance()->add_route ();
 }
 
 
@@ -2471,3 +2579,17 @@ Mixer_UI::plugin_drop (const Glib::RefPtr<Gdk::DragContext>&, const Gtk::Selecti
        manager.set_status (ppp->_pip->type, ppp->_pip->unique_id, status);
        manager.save_statuses ();
 }
+
+void
+Mixer_UI::do_vca_assign (boost::shared_ptr<VCA> vca)
+{
+       /* call protected MixerActor:: method */
+       vca_assign (vca);
+}
+
+void
+Mixer_UI::do_vca_unassign (boost::shared_ptr<VCA> vca)
+{
+       /* call protected MixerActor:: method */
+       vca_unassign (vca);
+}