summaryrefslogtreecommitdiffstats
path: root/src/libs/gui/NodeModule.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-09-23 04:00:03 +0000
committerDavid Robillard <d@drobilla.net>2007-09-23 04:00:03 +0000
commitf4d6256067e9581e67162dc9516b5ad11c8c0d93 (patch)
treebf527e91fcf0b938bc0c9610d8e78f48647cc470 /src/libs/gui/NodeModule.cpp
parentd1ba04724f0bfbed18690316dbe5eb977a131733 (diff)
downloadingen-f4d6256067e9581e67162dc9516b5ad11c8c0d93.tar.gz
ingen-f4d6256067e9581e67162dc9516b5ad11c8c0d93.tar.bz2
ingen-f4d6256067e9581e67162dc9516b5ad11c8c0d93.zip
Working LV2 GUI embedding, except for size issues...
git-svn-id: http://svn.drobilla.net/lad/ingen@767 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/gui/NodeModule.cpp')
-rw-r--r--src/libs/gui/NodeModule.cpp55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/libs/gui/NodeModule.cpp b/src/libs/gui/NodeModule.cpp
index d271dd2f..4d7770ba 100644
--- a/src/libs/gui/NodeModule.cpp
+++ b/src/libs/gui/NodeModule.cpp
@@ -38,6 +38,8 @@ namespace GUI {
NodeModule::NodeModule(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> node)
: FlowCanvas::Module(canvas, node->path().name())
, _node(node)
+ , _gui(NULL)
+ , _gui_item(NULL)
{
assert(_node);
@@ -51,6 +53,8 @@ NodeModule::NodeModule(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeMode
node->signal_metadata.connect(sigc::mem_fun(this, &NodeModule::set_metadata));
node->signal_polyphonic.connect(sigc::mem_fun(this, &NodeModule::set_stacked_border));
node->signal_renamed.connect(sigc::mem_fun(this, &NodeModule::rename));
+
+ _menu->signal_embed_gui.connect(sigc::mem_fun(this, &NodeModule::embed_gui));
set_stacked_border(node->polyphonic());
}
@@ -91,6 +95,54 @@ NodeModule::create(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> n
void
+NodeModule::embed_gui(bool embed)
+{
+ if (embed) {
+ if (!_gui_item) {
+ cerr << "Embedding LV2 GUI" << endl;
+ // FIXME: leaks?
+ SLV2UIInstance ui = _node->plugin()->ui(App::instance().engine().get(), _node.get());
+ if (ui) {
+ cerr << "Found UI" << endl;
+ GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(ui);
+ _gui = Glib::wrap(c_widget);
+ assert(_gui);
+ const double y = 4 + _canvas_title.property_text_height();
+ _gui_item = new Gnome::Canvas::Widget(/**_canvas.lock()->root()*/*this, 2.0, y, *_gui);
+ }
+ }
+
+ if (_gui_item) {
+ assert(_gui);
+ cerr << "Created canvas item" << endl;
+ _gui->show();
+ _gui->show_all();
+ _gui_item->show();
+ Gtk::Requisition r = _gui->size_request();
+ cerr << "Size request: " << r.width << "x" << r.height << endl;
+ _width = max(_width, (double)r.width);
+ _height = max(_height, (double)r.height);
+ _gui_item->property_width() = _width;
+ _gui_item->property_height() = _height;
+ _gui_item->raise_to_top();
+ _ports_y_offset = _height + 2;
+ set_width(_width);
+ } else {
+ cerr << "*** Failed to create canvas item" << endl;
+ }
+
+ } else {
+ if (_gui_item)
+ _gui_item->hide();
+
+ _ports_y_offset = 0;
+ }
+
+ resize();
+}
+
+
+void
NodeModule::rename()
{
set_name(_node->path().name());
@@ -128,8 +180,9 @@ NodeModule::show_control_window()
cerr << "Showing LV2 GUI" << endl;
// FIXME: leak
GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(ui);
- Gtk::Window* win = new Gtk::Window();
Gtk::Widget* widget = Glib::wrap(c_widget);
+
+ Gtk::Window* win = new Gtk::Window();
win->add(*widget);
widget->show_all();
win->show_all();