summaryrefslogtreecommitdiffstats
path: root/src/progs/ingenuity/OmFlowCanvas.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-09-13 06:11:25 +0000
committerDavid Robillard <d@drobilla.net>2006-09-13 06:11:25 +0000
commite5675ebfeb93175e16762d0a078bd51d15d05f63 (patch)
tree189249ed9014e4c482cfaed0d6af28ced68570ca /src/progs/ingenuity/OmFlowCanvas.cpp
parent23b7568ab7a87a79c186b8ddf3d3db4f1f934b06 (diff)
downloadingen-e5675ebfeb93175e16762d0a078bd51d15d05f63.tar.gz
ingen-e5675ebfeb93175e16762d0a078bd51d15d05f63.tar.bz2
ingen-e5675ebfeb93175e16762d0a078bd51d15d05f63.zip
Heavy-duty redesign of client library and GUI (now fully signal driven with clean Model/View separation).
Smarter, centralized window creation/management (should make window unification easy (panes?)). Typed metadata system, no more fugly string conversion of floats. Supports OSC fundamental types string, int, float, blob for now (though blob isn't working over the wire yet). git-svn-id: http://svn.drobilla.net/lad/ingen@131 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/progs/ingenuity/OmFlowCanvas.cpp')
-rw-r--r--src/progs/ingenuity/OmFlowCanvas.cpp162
1 files changed, 132 insertions, 30 deletions
diff --git a/src/progs/ingenuity/OmFlowCanvas.cpp b/src/progs/ingenuity/OmFlowCanvas.cpp
index d530bca0..0d2e9bb0 100644
--- a/src/progs/ingenuity/OmFlowCanvas.cpp
+++ b/src/progs/ingenuity/OmFlowCanvas.cpp
@@ -19,7 +19,6 @@
#include <flowcanvas/FlowCanvas.h>
#include "App.h"
#include "ModelEngineInterface.h"
-#include "PatchController.h"
#include "PatchModel.h"
#include "PatchWindow.h"
#include "LoadPluginWindow.h"
@@ -28,27 +27,20 @@
#include "OmPort.h"
#include "NodeModel.h"
#include "OmModule.h"
+#include "OmPortModule.h"
+#include "SubpatchModule.h"
#include "GladeFactory.h"
+#include "WindowFactory.h"
namespace Ingenuity {
-OmFlowCanvas::OmFlowCanvas(PatchController* controller, int width, int height)
+OmFlowCanvas::OmFlowCanvas(CountedPtr<PatchModel> patch, int width, int height)
: FlowCanvas(width, height),
- m_patch_controller(controller),
+ m_patch(patch),
m_last_click_x(0),
m_last_click_y(0)
{
- assert(controller != NULL);
-
- /*Gtk::Menu::MenuList& items = m_menu.items();
- items.push_back(Gtk::Menu_Helpers::MenuElem("Load Plugin...",
- sigc::mem_fun(this, &OmFlowCanvas::menu_load_plugin)));
- items.push_back(Gtk::Menu_Helpers::MenuElem("Load Subpatch...",
- sigc::mem_fun(this, &OmFlowCanvas::menu_load_subpatch)));
- items.push_back(Gtk::Menu_Helpers::MenuElem("New Subpatch...",
- sigc::mem_fun(this, &OmFlowCanvas::menu_create_subpatch)));*/
-
Glib::RefPtr<Gnome::Glade::Xml> xml = GladeFactory::new_glade_reference();
xml->get_widget("canvas_menu", m_menu);
@@ -62,6 +54,8 @@ OmFlowCanvas::OmFlowCanvas(PatchController* controller, int width, int height)
xml->get_widget("canvas_menu_load_patch", m_menu_load_patch);
xml->get_widget("canvas_menu_new_patch", m_menu_new_patch);
+ build_canvas();
+
// Add port menu items
m_menu_add_audio_input->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &OmFlowCanvas::menu_add_port),
@@ -82,6 +76,13 @@ OmFlowCanvas::OmFlowCanvas(PatchController* controller, int width, int height)
sigc::bind(sigc::mem_fun(this, &OmFlowCanvas::menu_add_port),
"midi_output", "MIDI", true));
+ // Connect to model signals to track state
+ m_patch->new_node_sig.connect(sigc::mem_fun(this, &OmFlowCanvas::add_node));
+ m_patch->removed_node_sig.connect(sigc::mem_fun(this, &OmFlowCanvas::remove_node));
+ m_patch->new_connection_sig.connect(sigc::mem_fun(this, &OmFlowCanvas::connection));
+ m_patch->removed_connection_sig.connect(sigc::mem_fun(this, &OmFlowCanvas::disconnection));
+
+ // Connect widget signals to do things
m_menu_load_plugin->signal_activate().connect(sigc::mem_fun(this, &OmFlowCanvas::menu_load_plugin));
m_menu_load_patch->signal_activate().connect(sigc::mem_fun(this, &OmFlowCanvas::menu_load_patch));
m_menu_new_patch->signal_activate().connect(sigc::mem_fun(this, &OmFlowCanvas::menu_new_patch));
@@ -89,6 +90,100 @@ OmFlowCanvas::OmFlowCanvas(PatchController* controller, int width, int height)
void
+OmFlowCanvas::build_canvas() {
+
+ // Create modules for nodes
+ for (NodeModelMap::const_iterator i = m_patch->nodes().begin();
+ i != m_patch->nodes().end(); ++i) {
+ add_node((*i).second);
+ }
+
+ // Create pseudo modules for ports (ports on this canvas, not on our module)
+ for (PortModelList::const_iterator i = m_patch->ports().begin();
+ i != m_patch->ports().end(); ++i) {
+ cerr << "FIXME: PORT MODULE LEAK!" << endl;
+ new OmPortModule(this, *i);
+ }
+
+ // Create connections
+ for (list<CountedPtr<ConnectionModel> >::const_iterator i = m_patch->connections().begin();
+ i != m_patch->connections().end(); ++i) {
+ connection(*i);
+ }
+}
+
+
+void
+OmFlowCanvas::add_node(CountedPtr<NodeModel> nm)
+{
+ cerr << "FIXME: MODULE LEAK!" << endl;
+
+ CountedPtr<PatchModel> pm = PtrCast<PatchModel>(nm);
+ if (pm)
+ new SubpatchModule(this, pm);
+ else
+ new OmModule(this, nm);
+}
+
+
+void
+OmFlowCanvas::remove_node(CountedPtr<NodeModel> nm)
+{
+ LibFlowCanvas::Module* module = get_module(nm->path().name());
+ delete module;
+}
+
+
+void
+OmFlowCanvas::connection(CountedPtr<ConnectionModel> cm)
+{
+ // Deal with port "anonymous nodes" for this patch's own ports...
+ const Path& src_parent_path = cm->src_port_path().parent();
+ const Path& dst_parent_path = cm->dst_port_path().parent();
+
+ const string& src_parent_name =
+ (src_parent_path == m_patch->path()) ? "" : src_parent_path.name();
+ const string& dst_parent_name =
+ (dst_parent_path == m_patch->path()) ? "" : dst_parent_path.name();
+
+ Port* src_port = get_port(src_parent_name, cm->src_port_path().name());
+ Port* dst_port = get_port(dst_parent_name, cm->dst_port_path().name());
+ assert(src_port && dst_port);
+
+ add_connection(src_port, dst_port);
+}
+
+
+void
+OmFlowCanvas::disconnection(const Path& src_port_path, const Path& dst_port_path)
+{
+ const string& src_node_name = src_port_path.parent().name();
+ const string& src_port_name = src_port_path.name();
+ const string& dst_node_name = dst_port_path.parent().name();
+ const string& dst_port_name = dst_port_path.name();
+
+ Port* src_port = get_port(src_node_name, src_port_name);
+ Port* dst_port = get_port(dst_node_name, dst_port_name);
+
+ if (src_port && dst_port) {
+ remove_connection(src_port, dst_port);
+ }
+
+ //patch_model()->remove_connection(src_port_path, dst_port_path);
+
+ cerr << "FIXME: disconnection\n";
+ /*
+ // Enable control slider in destination node control window
+ PortController* p = (PortController)Store::instance().port(dst_port_path)->controller();
+ assert(p);
+
+ if (p->control_panel())
+ p->control_panel()->enable_port(p->path());
+ */
+}
+
+
+void
OmFlowCanvas::connect(const Port* src_port, const Port* dst_port)
{
assert(src_port != NULL);
@@ -102,10 +197,12 @@ OmFlowCanvas::connect(const Port* src_port, const Port* dst_port)
dst->model()->type() == PortModel::CONTROL)
{
CountedPtr<PluginModel> pm(new PluginModel(PluginModel::Internal, "", "midi_control_in", ""));
- CountedPtr<NodeModel> nm(new NodeModel(pm, m_patch_controller->model()->path().base()
- + src->name() + "-" + dst->name()));
- nm->x(dst->module()->property_x() - dst->module()->width() - 20);
- nm->y(dst->module()->property_y());
+ CountedPtr<NodeModel> nm(new NodeModel(pm, m_patch->path().base()
+ + src->name() + "-" + dst->name(), false));
+ nm->set_metadata("module-x", Atom((float)
+ (dst->module()->property_x() - dst->module()->width() - 20)));
+ nm->set_metadata("module-y", Atom((float)
+ (dst->module()->property_y())));
App::instance().engine()->create_node_from_model(nm.get());
App::instance().engine()->connect(src->model()->path(), nm->path() + "/MIDI_In");
App::instance().engine()->connect(nm->path() + "/Out_(CR)", dst->model()->path());
@@ -114,9 +211,9 @@ OmFlowCanvas::connect(const Port* src_port, const Port* dst_port)
// Set control node range to port's user range
App::instance().engine()->set_port_value_queued(nm->path().base() + "Min",
- atof(dst->model()->get_metadata("user-min").c_str()));
+ dst->model()->get_metadata("user-min").get_float());
App::instance().engine()->set_port_value_queued(nm->path().base() + "Max",
- atof(dst->model()->get_metadata("user-max").c_str()));
+ dst->model()->get_metadata("user-max").get_float());
} else {
App::instance().engine()->connect(src->model()->path(),
dst->model()->path());
@@ -181,7 +278,7 @@ OmFlowCanvas::generate_port_name(const string& base) {
snprintf(num_buf, 5, "%u", i);
name = base + "_";
name += num_buf;
- if (!m_patch_controller->patch_model()->get_port(name))
+ if (!m_patch->get_port(name))
break;
}
@@ -194,7 +291,7 @@ OmFlowCanvas::generate_port_name(const string& base) {
void
OmFlowCanvas::menu_add_port(const string& name, const string& type, bool is_output)
{
- const Path& path = m_patch_controller->path().base() + generate_port_name(name);
+ const Path& path = m_patch->path().base() + generate_port_name(name);
App::instance().engine()->create_port(path, type, is_output);
char temp_buf[16];
@@ -267,30 +364,35 @@ OmFlowCanvas::menu_add_midi_output()
}
*/
+MetadataMap
+OmFlowCanvas::get_initial_data()
+{
+ MetadataMap result;
+
+ result["module-x"] = Atom((float)m_last_click_x);
+ result["module-y"] = Atom((float)m_last_click_y);
+
+ return result;
+}
+
void
OmFlowCanvas::menu_load_plugin()
{
- m_patch_controller->window()->load_plugin_window()->set_next_module_location(
- m_last_click_x, m_last_click_y);
- m_patch_controller->window()->load_plugin_window()->show();
+ App::instance().window_factory()->present_load_plugin(m_patch, get_initial_data());
}
void
OmFlowCanvas::menu_load_patch()
{
- m_patch_controller->window()->load_subpatch_window()->set_next_module_location(
- m_last_click_x, m_last_click_y);
- m_patch_controller->window()->load_subpatch_window()->show();
+ App::instance().window_factory()->present_load_subpatch(m_patch, get_initial_data());
}
void
OmFlowCanvas::menu_new_patch()
{
- m_patch_controller->window()->new_subpatch_window()->set_next_module_location(
- m_last_click_x, m_last_click_y);
- m_patch_controller->window()->new_subpatch_window()->show();
+ App::instance().window_factory()->present_new_subpatch(m_patch, get_initial_data());
}