summaryrefslogtreecommitdiffstats
path: root/src/gui/PluginMenu.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-11-24 13:44:03 +0100
committerDavid Robillard <d@drobilla.net>2018-11-24 13:44:03 +0100
commita7d83f19b08eb4c6f79a82fe60c2b86db13f4420 (patch)
treed9b620bfba1e7462df4ddb3f6225cc5216c0ca81 /src/gui/PluginMenu.cpp
parentd63edc742cebd685f8a05936682210aa5c1e69a9 (diff)
downloadingen-a7d83f19b08eb4c6f79a82fe60c2b86db13f4420.tar.gz
ingen-a7d83f19b08eb4c6f79a82fe60c2b86db13f4420.tar.bz2
ingen-a7d83f19b08eb4c6f79a82fe60c2b86db13f4420.zip
Squashed 'waflib/' changes from 6e726eb1..5ea8f99f
5ea8f99f Improve test output spacing 0e23b29f Raise exception when test suite fails to ensure non-zero exit status d6de073b Show run time of unit tests 5b655541 Add short configure option for ultra-strict flags 4687ba6d Use gtest-like test output 258903d9 Fix failure count in test group summaries da07e738 Fix verbose tests with Python 3 git-subtree-dir: waflib git-subtree-split: 5ea8f99f6e1246079c1fe6bb590c38a53aadd40d
Diffstat (limited to 'src/gui/PluginMenu.cpp')
-rw-r--r--src/gui/PluginMenu.cpp176
1 files changed, 0 insertions, 176 deletions
diff --git a/src/gui/PluginMenu.cpp b/src/gui/PluginMenu.cpp
deleted file mode 100644
index fc385773..00000000
--- a/src/gui/PluginMenu.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2014-2015 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or any later version.
-
- Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "PluginMenu.hpp"
-#include "ingen/Log.hpp"
-#include "ingen/client/PluginModel.hpp"
-
-namespace Ingen {
-namespace GUI {
-
-PluginMenu::PluginMenu(Ingen::World& world)
- : _world(world)
- , _classless_menu(nullptr, nullptr)
-{
- clear();
-}
-
-void
-PluginMenu::clear()
-{
- const LilvWorld* lworld = _world.lilv_world();
- const LilvPluginClass* lv2_plugin = lilv_world_get_plugin_class(lworld);
- const LilvPluginClasses* classes = lilv_world_get_plugin_classes(lworld);
-
- // Empty completely
- _classless_menu = MenuRecord(nullptr, nullptr);
- _class_menus.clear();
- items().clear();
-
- // Build skeleton
- LV2Children children;
- LILV_FOREACH(plugin_classes, i, classes) {
- const LilvPluginClass* c = lilv_plugin_classes_get(classes, i);
- const LilvNode* p = lilv_plugin_class_get_parent_uri(c);
- if (!p) {
- p = lilv_plugin_class_get_uri(lv2_plugin);
- }
- children.emplace(lilv_node_as_string(p), c);
- }
-
- std::set<const char*> ancestors;
- build_plugin_class_menu(this, lv2_plugin, classes, children, ancestors);
-
- items().push_back(Gtk::Menu_Helpers::MenuElem("_Uncategorized"));
- _classless_menu.item = &(items().back());
- _classless_menu.menu = Gtk::manage(new Gtk::Menu());
- _classless_menu.item->set_submenu(*_classless_menu.menu);
- _classless_menu.item->hide();
-}
-
-void
-PluginMenu::add_plugin(SPtr<Client::PluginModel> p)
-{
- typedef ClassMenus::iterator iterator;
-
- if (!p->lilv_plugin() || lilv_plugin_is_replaced(p->lilv_plugin())) {
- return;
- }
-
- const LilvPluginClass* pc = lilv_plugin_get_class(p->lilv_plugin());
- const LilvNode* class_uri = lilv_plugin_class_get_uri(pc);
- const char* class_uri_str = lilv_node_as_string(class_uri);
-
- std::pair<iterator, iterator> range = _class_menus.equal_range(class_uri_str);
- if (range.first == _class_menus.end() || range.first == range.second
- || range.first->second.menu == this) {
- // Add to uncategorized plugin menu
- add_plugin_to_menu(_classless_menu, p);
- } else {
- // For each menu that represents plugin's class (possibly several)
- for (auto i = range.first; i != range.second ; ++i) {
- add_plugin_to_menu(i->second, p);
- }
- }
-}
-
-size_t
-PluginMenu::build_plugin_class_menu(Gtk::Menu* menu,
- const LilvPluginClass* plugin_class,
- const LilvPluginClasses* classes,
- const LV2Children& children,
- std::set<const char*>& ancestors)
-{
- size_t num_items = 0;
- const LilvNode* class_uri = lilv_plugin_class_get_uri(plugin_class);
- const char* class_uri_str = lilv_node_as_string(class_uri);
-
- const std::pair<LV2Children::const_iterator, LV2Children::const_iterator> kids
- = children.equal_range(class_uri_str);
-
- if (kids.first == children.end()) {
- return 0;
- }
-
- // Add submenus
- ancestors.insert(class_uri_str);
- for (LV2Children::const_iterator i = kids.first; i != kids.second; ++i) {
- const LilvPluginClass* c = i->second;
- const char* sub_label_str = lilv_node_as_string(lilv_plugin_class_get_label(c));
- const char* sub_uri_str = lilv_node_as_string(lilv_plugin_class_get_uri(c));
- if (ancestors.find(sub_uri_str) != ancestors.end()) {
- _world.log().warn(fmt("Infinite LV2 class recursion: %1% <: %2%\n")
- % class_uri_str % sub_uri_str);
- return 0;
- }
-
- Gtk::Menu_Helpers::MenuElem menu_elem = Gtk::Menu_Helpers::MenuElem(
- std::string("_") + sub_label_str);
- menu->items().push_back(menu_elem);
- Gtk::MenuItem* menu_item = &(menu->items().back());
-
- Gtk::Menu* submenu = Gtk::manage(new Gtk::Menu());
- menu_item->set_submenu(*submenu);
-
- size_t num_child_items = build_plugin_class_menu(
- submenu, c, classes, children, ancestors);
-
- _class_menus.emplace(sub_uri_str, MenuRecord(menu_item, submenu));
- if (num_child_items == 0) {
- menu_item->hide();
- }
-
- ++num_items;
- }
- ancestors.erase(class_uri_str);
-
- return num_items;
-}
-
-void
-PluginMenu::add_plugin_to_menu(MenuRecord& menu, SPtr<Client::PluginModel> p)
-{
- const URIs& uris = _world.uris();
- LilvWorld* lworld = _world.lilv_world();
- LilvNode* ingen_Graph = lilv_new_uri(lworld, uris.ingen_Graph.c_str());
- LilvNode* rdf_type = lilv_new_uri(lworld, uris.rdf_type.c_str());
-
- bool is_graph = lilv_world_ask(lworld,
- lilv_plugin_get_uri(p->lilv_plugin()),
- rdf_type,
- ingen_Graph);
-
- menu.menu->items().push_back(
- Gtk::Menu_Helpers::MenuElem(
- std::string("_") + p->human_name() + (is_graph ? " ⚙" : ""),
- sigc::bind(sigc::mem_fun(this, &PluginMenu::load_plugin), p)));
-
- if (!menu.item->is_visible()) {
- menu.item->show();
- }
-
- lilv_node_free(rdf_type);
- lilv_node_free(ingen_Graph);
-}
-
-void
-PluginMenu::load_plugin(WPtr<Client::PluginModel> weak_plugin)
-{
- signal_load_plugin.emit(weak_plugin);
-}
-
-} // namespace GUI
-} // namespace Ingen