Revert afedd2 and associated commits (method to generate initial tag file)
[ardour.git] / gtk2_ardour / plugin_selector.cc
index 80dd1da5728079dad8bce0bdae218cb9fe5a3fc5..314e36ebb75572799b5c16d6e6338f29fd3d8fdb 100644 (file)
@@ -68,10 +68,12 @@ PluginSelector::PluginSelector (PluginManager& mgr)
        _plugin_menu = 0;
        in_row_change = false;
 
+       //anytime the list changes ( Status, Tags, or scanned plugins ) we need to rebuild redirect-box plugin selector menu
        manager.PluginListChanged.connect (plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::build_plugin_menu, this), gui_context());
-       manager.PluginListChanged.connect (plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::refill, this), gui_context());
-       manager.PluginStatusesChanged.connect (plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::plugin_status_changed, this, _1, _2, _3), gui_context());
-       manager.PluginTagsChanged.connect(plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::tags_changed, this, _1, _2, _3), gui_context());
+
+       //these are used to update the info of specific entries, while they are being edited
+       manager.PluginStatusChanged.connect (plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::plugin_status_changed, this, _1, _2, _3), gui_context());
+       manager.PluginTagChanged.connect(plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::tags_changed, this, _1, _2, _3), gui_context());
 
        plugin_model = Gtk::ListStore::create (plugin_columns);
        plugin_display.set_model (plugin_model);
@@ -148,15 +150,17 @@ PluginSelector::PluginSelector (PluginManager& mgr)
        search_entry.signal_changed().connect (sigc::mem_fun (*this, &PluginSelector::search_entry_changed));
        search_clear_button.signal_clicked().connect (sigc::mem_fun (*this, &PluginSelector::search_clear_button_clicked));
 
-       _search_name_checkbox = manage (new CheckButton (_("Name")));
-       _search_name_checkbox->set_active();
+       _search_name_checkbox = manage (new ArdourButton (_("Name"), ArdourButton::led_default_elements, true));
+       _search_name_checkbox->set_active(true);
+       _search_name_checkbox->set_name ("pluginlist filter button");
 
-       _search_tags_checkbox = manage (new CheckButton (_("Tags")));
-       _search_tags_checkbox->set_active();
+       _search_tags_checkbox = manage (new ArdourButton (_("Tags"), ArdourButton::led_default_elements, true));
+       _search_tags_checkbox->set_active(true);
+       _search_tags_checkbox->set_name ("pluginlist filter button");
 
-       _search_ignore_checkbox = manage (new CheckButton(_("Ignore Filters when searching")));
-       _search_ignore_checkbox->set_active();
-       _search_ignore_checkbox->signal_toggled().connect (sigc::mem_fun (*this, &PluginSelector::set_sensitive_widgets));
+       _search_ignore_checkbox = manage (new ArdourButton(_("Ignore Filters when searching"), ArdourButton::led_default_elements, true));
+       _search_ignore_checkbox->set_active(true);
+       _search_ignore_checkbox->set_name ("pluginlist filter button");
 
        Gtk::Label* search_help_label1 = manage (new Label(
                _("All search terms must be matched."), Gtk::ALIGN_LEFT));
@@ -182,8 +186,9 @@ PluginSelector::PluginSelector (PluginManager& mgr)
        search_frame->add (*search_table);
        search_frame->show_all ();
 
-       _search_name_checkbox->signal_clicked().connect (sigc::mem_fun (*this, &PluginSelector::refill));
-       _search_tags_checkbox->signal_clicked().connect (sigc::mem_fun (*this, &PluginSelector::refill));
+       _search_name_checkbox->signal_clicked.connect (sigc::mem_fun (*this, &PluginSelector::refill));
+       _search_tags_checkbox->signal_clicked.connect (sigc::mem_fun (*this, &PluginSelector::refill));
+       _search_ignore_checkbox->signal_clicked.connect (sigc::mem_fun (*this, &PluginSelector::set_sensitive_widgets));
 
        /* FILTER */
 
@@ -264,7 +269,7 @@ PluginSelector::PluginSelector (PluginManager& mgr)
        tag_entry = manage (new Gtk::Entry);
        tag_entry_connection = tag_entry->signal_changed().connect (sigc::mem_fun (*this, &PluginSelector::tag_entry_changed));
 
-       Gtk::Button* tag_reset_button = manage (new Button (_("Reset")));
+       tag_reset_button = manage (new Button (_("Reset")));
        tag_reset_button->signal_clicked().connect (sigc::mem_fun (*this, &PluginSelector::tag_reset_button_clicked));
 
        Gtk::Label* tagging_help_label1 = manage (new Label(
@@ -328,6 +333,7 @@ PluginSelector::PluginSelector (PluginManager& mgr)
        plugin_display.grab_focus();
 
        build_plugin_menu ();
+       display_selection_changed ();
 }
 
 PluginSelector::~PluginSelector ()
@@ -380,6 +386,9 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
 
                /* user asked to ignore filters */
                if (maybe_show && _search_ignore_checkbox->get_active()) {
+                       if (manager.get_status (info) == PluginManager::Hidden) {
+                               return false;
+                       }
                        return true;
                }
        }
@@ -404,10 +413,8 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
                return false;
        }
 
-       if (manager.get_status (info) == PluginManager::Hidden) {
-               if (!_fil_hidden_radio->get_active() && !_fil_all_radio->get_active()) {
-                       return false;
-               }
+       if (!_fil_hidden_radio->get_active() && manager.get_status (info) == PluginManager::Hidden) {
+               return false;
        }
 
        /* Filter "type" combobox */
@@ -696,6 +703,10 @@ PluginSelector::load_plugin (PluginInfoPtr pi)
 void
 PluginSelector::btn_add_clicked()
 {
+       if (plugin_display.get_selection()->count_selected_rows() == 0) {
+               /* may happen with ctrl + double-click un-selecting but activating a row */
+               return;
+       }
        std::string name;
        PluginInfoPtr pi;
        TreeModel::Row newrow = *(amodel->append());
@@ -736,12 +747,14 @@ PluginSelector::display_selection_changed()
                tag_entry->set_text (tags);
 
                tag_entry->set_sensitive (true);
+               tag_reset_button->set_sensitive (true);
                btn_add->set_sensitive (true);
 
        } else {
                tag_entry->set_text ("");
 
                tag_entry->set_sensitive (false);
+               tag_reset_button->set_sensitive (false);
                btn_add->set_sensitive (false);
        }
        tag_entry_connection.unblock ();
@@ -807,8 +820,8 @@ PluginSelector::run ()
                manager.save_statuses();
        }
 
-       if (_need_menu_rebuild) {
-               build_plugin_menu();
+       if ( _need_tag_save || _need_status_save || _need_menu_rebuild ) {
+               manager.PluginListChanged();  //emit signal
        }
 
        return (int) r;
@@ -829,6 +842,7 @@ PluginSelector::tag_reset_button_clicked ()
                manager.reset_tags (pi);
                display_selection_changed ();
                _need_tag_save = true;
+               _need_menu_rebuild = true;
        }
 }
 
@@ -851,6 +865,7 @@ PluginSelector::tag_entry_changed ()
                manager.set_tags (pi->type, pi->unique_id, tag_entry->get_text(), false);
 
                _need_tag_save = true;
+               _need_menu_rebuild = true;
        }
 }
 
@@ -865,11 +880,6 @@ PluginSelector::tags_changed (PluginType t, std::string unique_id, std::string t
                }
                row[plugin_columns.tags] = tags;
        }
-
-       /* A plugin's tags change while the user is entering them.
-        * defer a rebuilding of the "tag" menu until the dialog is closed.
-        */
-       _need_menu_rebuild = true;
 }
 
 void
@@ -895,9 +905,6 @@ PluginSelector::plugin_status_changed (PluginType t, std::string uid, PluginMana
                                        plugin_model->erase(i);
                        }
 
-                       /* plugin menu must be re-built to accommodate Hidden and Favorite plugins */
-                       build_plugin_menu();
-
                        return;
                }
        }
@@ -1123,7 +1130,7 @@ PluginSelector::create_by_tags_menu (ARDOUR::PluginInfoList& all_plugs)
        by_tags->set_name("ArdourContextMenu");
        MenuList& by_tags_items = by_tags->items();
 
-       std::vector<std::string> all_tags = manager.get_all_tags(false);
+       std::vector<std::string> all_tags = manager.get_all_tags (PluginManager::NoHidden);
        for (vector<string>::iterator t = all_tags.begin(); t != all_tags.end(); ++t) {
                Gtk::Menu *submenu = new Gtk::Menu;
                by_tags_items.push_back (MenuElem (*t, *manage (submenu)));
@@ -1145,12 +1152,11 @@ PluginSelector::create_by_tags_menu (ARDOUR::PluginInfoList& all_plugs)
                        Gtk::Menu* submenu;
                        if ((x = tags_submenu_map.find (*t)) != tags_submenu_map.end()) {
                                submenu = x->second;
-                       } else {
+                               string typ = GetPluginTypeStr(*i);
+                               MenuElem elem ((*i)->name + typ, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)));
+                               elem.get_child()->set_use_underline (false);
+                               submenu->items().push_back (elem);
                        }
-                       string typ = GetPluginTypeStr(*i);
-                       MenuElem elem ((*i)->name + typ, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)));
-                       elem.get_child()->set_use_underline (false);
-                       submenu->items().push_back (elem);
                }
        }
        return by_tags;
@@ -1198,6 +1204,7 @@ PluginSelector::favorite_changed (const std::string& path)
                manager.set_status (pi->type, pi->unique_id, status);
 
                _need_status_save = true;
+               _need_menu_rebuild = true;
        }
        in_row_change = false;
 }
@@ -1230,6 +1237,7 @@ PluginSelector::hidden_changed (const std::string& path)
                manager.set_status (pi->type, pi->unique_id, status);
 
                _need_status_save = true;
+               _need_menu_rebuild = true;
        }
        in_row_change = false;
 }