summaryrefslogtreecommitdiff
path: root/libs/flowcanvas/src/Connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/flowcanvas/src/Connection.cpp')
-rw-r--r--libs/flowcanvas/src/Connection.cpp679
1 files changed, 0 insertions, 679 deletions
diff --git a/libs/flowcanvas/src/Connection.cpp b/libs/flowcanvas/src/Connection.cpp
deleted file mode 100644
index d792545a05..0000000000
--- a/libs/flowcanvas/src/Connection.cpp
+++ /dev/null
@@ -1,679 +0,0 @@
-/* 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 "flowcanvas/Connection.h"
-#include <cassert>
-#include <math.h>
-#include <libgnomecanvasmm/libgnomecanvasmm.h>
-#include "flowcanvas/FlowCanvas.h"
-
-// FIXME: remove
-#include <iostream>
-using std::cerr; using std::endl;
-
-namespace LibFlowCanvas {
-
-
-Connection::Connection(FlowCanvas* patch_bay, Port* source_port, Port* dest_port)
-: Gnome::Canvas::Bpath(*patch_bay->root()),
- m_patch_bay(patch_bay),
- m_source_port(source_port),
- m_dest_port(dest_port),
- m_selected(false),
-// m_path(Gnome::Canvas::PathDef::create())
- m_path(gnome_canvas_path_def_new())
-{
- assert(m_source_port->is_output());
- assert(m_dest_port->is_input());
-
- m_colour = m_source_port->colour() + 0x44444400;
- property_width_units() = 1.0;
- property_outline_color_rgba() = m_colour;
- property_cap_style() = (Gdk::CapStyle)GDK_CAP_ROUND;
-
- update_location();
-}
-
-
-Connection::~Connection()
-{
- if (m_selected) {
- for (list<Connection*>::iterator c = m_patch_bay->selected_connections().begin();
- c != m_patch_bay->selected_connections().end(); ++c)
- {
- if ((*c) == this) {
- m_patch_bay->selected_connections().erase(c);
- break;
- }
- }
- }
-}
-
-
-#undef MIN
-#define MIN(x,y) (((x) < (y)) ? (x) : (y))
-
-#undef MAX
-#define MAX(x,y) (((x) > (y)) ? (x) : (y))
-
-#if 0
-/** Updates the connection's location to match it's source/dest ports.
- *
- * This is used when modules are dragged, to keep the connections attached
- * to their ports.
- *
- * You are not expected to understand this.
- */
-void
-Connection::update_location()
-{
- const double src_x = m_source_port->connection_coords().get_x();
- const double src_y = m_source_port->connection_coords().get_y();
- const double dst_x = m_dest_port->connection_coords().get_x();
- const double dst_y = m_dest_port->connection_coords().get_y();
-
- const double src_mod_x = m_source_port->module()->property_x();
- const double src_mod_y = m_source_port->module()->property_y();
- const double src_mod_w = m_source_port->module()->width();
- const double src_mod_h = m_source_port->module()->height();
- const double dst_mod_x = m_dest_port->module()->property_x();
- const double dst_mod_y = m_dest_port->module()->property_y();
- const double dst_mod_w = m_dest_port->module()->width();
- const double dst_mod_h = m_dest_port->module()->height();
-
- // Y Modifier (-1 if src module is below dst module)
- double y_mod = (src_y < dst_y) ? 1.0 : -1.0;
-
- // Added in various places to keep things parallel
- /*double src_port_offset = src_y - src_mod_y - src_title_h;
- double dst_port_offset = dst_y - dst_mod_y - dst_title_h;
- if (y_mod < 0.0) {
- src_port_offset = src_mod_y + src_mod_h - src_y;
- dst_port_offset = dst_mod_y + dst_mod_h - dst_y;
- }*/
- double src_port_offset = m_source_port->module()->port_connection_point_offset(m_source_port);
- double src_offset_range = m_source_port->module()->port_connection_points_range();
- double dst_port_offset = m_dest_port->module()->port_connection_point_offset(m_dest_port);
- double dst_offset_range = m_dest_port->module()->port_connection_points_range();
-
- /*
- double smallest_offset = (src_port_offset < dst_port_offset)
- ? src_port_offset : dst_port_offset;
-
- double smallest_offset_range = (src_port_offset < dst_port_offset)
- ? m_source_port->module()->port_connection_points_range()
- : m_dest_port->module()->port_connection_points_range();
- */
- double smallest_offset = (src_offset_range < dst_offset_range)
- ? src_port_offset : dst_port_offset;
-
- double smallest_offset_range = (src_offset_range < dst_offset_range)
- ? m_source_port->module()->port_connection_points_range()
- : m_dest_port->module()->port_connection_points_range();
-
- //double largest_offset_range = (src_offset_range > dst_offset_range)
- // ? m_source_port->module()->port_connection_points_range()
- // : m_dest_port->module()->port_connection_points_range();
-
- double x_dist = fabs(dst_x - src_x);
- double y_dist = fabs(dst_y - src_y);
-
- // Vertical distance between modules
- double y_mod_dist = dst_mod_y - src_mod_y - src_mod_h;
- if (dst_y < src_y)
- y_mod_dist = src_mod_y - dst_mod_y - dst_mod_h;
- if (y_mod_dist < 1.0)
- y_mod_dist = 1.0;
-
- // Horizontal distance between modules
- double x_mod_dist = dst_mod_x - src_mod_x - src_mod_w;
- if (src_x > dst_x + src_mod_w)
- x_mod_dist = src_mod_x - dst_mod_x - dst_mod_w;
- if (x_mod_dist < 1.0)
- x_mod_dist = 1.0;
-
- double tallest_mod_h = m_source_port->module()->height();
- if (m_dest_port->module()->height() > tallest_mod_h)
- tallest_mod_h = m_dest_port->module()->height();
-
- double src_x1, src_y1, src_x2, src_y2, join_x, join_y; // Path 1
- double dst_x2, dst_y2, dst_x1, dst_y1; // Path 2
-
- src_x1 = src_y1 = src_x2 = src_y2 = join_x = join_y = dst_x2 = dst_y2 = dst_x1 = dst_y1 = 0.0;
-
- static const double join_range = 15.0;
-
- double src_offset = (src_y < dst_y)
- ? src_port_offset : src_offset_range - src_port_offset;
- double dst_offset = (src_y < dst_y)
- ? dst_port_offset : dst_offset_range - dst_port_offset;
-
-
- // Wrap around connections
- if (dst_x < src_x && y_mod_dist < join_range*3.0) {
-
- static const double module_padding = 20.0;
-
- // FIXME: completely different meanings in this case than the normal case
- // (this one is better though)
- smallest_offset = (src_offset_range < dst_offset_range)
- ? src_offset : dst_offset;
-
- // Limit straight out distance
- if (x_dist > 60.0)
- x_dist = 60.0;
- if (x_dist < 80.0 && y_dist > 40.0)
- x_dist = 80.0;
-
- // Calculate join point
- join_x = dst_mod_x + dst_mod_w + x_mod_dist/2.0;
- join_y = (src_y < dst_y)
- ? MIN(src_mod_y, dst_mod_y)
- : MAX(src_mod_y + src_mod_h, dst_mod_y + dst_mod_h);
- join_y -= (smallest_offset/smallest_offset_range*join_range + module_padding) * y_mod;
-
- if (join_x > src_mod_x)
- join_x = src_mod_x;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + x_dist/5.0 + src_offset/src_offset_range*join_range;
- src_y1 = src_y - (x_dist/3.0 + src_offset) * y_mod;
- src_x2 = src_x + x_dist/3.0 + src_offset/src_offset_range*join_range;
- src_y2 = join_y;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = MIN(dst_x, src_mod_x) - x_dist/5.0 - dst_offset/dst_offset_range*join_range;
- dst_y1 = MIN(dst_y, src_mod_y + src_mod_h) - (x_dist/3.0 + dst_offset) * y_mod;
- dst_x2 = MIN(dst_x, src_mod_x) - x_dist/3.0 - dst_offset/dst_offset_range*join_range;
- dst_y2 = join_y;
-
-
- // Curve through connections and normal (left->right) connections
- // (These two cases are continuous)
- } else {
- /* The trick with this one is to define each curve's points exclusively in terms
- * of the join point (ie nothing about the other module), and choose the join point
- * cleverly */
-
- // Calculate join point
- double ratio = (x_dist - y_dist) / (y_dist + x_dist);
- join_x = (src_x + dst_x)/2.0;
- join_y = (src_y + dst_y)/2.0;
-
- // Vertical centre point between the modules
- join_y = (src_y < dst_y)
- ? (dst_mod_y - (dst_mod_y - (src_mod_y + src_mod_h)) / 2.0)
- : (src_mod_y - (src_mod_y - (dst_mod_y + dst_mod_h)) / 2.0);
-
- join_y -= (smallest_offset / smallest_offset_range * join_range) - join_range/2.0;
-
- // Interpolate between (src_x < dst_x) case and (src_y == dst_y) case
- if (src_x < dst_x && x_dist > y_dist) {
- join_y *= (1.0-ratio);
- join_y += (src_y + dst_y)/2.0 * ratio;
- }
-
- if (src_x < dst_x) {
- join_y += ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio));
- join_x -= ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio)) * y_mod;
- }
-
- //cerr << "ratio: " << ratio << endl;
-
- // Curve through connections
- if (dst_x < src_x) {
- double src_x_offset = fabs(src_x - join_x)/8.0 + src_offset_range - src_offset/src_offset_range*join_range;
- double dst_x_offset = fabs(dst_x - join_x)/8.0 + dst_offset_range + dst_offset/dst_offset_range*join_range;
- double src_y_offset = fabs(src_y - join_y)/4.0 + src_offset/src_offset_range*(src_offset_range+join_range)/2.0;
- double dst_y_offset = fabs(dst_y - join_y)/2.0 + (dst_offset_range-dst_offset)/dst_offset_range*(dst_offset_range+join_range)/2.0;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + src_x_offset;
- src_y1 = join_y - src_y_offset * y_mod;
- src_x2 = src_x + src_x_offset;
- src_y2 = join_y;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = dst_x - dst_x_offset;
- dst_y1 = join_y + dst_y_offset * y_mod;
- dst_x2 = dst_x - dst_x_offset;
- dst_y2 = join_y;
-
- // Normal connections
- } else {
- double src_x_offset = fabs(src_x - join_x)/8.0 + src_offset_range - src_offset/src_offset_range*join_range;
- double dst_x_offset = fabs(dst_x - join_x)/8.0 + dst_offset_range + dst_offset/dst_offset_range*join_range;
- double src_y_offset = fabs(src_y - join_y)/4.0 + src_offset/src_offset_range*(src_offset_range+join_range)/2.0;
- double dst_y_offset = fabs(dst_y - join_y)/2.0 + (dst_offset_range-dst_offset)/dst_offset_range*(dst_offset_range+join_range)/2.0;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + src_x_offset;
- // Interpolate from curve through case
- if (x_dist < y_dist) {
- // Smooth transition from (src_y) to (join_y - src_y_offset * y_mod)
- src_y1 = (src_y * (1.0-fabs(ratio))) + ((join_y - src_y_offset * y_mod) * -ratio);
- // Smooth transition from (join_x + src_offset_range/4.0 * -ratio) to (src_x + src_x_offset)
- src_x2 = (join_x + src_offset_range/4.0 * -ratio)*(1.0-fabs(ratio)) + (src_x + src_x_offset)*-ratio;
- } else {
- src_y1 = src_y;
- src_x2 = join_x + src_offset_range/4.0 * -ratio;
- }
- src_y2 = join_y - src_y_offset*(1.0-fabs(ratio)) * y_mod;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = dst_x - dst_x_offset;
- dst_y1 = dst_y;
- // Interpolate from curve through case
- if (x_dist < y_dist) {
- // Smooth transition from (dst_y) to (join_y - dst_y_offset * y_mod)
- dst_y1 = (dst_y * (1.0-fabs(ratio))) + ((join_y + dst_y_offset * y_mod) * -ratio);
- // Smooth transition from (join_x + dst_offset_range/4.0 * -ratio) to (dst_x + dst_x_offset)
- dst_x2 = (join_x - dst_offset_range/4.0 * -ratio)*(1.0-fabs(ratio)) + (dst_x - dst_x_offset)*-ratio;
- } else {
- dst_y1 = dst_y;
- dst_x2 = join_x - dst_offset_range/4.0 * -ratio;
- }
- dst_y2 = join_y + dst_y_offset*(1.0-fabs(ratio)) * y_mod;
- }
- /*
- } else {
- double src_x_offset = fabs(src_x - join_x)/4.0 + src_offset_range*2.0 - src_offset;
- double dst_x_offset = fabs(dst_x - join_x)/4.0 + dst_offset + dst_offset_range;
- double y_offset = fabs(join_y - src_y)/2.0;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + src_x_offset/2.0;
- src_y1 = src_y;
- if (x_dist < y_dist)
- src_x2 = join_x + src_x_offset * -ratio;
- else
- src_x2 = join_x + src_offset_range/4.0 * -ratio;
- src_y2 = join_y - y_offset*(1.0-fabs(ratio)) * y_mod;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = dst_x - dst_x_offset/2.0;
- dst_y1 = dst_y;
- if (x_dist < y_dist)
- dst_x2 = join_x - dst_x_offset * -ratio;
- else
- dst_x2 = join_x - dst_x_offset/4.0 * -ratio;
- dst_y2 = join_y + y_offset*(1.0-fabs(ratio)) * y_mod;
- }*/
- }
-
- /*
- cerr << "src_x1: " << src_x1 << endl;
- cerr << "src_y1: " << src_y1 << endl;
- cerr << "src_x2: " << src_x2 << endl;
- cerr << "src_y2: " << src_x2 << endl;
- cerr << "join_x: " << join_x << endl;
- cerr << "join_y: " << join_y << endl;
- cerr << "dst_x1: " << dst_x1 << endl;
- cerr << "dst_y1: " << dst_y1 << endl;
- cerr << "dst_x2: " << dst_x2 << endl;
- cerr << "dst_y2: " << dst_x2 << endl << endl;
- */
-
- m_path->reset();
-
- //m_path->moveto(0,0);
-
-
- m_path->moveto(src_x, src_y);
- //m_path->lineto(join_x, join_y);
- m_path->curveto(src_x1, src_y1, src_x2, src_y2, join_x, join_y);
- m_path->curveto(dst_x2, dst_y2, dst_x1, dst_y1, dst_x, dst_y);
- set_bpath(m_path);
-}
-#endif
-
-
-/** Updates the path of the connection to match it's ports if they've moved.
- */
-void
-Connection::update_location()
-{
- const double src_x = m_source_port->connection_coords().get_x();
- const double src_y = m_source_port->connection_coords().get_y();
- const double dst_x = m_dest_port->connection_coords().get_x();
- const double dst_y = m_dest_port->connection_coords().get_y();
-
- const double src_mod_x = m_source_port->module()->property_x();
- const double src_mod_y = m_source_port->module()->property_y();
- const double src_mod_w = m_source_port->module()->width();
- const double src_mod_h = m_source_port->module()->height();
- const double dst_mod_x = m_dest_port->module()->property_x();
- const double dst_mod_y = m_dest_port->module()->property_y();
- const double dst_mod_w = m_dest_port->module()->width();
- const double dst_mod_h = m_dest_port->module()->height();
-
- // Vertical distance between modules
- double y_mod_dist = dst_mod_y - src_mod_y - src_mod_h;
- if (dst_y < src_y)
- y_mod_dist = src_mod_y - dst_mod_y - dst_mod_h;
- if (y_mod_dist < 1.0)
- y_mod_dist = 1.0;
-
- // Horizontal distance between modules
- double x_mod_dist = dst_mod_x - src_mod_x - src_mod_w;
- if (src_x > dst_x + src_mod_w)
- x_mod_dist = src_mod_x - dst_mod_x - dst_mod_w;
- if (x_mod_dist < 1.0)
- x_mod_dist = 1.0;
-
- // Y Modifier (-1 if src module is below dst module)
- double y_mod = (src_y < dst_y) ? 1.0 : -1.0;
-
- double x_dist = fabsl(src_x - dst_x);
- double y_dist = fabsl(src_y - dst_y);
-
- double src_port_offset = m_source_port->module()->port_connection_point_offset(m_source_port);
- double src_offset_range = m_source_port->module()->port_connection_points_range();
- double dst_port_offset = m_dest_port->module()->port_connection_point_offset(m_dest_port);
- double dst_offset_range = m_dest_port->module()->port_connection_points_range();
-
- double smallest_offset = (src_offset_range < dst_offset_range)
- ? src_port_offset : dst_port_offset;
-
- double smallest_offset_range = (src_offset_range < dst_offset_range)
- ? m_source_port->module()->port_connection_points_range()
- : m_dest_port->module()->port_connection_points_range();
-
- double tallest_module_height = m_source_port->module()->height();
- if (m_dest_port->module()->height() > tallest_module_height)
- tallest_module_height = m_dest_port->module()->height();
-
- double src_x1, src_y1, src_x2, src_y2, join_x, join_y; // Path 1
- double dst_x2, dst_y2, dst_x1, dst_y1; // Path 2
- src_x1 = src_y1 = src_x2 = src_y2 = join_x = join_y = dst_x2 = dst_y2 = dst_x1 = dst_y1 = 0.0;
-
- double join_range = 20.0;
-
- double src_offset = (src_y < dst_y)
- ? src_port_offset : src_offset_range - src_port_offset;
- double dst_offset = (src_y < dst_y)
- ? dst_port_offset : dst_offset_range - dst_port_offset;
-
- // Wrap around connections
- if ((src_x > dst_x)
- && y_mod_dist < join_range*3.0
- && ((dst_x > src_mod_x+src_mod_w+join_range*2.0) || src_x > dst_x)
- && (! ((src_mod_y + src_mod_h < dst_mod_y - join_range*3.0) || (dst_mod_y + dst_mod_h < src_mod_h - join_range*3.0)))) {
- //|| (dst_x < src_x)) {
-
- static const double module_padding = 20.0;
-
- // FIXME: completely different meanings in this case than the normal case
- // (this one is better though)
- smallest_offset = (src_offset_range < dst_offset_range)
- ? src_offset : dst_offset;
-
- // Limit straight out distance
- if (x_dist > 60.0)
- x_dist = 60.0;
- if (x_dist < 80.0 && y_dist > 40.0)
- x_dist = 80.0;
-
- // Calculate join point
- join_x = dst_mod_x + dst_mod_w + x_mod_dist/2.0;
- join_y = (src_y < dst_y)
- ? MIN(src_mod_y, dst_mod_y)
- : MAX(src_mod_y + src_mod_h, dst_mod_y + dst_mod_h);
- join_y -= (smallest_offset/smallest_offset_range*join_range + module_padding) * y_mod;
-
- if (join_x > src_mod_x)
- join_x = src_mod_x;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + x_dist/5.0 + src_offset/src_offset_range*join_range;
- src_y1 = src_y - (x_dist/3.0 + src_offset) * y_mod;
- src_x2 = src_x + x_dist/3.0 + src_offset/src_offset_range*join_range;
- src_y2 = join_y;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = MIN(dst_x, src_mod_x) - x_dist/5.0 - dst_offset/dst_offset_range*join_range;
- dst_y1 = MIN(dst_y, src_mod_y + src_mod_h) - (x_dist/3.0 + dst_offset) * y_mod;
- dst_x2 = MIN(dst_x, src_mod_x) - x_dist/3.0 - dst_offset/dst_offset_range*join_range;
- dst_y2 = join_y;
-
-
- // Curve through connections
- } else if (dst_x < src_x) {
-
- join_range = MIN(join_range, smallest_offset_range);
-
- // Calculate join point
- double ratio = (x_dist - y_dist) / (y_dist + x_dist);
- join_x = (src_x + dst_x)/2.0;
- join_y = (src_y + dst_y)/2.0;
-
- // Vertical centre point between the modules
- join_y = (src_y < dst_y)
- ? (dst_mod_y - (dst_mod_y - (src_mod_y + src_mod_h)) / 2.0)
- : (src_mod_y - (src_mod_y - (dst_mod_y + dst_mod_h)) / 2.0);
-
- join_y -= (smallest_offset / smallest_offset_range * join_range) - join_range/2.0;
-
- // Interpolate between (src_x < dst_x) case and (src_y == dst_y) case
- if (src_x < dst_x && x_dist > y_dist) {
- join_y *= (1.0-ratio);
- join_y += (src_y + dst_y)/2.0 * ratio;
- }
-
- if (src_x < dst_x) {
- join_y += ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio));
- join_x -= ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio)) * y_mod;
- }
-
- //cerr << "ratio: " << ratio << endl;
-
- double src_x_offset = fabs(src_x - join_x)/8.0 + MAX(src_offset_range,join_range) - src_offset/src_offset_range*join_range;
- double dst_x_offset = fabs(dst_x - join_x)/8.0 + MAX(dst_offset_range,join_range) + dst_offset/dst_offset_range*join_range;
- double src_y_offset = fabs(src_y - join_y)/4.0 + src_offset/src_offset_range*(src_offset_range+join_range)/2.0;
- double dst_y_offset = fabs(dst_y - join_y)/4.0 + (dst_offset_range-dst_offset)/dst_offset_range*(dst_offset_range+join_range)/2.0;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + src_x_offset;
- src_y1 = join_y - src_y_offset * y_mod;
- src_x2 = src_x + src_x_offset;
- src_y2 = join_y;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = dst_x - dst_x_offset;
- dst_y1 = join_y + dst_y_offset * y_mod;
- dst_x2 = dst_x - dst_x_offset;
- dst_y2 = join_y;
-
-
- // In between curve through and normal connections
-/* } else if (x_dist < y_dist && src_mod_y + src_mod_h < dst_mod_y) {
- // Calculate join point
- double ratio = (x_dist - y_dist) / (y_dist + x_dist);
- join_x = (src_x + dst_x)/2.0;
- join_y = (src_y + dst_y)/2.0;
-
- // Vertical centre point between the modules
- join_y = (src_y < dst_y)
- ? (dst_mod_y - (dst_mod_y - (src_mod_y + src_mod_h)) / 2.0)
- : (src_mod_y - (src_mod_y - (dst_mod_y + dst_mod_h)) / 2.0);
-
- join_y -= (smallest_offset / smallest_offset_range * join_range) - join_range/2.0;
-
- // Interpolate between (src_x < dst_x) case and (src_y == dst_y) case
- if (src_x < dst_x && x_dist > y_dist) {
- join_y *= (1.0-ratio);
- join_y += (src_y + dst_y)/2.0 * ratio;
- }
-
- if (src_x < dst_x) {
- join_y += ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio));
- join_x -= ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio)) * y_mod;
- }
- double src_x_offset = fabs(src_x - join_x)/8.0 + src_offset_range - src_offset/src_offset_range*join_range;
- double dst_x_offset = fabs(dst_x - join_x)/8.0 + dst_offset_range + dst_offset/dst_offset_range*join_range;
- double src_y_offset = fabs(src_y - join_y)/4.0 + src_offset/src_offset_range*(src_offset_range+join_range)/2.0;
- double dst_y_offset = fabs(dst_y - join_y)/2.0 + (dst_offset_range-dst_offset)/dst_offset_range*(dst_offset_range+join_range)/2.0;
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- src_x1 = src_x + src_x_offset;
- // Interpolate from curve through case
- if (x_dist < y_dist) {
- // Smooth transition from (src_y) to (join_y - src_y_offset * y_mod)
- src_y1 = (src_y * (1.0-fabs(ratio))) + ((join_y - src_y_offset * y_mod) * -ratio);
- // Smooth transition from (join_x + src_offset_range/4.0 * -ratio) to (src_x + src_x_offset)
- src_x2 = (join_x + src_offset_range/4.0 * -ratio)*(1.0-fabs(ratio)) + (src_x + src_x_offset)*-ratio;
- } else {
- src_y1 = src_y;
- src_x2 = join_x + src_offset_range/4.0 * -ratio;
- }
- src_y2 = join_y - src_y_offset*(1.0-fabs(ratio)) * y_mod;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- dst_x1 = dst_x - dst_x_offset;
- dst_y1 = dst_y;
- // Interpolate from curve through case
- if (x_dist < y_dist) {
- // Smooth transition from (dst_y) to (join_y - dst_y_offset * y_mod)
- dst_y1 = (dst_y * (1.0-fabs(ratio))) + ((join_y + dst_y_offset * y_mod) * -ratio);
- // Smooth transition from (join_x + dst_offset_range/4.0 * -ratio) to (dst_x + dst_x_offset)
- dst_x2 = (join_x - dst_offset_range/4.0 * -ratio)*(1.0-fabs(ratio)) + (dst_x - dst_x_offset)*-ratio;
- } else {
- dst_y1 = dst_y;
- dst_x2 = join_x - dst_offset_range/4.0 * -ratio;
- }
- dst_y2 = join_y + dst_y_offset*(1.0-fabs(ratio)) * y_mod;
-*/
-
- // "Normal" connections
- } else {
-
- join_x = (src_x + dst_x)/2.0;
- join_y = (src_y + dst_y)/2.0;
-#if 0
- join_range = MIN(join_range, x_dist/2.0);
-
-
-
- /************ Find join point **************/
-
- //const double join_range = 15.0;
- //const double join_range = MIN(smallest_offset_range, x_dist/2.0);
- //const double join_range = MIN(30.0, x_dist/2.0);
-
- // Calculate join point
- double ratio = (x_dist - y_dist) / (y_dist + x_dist);
-
- cerr << "ratio: " << ratio << endl;
-
- /* if (MAX(x_dist, y_dist) > smallest_offset_range * 2.0) {
- // Vertical centre point between the modules
- join_y = (src_y < dst_y)
- ? (dst_mod_y - (dst_mod_y - (src_mod_y + src_mod_h)) / 2.0)
- : (src_mod_y - (src_mod_y - (dst_mod_y + dst_mod_h)) / 2.0);
-
- join_y -= (smallest_offset / smallest_offset_range * join_range) - join_range/2.0;
-
- // Interpolate between (src_x < dst_x) case and (src_y == dst_y) case
- if (src_x < dst_x && x_dist > y_dist) {
- join_y *= (1.0-ratio);
- join_y += (src_y + dst_y)/2.0 * ratio;
- }
- }*/
-
- if (src_x < dst_x) {
- // join_y += ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio));
- join_x -= ((smallest_offset/smallest_offset_range)) * join_range * (1.0-fabs(ratio)) * y_mod;
- join_x += join_range/2.0 * (1.0-fabs(ratio)); // center
- }
-#endif
-
- /*************************************************/
-
-
- // Path 1 (src_x, src_y) -> (join_x, join_y)
- // Control point 1
- src_x1 = src_x + fabs(join_x - src_x) / 2.0;
- src_y1 = src_y;
- // Control point 2
- src_x2 = join_x - fabs(join_x - src_x) / 4.0;
- src_y2 = join_y - fabs(join_y - src_y) / 2.0 * y_mod;
-
- // Path 2, (join_x, join_y) -> (dst_x, dst_y)
- // Control point 1
- dst_x1 = dst_x - fabs(join_x - dst_x) / 2.0;
- dst_y1 = dst_y;
- // Control point 2
- dst_x2 = join_x + fabs(join_x - dst_x) / 4.0;
- dst_y2 = join_y + fabs(join_y - dst_y) / 2.0 * y_mod;
- }
-
- // This was broken in libgnomecanvasmm with GTK 2.8. Nice work, guys.
- /*
- m_path->reset();
- m_path->moveto(src_x, src_y);
- m_path->curveto(src_x1, src_y1, src_x2, src_y2, join_x, join_y);
- m_path->curveto(dst_x2, dst_y2, dst_x1, dst_y1, dst_x, dst_y);
- set_bpath(m_path);
- */
-
- // Work around it w/ the C API
- gnome_canvas_path_def_reset(m_path);
- gnome_canvas_path_def_moveto(m_path, src_x, src_y);
- gnome_canvas_path_def_curveto(m_path, src_x1, src_y1, src_x2, src_y2, join_x, join_y);
- gnome_canvas_path_def_curveto(m_path, dst_x2, dst_y2, dst_x1, dst_y1, dst_x, dst_y);
-
- GnomeCanvasBpath* c_obj = gobj();
- gnome_canvas_item_set(GNOME_CANVAS_ITEM(c_obj), "bpath", m_path, NULL);
-}
-
-
-/** Removes the reference to this connection contained in the ports.
- *
- * Must be called before destroying a connection.
- */
-void
-Connection::disconnect()
-{
- m_source_port->remove_connection(this);
- m_dest_port->remove_connection(this);
- m_source_port = NULL;
- m_dest_port = NULL;
-}
-
-
-void
-Connection::hilite(bool b)
-{
- if (b)
- property_outline_color_rgba() = 0xFF0000FF;
- else
- property_outline_color_rgba() = m_colour;
-}
-
-
-void
-Connection::selected(bool selected)
-{
- m_selected = selected;
- if (selected)
- property_dash() = m_patch_bay->select_dash();
- else
- property_dash() = NULL;
-}
-
-
-} // namespace LibFlowCanvas
-