diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-11-08 19:20:12 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-11-08 19:20:12 +0000 |
commit | 6f1964985e44f8c9f5a1459973dae9e7ddf1c927 (patch) | |
tree | 2d731699efd4c06c01db37937a55ddd56d090cb8 /gtk2_ardour | |
parent | 93c1d87c3ccb7e0298da8399c08c1a9f6ae88cb4 (diff) |
plugin menu/manager patch from J. Abelardo Gutierrez (already applied to 3.0)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6039 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/plugin_selector.cc | 253 | ||||
-rw-r--r-- | gtk2_ardour/plugin_selector.h | 7 |
2 files changed, 208 insertions, 52 deletions
diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index 2fd3aa8ee0..684ef2f36a 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -54,6 +54,7 @@ static const char* _filter_mode_strings[] = { N_("Author contains"), N_("Library contains"), N_("Favorites only"), + N_("Hidden only"), 0 }; @@ -73,9 +74,11 @@ PluginSelector::PluginSelector (PluginManager *mgr) plugin_model = Gtk::ListStore::create (plugin_columns); plugin_display.set_model (plugin_model); /* XXX translators: try to convert "Fav" into a short term - related to "favorite" + related to "favorite" and "Hid" into a short term + related to "hidden" */ plugin_display.append_column (_("Fav"), plugin_columns.favorite); + plugin_display.append_column (_("Hid"), plugin_columns.hidden); plugin_display.append_column (_("Available Plugins"), plugin_columns.name); plugin_display.append_column (_("Type"), plugin_columns.type_name); plugin_display.append_column (_("Category"), plugin_columns.category); @@ -89,9 +92,14 @@ PluginSelector::PluginSelector (PluginManager *mgr) CellRendererToggle* fav_cell = dynamic_cast<CellRendererToggle*>(plugin_display.get_column_cell_renderer (0)); fav_cell->property_activatable() = true; - fav_cell->property_radio() = false; + fav_cell->property_radio() = true; fav_cell->signal_toggled().connect (mem_fun (*this, &PluginSelector::favorite_changed)); + CellRendererToggle* hidden_cell = dynamic_cast<CellRendererToggle*>(plugin_display.get_column_cell_renderer (1)); + hidden_cell->property_activatable() = true; + hidden_cell->property_radio() = true; + hidden_cell->signal_toggled().connect (mem_fun (*this, &PluginSelector::hidden_changed)); + scroller.set_border_width(10); scroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); scroller.add(plugin_display); @@ -102,7 +110,7 @@ PluginSelector::PluginSelector (PluginManager *mgr) added_list.set_headers_visible (true); added_list.set_reorderable (false); - for (int i = 0; i <=3; i++) { + for (int i = 0; i <=4; i++) { Gtk::TreeView::Column* column = plugin_display.get_column(i); column->set_sort_column(i); } @@ -153,7 +161,7 @@ PluginSelector::PluginSelector (PluginManager *mgr) table->attach(ascroller, 0, 7, 8, 10); - add_button (Stock::CANCEL, RESPONSE_CANCEL); + add_button (Stock::CLOSE, RESPONSE_CLOSE); add_button (_("Insert Plugin(s)"), RESPONSE_APPLY); set_default_response (RESPONSE_APPLY); set_response_sensitive (RESPONSE_APPLY, false); @@ -202,7 +210,11 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string& std::string mode = filter_mode.get_active_text (); if (mode == _("Favorites only")) { - return manager->is_a_favorite_plugin (info); + return manager->get_status (info) == PluginManager::Favorite; + } + + if (mode == _("Hidden only")) { + return manager->get_status (info) == PluginManager::Hidden; } if (!filterstr.empty()) { @@ -286,7 +298,8 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte if (show_this_plugin (*i, filterstr)) { TreeModel::Row newrow = *(plugin_model->append()); - newrow[plugin_columns.favorite] = manager->is_a_favorite_plugin (*i); + newrow[plugin_columns.favorite] = (manager->get_status (*i) == PluginManager::Favorite); + newrow[plugin_columns.hidden] = (manager->get_status (*i) == PluginManager::Hidden); newrow[plugin_columns.name] = (*i)->name; newrow[plugin_columns.type_name] = type; newrow[plugin_columns.category] = (*i)->category; @@ -469,7 +482,7 @@ PluginSelector::filter_mode_changed () { std::string mode = filter_mode.get_active_text (); - if (mode == _("Favorites only")) { + if (mode == _("Favorites only") || mode == _("Hidden only")) { filter_entry.set_sensitive (false); } else { filter_entry.set_sensitive (true); @@ -485,7 +498,7 @@ PluginSelector::on_show () filter_entry.grab_focus (); } -struct PluginMenuCompare { +struct PluginMenuCompareByCreator { bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { int cmp; @@ -503,28 +516,45 @@ struct PluginMenuCompare { } }; -Gtk::Menu& -PluginSelector::plugin_menu() -{ - using namespace Menu_Helpers; +struct PluginMenuCompareByName { + bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { + int cmp; - typedef std::map<Glib::ustring,Gtk::Menu*> SubmenuMap; - SubmenuMap submenu_map; + cmp = strcasecmp (a->name.c_str(), b->name.c_str()); - if (!_menu) { - _menu = new Menu(); - _menu->set_name("ArdourContextMenu"); - } + if (cmp < 0) { + return true; + } else if (cmp == 0) { + /* same name ... compare type */ + if (a->type < b->type) { + return true; + } + } + return false; + } +}; - MenuList& items = _menu->items(); - Menu* favs = new Menu(); - favs->set_name("ArdourContextMenu"); +struct PluginMenuCompareByCategory { + bool operator() (PluginInfoPtr a, PluginInfoPtr b) const { + int cmp; - items.clear (); - items.push_back (MenuElem (_("Favorites"), *favs)); - items.push_back (MenuElem (_("Plugin Manager"), mem_fun (*this, &PluginSelector::show_manager))); - items.push_back (SeparatorElem ()); + cmp = strcasecmp (a->category.c_str(), b->category.c_str()); + + if (cmp < 0) { + return true; + } else if (cmp == 0) { + /* same category ... compare names */ + if (strcasecmp (a->name.c_str(), b->name.c_str()) < 0) { + return true; + } + } + return false; + } +}; +Gtk::Menu& +PluginSelector::plugin_menu() +{ PluginInfoList all_plugs; all_plugs.insert (all_plugs.end(), manager->ladspa_plugin_info().begin(), manager->ladspa_plugin_info().end()); @@ -538,38 +568,125 @@ PluginSelector::plugin_menu() all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end()); #endif - PluginMenuCompare cmp; - all_plugs.sort (cmp); + using namespace Menu_Helpers; - for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { - SubmenuMap::iterator x; - Gtk::Menu* submenu; + if (!_menu) { + _menu = new Menu(); + _menu->set_name("ArdourContextMenu"); + } - string creator = (*i)->creator; - string::size_type pos = 0; + MenuList& items = _menu->items(); + items.clear (); + + Gtk::Menu* favs = create_favs_menu(all_plugs); + items.push_back (MenuElem (_("Favorites"), *favs)); - if (manager->is_a_favorite_plugin (*i)) { + items.push_back (MenuElem (_("Plugin Manager"), mem_fun (*this, &PluginSelector::show_manager))); + items.push_back (SeparatorElem ()); + + Menu* by_creator = create_by_creator_menu(all_plugs); + items.push_back (MenuElem (_("By Creator"), *by_creator)); + + Menu* by_category = create_by_category_menu(all_plugs); + items.push_back (MenuElem (_("By Category"), *by_category)); + + return *_menu; +} + +Gtk::Menu* +PluginSelector::create_favs_menu (PluginInfoList& all_plugs) +{ + using namespace Menu_Helpers; + + Menu* favs = new Menu(); + favs->set_name("ArdourContextMenu"); + + PluginMenuCompareByName cmp_by_name; + all_plugs.sort (cmp_by_name); + + for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { + if (manager->get_status (*i) == PluginManager::Favorite) { favs->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } - + } + return favs; +} + +Gtk::Menu* +PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs) +{ + using namespace Menu_Helpers; + + typedef std::map<Glib::ustring,Gtk::Menu*> SubmenuMap; + SubmenuMap creator_submenu_map; + + Menu* by_creator = new Menu(); + by_creator->set_name("ArdourContextMenu"); + + MenuList& by_creator_items = by_creator->items(); + PluginMenuCompareByCreator cmp_by_creator; + all_plugs.sort (cmp_by_creator); + + for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { + + if (manager->get_status (*i) == PluginManager::Hidden) continue; + + string creator = (*i)->creator; + /* stupid LADSPA creator strings */ - + string::size_type pos = 0; while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos; creator = creator.substr (0, pos); - if ((x = submenu_map.find (creator)) != submenu_map.end()) { + SubmenuMap::iterator x; + Gtk::Menu* submenu; + if ((x = creator_submenu_map.find (creator)) != creator_submenu_map.end()) { submenu = x->second; } else { submenu = new Gtk::Menu; - items.push_back (MenuElem (creator, *submenu)); - submenu_map.insert (pair<Glib::ustring,Menu*> (creator, submenu)); + by_creator_items.push_back (MenuElem (creator, *submenu)); + creator_submenu_map.insert (pair<Glib::ustring,Menu*> (creator, submenu)); submenu->set_name("ArdourContextMenu"); } - submenu->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } - - return *_menu; + return by_creator; +} + +Gtk::Menu* +PluginSelector::create_by_category_menu (ARDOUR::PluginInfoList& all_plugs) +{ + using namespace Menu_Helpers; + + typedef std::map<Glib::ustring,Gtk::Menu*> SubmenuMap; + SubmenuMap category_submenu_map; + + Menu* by_category = new Menu(); + by_category->set_name("ArdourContextMenu"); + + MenuList& by_category_items = by_category->items(); + PluginMenuCompareByCategory cmp_by_category; + all_plugs.sort (cmp_by_category); + + for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { + + if (manager->get_status (*i) == PluginManager::Hidden) continue; + + string category = (*i)->category; + + SubmenuMap::iterator x; + Gtk::Menu* submenu; + if ((x = category_submenu_map.find (category)) != category_submenu_map.end()) { + submenu = x->second; + } else { + submenu = new Gtk::Menu; + by_category_items.push_back (MenuElem (category, *submenu)); + category_submenu_map.insert (pair<Glib::ustring,Menu*> (category, submenu)); + submenu->set_name("ArdourContextMenu"); + } + submenu->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); + } + return by_category; } void @@ -596,9 +713,9 @@ PluginSelector::favorite_changed (const Glib::ustring& path) } in_row_change = true; - + TreeModel::iterator iter = plugin_model->get_iter (path); - + if (iter) { bool favorite = !(*iter)[plugin_columns.favorite]; @@ -606,18 +723,50 @@ PluginSelector::favorite_changed (const Glib::ustring& path) /* change state */ (*iter)[plugin_columns.favorite] = favorite; + (*iter)[plugin_columns.hidden] = false; + PluginManager::PluginStatusType status = (favorite ? PluginManager::Favorite : PluginManager::Normal); - /* save new favorites list */ + /* save new statuses list */ pi = (*iter)[plugin_columns.plugin]; - - if (favorite) { - manager->add_favorite (pi->type, pi->unique_id); - } else { - manager->remove_favorite (pi->type, pi->unique_id); - } - - manager->save_favorites (); + + manager->set_status (pi->type, pi->unique_id, status); + + manager->save_statuses (); + } + in_row_change = false; +} + +void +PluginSelector::hidden_changed (const Glib::ustring& path) +{ + PluginInfoPtr pi; + + if (in_row_change) { + return; + } + + in_row_change = true; + + TreeModel::iterator iter = plugin_model->get_iter (path); + + if (iter) { + + bool hidden = !(*iter)[plugin_columns.hidden]; + + /* change state */ + + (*iter)[plugin_columns.favorite] = false; + (*iter)[plugin_columns.hidden] = hidden; + PluginManager::PluginStatusType status = (hidden ? PluginManager::Hidden : PluginManager::Normal); + + /* save new statuses list */ + + pi = (*iter)[plugin_columns.plugin]; + + manager->set_status (pi->type, pi->unique_id, status); + + manager->save_statuses (); } in_row_change = false; } diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h index ab5495b348..dfdb3d05a2 100644 --- a/gtk2_ardour/plugin_selector.h +++ b/gtk2_ardour/plugin_selector.h @@ -66,6 +66,7 @@ class PluginSelector : public ArdourDialog struct PluginColumns : public Gtk::TreeModel::ColumnRecord { PluginColumns () { add (favorite); + add (hidden); add (name); add (type_name); add (category); @@ -75,6 +76,7 @@ class PluginSelector : public ArdourDialog add (plugin); } Gtk::TreeModelColumn<bool> favorite; + Gtk::TreeModelColumn<bool> hidden; Gtk::TreeModelColumn<std::string> name; Gtk::TreeModelColumn<std::string> type_name; Gtk::TreeModelColumn<std::string> category; @@ -122,10 +124,15 @@ class PluginSelector : public ArdourDialog void setup_filter_string (std::string&); void favorite_changed (const Glib::ustring& path); + void hidden_changed (const Glib::ustring& path); bool in_row_change; void plugin_chosen_from_menu (const ARDOUR::PluginInfoPtr&); Gtk::Menu* _menu; + + Gtk::Menu* create_favs_menu (ARDOUR::PluginInfoList&); + Gtk::Menu* create_by_creator_menu (ARDOUR::PluginInfoList&); + Gtk::Menu* create_by_category_menu (ARDOUR::PluginInfoList&); }; #endif // __ardour_plugin_selector_h__ |