summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-04-25 02:14:12 +0000
committerDavid Robillard <d@drobilla.net>2012-04-25 02:14:12 +0000
commit60225956989f53f4576886b129b771a9f69b3a6f (patch)
tree106feed603d423356c1ae4ba35c08cb23f7999dc
parent15d4fba20c9fc2be562d73b72d8e8041b847976b (diff)
downloadingen-60225956989f53f4576886b129b771a9f69b3a6f.tar.gz
ingen-60225956989f53f4576886b129b771a9f69b3a6f.tar.bz2
ingen-60225956989f53f4576886b129b771a9f69b3a6f.zip
Preserve node UI embedded state and fix repeated embedding/de-embedding.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4269 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--ingen/shared/URIs.hpp1
-rw-r--r--src/client/PluginModel.cpp3
-rw-r--r--src/gui/NodeMenu.cpp4
-rw-r--r--src/gui/NodeModule.cpp39
-rw-r--r--src/gui/NodeModule.hpp1
-rw-r--r--src/shared/URIs.cpp1
6 files changed, 26 insertions, 23 deletions
diff --git a/ingen/shared/URIs.hpp b/ingen/shared/URIs.hpp
index 8f5b830e..0014961f 100644
--- a/ingen/shared/URIs.hpp
+++ b/ingen/shared/URIs.hpp
@@ -81,6 +81,7 @@ public:
const Quark ingen_sampleRate;
const Quark ingen_selected;
const Quark ingen_source;
+ const Quark ingen_uiEmbedded;
const Quark ingen_value;
const Quark lv2_AudioPort;
const Quark lv2_CVPort;
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp
index 4381d979..6a5912a8 100644
--- a/src/client/PluginModel.cpp
+++ b/src/client/PluginModel.cpp
@@ -195,8 +195,9 @@ SharedPtr<PluginUI>
PluginModel::ui(Ingen::Shared::World* world,
SharedPtr<const NodeModel> node) const
{
- if (_type != LV2)
+ if (!_lilv_plugin) {
return SharedPtr<PluginUI>();
+ }
return PluginUI::create(world, node, _lilv_plugin);
}
diff --git a/src/gui/NodeMenu.cpp b/src/gui/NodeMenu.cpp
index f63384d3..0d58d40c 100644
--- a/src/gui/NodeMenu.cpp
+++ b/src/gui/NodeMenu.cpp
@@ -67,6 +67,10 @@ NodeMenu::init(App& app, SharedPtr<const NodeModel> node)
if (plugin && plugin->type() == PluginModel::LV2 && plugin->has_ui()) {
_popup_gui_menuitem->show();
_embed_gui_menuitem->show();
+ const Raul::Atom& ui_embedded = node->get_property(
+ _app->uris().ingen_uiEmbedded);
+ _embed_gui_menuitem->set_active(
+ ui_embedded.is_valid() && ui_embedded.get_bool());
} else {
_popup_gui_menuitem->hide();
_embed_gui_menuitem->hide();
diff --git a/src/gui/NodeModule.cpp b/src/gui/NodeModule.cpp
index bdd5f32f..87b3ba5d 100644
--- a/src/gui/NodeModule.cpp
+++ b/src/gui/NodeModule.cpp
@@ -88,7 +88,7 @@ NodeModule::show_menu(GdkEventButton* ev)
WidgetFactory::get_widget_derived("object_menu", _menu);
_menu->init(app(), _node);
_menu->signal_embed_gui.connect(
- sigc::mem_fun(this, &NodeModule::embed_gui));
+ sigc::mem_fun(this, &NodeModule::on_embed_gui_toggled));
_menu->signal_popup_gui.connect(
sigc::hide_return(sigc::mem_fun(this, &NodeModule::popup_gui)));
_menu->popup(ev->button, ev->time);
@@ -190,11 +190,18 @@ NodeModule::plugin_changed()
}
void
+NodeModule::on_embed_gui_toggled(bool embed)
+{
+ embed_gui(embed);
+ app().engine()->set_property(_node->path(),
+ app().uris().ingen_uiEmbedded,
+ app().forge().make(embed));
+}
+
+void
NodeModule::embed_gui(bool embed)
{
- const URIs& uris = app().uris();
if (embed) {
-
if (_gui_window) {
warn << "LV2 GUI already popped up, cannot embed" << endl;
return;
@@ -220,30 +227,12 @@ NodeModule::embed_gui(bool embed)
if (_gui_widget) {
_gui_widget->show_all();
-
- for (NodeModel::Ports::const_iterator p = _node->ports().begin();
- p != _node->ports().end(); ++p)
- if ((*p)->is_output() && app().can_control(p->get()))
- app().engine()->set_property((*p)->path(),
- uris.ingen_broadcast,
- app().forge().make(true));
+ set_control_values();
}
} else { // un-embed
-
Ganv::Module::embed(NULL);
_plugin_ui.reset();
-
- for (NodeModel::Ports::const_iterator p = _node->ports().begin();
- p != _node->ports().end(); ++p)
- if ((*p)->is_output() && app().can_control(p->get()))
- app().engine()->set_property((*p)->path(),
- uris.ingen_broadcast,
- app().forge().make(false));
- }
-
- if (embed) {
- set_control_values();
}
}
@@ -415,6 +404,12 @@ NodeModule::property_changed(const URI& key, const Atom& value)
if (value.get_bool() != get_selected()) {
set_selected(value.get_bool());
}
+ } else if (key == uris.ingen_uiEmbedded) {
+ if (value.get_bool() && !_gui_widget) {
+ embed_gui(true);
+ } else if (!value.get_bool() && _gui_widget) {
+ embed_gui(false);
+ }
}
} else if (value.type() == uris.forge.String) {
if (key == uris.lv2_name
diff --git a/src/gui/NodeModule.hpp b/src/gui/NodeModule.hpp
index a0dd3417..6d83230a 100644
--- a/src/gui/NodeModule.hpp
+++ b/src/gui/NodeModule.hpp
@@ -73,6 +73,7 @@ protected:
bool on_event(GdkEvent* ev);
void show_control_window();
+ void on_embed_gui_toggled(bool embed);
void embed_gui(bool embed);
bool popup_gui();
void on_gui_window_close();
diff --git a/src/shared/URIs.cpp b/src/shared/URIs.cpp
index 9d78a2d1..415fc421 100644
--- a/src/shared/URIs.cpp
+++ b/src/shared/URIs.cpp
@@ -85,6 +85,7 @@ URIs::URIs(Ingen::Forge& f, LV2URIMap* map)
, ingen_sampleRate (forge, map, NS_INGEN "sampleRate")
, ingen_selected (forge, map, NS_INGEN "selected")
, ingen_source (forge, map, NS_INGEN "source")
+ , ingen_uiEmbedded (forge, map, NS_INGEN "uiEmbedded")
, ingen_value (forge, map, NS_INGEN "value")
, lv2_AudioPort (forge, map, LV2_CORE__AudioPort)
, lv2_CVPort (forge, map, LV2_CORE__CVPort)