From f4d6256067e9581e67162dc9516b5ad11c8c0d93 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 23 Sep 2007 04:00:03 +0000 Subject: Working LV2 GUI embedding, except for size issues... git-svn-id: http://svn.drobilla.net/lad/ingen@767 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/gui/NodeModule.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'src/libs/gui/NodeModule.cpp') 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 canvas, SharedPtr 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 canvas, SharedPtrsignal_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()); } @@ -90,6 +94,54 @@ NodeModule::create(boost::shared_ptr canvas, SharedPtr 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() { @@ -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(); -- cgit v1.2.1