summaryrefslogtreecommitdiff
path: root/libs/flowcanvas/src/Port.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/flowcanvas/src/Port.cpp')
-rw-r--r--libs/flowcanvas/src/Port.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/libs/flowcanvas/src/Port.cpp b/libs/flowcanvas/src/Port.cpp
new file mode 100644
index 0000000000..8310b484c3
--- /dev/null
+++ b/libs/flowcanvas/src/Port.cpp
@@ -0,0 +1,189 @@
+/* This file is part of FlowCanvas. Copyright (C) 2005 Dave Robillard.
+ *
+ * FlowCanvas 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.
+ *
+ * FlowCanvas 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.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <libgnomecanvasmm/libgnomecanvasmm.h>
+#include "flowcanvas/Port.h"
+#include "flowcanvas/Module.h"
+#include "flowcanvas/FlowCanvas.h"
+
+namespace LibFlowCanvas {
+
+
+Port::Port(Module* module, const string& name, bool is_input, int color)
+: Gnome::Canvas::Group(*module, 0, 0),
+ m_module(module),
+ m_name(name),
+ m_is_input(is_input),
+ m_colour(color),
+ m_label(*this, 1, 1, m_name),
+ m_rect(*this, 0, 0, 0, 0)
+{
+ m_menu.items().push_back(Gtk::Menu_Helpers::MenuElem(
+ "Disconnect All", sigc::mem_fun(this, &Port::disconnect_all)));
+
+ m_rect.property_fill_color_rgba() = color;
+
+ // Make rectangle pretty
+ //m_rect.property_outline_color_rgba() = 0x8899AAFF;
+ m_rect.property_outline_color_rgba() = color;
+ m_rect.property_join_style() = Gdk::JOIN_MITER;
+ border_width(1.0);
+
+ // Make label pretty
+ m_label.property_size() = PORT_LABEL_SIZE;
+ m_label.property_fill_color_rgba() = 0xFFFFFFFF;
+ m_label.property_weight() = 200;
+
+ m_width = m_label.property_text_width() + 4.0;
+ m_height = m_label.property_text_height();
+
+ // Place everything
+ m_rect.property_x1() = 0;
+ m_rect.property_y1() = 0;
+ m_rect.property_x2() = m_width;
+ m_rect.property_y2() = m_height;
+ m_label.property_x() = m_label.property_text_width() / 2 + 1;
+ m_label.property_y() = m_height / 2;
+
+ m_label.raise_to_top();
+
+}
+
+
+/** Set the border width of the port's rectangle.
+ *
+ * Do NOT directly set the width_units property on the rect, use this function.
+ */
+void
+Port::border_width(double w)
+{
+ m_border_width = w;
+ m_rect.property_width_units() = w;
+}
+
+
+void
+Port::name(const string& n)
+{
+ m_name = n;
+
+ // Reposition label
+ m_label.property_text() = m_name;
+ m_width = m_label.property_text_width() + 4.0;
+ m_height = m_label.property_text_height();
+ m_rect.property_x2() = m_width;
+ m_rect.property_y2() = m_height;
+ m_label.property_x() = m_label.property_text_width() / 2 + 1;
+ m_label.property_y() = m_height / 2;
+
+ m_module->resize();
+}
+
+
+void
+Port::zoom(float z)
+{
+ m_label.property_size() = static_cast<int>(8000 * z);
+}
+
+
+/** Update the location of all connections to/from this port if this port has moved */
+void
+Port::move_connections()
+{
+ for (list<Connection*>::iterator i = m_connections.begin(); i != m_connections.end(); i++) {
+ ((Connection*)(*i))->update_location();
+ }
+}
+
+
+void
+Port::remove_connection(Connection* c)
+{
+ m_connections.erase(
+ find(m_connections.begin(), m_connections.end(), c)
+ );
+}
+
+
+void
+Port::disconnect_all()
+{
+ Connection* c = NULL;
+ list<Connection*> temp_list = m_connections;
+ for (list<Connection*>::iterator i = temp_list.begin(); i != temp_list.end(); ++i) {
+ c = *i;
+ m_module->patch_bay()->disconnect(c->source_port(), c->dest_port());
+ }
+}
+
+
+void
+Port::hilite(bool b)
+{
+ m_module->hilite(b);
+
+ for (list<Connection*>::iterator i = m_connections.begin(); i != m_connections.end(); ++i) {
+ (*i)->hilite(b);
+ if (b)
+ (*i)->raise_to_top();
+ }
+
+ if (b) {
+ raise_to_top();
+ m_rect.raise_to_top();
+ m_label.raise_to_top();
+ m_rect.property_fill_color_rgba() = m_colour + 0x33333300;
+ } else {
+ m_rect.property_fill_color_rgba() = m_colour;
+ }
+}
+
+
+void
+Port::raise_connections()
+{
+ for (list<Connection*>::iterator i = m_connections.begin(); i != m_connections.end(); ++i) {
+ (*i)->raise_to_top();
+ }
+}
+
+
+// Returns the world-relative coordinates of where a connection line
+// should attach
+Gnome::Art::Point
+Port::connection_coords()
+{
+ double x = (is_input()) ? m_rect.property_x1()-1.0 : m_rect.property_x2()+1.0;
+ double y = m_rect.property_y1() + m_height / 2;
+
+ i2w(x, y); // convert to world-relative coords
+
+ return Gnome::Art::Point(x, y);
+}
+
+
+void
+Port::width(double w)
+{
+ double diff = w - m_width;
+ m_rect.property_x2() = m_rect.property_x2() + diff;
+ m_width = w;
+}
+
+
+} // namespace LibFlowCanvas