Transfer Fn: skip phase calculation for silence and small signal levels
[ardour.git] / gtk2_ardour / plugin_selector.cc
index 3f03a218e523237612f3e779d202a36d71db6728..989d4f31a3b9326982b55f9d1512cd45583b9638 100644 (file)
@@ -61,6 +61,9 @@ PluginSelector::PluginSelector (PluginManager& mgr)
        : ArdourDialog (_("Plugin Manager"), true, false)
        , search_clear_button (Stock::CLEAR)
        , manager (mgr)
+       , _need_tag_save (false)
+       , _need_status_save (false)
+       , _need_menu_rebuild (false)
        , _inhibit_refill (false)
 {
        set_name ("PluginSelectorWindow");
@@ -69,10 +72,9 @@ 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.PluginStatusChanged.connect (plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::build_plugin_menu, this), 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());
 
@@ -347,6 +349,7 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
 {
        string mode;
        bool maybe_show = false;
+       PluginManager::PluginStatusType status = manager.get_status (info);
 
        if (!searchstr.empty()) {
 
@@ -374,7 +377,10 @@ 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) {
+                       if (status == PluginManager::Hidden) {
+                               return false;
+                       }
+                       if (status == PluginManager::Concealed) {
                                return false;
                        }
                        return true;
@@ -393,15 +399,19 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
                return false;
        }
 
-       if (_fil_favorites_radio->get_active() && !(manager.get_status (info) == PluginManager::Favorite)) {
+       if (_fil_favorites_radio->get_active() && status != PluginManager::Favorite) {
+               return false;
+       }
+
+       if (_fil_hidden_radio->get_active() && (status != PluginManager::Hidden && status != PluginManager::Concealed)) {
                return false;
        }
 
-       if (_fil_hidden_radio->get_active() && !(manager.get_status (info) == PluginManager::Hidden)) {
+       if (!_fil_hidden_radio->get_active() && status == PluginManager::Hidden) {
                return false;
        }
 
-       if (!_fil_hidden_radio->get_active() && manager.get_status (info) == PluginManager::Hidden) {
+       if (!_fil_hidden_radio->get_active() && status == PluginManager::Concealed) {
                return false;
        }
 
@@ -528,8 +538,10 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& searc
                if (show_this_plugin (*i, searchstr)) {
 
                        TreeModel::Row newrow = *(plugin_model->append());
-                       newrow[plugin_columns.favorite] = (manager.get_status (*i) == PluginManager::Favorite);
-                       newrow[plugin_columns.hidden] = (manager.get_status (*i) == PluginManager::Hidden);
+
+                       PluginManager::PluginStatusType status = manager.get_status (*i);
+                       newrow[plugin_columns.favorite] = status == PluginManager::Favorite;
+                       newrow[plugin_columns.hidden] = status == PluginManager::Hidden;
 
                        string name = (*i)->name;
                        if (name.length() > 48) {
@@ -787,9 +799,8 @@ PluginSelector::run ()
        if (_need_status_save) {
                manager.save_statuses();
        }
-
-       if ( _need_tag_save || _need_status_save || _need_menu_rebuild ) {
-               manager.PluginListChanged();  //emit signal
+       if (_need_menu_rebuild) {
+               build_plugin_menu ();
        }
 
        return (int) r;
@@ -810,7 +821,6 @@ PluginSelector::tag_reset_button_clicked ()
                manager.reset_tags (pi);
                display_selection_changed ();
                _need_tag_save = true;
-               _need_menu_rebuild = true;
        }
 }
 
@@ -833,7 +843,6 @@ PluginSelector::tag_entry_changed ()
                manager.set_tags (pi->type, pi->unique_id, tag_entry->get_text(), pi->name, PluginManager::FromGui);
 
                _need_tag_save = true;
-               _need_menu_rebuild = true;
        }
 }
 
@@ -861,7 +870,7 @@ PluginSelector::plugin_status_changed (PluginType t, std::string uid, PluginMana
                        (*i)[plugin_columns.hidden] = (stat == PluginManager::Hidden) ? true : false;
 
                        /* if plug was hidden, remove it from the view */
-                       if (stat == PluginManager::Hidden) {
+                       if (stat == PluginManager::Hidden || stat == PluginManager::Concealed) {
                                if (!_fil_hidden_radio->get_active() && !_fil_all_radio->get_active()) {
                                        plugin_model->erase(i);
                                }
@@ -888,7 +897,6 @@ PluginSelector::on_show ()
 
        _need_tag_save = false;
        _need_status_save = false;
-       _need_menu_rebuild = false;
 }
 
 struct PluginMenuCompareByCreator {
@@ -937,6 +945,11 @@ PluginSelector::plugin_menu()
 void
 PluginSelector::build_plugin_menu ()
 {
+       if (is_visible ()) {
+               _need_menu_rebuild = true;
+               return;
+       }
+       _need_menu_rebuild = false;
        PluginInfoList all_plugs;
 
        all_plugs.insert (all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
@@ -961,7 +974,7 @@ PluginSelector::build_plugin_menu ()
 
        delete _plugin_menu;
 
-       _plugin_menu = manage (new Menu);
+       _plugin_menu = new Menu;
        _plugin_menu->set_name("ArdourContextMenu");
 
        MenuList& items = _plugin_menu->items();
@@ -1053,7 +1066,9 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs)
 
        for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
 
-               if (manager.get_status (*i) == PluginManager::Hidden) continue;
+               PluginManager::PluginStatusType status = manager.get_status (*i);
+               if (status == PluginManager::Hidden) continue;
+               if (status == PluginManager::Concealed) continue;
 
                string creator = (*i)->creator;
 
@@ -1111,7 +1126,9 @@ PluginSelector::create_by_tags_menu (ARDOUR::PluginInfoList& all_plugs)
 
        for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
 
-               if (manager.get_status (*i) == PluginManager::Hidden) continue;
+               PluginManager::PluginStatusType status = manager.get_status (*i);
+               if (status == PluginManager::Hidden) continue;
+               if (status == PluginManager::Concealed) continue;
 
                /* for each tag in the plugins tag list, add it to that submenu */
                vector<string> tokens = manager.get_tags(*i);
@@ -1172,7 +1189,6 @@ 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;
 }
@@ -1205,7 +1221,6 @@ 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;
 }