diff options
author | David Robillard <d@drobilla.net> | 2008-09-30 16:50:21 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-09-30 16:50:21 +0000 |
commit | 93850c202de8b073a1ce1dd8bd246d407bce4e2f (patch) | |
tree | 6910b135bf4eff12de1af116cef73f6e9c107cd0 /src/libs/gui/NodeModule.cpp | |
parent | a8bf5272d096de73507d2eab47f282c345f4ca8a (diff) | |
download | ingen-93850c202de8b073a1ce1dd8bd246d407bce4e2f.tar.gz ingen-93850c202de8b073a1ce1dd8bd246d407bce4e2f.tar.bz2 ingen-93850c202de8b073a1ce1dd8bd246d407bce4e2f.zip |
Flatten ingen source directory heirarchy a bit.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1551 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/gui/NodeModule.cpp')
-rw-r--r-- | src/libs/gui/NodeModule.cpp | 386 |
1 files changed, 0 insertions, 386 deletions
diff --git a/src/libs/gui/NodeModule.cpp b/src/libs/gui/NodeModule.cpp deleted file mode 100644 index 97edaa84..00000000 --- a/src/libs/gui/NodeModule.cpp +++ /dev/null @@ -1,386 +0,0 @@ -/* This file is part of Ingen. - * Copyright (C) 2007 Dave Robillard <http://drobilla.net> - * - * Ingen is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) 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 General Public License for details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <cassert> -#include <raul/Atom.hpp> -#include "interface/EngineInterface.hpp" -#include "client/NodeModel.hpp" -#include "client/PatchModel.hpp" -#include "client/PluginUI.hpp" -#include "App.hpp" -#include "GladeFactory.hpp" -#include "NodeControlWindow.hpp" -#include "NodeModule.hpp" -#include "PatchCanvas.hpp" -#include "PatchWindow.hpp" -#include "Port.hpp" -#include "RenameWindow.hpp" -#include "SubpatchModule.hpp" -#include "WindowFactory.hpp" -#include "Configuration.hpp" - -using namespace std; - -namespace Ingen { -namespace GUI { - - -NodeModule::NodeModule(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> node) - : FlowCanvas::Module(canvas, node->path().name()) - , _node(node) - , _gui_widget(NULL) - , _gui_window(NULL) -{ - assert(_node); - - node->signal_new_port.connect(sigc::bind(sigc::mem_fun(this, &NodeModule::add_port), true)); - node->signal_removed_port.connect(sigc::mem_fun(this, &NodeModule::remove_port)); - node->signal_variable.connect(sigc::mem_fun(this, &NodeModule::set_variable)); - node->signal_property.connect(sigc::mem_fun(this, &NodeModule::set_property)); - node->signal_renamed.connect(sigc::mem_fun(this, &NodeModule::rename)); -} - - -NodeModule::~NodeModule() -{ - NodeControlWindow* win = App::instance().window_factory()->control_window(_node); - - if (win) { - // Should remove from window factory via signal - delete win; - } -} - - -void -NodeModule::create_menu() -{ - Glib::RefPtr<Gnome::Glade::Xml> xml = GladeFactory::new_glade_reference(); - xml->get_widget_derived("object_menu", _menu); - _menu->init(_node); - _menu->signal_embed_gui.connect(sigc::mem_fun(this, &NodeModule::embed_gui)); - _menu->signal_popup_gui.connect(sigc::hide_return(sigc::mem_fun(this, &NodeModule::popup_gui))); - - set_menu(_menu); -} - - -boost::shared_ptr<NodeModule> -NodeModule::create(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> node, bool human) -{ - boost::shared_ptr<NodeModule> ret; - - SharedPtr<PatchModel> patch = PtrCast<PatchModel>(node); - if (patch) - ret = boost::shared_ptr<NodeModule>(new SubpatchModule(canvas, patch)); - else - ret = boost::shared_ptr<NodeModule>(new NodeModule(canvas, node)); - - for (GraphObject::Variables::const_iterator m = node->variables().begin(); m != node->variables().end(); ++m) - ret->set_variable(m->first, m->second); - - for (NodeModel::Ports::const_iterator p = node->ports().begin(); p != node->ports().end(); ++p) { - ret->add_port(*p, false); - } - - if (human) - ret->show_human_names(human); - - ret->resize(); - ret->set_stacked_border(node->polyphonic()); - - return ret; -} - - -void -NodeModule::show_human_names(bool b) -{ - if (b && node()->plugin()) - set_name(((PluginModel*)node()->plugin())->human_name()); - else - b = false; - - if (!b) - set_name(node()->symbol()); - - uint32_t index = 0; - for (PortVector::const_iterator i = ports().begin(); i != ports().end(); ++i) { - if (b) { - string hn = ((PluginModel*)node()->plugin())->port_human_name(index); - if (hn != "") - (*i)->set_name(hn); - } else { - (*i)->set_name(node()->port(index)->symbol()); - } - ++index; - } - - resize(); -} - - -void -NodeModule::value_changed(uint32_t index, const Atom& value) -{ - float control = 0.0f; - switch (value.type()) { - case Atom::FLOAT: - control = value.get_float(); - if (_plugin_ui) { - SLV2UIInstance inst = _plugin_ui->instance(); - const LV2UI_Descriptor* ui_descriptor = slv2_ui_instance_get_descriptor(inst); - LV2UI_Handle ui_handle = slv2_ui_instance_get_handle(inst); - if (ui_descriptor->port_event) - ui_descriptor->port_event(ui_handle, index, 4, 0, &control); - } - break; - case Atom::STRING: - cout << "Port value type is a string? (\"" << value.get_string() << "\")" << endl; - break; - default: - break; - } -} - - -void -NodeModule::embed_gui(bool embed) -{ - if (embed) { - - if (_gui_window) { - cerr << "LV2 GUI already popped up, cannot embed" << endl; - return; - } - - if (!_plugin_ui) { - const PluginModel* const pm = dynamic_cast<const PluginModel*>(_node->plugin()); - assert(pm); - _plugin_ui = pm->ui(App::instance().world(), _node); - } - - if (_plugin_ui) { - GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(_plugin_ui->instance()); - _gui_widget = Glib::wrap(c_widget); - assert(_gui_widget); - - Gtk::Container* container = new Gtk::EventBox(); - container->set_name("ingen_embedded_node_gui_container"); - container->add(*_gui_widget); - FlowCanvas::Module::embed(container); - } else { - cerr << "ERROR: Failed to create LV2 UI" << endl; - } - - if (_gui_widget) { - _gui_widget->show_all(); - - for (NodeModel::Ports::const_iterator p = _node->ports().begin(); - p != _node->ports().end(); ++p) - if ((*p)->type().is_control() && (*p)->is_output()) - App::instance().engine()->set_property((*p)->path(), "ingen:broadcast", true); - } - - } else { // un-embed - - FlowCanvas::Module::embed(NULL); - _plugin_ui.reset(); - - for (NodeModel::Ports::const_iterator p = _node->ports().begin(); p != _node->ports().end(); ++p) - if ((*p)->type().is_control() && (*p)->is_output()) - App::instance().engine()->set_property((*p)->path(), "ingen:broadcast", false); - } - - if (embed && _embed_item) { - initialise_gui_values(); - set_base_color(0x212222FF); - } else { - set_default_base_color(); - } - - resize(); -} - - -void -NodeModule::rename() -{ - set_name(_node->path().name()); - resize(); -} - - -void -NodeModule::add_port(SharedPtr<PortModel> port, bool resize_to_fit) -{ - uint32_t index = _ports.size(); // FIXME: kludge, engine needs to tell us this - - string name = port->path().name(); - if (App::instance().configuration()->name_style() == Configuration::HUMAN && node()->plugin()) - name = ((PluginModel*)node()->plugin())->port_human_name(index); - - Module::add_port(boost::shared_ptr<Port>( - new Port(PtrCast<NodeModule>(shared_from_this()), port, name))); - - port->signal_value_changed.connect(sigc::bind<0>( - sigc::mem_fun(this, &NodeModule::value_changed), index)); - - if (resize_to_fit) - resize(); -} - - -void -NodeModule::remove_port(SharedPtr<PortModel> port) -{ - SharedPtr<FlowCanvas::Port> p = Module::remove_port(port->path().name()); - p.reset(); -} - - -bool -NodeModule::popup_gui() -{ -#ifdef HAVE_SLV2 - if (_node->plugin() && _node->plugin()->type() == PluginModel::LV2) { - if (_plugin_ui) { - cerr << "LV2 GUI already embedded, cannot pop up" << endl; - return false; - } - - const PluginModel* const plugin = dynamic_cast<const PluginModel*>(_node->plugin()); - assert(plugin); - - _plugin_ui = plugin->ui(App::instance().world(), _node); - - if (_plugin_ui) { - GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(_plugin_ui->instance()); - _gui_widget = Glib::wrap(c_widget); - - _gui_window = new Gtk::Window(); - _gui_window->add(*_gui_widget); - _gui_widget->show_all(); - initialise_gui_values(); - - _gui_window->signal_unmap().connect( - sigc::mem_fun(this, &NodeModule::on_gui_window_close)); - _gui_window->present(); - - return true; - } else { - cerr << "No LV2 GUI" << endl; - } - } -#endif - return false; -} - - -void -NodeModule::on_gui_window_close() -{ - delete _gui_window; - _gui_window = NULL; - _plugin_ui.reset(); - _gui_widget = NULL; -} - - -void -NodeModule::initialise_gui_values() -{ - uint32_t index=0; - for (NodeModel::Ports::const_iterator p = _node->ports().begin(); p != _node->ports().end(); ++p) { - if ((*p)->type().is_control()) - value_changed(index, (*p)->value()); - ++index; - } -} - - -void -NodeModule::show_control_window() -{ - App::instance().window_factory()->present_controls(_node); -} - - -void -NodeModule::on_double_click(GdkEventButton* ev) -{ - if ( ! popup_gui() ) - show_control_window(); -} - - -void -NodeModule::store_location() -{ - const float x = static_cast<float>(property_x()); - const float y = static_cast<float>(property_y()); - - const Atom& existing_x = _node->get_variable("ingenuity:canvas-x"); - const Atom& existing_y = _node->get_variable("ingenuity:canvas-y"); - - if (existing_x.type() != Atom::FLOAT || existing_y.type() != Atom::FLOAT - || existing_x.get_float() != x || existing_y.get_float() != y) { - App::instance().engine()->set_variable(_node->path(), "ingenuity:canvas-x", Atom(x)); - App::instance().engine()->set_variable(_node->path(), "ingenuity:canvas-y", Atom(y)); - } -} - - -void -NodeModule::set_variable(const string& key, const Atom& value) -{ - if (key == "ingenuity:canvas-x" && value.type() == Atom::FLOAT) - move_to(value.get_float(), property_y()); - else if (key == "ingenuity:canvas-y" && value.type() == Atom::FLOAT) - move_to(property_x(), value.get_float()); -} - - -void -NodeModule::set_property(const string& key, const Atom& value) -{ - if (key == "ingen:polyphonic" && value.type() == Atom::BOOL) { - set_stacked_border(value.get_bool()); - } else if (key == "ingen:selected" && value.type() == Atom::BOOL) { - if (value.get_bool() != selected()) { - if (value.get_bool()) - _canvas.lock()->select_item(shared_from_this()); - else - _canvas.lock()->unselect_item(shared_from_this()); - } - } -} - - -void -NodeModule::set_selected(bool b) -{ - if (b != selected()) { - Module::set_selected(b); - if (App::instance().signal()) - App::instance().engine()->set_property(_node->path(), "ingen:selected", b); - } -} - - -} // namespace GUI -} // namespace Ingen |