aboutsummaryrefslogtreecommitdiffstats
path: root/src/gui/MachinaCanvas.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-02-10 03:39:10 +0000
committerDavid Robillard <d@drobilla.net>2007-02-10 03:39:10 +0000
commitb924ead0db7c09ee50d2d4eee487b844c5fb867b (patch)
tree36fa1a6c879989a111f4fbbaf9a03b7f442b618c /src/gui/MachinaCanvas.cpp
parent9f2a520a8f20661385bf6c9f7447aef1227d8696 (diff)
downloadmachina-b924ead0db7c09ee50d2d4eee487b844c5fb867b.tar.gz
machina-b924ead0db7c09ee50d2d4eee487b844c5fb867b.tar.bz2
machina-b924ead0db7c09ee50d2d4eee487b844c5fb867b.zip
Machine GUI talking to Jack engine, running machines made in GUI, etc.
git-svn-id: http://svn.drobilla.net/lad/machina@297 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/gui/MachinaCanvas.cpp')
-rw-r--r--src/gui/MachinaCanvas.cpp176
1 files changed, 81 insertions, 95 deletions
diff --git a/src/gui/MachinaCanvas.cpp b/src/gui/MachinaCanvas.cpp
index 303774f..775ae28 100644
--- a/src/gui/MachinaCanvas.cpp
+++ b/src/gui/MachinaCanvas.cpp
@@ -17,10 +17,17 @@
//#include "config.h"
#include <raul/SharedPtr.h>
-#include <flowcanvas/Ellipse.h>
+#include "machina/Node.hpp"
+#include "machina/Machine.hpp"
+#include "machina/Action.hpp"
+#include "machina/Edge.hpp"
+#include "NodeView.hpp"
#include "MachinaCanvas.hpp"
#include "MachinaGUI.hpp"
+using namespace LibFlowCanvas;
+
+
MachinaCanvas::MachinaCanvas(MachinaGUI* app, int width, int height)
: FlowCanvas(width, height),
_app(app)
@@ -30,31 +37,86 @@ MachinaCanvas::MachinaCanvas(MachinaGUI* app, int width, int height)
void
-MachinaCanvas::connect(boost::shared_ptr<Connectable>, //item1,
- boost::shared_ptr<Connectable>) //item2)
+MachinaCanvas::status_message(const string& msg)
{
-#if 0
- boost::shared_ptr<MachinaPort> p1 = boost::dynamic_pointer_cast<MachinaPort>(port1);
- boost::shared_ptr<MachinaPort> p2 = boost::dynamic_pointer_cast<MachinaPort>(port2);
- if (!p1 || !p2)
+ _app->status_message(string("[Canvas] ").append(msg));
+}
+
+
+void
+MachinaCanvas::node_clicked(SharedPtr<NodeView> item, GdkEventButton* event)
+{
+ cerr << "CLICKED: " << item->name() << endl;
+
+ SharedPtr<NodeView> node = PtrCast<NodeView>(item);
+ if (!node)
return;
+
+ SharedPtr<NodeView> last = _last_clicked.lock();
- if (p1->type() == JACK_AUDIO && p2->type() == JACK_AUDIO
- || (p1->type() == JACK_MIDI && p2->type() == JACK_MIDI))
- _app->jack_driver()->connect(p1, p2);
-#ifdef HAVE_ALSA
- else if (p1->type() == ALSA_MIDI && p2->type() == ALSA_MIDI)
- _app->alsa_driver()->connect(p1, p2);
-#endif
- else
- status_message("WARNING: Cannot make connection, incompatible port types.");
-#endif
+ if (last) {
+ connect(last, node);
+ _last_clicked.reset();
+ } else {
+ _last_clicked = node;
+ }
+}
+
+
+bool
+MachinaCanvas::canvas_event(GdkEvent* event)
+{
+ static int last = 0;
+
+ assert(event);
+
+ if (event->type == GDK_BUTTON_PRESS) {
+
+ const double x = event->button.x;
+ const double y = event->button.y;
+
+ if (event->button.button == 1) {
+ string name = string("Note")+(char)(last++ +'0');
+
+ SharedPtr<Machina::Node> node(new Machina::Node(1024*10, false));
+ node->add_enter_action(new Machina::PrintAction(name));
+ SharedPtr<NodeView> view(new NodeView(node, shared_from_this(),
+ name, x, y));
+
+ //view->signal_clicked.connect(sigc::bind(sigc::mem_fun(this,
+ // &MachinaCanvas::node_clicked), view));
+ view->signal_clicked.connect(sigc::bind<0>(sigc::mem_fun(this,
+ &MachinaCanvas::node_clicked), view));
+ add_item(view);
+ view->resize();
+ view->raise_to_top();
+
+ _app->machine()->add_node(node);
+ }
+ }
+
+ return FlowCanvas::canvas_event(event);
}
void
-MachinaCanvas::disconnect(boost::shared_ptr<Connectable>,// item1,
- boost::shared_ptr<Connectable>)// item2)
+MachinaCanvas::connect(boost::shared_ptr<NodeView> src,
+ boost::shared_ptr<NodeView> dst)
+{
+ boost::shared_ptr<Connection> c(new Connection(shared_from_this(),
+ src, dst, 0x9999AAFF, true));
+ src->add_connection(c);
+ dst->add_connection(c);
+ add_connection(c);
+
+ src->node()->add_outgoing_edge(SharedPtr<Machina::Edge>(
+ new Machina::Edge(src->node(), dst->node())));
+}
+
+
+void
+MachinaCanvas::disconnect(boost::shared_ptr<NodeView>,// item1,
+ boost::shared_ptr<NodeView>)// item2)
{
#if 0
boost::shared_ptr<MachinaPort> input
@@ -90,79 +152,3 @@ MachinaCanvas::disconnect(boost::shared_ptr<Connectable>,// item1,
}
-void
-MachinaCanvas::status_message(const string& msg)
-{
- _app->status_message(string("[Canvas] ").append(msg));
-}
-
-
-void
-MachinaCanvas::item_selected(SharedPtr<Item> i)
-{
- cerr << "SELECTED: " << i->name() << endl;
-
- SharedPtr<Connectable> item = PtrCast<Connectable>(i);
- if (!item)
- return;
-
- SharedPtr<Connectable> last = _last_selected.lock();
-
- if (last) {
- boost::shared_ptr<Connection> c(new Connection(shared_from_this(),
- last, item, 0x9999AAFF, true));
- last->add_connection(c);
- item->add_connection(c);
- add_connection(c);
- i->raise_to_top();
- _last_selected.reset();
- } else {
- _last_selected = item;
- }
-}
-
-
-void
-MachinaCanvas::item_clicked(SharedPtr<Item> i, GdkEventButton* event)
-{
- cerr << "CLICKED " << event->button << ": " << i->name() << endl;
-
- //return false;
-}
-
-
-bool
-MachinaCanvas::canvas_event(GdkEvent* event)
-{
- static int last = 0;
-
- assert(event);
-
- if (event->type == GDK_BUTTON_PRESS) {
-
- const double x = event->button.x;
- const double y = event->button.y;
-
- SharedPtr<Item> item;
-
- if (event->button.button == 1) {
- item = SharedPtr<Item>(new Ellipse(shared_from_this(),
- string("Note")+(char)(last++ +'0'), x, y, 30, 30, true));
- } else if (event->button.button == 2) {
- item = SharedPtr<Item>(new Module(shared_from_this(),
- string("Note")+(char)(last++ +'0'), x, y, true));
- }
-
- if (item) {
- item->signal_selected.connect(sigc::bind(sigc::mem_fun(this,
- &MachinaCanvas::item_selected), item));
- item->signal_clicked.connect(sigc::bind<0>(sigc::mem_fun(this,
- &MachinaCanvas::item_clicked), item));
- add_item(item);
- item->resize();
- item->raise_to_top();
- }
- }
-
- return FlowCanvas::canvas_event(event);
-}