From b8cf49d04a2600f83767ddda46929d4d47adc3fd Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 13 Feb 2010 21:49:19 +0000 Subject: Make preset menu work when clicking items (previously only worked when pressing enter for mysterious crazy nonsensical reasons). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2441 a436a847-0d15-0410-975c-d299462d15a1 --- src/gui/NodeMenu.cpp | 37 ++++++++++++++++++++++++++----------- src/gui/NodeMenu.hpp | 1 + 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/gui/NodeMenu.cpp b/src/gui/NodeMenu.cpp index ae735ad6..aed7650c 100644 --- a/src/gui/NodeMenu.cpp +++ b/src/gui/NodeMenu.cpp @@ -16,6 +16,7 @@ */ #include +#include "ingen-config.h" #include "interface/EngineInterface.hpp" #include "shared/LV2URIMap.hpp" #include "client/NodeModel.hpp" @@ -92,22 +93,28 @@ NodeMenu::init(SharedPtr node) "PREFIX dc: \n" "SELECT ?p ?name WHERE { <> pset:hasPreset ?p . ?p dc:title ?name }\n"); if (!slv2_results_finished(presets)) { - items().push_front(Gtk::Menu_Helpers::SeparatorElem()); - items().push_front(Gtk::Menu_Helpers::ImageMenuElem("_Presets", - *(manage(new Gtk::Image(Gtk::Stock::INDEX, Gtk::ICON_SIZE_MENU))))); - Gtk::MenuItem* presets_menu_item = &(items().front()); _presets_menu = Gtk::manage(new Gtk::Menu()); - presets_menu_item->set_submenu(*_presets_menu); for (; !slv2_results_finished(presets); slv2_results_next(presets)) { SLV2Value uri = slv2_results_get_binding_value(presets, 0); SLV2Value name = slv2_results_get_binding_value(presets, 1); - Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(slv2_value_as_string(name))); - _presets_menu->items().push_back(*item); - item->show(); - item->signal_activate().connect( - sigc::bind(sigc::mem_fun(this, &NodeMenu::on_preset_activated), - string(slv2_value_as_string(uri))), false); + _presets_menu->items().push_back(Gtk::Menu_Helpers::MenuElem( + slv2_value_as_string(name), + sigc::bind( + sigc::mem_fun(this, &NodeMenu::on_preset_activated), + string(slv2_value_as_string(uri))))); + + // I have no idea why this is necessary, signal_activated doesn't work + // in this menu (and only this menu) + Gtk::MenuItem* item = &(_presets_menu->items().back()); + item->signal_button_release_event().connect( + sigc::bind<0>(sigc::mem_fun(this, &NodeMenu::on_preset_clicked), + string(slv2_value_as_string(uri)))); } + items().push_front(Gtk::Menu_Helpers::SeparatorElem()); + items().push_front(Gtk::Menu_Helpers::ImageMenuElem("_Presets", + *(manage(new Gtk::Image(Gtk::Stock::INDEX, Gtk::ICON_SIZE_MENU))))); + Gtk::MenuItem* presets_menu_item = &(items().front()); + presets_menu_item->set_submenu(*_presets_menu); } slv2_results_free(presets); } @@ -189,6 +196,14 @@ NodeMenu::on_preset_activated(const std::string uri) } +bool +NodeMenu::on_preset_clicked(const std::string uri, GdkEventButton* ev) +{ + on_preset_activated(uri); + return false; +} + + bool NodeMenu::has_control_inputs() { diff --git a/src/gui/NodeMenu.hpp b/src/gui/NodeMenu.hpp index 7d2be982..1698e597 100644 --- a/src/gui/NodeMenu.hpp +++ b/src/gui/NodeMenu.hpp @@ -54,6 +54,7 @@ protected: void on_menu_embed_gui(); void on_menu_randomize(); void on_preset_activated(const std::string uri); + bool on_preset_clicked(const std::string uri, GdkEventButton* ev); Gtk::MenuItem* _controls_menuitem; Gtk::MenuItem* _popup_gui_menuitem; -- cgit v1.2.1