summaryrefslogtreecommitdiffstats
path: root/src/libs/gui/NodeModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/gui/NodeModule.cpp')
-rw-r--r--src/libs/gui/NodeModule.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/libs/gui/NodeModule.cpp b/src/libs/gui/NodeModule.cpp
new file mode 100644
index 00000000..3c80f5e2
--- /dev/null
+++ b/src/libs/gui/NodeModule.cpp
@@ -0,0 +1,153 @@
+/* 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.h>
+#include "interface/EngineInterface.h"
+#include "client/PatchModel.h"
+#include "client/NodeModel.h"
+#include "App.h"
+#include "NodeModule.h"
+#include "PatchCanvas.h"
+#include "Port.h"
+#include "GladeFactory.h"
+#include "RenameWindow.h"
+#include "PatchWindow.h"
+#include "WindowFactory.h"
+#include "SubpatchModule.h"
+#include "NodeControlWindow.h"
+
+namespace Ingen {
+namespace GUI {
+
+
+NodeModule::NodeModule(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> node)
+: LibFlowCanvas::Module(canvas, node->path().name()),
+ _node(node),
+ _menu(node)
+{
+ assert(_node);
+
+ if (node->polyphonic()) {
+ set_border_width(2.0);
+ }
+
+ node->new_port_sig.connect(sigc::bind(sigc::mem_fun(this, &NodeModule::add_port), true));
+ node->removed_port_sig.connect(sigc::mem_fun(this, &NodeModule::remove_port));
+ node->metadata_update_sig.connect(sigc::mem_fun(this, &NodeModule::metadata_update));
+
+ signal_clicked.connect(sigc::mem_fun(this, &NodeModule::on_click));
+}
+
+
+NodeModule::~NodeModule()
+{
+ NodeControlWindow* win = App::instance().window_factory()->control_window(_node);
+
+ if (win) {
+ // Should remove from window factory via signal
+ delete win;
+ }
+}
+
+
+boost::shared_ptr<NodeModule>
+NodeModule::create(boost::shared_ptr<PatchCanvas> canvas, SharedPtr<NodeModel> node)
+{
+ 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 (MetadataMap::const_iterator m = node->metadata().begin(); m != node->metadata().end(); ++m)
+ ret->metadata_update(m->first, m->second);
+
+ for (PortModelList::const_iterator p = node->ports().begin(); p != node->ports().end(); ++p)
+ ret->add_port(*p, false);
+
+ ret->resize();
+
+ return ret;
+}
+
+
+void
+NodeModule::add_port(SharedPtr<PortModel> port, bool resize_to_fit)
+{
+ Module::add_port(boost::shared_ptr<Port>(new Port(
+ PtrCast<NodeModule>(shared_from_this()), port)));
+
+ if (resize_to_fit)
+ resize();
+}
+
+
+void
+NodeModule::remove_port(SharedPtr<PortModel> port)
+{
+ SharedPtr<LibFlowCanvas::Port> p = Module::remove_port(port->path().name());
+ p.reset();
+}
+
+
+void
+NodeModule::show_control_window()
+{
+ App::instance().window_factory()->present_controls(_node);
+}
+
+
+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_metadata("ingenuity:canvas-x");
+ const Atom& existing_y = _node->get_metadata("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_metadata(_node->path(), "ingenuity:canvas-x", Atom(x));
+ App::instance().engine()->set_metadata(_node->path(), "ingenuity:canvas-y", Atom(y));
+ }
+}
+
+
+void
+NodeModule::on_click(GdkEventButton* event)
+{
+ if (event->button == 3)
+ _menu.popup(event->button, event->time);
+}
+
+
+void
+NodeModule::metadata_update(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());
+}
+
+
+} // namespace GUI
+} // namespace Ingen