summaryrefslogtreecommitdiff
path: root/libs/flowcanvas/src/Module.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/flowcanvas/src/Module.cpp')
-rw-r--r--libs/flowcanvas/src/Module.cpp472
1 files changed, 0 insertions, 472 deletions
diff --git a/libs/flowcanvas/src/Module.cpp b/libs/flowcanvas/src/Module.cpp
deleted file mode 100644
index 14f9e3eda6..0000000000
--- a/libs/flowcanvas/src/Module.cpp
+++ /dev/null
@@ -1,472 +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/Module.h"
-#include "flowcanvas/FlowCanvas.h"
-#include <functional>
-#include <list>
-#include <cstdlib>
-#include <cassert>
-#include <cmath>
-
-using std::string;
-
-namespace LibFlowCanvas {
-
-static const int MODULE_FILL_COLOUR = 0x122A3CFF;
-static const int MODULE_OUTLINE_COLOUR = 0x8899AAFF;
-static const int MODULE_TITLE_COLOUR = 0xDDEEFFFF;
-
-Module::Module(FlowCanvas* patch_bay, const string& name, double x, double y)
-: Gnome::Canvas::Group(*patch_bay->root(), x, y),
- m_name(name),
- m_selected(false),
- m_patch_bay(patch_bay),
- m_module_box(*this, 0, 0, 0, 0), // w, h set later
- m_canvas_title(*this, 0, 6, name) // x set later
-{
- assert(m_patch_bay != NULL);
-
- m_module_box.property_fill_color_rgba() = MODULE_FILL_COLOUR;
-
- m_module_box.property_outline_color_rgba() = MODULE_OUTLINE_COLOUR;
- m_module_box.property_join_style() = Gdk::JOIN_ROUND;
- border_width(1.0);
-
- m_canvas_title.property_size_set() = true;
- m_canvas_title.property_size() = 10000;
- m_canvas_title.property_weight_set() = true;
- m_canvas_title.property_weight() = 400;
- m_canvas_title.property_fill_color_rgba() = MODULE_TITLE_COLOUR;
-
- width(m_canvas_title.property_text_width() + 6.0);
- height(m_canvas_title.property_text_height() + 2.0);
- m_canvas_title.property_x() = m_width/2.0;
-
- signal_event().connect(sigc::mem_fun(this, &Module::module_event));
-}
-
-
-Module::~Module()
-{
- if (m_selected) {
- for (list<Module*>::iterator i = m_patch_bay->selected_modules().begin();
- i != m_patch_bay->selected_modules().end(); ++i)
- {
- if ((*i) == this) {
- m_patch_bay->selected_modules().erase(i);
- break;
- }
- }
- }
- for (PortList::iterator p = m_ports.begin(); p != m_ports.end(); ++p)
- delete (*p);
-}
-
-/** Set the border width of the module.
- *
- * Do NOT directly set the width_units property on the rect, use this function.
- */
-void
-Module::border_width(double w)
-{
- m_border_width = w;
- m_module_box.property_width_units() = w;
-}
-
-
-bool
-Module::module_event(GdkEvent* event)
-{
- assert(event != NULL);
-
- static double x, y;
- static double drag_start_x, drag_start_y;
- double module_x, module_y; // FIXME: bad name, actually mouse click loc
- static bool dragging = false;
- bool handled = true;
-
- module_x = event->button.x;
- module_y = event->button.y;
-
- property_parent().get_value()->w2i(module_x, module_y);
-
- switch (event->type) {
-
- case GDK_2BUTTON_PRESS:
- on_double_click();
- handled = true;
- break;
-
- case GDK_BUTTON_PRESS:
- if (event->button.button == 1) {
- x = module_x;
- y = module_y;
- // Set these so we can tell on a button release if a drag actually
- // happened (if not, it's just a click)
- drag_start_x = x;
- drag_start_y = y;
- grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK,
- Gdk::Cursor(Gdk::FLEUR),
- event->button.time);
- dragging = true;
- } else if (event->button.button == 2) {
- on_double_click();
- handled = true;
- } else if (event->button.button == 3) {
- show_menu(&event->button);
- } else {
- handled = false;
- }
- break;
-
- case GDK_MOTION_NOTIFY:
- if ((dragging && (event->motion.state & GDK_BUTTON1_MASK))) {
- double new_x = module_x;
- double new_y = module_y;
-
- // Move any other selected modules if we're selected
- if (m_selected) {
- for (list<Module*>::iterator i = m_patch_bay->selected_modules().begin();
- i != m_patch_bay->selected_modules().end(); ++i)
- {
- (*i)->move(new_x - x, new_y - y);
- }
- } else {
- move(new_x - x, new_y - y);
- }
-
- x = new_x;
- y = new_y;
- } else {
- handled = false;
- }
- break;
-
- case GDK_BUTTON_RELEASE:
- if (dragging) {
- ungrab(event->button.time);
- dragging = false;
- if (module_x != drag_start_x || module_y != drag_start_y) {// dragged
- store_location();
- } else { // just a click
- if (m_selected) {
- m_patch_bay->unselect_module(this);
- assert(!m_selected);
- } else {
- if ( !(event->button.state & GDK_CONTROL_MASK))
- m_patch_bay->clear_selection();
- m_patch_bay->select_module(this);
- assert(m_selected);
- }
- }
- } else {
- handled = false;
- }
- break;
-
- case GDK_ENTER_NOTIFY:
- hilite(true);
- raise_to_top();
- for (PortList::iterator p = m_ports.begin(); p != m_ports.end(); ++p)
- (*p)->raise_connections();
- break;
-
- case GDK_LEAVE_NOTIFY:
- hilite(false);
- break;
-
- default:
- handled = false;
- }
-
- return handled;
-}
-
-
-void
-Module::zoom(float z)
-{
- m_canvas_title.property_size() = static_cast<int>(roundf(10000.0f * z));
- for (PortList::iterator p = m_ports.begin(); p != m_ports.end(); ++p)
- (*p)->zoom(z);
-}
-
-
-void
-Module::hilite(bool b)
-{
- if (b) {
- m_module_box.property_fill_color_rgba() = 0x223553FF;
- } else {
- m_module_box.property_fill_color_rgba() = MODULE_FILL_COLOUR;
- }
-}
-
-
-void
-Module::selected(bool selected)
-{
- m_selected = selected;
- if (selected) {
- m_module_box.property_fill_color_rgba() = 0x223553FF;
- m_module_box.property_outline_color_rgba() = 0xEEEEFFFF;
- m_module_box.property_dash() = m_patch_bay->select_dash();
- m_canvas_title.property_fill_color_rgba() = 0xEEEEFFFF;
- //for (PortList::iterator p = m_ports.begin(); p != m_ports.end(); ++p)
- // (*p)->rect()->property_outline_color_rgba() = 0xEEEEFFFF;
- } else {
- m_module_box.property_fill_color_rgba() = MODULE_FILL_COLOUR;
- m_module_box.property_outline_color_rgba() = MODULE_OUTLINE_COLOUR;
- m_module_box.property_dash() = NULL;
- m_canvas_title.property_fill_color_rgba() = MODULE_TITLE_COLOUR;
- //for (PortList::iterator p = m_ports.begin(); p != m_ports.end(); ++p)
- // (*p)->rect()->property_outline_color_rgba() = 0x8899AAFF;
- }
-}
-
-
-bool
-Module::is_within(const Gnome::Canvas::Rect* const rect)
-{
- const double x1 = rect->property_x1();
- const double y1 = rect->property_y1();
- const double x2 = rect->property_x2();
- const double y2 = rect->property_y2();
-
- if (x1 < x2 && y1 < y2) {
- return (property_x() > x1
- && property_y() > y1
- && property_x() + width() < x2
- && property_y() + height() < y2);
- } else if (x2 < x1 && y2 < y1) {
- return (property_x() > x2
- && property_y() > y2
- && property_x() + width() < x1
- && property_y() + height() < y1);
- } else if (x1 < x2 && y2 < y1) {
- return (property_x() > x1
- && property_y() > y2
- && property_x() + width() < x2
- && property_y() + height() < y1);
- } else if (x2 < x1 && y1 < y2) {
- return (property_x() > x2
- && property_y() > y1
- && property_x() + width() < x1
- && property_y() + height() < y2);
- } else {
- return false;
- }
-}
-
-
-void
-Module::remove_port(const string& port_name, bool resize_to_fit)
-{
- for (PortList::iterator i = m_ports.begin(); i != m_ports.end(); ++i) {
- if ((*i)->name() == port_name) {
- delete (*i);
- i = m_ports.erase(i);
- }
- }
-
- if (resize_to_fit)
- resize();
-}
-
-
-void
-Module::width(double w)
-{
- m_width = w;
- m_module_box.property_x2() = m_module_box.property_x1() + w;
-}
-
-
-void
-Module::height(double h)
-{
- m_height = h;
- m_module_box.property_y2() = m_module_box.property_y1() + h;
-}
-
-
-/** Overloaded Group::move to update connection paths and keep module on the canvas */
-void
-Module::move(double dx, double dy)
-{
- double new_x = property_x() + dx;
- double new_y = property_y() + dy;
-
- if (new_x < 0) dx = property_x() * -1;
- else if (new_x + m_width > m_patch_bay->width()) dx = m_patch_bay->width() - property_x() - m_width;
-
- if (new_y < 0) dy = property_y() * -1;
- else if (new_y + m_height > m_patch_bay->height()) dy = m_patch_bay->height() - property_y() - m_height;
-
- Gnome::Canvas::Group::move(dx, dy);
-
- // Deal with moving the connection lines
- for (PortList::iterator p = ports().begin(); p != ports().end(); ++p)
- (*p)->move_connections();
-}
-
-
-/** Move to the specified absolute coordinate on the canvas */
-void
-Module::move_to(double x, double y)
-{
- if (x < 0) x = 0;
- if (y < 0) y = 0;
- if (x + m_width > m_patch_bay->width()) x = m_patch_bay->width() - m_width;
- if (y + m_height > m_patch_bay->height()) y = m_patch_bay->height() - m_height;
-
- // Man, not many things left to try to get the damn things to move! :)
- property_x() = x;
- property_y() = y;
- move(0, 0);
- // Deal with moving the connection lines
- for (PortList::iterator p = ports().begin(); p != ports().end(); ++p)
- (*p)->move_connections();
-}
-
-
-void
-Module::name(const string& n)
-{
- m_name = n;
- m_canvas_title.property_text() = m_name;
- resize();
-}
-
-/*
-void
-Module::add_port(const string& port_name, bool is_input, int colour, bool resize_to_fit)
-{
- Port* port = new Port(this, port_name, is_input, colour);
-
- port->signal_event().connect(
- sigc::bind<Port*>(sigc::mem_fun(m_patch_bay, &FlowCanvas::port_event), port));
-
- add_port(port, resize_to_fit);
-}
-*/
-
-void
-Module::add_port(Port* port, bool resize_to_fit)
-{
- m_ports.push_back(port);
-
- if (resize_to_fit)
- resize();
-}
-
-
-/** Resize the module to fit its contents best.
- */
-void
-Module::resize()
-{
- double widest_in = 0.0;
- double widest_out = 0.0;
-
- Port* p = NULL;
-
- // Find widest in/out ports
- for (PortList::iterator i = m_ports.begin(); i != m_ports.end(); ++i) {
- p = (*i);
- if (p->is_input() && p->width() > widest_in)
- widest_in = p->width();
- else if (p->is_output() && p->width() > widest_out)
- widest_out = p->width();
- }
-
- // Make sure module is wide enough for ports
- if (widest_in > widest_out)
- width(widest_in + 5.0 + border_width()*2.0);
- else
- width(widest_out + 5.0 + border_width()*2.0);
-
- // Make sure module is wide enough for title
- if (m_canvas_title.property_text_width() + 6.0 > m_width)
- width(m_canvas_title.property_text_width() + 6.0);
-
- // Set height to contain ports and title
- double height_base = m_canvas_title.property_text_height() + 2;
- double h = height_base;
- if (m_ports.size() > 0)
- h += m_ports.size() * ((*m_ports.begin())->height()+2.0);
- height(h);
-
- // Move ports to appropriate locations
-
- double y;
- int i = 0;
- for (PortList::iterator pi = m_ports.begin(); pi != m_ports.end(); ++pi, ++i) {
- Port* p = (*pi);
-
- y = height_base + (i * (p->height() + 2.0));
- if (p->is_input()) {
- p->width(widest_in);
- p->property_x() = 1.0;//border_width();
- p->property_y() = y;
- } else {
- p->width(widest_out);
- p->property_x() = m_width - p->width() - 1.0;//p->border_width();
- p->property_y() = y;
- }
- }
-
- // Center title
- m_canvas_title.property_x() = m_width/2.0;
-
- // Update connection locations if we've moved/resized
- for (PortList::iterator pi = m_ports.begin(); pi != m_ports.end(); ++pi, ++i) {
- (*pi)->move_connections();
- }
-
- // Make things actually move to their new locations (?!)
- move(0, 0);
-}
-
-
-/** Port offset, for connection drawing. See doc/port_offsets.dia */
-double
-Module::port_connection_point_offset(Port* port)
-{
- assert(port->module() == this);
- assert(ports().size() > 0);
-
- return (port->connection_coords().get_y()
- - m_ports.front()->connection_coords().get_y());
-}
-
-
-/** Range of port offsets, for connection drawing. See doc/port_offsets.dia */
-double
-Module::port_connection_points_range()
-{
- assert(m_ports.size() > 0);
-
- double ret = fabs(m_ports.back()->connection_coords().get_y()
- - m_ports.front()->connection_coords().get_y());
-
- return (ret < 1.0) ? 1.0 : ret;
-}
-
-
-} // namespace LibFlowCanvas