add_option() after addings its choices so that it gets
[ardour.git] / gtk2_ardour / processor_box.cc
index 0cd300883496dba3e6773e22df5935950d49b32a..883ce4b196ff939128af2ac08c8056407887fdf5 100644 (file)
@@ -96,55 +96,41 @@ RefPtr<Action> ProcessorBox::controls_action;
 Glib::RefPtr<Gdk::Pixbuf> SendProcessorEntry::_slider;
 
 ProcessorEntry::ProcessorEntry (boost::shared_ptr<Processor> p, Width w)
-       : _position (PreFader)
+       : _button (ArdourButton::led_default_elements)
+       , _position (PreFader)
        , _processor (p)
        , _width (w)
        , _visual_state (Gtk::STATE_NORMAL)
 {
-       _hbox.pack_start (_active, false, false);
-       _event_box.add (_name);
-       _hbox.pack_start (_event_box, true, true);
-       _vbox.pack_start (_hbox);
-       _frame.add (_vbox);
-
-       /* without this, the border is mis-drawn on some systems */
-       _vbox.set_border_width (1);
-
-       _name.set_alignment (0, 0.5);
-       _name.set_text (name ());
-       _name.set_padding (2, 2);
-
-       if (boost::dynamic_pointer_cast<Amp> (p)) {
-               /* Fader processor gets a special look */
-               _event_box.set_name ("ProcessorFader");
-               _frame.set_name ("ProcessorFaderFrame");
-               _name.set_padding (2, 4);
-       }
-
-       _active.set_active (_processor->active ());
-       _active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled));
-
-       _frame.show ();
+       _vbox.pack_start (_button, true, true);
        _vbox.show ();
-       _hbox.show ();
-       _event_box.show ();
-       _name.show ();
-       _active.show ();
+       
+       if (_processor->active()) {
+               _button.set_active_state (Gtkmm2ext::Active);
+       }
+       _button.set_diameter (3);
+       _button.set_distinct_led_click (true);
+       _button.set_led_left (true);
+       _button.signal_led_clicked.connect (sigc::mem_fun (*this, &ProcessorEntry::led_clicked));
+       _button.set_text (name());
+       _button.show ();
 
        _processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
        _processor->PropertyChanged.connect (name_connection, invalidator (*this), ui_bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
+
+       setup_visuals ();
 }
 
 EventBox&
 ProcessorEntry::action_widget ()
 {
-       return _event_box;
+       return _button;
 }
 
 Gtk::Widget&
 ProcessorEntry::widget ()
 {
-       return _frame;
+       return _vbox;
 }
 
 string
@@ -154,17 +140,20 @@ ProcessorEntry::drag_text () const
 }
 
 void
-ProcessorEntry::set_visual_state (Gtk::StateType t)
+ProcessorEntry::set_position (Position p)
 {
-       _visual_state = t;
+       _position = p;
        setup_visuals ();
 }
 
 void
-ProcessorEntry::set_position (Position p)
+ProcessorEntry::set_visual_state (Gtkmm2ext::VisualState s, bool yn)
 {
-       _position = p;
-       setup_visuals ();
+       if (yn) {
+               _button.set_visual_state (Gtkmm2ext::VisualState (_button.visual_state() | s));
+       } else {
+               _button.set_visual_state (Gtkmm2ext::VisualState (_button.visual_state() & ~s));
+       }
 }
 
 void
@@ -172,42 +161,15 @@ ProcessorEntry::setup_visuals ()
 {
        switch (_position) {
        case PreFader:
-               _event_box.set_name ("ProcessorPreFader");
-               if (_visual_state == Gtk::STATE_NORMAL) {
-                       _frame.set_name ("ProcessorPreFaderFrame");
-               }
+               _button.set_name ("processor prefader");
                break;
 
        case Fader:
-               _event_box.set_name ("ProcessorFader");
-               if (_visual_state == Gtk::STATE_NORMAL) {
-                       _frame.set_name ("ProcessorFaderFrame");
-               }
+               _button.set_name ("processor fader");
                break;
 
        case PostFader:
-               _event_box.set_name ("ProcessorPostFader");
-               if (_visual_state == Gtk::STATE_NORMAL) {
-                       _frame.set_name ("ProcessorPostFaderFrame");
-               }
-               break;
-       }
-
-       switch (_visual_state) {
-       case Gtk::STATE_NORMAL:
-               /* _frame has been set up above */
-               _event_box.set_state (Gtk::STATE_NORMAL);
-               break;
-       case Gtk::STATE_SELECTED:
-               _frame.set_name ("ProcessorFrameSelected");
-               /* don't change the background of the box when it is selected */
-               _event_box.set_state (Gtk::STATE_NORMAL);
-               break;
-       case Gtk::STATE_ACTIVE:
-               _frame.set_name ("ProcessorFrameActiveSend");
-               _event_box.set_state (Gtk::STATE_ACTIVE);
-               break;
-       default:
+               _button.set_name ("processor postfader");
                break;
        }
 }
@@ -226,24 +188,22 @@ ProcessorEntry::set_enum_width (Width w)
 }
 
 void
-ProcessorEntry::active_toggled ()
+ProcessorEntry::led_clicked()
 {
-       if (_active.get_active ()) {
-               if (!_processor->active ()) {
-                       _processor->activate ();
-               }
+       if (_button.active_state() == Gtkmm2ext::Active) {
+               _processor->deactivate ();
        } else {
-               if (_processor->active ()) {
-                       _processor->deactivate ();
-               }
+               _processor->activate ();
        }
 }
 
 void
 ProcessorEntry::processor_active_changed ()
 {
-       if (_active.get_active () != _processor->active ()) {
-               _active.set_active (_processor->active ());
+       if (_processor->active()) {
+               _button.set_active_state (Gtkmm2ext::Active);
+       } else {
+               _button.unset_active_state ();
        }
 }
 
@@ -251,7 +211,7 @@ void
 ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
 {
        if (what_changed.contains (ARDOUR::Properties::name)) {
-               _name.set_text (name ());
+               _button.set_text (name ());
        }
 }
 
@@ -497,7 +457,7 @@ ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::function<PluginSelecto
        , _owner_is_mixer (owner_is_mixer)
        , ab_direction (true)
        , _get_plugin_selector (get_plugin_selector)
-       , _placement(PreFader)
+       , _placement (-1)
        , _rr_selection(rsel)
 {
        set_session (sess);
@@ -684,10 +644,11 @@ ProcessorBox::new_send ()
 }
 
 void
-ProcessorBox::show_processor_menu (gint arg)
+ProcessorBox::show_processor_menu (int arg)
 {
        if (processor_menu == 0) {
                processor_menu = build_processor_menu ();
+               processor_menu->signal_unmap().connect (sigc::mem_fun (*this, &ProcessorBox::processor_menu_unmapped));
        }
 
        Gtk::MenuItem* plugin_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/newplugin"));
@@ -714,6 +675,13 @@ ProcessorBox::show_processor_menu (gint arg)
        paste_action->set_sensitive (!_rr_selection.processors.empty());
 
        processor_menu->popup (1, arg);
+
+       /* Add a placeholder gap to the processor list to indicate where a processor would be
+          inserted were one chosen from the menu.
+       */
+       int x, y;
+       processor_display.get_pointer (x, y);
+       _placement = processor_display.add_placeholder (y);
 }
 
 bool
@@ -884,20 +852,6 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev, ProcessorEntry
 
        } else if (Keyboard::is_context_menu_event (ev)) {
 
-               /* figure out if we are above or below the fader/amp processor,
-                  and set the next insert position appropriately.
-               */
-
-               if (processor) {
-                       if (_route->processor_is_prefader (processor)) {
-                               _placement = PreFader;
-                       } else {
-                               _placement = PostFader;
-                       }
-               } else {
-                       _placement = PostFader;
-               }
-
                show_processor_menu (ev->time);
 
        } else if (processor && Keyboard::is_button2_event (ev)
@@ -977,7 +931,7 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins)
 
                Route::ProcessorStreams err_streams;
 
-               if (_route->add_processor (processor, _placement, &err_streams, Config->get_new_plugins_active ())) {
+               if (_route->add_processor_by_index (processor, _placement, &err_streams, Config->get_new_plugins_active ())) {
                        weird_plugin_dialog (**p, err_streams);
                        return true;
                        // XXX SHAREDPTR delete plugin here .. do we even need to care?
@@ -1042,7 +996,7 @@ void
 ProcessorBox::choose_insert ()
 {
        boost::shared_ptr<Processor> processor (new PortInsert (*_session, _route->pannable(), _route->mute_master()));
-       _route->add_processor (processor, _placement);
+       _route->add_processor_by_index (processor, _placement);
 }
 
 /* Caller must not hold process lock */
@@ -1104,7 +1058,7 @@ ProcessorBox::send_io_finished (IOSelector::Result r, boost::weak_ptr<Processor>
                break;
 
        case IOSelector::Accepted:
-               _route->add_processor (processor, _placement);
+               _route->add_processor_by_index (processor, _placement);
                if (Profile->get_sae()) {
                        processor->activate ();
                }
@@ -1132,7 +1086,7 @@ ProcessorBox::return_io_finished (IOSelector::Result r, boost::weak_ptr<Processo
                break;
 
        case IOSelector::Accepted:
-               _route->add_processor (processor, _placement);
+               _route->add_processor_by_index (processor, _placement);
                if (Profile->get_sae()) {
                        processor->activate ();
                }
@@ -1761,7 +1715,8 @@ ProcessorBox::for_selected_processors (void (ProcessorBox::*method)(boost::share
 void
 ProcessorBox::all_processors_active (bool state)
 {
-       _route->all_processors_active (_placement, state);
+       _route->all_processors_active (PreFader, state);
+       _route->all_processors_active (PostFader, state);
 }
 
 void
@@ -2400,6 +2355,12 @@ ProcessorBox::hide_things ()
        }
 }
 
+void
+ProcessorBox::processor_menu_unmapped ()
+{
+       processor_display.remove_placeholder ();
+}
+
 ProcessorWindowProxy::ProcessorWindowProxy (
        string const & name,
        XMLNode const * node,