| 
							- /*
 -  * Patchbay Canvas engine using QGraphicsView/Scene
 -  * Copyright (C) 2010-2012 Filipe Coelho <falktx@falktx.com>
 -  *
 -  * This program 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
 -  * any later version.
 -  *
 -  * This program 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 more details.
 -  *
 -  * For a full copy of the GNU General Public License see the COPYING file
 -  */
 - 
 - #include "patchcanvas.h"
 - #include "patchscene.h"
 - 
 - #include <QtCore/QSettings>
 - #include <QtCore/QTimer>
 - #include <QtGui/QAction>
 - 
 - #include "canvasfadeanimation.h"
 - #include "canvasline.h"
 - #include "canvasbezierline.h"
 - #include "canvasport.h"
 - #include "canvasbox.h"
 - 
 - CanvasObject::CanvasObject(QObject* parent) : QObject(parent) {}
 - 
 - void CanvasObject::AnimationIdle()
 - {
 -     PatchCanvas::CanvasFadeAnimation* animation = (PatchCanvas::CanvasFadeAnimation*)sender();
 -     if (animation)
 -         PatchCanvas::CanvasRemoveAnimation(animation);
 - }
 - 
 - void CanvasObject::AnimationHide()
 - {
 -     PatchCanvas::CanvasFadeAnimation* animation = (PatchCanvas::CanvasFadeAnimation*)sender();
 -     if (animation)
 -     {
 -         if (animation->item())
 -             animation->item()->hide();
 -         PatchCanvas::CanvasRemoveAnimation(animation);
 -     }
 - }
 - 
 - void CanvasObject::AnimationDestroy()
 - {
 -     PatchCanvas::CanvasFadeAnimation* animation = (PatchCanvas::CanvasFadeAnimation*)sender();
 -     if (animation)
 -     {
 -         if (animation->item())
 -             PatchCanvas::CanvasRemoveItemFX(animation->item());
 -         PatchCanvas::CanvasRemoveAnimation(animation);
 -     }
 - }
 - 
 - void CanvasObject::CanvasPostponedGroups()
 - {
 -     PatchCanvas::CanvasPostponedGroups();
 - }
 - 
 - void CanvasObject::PortContextMenuDisconnect()
 - {
 -     bool ok;
 -     int connection_id = ((QAction*)sender())->data().toInt(&ok);
 -     if (ok)
 -         PatchCanvas::CanvasCallback(PatchCanvas::ACTION_PORTS_DISCONNECT, connection_id, 0, "");
 - }
 - 
 - START_NAMESPACE_PATCHCANVAS
 - 
 - /* contructor and destructor */
 - Canvas::Canvas()
 - {
 -     qobject   = 0;
 -     settings  = 0;
 -     theme     = 0;
 -     initiated = false;
 - }
 - 
 - Canvas::~Canvas()
 - {
 -     if (qobject)
 -         delete qobject;
 -     if (settings)
 -         delete settings;
 -     if (theme)
 -         delete theme;
 - }
 - 
 - /* Global objects */
 - Canvas canvas;
 - 
 - options_t options = {
 -     /* theme_name */       getDefaultThemeName(),
 -     /* auto_hide_groups */ false,
 -     /* use_bezier_lines */ true,
 -     /* antialiasing */     ANTIALIASING_SMALL,
 -     /* eyecandy */         EYECANDY_SMALL
 - };
 - 
 - features_t features = {
 -     /* group_info */       false,
 -     /* group_rename */     false,
 -     /* port_info */        false,
 -     /* port_rename */      false,
 -     /* handle_group_pos */ false
 - };
 - 
 - /* Internal functions */
 - const char* bool2str(bool check)
 - {
 -     return check ? "true" : "false";
 - }
 - 
 - const char* port_mode2str(PortMode port_mode)
 - {
 -     if (port_mode == PORT_MODE_NULL)
 -         return "PORT_MODE_NULL";
 -     else if (port_mode == PORT_MODE_INPUT)
 -         return "PORT_MODE_INPUT";
 -     else if (port_mode == PORT_MODE_OUTPUT)
 -         return "PORT_MODE_OUTPUT";
 -     else
 -         return "PORT_MODE_???";
 - }
 - 
 - const char* port_type2str(PortType port_type)
 - {
 -     if (port_type == PORT_TYPE_NULL)
 -         return "PORT_TYPE_NULL";
 -     else if (port_type == PORT_TYPE_AUDIO_JACK)
 -         return "PORT_TYPE_AUDIO_JACK";
 -     else if (port_type == PORT_TYPE_MIDI_JACK)
 -         return "PORT_TYPE_MIDI_JACK";
 -     else if (port_type == PORT_TYPE_MIDI_A2J)
 -         return "PORT_TYPE_MIDI_A2J";
 -     else if (port_type == PORT_TYPE_MIDI_ALSA)
 -         return "PORT_TYPE_MIDI_ALSA";
 -     else
 -         return "PORT_TYPE_???";
 - }
 - 
 - const char* icon2str(Icon icon)
 - {
 -     if (icon == ICON_HARDWARE)
 -         return "ICON_HARDWARE";
 -     else if (ICON_APPLICATION)
 -         return "ICON_APPLICATION";
 -     else if (ICON_LADISH_ROOM)
 -         return "ICON_LADISH_ROOM";
 -     else
 -         return "ICON_???";
 - }
 - 
 - const char* split2str(SplitOption split)
 - {
 -     if (split == SPLIT_UNDEF)
 -         return "SPLIT_UNDEF";
 -     else if (split == SPLIT_NO)
 -         return "SPLIT_NO";
 -     else if (split == SPLIT_YES)
 -         return "SPLIT_YES";
 -     else
 -         return "SPLIT_???";
 - }
 - 
 - /* PatchCanvas API */
 - void setOptions(options_t* new_options)
 - {
 -     if (canvas.initiated) return;
 -     options.theme_name        = new_options->theme_name;
 -     options.auto_hide_groups  = new_options->auto_hide_groups;
 -     options.use_bezier_lines  = new_options->use_bezier_lines;
 -     options.antialiasing      = new_options->antialiasing;
 -     options.eyecandy          = new_options->eyecandy;
 - }
 - 
 - void setFeatures(features_t* new_features)
 - {
 -     if (canvas.initiated) return;
 -     features.group_info       = new_features->group_info;
 -     features.group_rename     = new_features->group_rename;
 -     features.port_info        = new_features->port_info;
 -     features.port_rename      = new_features->port_rename;
 -     features.handle_group_pos = new_features->handle_group_pos;
 - }
 - 
 - void init(PatchScene* scene, Callback callback, bool debug)
 - {
 -     if (debug)
 -         qDebug("PatchCanvas::init(%p, %p, %s)", scene, callback, bool2str(debug));
 - 
 -     if (canvas.initiated)
 -     {
 -         qCritical("PatchCanvas::init() - already initiated");
 -         return;
 -     }
 - 
 -     if (!callback)
 -     {
 -         qFatal("PatchCanvas::init() - fatal error: callback not set");
 -         return;
 -     }
 - 
 -     canvas.scene = scene;
 -     canvas.callback = callback;
 -     canvas.debug = debug;
 - 
 -     canvas.last_z_value = 0;
 -     canvas.last_connection_id = 0;
 -     canvas.initial_pos = QPointF(0, 0);
 -     canvas.size_rect = QRectF();
 - 
 -     if (!canvas.qobject) canvas.qobject = new CanvasObject();
 -     if (!canvas.settings) canvas.settings = new QSettings(PATCHCANVAS_ORGANISATION_NAME, "PatchCanvas");
 - 
 -     if (canvas.theme)
 -     {
 -         delete canvas.theme;
 -         canvas.theme = 0;
 -     }
 - 
 -     for (int i=0; i<Theme::THEME_MAX; i++)
 -     {
 -         QString this_theme_name = getThemeName(static_cast<Theme::List>(i));
 -         if (this_theme_name == options.theme_name)
 -         {
 -             canvas.theme = new Theme(static_cast<Theme::List>(i));
 -             break;
 -         }
 -     }
 - 
 -     if (!canvas.theme)
 -         canvas.theme = new Theme(getDefaultTheme());
 - 
 -     canvas.scene->updateTheme();
 - 
 -     canvas.initiated = true;
 - }
 - 
 - void clear()
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::clear()");
 - 
 -     QList<int> group_list_ids;
 -     QList<int> port_list_ids;
 -     QList<int> connection_list_ids;
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -         group_list_ids.append(group.group_id);
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -         port_list_ids.append(port.port_id);
 - 
 -     foreach (const connection_dict_t& connection, canvas.connection_list)
 -         connection_list_ids.append(connection.connection_id);
 - 
 -     foreach (const int& idx, connection_list_ids)
 -         disconnectPorts(idx);
 - 
 -     foreach (const int& idx, port_list_ids)
 -         removePort(idx);
 - 
 -     foreach (const int& idx, group_list_ids)
 -         removeGroup(idx);
 - 
 -     canvas.last_z_value = 0;
 -     canvas.last_connection_id = 0;
 - 
 -     canvas.group_list.clear();
 -     canvas.port_list.clear();
 -     canvas.connection_list.clear();
 - 
 -     canvas.initiated = false;
 - }
 - 
 - void setInitialPos(int x, int y)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::setInitialPos(%i, %i)", x, y);
 - 
 -     canvas.initial_pos.setX(x);
 -     canvas.initial_pos.setY(y);
 - }
 - 
 - void setCanvasSize(int x, int y, int width, int height)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::setCanvasSize(%i, %i, %i, %i)", x, y, width, height);
 - 
 -     canvas.size_rect.setX(x);
 -     canvas.size_rect.setY(y);
 -     canvas.size_rect.setWidth(width);
 -     canvas.size_rect.setHeight(height);
 - }
 - 
 - void addGroup(int group_id, QString group_name, SplitOption split, Icon icon)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::addGroup(%i, %s, %s, %s)", group_id, group_name.toUtf8().constData(), split2str(split), icon2str(icon));
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -         {
 -             qWarning("PatchCanvas::addGroup(%i, %s, %s, %s) - group already exists", group_id, group_name.toUtf8().constData(), split2str(split), icon2str(icon));
 -             return;
 -         }
 -     }
 - 
 -     if (split == SPLIT_UNDEF && features.handle_group_pos)
 -         split = static_cast<SplitOption>(canvas.settings->value(QString("CanvasPositions/%1_SPLIT").arg(group_name), split).toInt());
 - 
 -     CanvasBox* group_box = new CanvasBox(group_id, group_name, icon);
 - 
 -     group_dict_t group_dict;
 -     group_dict.group_id   = group_id;
 -     group_dict.group_name = group_name;
 -     group_dict.split = (split == SPLIT_YES);
 -     group_dict.icon  = icon;
 -     group_dict.widgets[0] = group_box;
 -     group_dict.widgets[1] = 0;
 - 
 -     if (split == SPLIT_YES)
 -     {
 -         group_box->setSplit(true, PORT_MODE_OUTPUT);
 - 
 -         if (features.handle_group_pos)
 -             group_box->setPos(canvas.settings->value(QString("CanvasPositions/%1_OUTPUT").arg(group_name), CanvasGetNewGroupPos()).toPointF());
 -         else
 -             group_box->setPos(CanvasGetNewGroupPos());
 - 
 -         CanvasBox* group_sbox = new CanvasBox(group_id, group_name, icon);
 -         group_sbox->setSplit(true, PORT_MODE_INPUT);
 - 
 -         group_dict.widgets[1] = group_sbox;
 - 
 -         if (features.handle_group_pos)
 -             group_sbox->setPos(canvas.settings->value(QString("CanvasPositions/%1_INPUT").arg(group_name), CanvasGetNewGroupPos(true)).toPointF());
 -         else
 -             group_sbox->setPos(CanvasGetNewGroupPos(true));
 - 
 -         canvas.last_z_value += 1;
 -         group_sbox->setZValue(canvas.last_z_value);
 - 
 -         if (options.auto_hide_groups == false && options.eyecandy == EYECANDY_FULL)
 -             CanvasItemFX(group_sbox, true);
 -     }
 -     else
 -     {
 -         group_box->setSplit(false);
 - 
 -         if (features.handle_group_pos)
 -             group_box->setPos(canvas.settings->value(QString("CanvasPositions/%1").arg(group_name), CanvasGetNewGroupPos()).toPointF());
 -         else
 -         {
 -             // Special ladish fake-split groups
 -             bool horizontal = (icon == ICON_HARDWARE || icon == ICON_LADISH_ROOM);
 -             group_box->setPos(CanvasGetNewGroupPos(horizontal));
 -         }
 -     }
 - 
 -     canvas.last_z_value += 1;
 -     group_box->setZValue(canvas.last_z_value);
 - 
 -     canvas.group_list.append(group_dict);
 - 
 -     if (options.auto_hide_groups == false && options.eyecandy == EYECANDY_FULL)
 -         CanvasItemFX(group_box, true);
 - 
 -     QTimer::singleShot(0, canvas.scene, SLOT(update()));
 - }
 - 
 - void removeGroup(int group_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::removeGroup(%i)", group_id);
 - 
 -     foreach2 (const group_dict_t& group, canvas.group_list)
 -         if (group.group_id == group_id)
 -         {
 -             CanvasBox* item = group.widgets[0];
 -             QString group_name = group.group_name;
 - 
 -             if (group.split)
 -             {
 -                 CanvasBox* s_item = group.widgets[1];
 -                 if (features.handle_group_pos)
 -                 {
 -                     canvas.settings->setValue(QString("CanvasPositions/%1_OUTPUT").arg(group_name), item->pos());
 -                     canvas.settings->setValue(QString("CanvasPositions/%1_INPUT").arg(group_name), s_item->pos());
 -                     canvas.settings->setValue(QString("CanvasPositions/%1_SPLIT").arg(group_name), SPLIT_YES);
 -                 }
 - 
 -                 if (options.eyecandy == EYECANDY_FULL)
 -                 {
 -                     CanvasItemFX(s_item, false, true);
 -                 }
 -                 else
 -                 {
 -                     s_item->removeIconFromScene();
 -                     canvas.scene->removeItem(s_item);
 -                     delete s_item;
 -                 }
 -             }
 -             else
 -             {
 -                 if (features.handle_group_pos)
 -                 {
 -                     canvas.settings->setValue(QString("CanvasPositions/%1").arg(group_name), item->pos());
 -                     canvas.settings->setValue(QString("CanvasPositions/%1_SPLIT").arg(group_name), SPLIT_NO);
 -                 }
 -             }
 - 
 -             if (options.eyecandy == EYECANDY_FULL)
 -             {
 -                 CanvasItemFX(item, false, true);
 -             }
 -             else
 -             {
 -                 item->removeIconFromScene();
 -                 canvas.scene->removeItem(item);
 -                 delete item;
 -             }
 - 
 -             canvas.group_list.takeAt(i);
 - 
 -             QTimer::singleShot(0, canvas.scene, SLOT(update()));
 -             return;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::removeGroup(%i) - unable to find group to remove", group_id);
 - }
 - 
 - void renameGroup(int group_id, QString new_group_name)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::renameGroup(%i, %s)", group_id, new_group_name.toUtf8().constData());
 - 
 -     foreach2 (group_dict_t& group, canvas.group_list)
 -         if (group.group_id == group_id)
 -         {
 -             group.group_name = new_group_name;
 -             group.widgets[0]->setGroupName(new_group_name);
 - 
 -             if (group.split && group.widgets[1])
 -                 group.widgets[1]->setGroupName(new_group_name);
 - 
 -             QTimer::singleShot(0, canvas.scene, SLOT(update()));
 -             return;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::renameGroup(%i, %s) - unable to find group to rename", group_id, new_group_name.toUtf8().constData());
 - }
 - 
 - void splitGroup(int group_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::splitGroup(%i)", group_id);
 - 
 -     CanvasBox* item = 0;
 -     QString group_name;
 -     Icon group_icon = ICON_APPLICATION;
 -     QList<port_dict_t> ports_data;
 -     QList<connection_dict_t> conns_data;
 - 
 -     // Step 1 - Store all Item data
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -         {
 -             if (group.split)
 -             {
 -                 qCritical("PatchCanvas::splitGroup(%i) - group is already splitted", group_id);
 -                 return;
 -             }
 - 
 -             item = group.widgets[0];
 -             group_name = group.group_name;
 -             group_icon = group.icon;
 -             break;
 -         }
 -     }
 - 
 -     if (!item)
 -     {
 -         qCritical("PatchCanvas::splitGroup(%i) - unable to find group to split", group_id);
 -         return;
 -     }
 - 
 -     QList<int> port_list_ids = QList<int>(item->getPortList());
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port_list_ids.contains(port.port_id))
 -         {
 -             port_dict_t port_dict;
 -             port_dict.group_id  = port.group_id;
 -             port_dict.port_id   = port.port_id;
 -             port_dict.port_name = port.port_name;
 -             port_dict.port_mode = port.port_mode;
 -             port_dict.port_type = port.port_type;
 -             port_dict.widget    = 0;
 -             ports_data.append(port_dict);
 -         }
 -     }
 - 
 -     foreach (const connection_dict_t& connection, canvas.connection_list)
 -     {
 -         if (port_list_ids.contains(connection.port_out_id) || port_list_ids.contains(connection.port_in_id))
 -         {
 -             connection_dict_t connection_dict;
 -             connection_dict.connection_id = connection.connection_id;
 -             connection_dict.port_in_id    = connection.port_in_id;
 -             connection_dict.port_out_id   = connection.port_out_id;
 -             connection_dict.widget        = 0;
 -             conns_data.append(connection_dict);
 -         }
 -     }
 - 
 -     // Step 2 - Remove Item and Children
 -     foreach (const connection_dict_t& conn, conns_data)
 -         disconnectPorts(conn.connection_id);
 - 
 -     foreach (const int& port_id, port_list_ids)
 -         removePort(port_id);
 - 
 -     removeGroup(group_id);
 - 
 -     // Step 3 - Re-create Item, now splitted
 -     addGroup(group_id, group_name, SPLIT_YES, group_icon);
 - 
 -     foreach (const port_dict_t& port, ports_data)
 -         addPort(group_id, port.port_id, port.port_name, port.port_mode, port.port_type);
 - 
 -     foreach (const connection_dict_t& conn, conns_data)
 -         connectPorts(conn.connection_id, conn.port_out_id, conn.port_in_id);
 - 
 -     QTimer::singleShot(0, canvas.scene, SLOT(update()));
 - }
 - 
 - void joinGroup(int group_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::joinGroup(%i)", group_id);
 - 
 -     CanvasBox* item = 0;
 -     CanvasBox* s_item = 0;
 -     QString group_name;
 -     Icon group_icon = ICON_APPLICATION;
 -     QList<port_dict_t> ports_data;
 -     QList<connection_dict_t> conns_data;
 - 
 -     // Step 1 - Store all Item data
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -         {
 -             if (group.split == false)
 -             {
 -                 qCritical("PatchCanvas::joinGroup(%i) - group is not splitted", group_id);
 -                 return;
 -             }
 - 
 -             item   = group.widgets[0];
 -             s_item = group.widgets[1];
 -             group_name = group.group_name;
 -             group_icon = group.icon;
 -             break;
 -         }
 -     }
 - 
 -     if (!item || !s_item)
 -     {
 -         qCritical("PatchCanvas::joinGroup(%i) - Unable to find groups to join", group_id);
 -         return;
 -     }
 - 
 -     QList<int> port_list_ids  = QList<int>(item->getPortList());
 -     QList<int> port_list_idss = s_item->getPortList();
 - 
 -     foreach (const int& port_id, port_list_idss)
 -     {
 -         if (port_list_ids.contains(port_id) == false)
 -             port_list_ids.append(port_id);
 -     }
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port_list_ids.contains(port.port_id))
 -         {
 -             port_dict_t port_dict;
 -             port_dict.group_id  = port.group_id;
 -             port_dict.port_id   = port.port_id;
 -             port_dict.port_name = port.port_name;
 -             port_dict.port_mode = port.port_mode;
 -             port_dict.port_type = port.port_type;
 -             port_dict.widget    = 0;
 -             ports_data.append(port_dict);
 -         }
 -     }
 - 
 -     foreach (const connection_dict_t& connection, canvas.connection_list)
 -     {
 -         if (port_list_ids.contains(connection.port_out_id) || port_list_ids.contains(connection.port_in_id))
 -         {
 -             connection_dict_t connection_dict;
 -             connection_dict.connection_id = connection.connection_id;
 -             connection_dict.port_in_id    = connection.port_in_id;
 -             connection_dict.port_out_id   = connection.port_out_id;
 -             connection_dict.widget        = 0;
 -             conns_data.append(connection_dict);
 -         }
 -     }
 - 
 -     // Step 2 - Remove Item and Children
 -     foreach (const connection_dict_t& conn, conns_data)
 -         disconnectPorts(conn.connection_id);
 - 
 -     foreach (const int& port_id, port_list_ids)
 -         removePort(port_id);
 - 
 -     removeGroup(group_id);
 - 
 -     // Step 3 - Re-create Item, now together
 -     addGroup(group_id, group_name, SPLIT_NO, group_icon);
 - 
 -     foreach (const port_dict_t& port, ports_data)
 -         addPort(group_id, port.port_id, port.port_name, port.port_mode, port.port_type);
 - 
 -     foreach (const connection_dict_t& conn, conns_data)
 -         connectPorts(conn.connection_id, conn.port_out_id, conn.port_in_id);
 - 
 -     QTimer::singleShot(0, canvas.scene, SLOT(update()));
 - }
 - 
 - QPointF getGroupPos(int group_id, PortMode port_mode)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::getGroupPos(%i, %s)", group_id, port_mode2str(port_mode));
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -         {
 -             if (group.split)
 -             {
 -                 if (port_mode == PORT_MODE_OUTPUT)
 -                     return group.widgets[0]->pos();
 -                 else if (port_mode == PORT_MODE_INPUT)
 -                     return group.widgets[1]->pos();
 -                 else
 -                     return QPointF(0, 0);
 -             }
 -             else
 -                 return group.widgets[0]->pos();
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::getGroupPos(%i, %s) - unable to find group", group_id, port_mode2str(port_mode));
 -     return QPointF(0,0);
 - }
 - 
 - void setGroupPos(int group_id, int group_pos_x, int group_pos_y)
 - {
 -     setGroupPos(group_id, group_pos_x, group_pos_y, group_pos_x, group_pos_y);
 - }
 - 
 - void setGroupPos(int group_id, int group_pos_x, int group_pos_y, int group_pos_xs, int group_pos_ys)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i)", group_id, group_pos_x, group_pos_y, group_pos_xs, group_pos_ys);
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -         {
 -             group.widgets[0]->setPos(group_pos_x, group_pos_y);
 - 
 -             if (group.split && group.widgets[1])
 -             {
 -                 group.widgets[1]->setPos(group_pos_xs, group_pos_ys);
 -             }
 - 
 -             QTimer::singleShot(0, canvas.scene, SLOT(update()));
 -             return;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i) - unable to find group to reposition", group_id, group_pos_x, group_pos_y, group_pos_xs, group_pos_ys);
 - }
 - 
 - void setGroupIcon(int group_id, Icon icon)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::setGroupIcon(%i, %s)", group_id, icon2str(icon));
 - 
 -     foreach2 (group_dict_t& group, canvas.group_list)
 -         if (group.group_id == group_id)
 -         {
 -             group.icon = icon;
 -             group.widgets[0]->setIcon(icon);
 - 
 -             if (group.split && group.widgets[1])
 -                 group.widgets[1]->setIcon(icon);
 - 
 -             QTimer::singleShot(0, canvas.scene, SLOT(update()));
 -             return;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::setGroupIcon(%i, %s) - unable to find group to change icon", group_id, icon2str(icon));
 - }
 - 
 - void addPort(int group_id, int port_id, QString port_name, PortMode port_mode, PortType port_type)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::addPort(%i, %i, %s, %s, %s)", group_id, port_id, port_name.toUtf8().constData(), port_mode2str(port_mode), port_type2str(port_type));
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port.group_id == group_id and port.port_id == port_id)
 -         {
 -             qWarning("PatchCanvas::addPort(%i, %i, %s, %s, %s) - port already exists" , group_id, port_id, port_name.toUtf8().constData(), port_mode2str(port_mode), port_type2str(port_type));
 -             return;
 -         }
 -     }
 - 
 -     CanvasBox* box_widget = 0;
 -     CanvasPort* port_widget = 0;
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -         {
 -             int n;
 -             if (group.split && group.widgets[0]->getSplittedMode() != port_mode && group.widgets[1])
 -                 n = 1;
 -             else
 -                 n = 0;
 -             box_widget = group.widgets[n];
 -             port_widget = box_widget->addPortFromGroup(port_id, port_name, port_mode, port_type);
 -             break;
 -         }
 -     }
 - 
 -     if (!box_widget || !port_widget)
 -     {
 -         qCritical("PatchCanvas::addPort(%i, %i, %s, %s, %s) - unable to find parent group", group_id, port_id, port_name.toUtf8().constData(), port_mode2str(port_mode), port_type2str(port_type));
 -         return;
 -     }
 - 
 -     if (options.eyecandy == EYECANDY_FULL)
 -         CanvasItemFX(port_widget, true);
 - 
 -     port_dict_t port_dict;
 -     port_dict.group_id  = group_id;
 -     port_dict.port_id   = port_id;
 -     port_dict.port_name = port_name;
 -     port_dict.port_mode = port_mode;
 -     port_dict.port_type = port_type;
 -     port_dict.widget    = port_widget;
 -     canvas.port_list.append(port_dict);
 - 
 -     box_widget->updatePositions();
 - 
 -     QTimer::singleShot(0, canvas.scene, SLOT(update()));
 - }
 - 
 - void removePort(int port_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::removePort(%i)", port_id);
 - 
 -     foreach2 (const port_dict_t& port, canvas.port_list)
 -         if (port.port_id == port_id)
 -         {
 -             CanvasPort* item = port.widget;
 -             ((CanvasBox*)item->parentItem())->removePortFromGroup(port_id);
 -             canvas.scene->removeItem(item);
 -             delete item;
 - 
 -             canvas.port_list.takeAt(i);
 - 
 -             QTimer::singleShot(0, canvas.scene, SLOT(update()));
 -             return;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::removePort(%i) - unable to find port to remove", port_id);
 - }
 - 
 - void renamePort(int port_id, QString new_port_name)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::renamePort(%i, %s)", port_id, new_port_name.toUtf8().constData());
 - 
 -     foreach2 (port_dict_t& port, canvas.port_list)
 -         if (port.port_id == port_id)
 -         {
 -             port.port_name = new_port_name;
 -             port.widget->setPortName(new_port_name);
 -             ((CanvasBox*)port.widget->parentItem())->updatePositions();
 - 
 -             QTimer::singleShot(0, canvas.scene, SLOT(update()));
 -             return;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::renamePort(%i, %s) - unable to find port to rename", port_id, new_port_name.toUtf8().constData());
 - }
 - 
 - void connectPorts(int connection_id, int port_out_id, int port_in_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::connectPorts(%i, %i, %i)", connection_id, port_out_id, port_in_id);
 - 
 -     CanvasPort* port_out = 0;
 -     CanvasPort* port_in  = 0;
 -     CanvasBox* port_out_parent = 0;
 -     CanvasBox* port_in_parent  = 0;
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port.port_id == port_out_id)
 -         {
 -             port_out = port.widget;
 -             port_out_parent = (CanvasBox*)port_out->parentItem();
 -         }
 -         else if (port.port_id == port_in_id)
 -         {
 -             port_in = port.widget;
 -             port_in_parent = (CanvasBox*)port_in->parentItem();
 -         }
 -     }
 - 
 -     if (!port_out || !port_in)
 -     {
 -         qCritical("PatchCanvas::connectPorts(%i, %i, %i) - Unable to find ports to connect", connection_id, port_out_id, port_in_id);
 -         return;
 -     }
 - 
 -     connection_dict_t connection_dict;
 -     connection_dict.connection_id = connection_id;
 -     connection_dict.port_out_id = port_out_id;
 -     connection_dict.port_in_id  = port_in_id;
 - 
 -     if (options.use_bezier_lines)
 -         connection_dict.widget = new CanvasBezierLine(port_out, port_in, 0);
 -     else
 -         connection_dict.widget = new CanvasLine(port_out, port_in, 0);
 - 
 -     port_out_parent->addLineFromGroup(connection_dict.widget, connection_id);
 -     port_in_parent->addLineFromGroup(connection_dict.widget, connection_id);
 - 
 -     canvas.last_z_value += 1;
 -     port_out_parent->setZValue(canvas.last_z_value);
 -     port_in_parent->setZValue(canvas.last_z_value);
 - 
 -     canvas.last_z_value += 1;
 -     connection_dict.widget->setZValue(canvas.last_z_value);
 - 
 -     canvas.connection_list.append(connection_dict);
 - 
 -     if (options.eyecandy == EYECANDY_FULL)
 -     {
 -         QGraphicsItem* item = (options.use_bezier_lines) ? (QGraphicsItem*)(CanvasBezierLine*)connection_dict.widget : (QGraphicsItem*)(CanvasLine*)connection_dict.widget;
 -         CanvasItemFX(item, true);
 -     }
 - 
 -     QTimer::singleShot(0, canvas.scene, SLOT(update()));
 - }
 - 
 - void disconnectPorts(int connection_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::disconnectPorts(%i)", connection_id);
 - 
 -     int port_1_id, port_2_id;
 -     AbstractCanvasLine* line = 0;
 -     QGraphicsItem* item1 = 0;
 -     QGraphicsItem* item2 = 0;
 - 
 -     foreach2 (const connection_dict_t& connection, canvas.connection_list)
 -         if (connection.connection_id == connection_id)
 -         {
 -             port_1_id = connection.port_out_id;
 -             port_2_id = connection.port_in_id;
 -             line = connection.widget;
 -             canvas.connection_list.takeAt(i);
 -             break;
 -         }
 -     }
 - 
 -     if (!line)
 -     {
 -         qCritical("PatchCanvas::disconnectPorts(%i) - unable to find connection ports", connection_id);
 -         return;
 -     }
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port.port_id == port_1_id)
 -         {
 -             item1 = port.widget;
 -             break;
 -         }
 -     }
 - 
 -     if (!item1)
 -     {
 -         qCritical("PatchCanvas::disconnectPorts(%i) - unable to find output port", connection_id);
 -         return;
 -     }
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port.port_id == port_2_id)
 -         {
 -             item2 = port.widget;
 -             break;
 -         }
 -     }
 - 
 -     if (!item2)
 -     {
 -         qCritical("PatchCanvas::disconnectPorts(%i) - unable to find input port", connection_id);
 -         return;
 -     }
 - 
 -     ((CanvasBox*)item1->parentItem())->removeLineFromGroup(connection_id);
 -     ((CanvasBox*)item2->parentItem())->removeLineFromGroup(connection_id);
 - 
 -     if (options.eyecandy == EYECANDY_FULL)
 -     {
 -         QGraphicsItem* item = (options.use_bezier_lines) ? (QGraphicsItem*)(CanvasBezierLine*)line : (QGraphicsItem*)(CanvasLine*)line;
 -         CanvasItemFX(item, false, true);
 -     }
 -     else
 -         line->deleteFromScene();
 - 
 -     QTimer::singleShot(0, canvas.scene, SLOT(update()));
 - }
 - 
 - void arrange()
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::Arrange()");
 - }
 - 
 - void updateZValues()
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::updateZValues()");
 - 
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         group.widgets[0]->resetLinesZValue();
 - 
 -         if (group.split and group.widgets[1])
 -             group.widgets[1]->resetLinesZValue();
 -     }
 - }
 - 
 - /* Extra Internal functions */
 - 
 - QString CanvasGetGroupName(int group_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasGetGroupName(%i)", group_id);
 - 
 -     foreach (const group_dict_t& group, canvas.group_list)
 -     {
 -         if (group.group_id == group_id)
 -             return group.group_name;
 -     }
 - 
 -     qCritical("PatchCanvas::CanvasGetGroupName(%i) - unable to find group", group_id);
 -     return "";
 - }
 - 
 - int CanvasGetGroupPortCount(int group_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasGetGroupPortCount(%i)", group_id);
 - 
 -     int port_count = 0;
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port.group_id == group_id)
 -             port_count += 1;
 -     }
 - 
 -     return port_count;
 - }
 - 
 - QPointF CanvasGetNewGroupPos(bool horizontal)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasGetNewGroupPos(%s)", bool2str(horizontal));
 - 
 -     QPointF new_pos(canvas.initial_pos.x(), canvas.initial_pos.y());
 -     QList<QGraphicsItem*> items = canvas.scene->items();
 - 
 -     bool break_loop = false;
 -     while (break_loop == false)
 -     {
 -         bool break_for = false;
 -         for (int i=0; i < items.count(); i++)
 -         {
 -             QGraphicsItem* item = items[i];
 -             if (item && item->type() == CanvasBoxType)
 -             {
 -                 if (item->sceneBoundingRect().contains(new_pos))
 -                 {
 -                     if (horizontal)
 -                         new_pos += QPointF(item->boundingRect().width()+15, 0);
 -                     else
 -                         new_pos += QPointF(0, item->boundingRect().height()+15);
 -                     break;
 -                 }
 -             }
 -             if (i >= items.count()-1 && break_for == false)
 -                 break_loop = true;
 -         }
 -     }
 - 
 -     return new_pos;
 - }
 - 
 - QString CanvasGetFullPortName(int port_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasGetFullPortName(%i)", port_id);
 - 
 -     foreach (const port_dict_t& port, canvas.port_list)
 -     {
 -         if (port.port_id == port_id)
 -         {
 -             int group_id = port.group_id;
 -             foreach (const group_dict_t& group, canvas.group_list)
 -             {
 -                 if (group.group_id == group_id)
 -                     return group.group_name + ":" + port.port_name;
 -             }
 -             break;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::CanvasGetFullPortName(%i) - unable to find port", port_id);
 -     return "";
 - }
 - 
 - QList<int> CanvasGetPortConnectionList(int port_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasGetPortConnectionList(%i)", port_id);
 - 
 -     QList<int> port_con_list;
 - 
 -     foreach (const connection_dict_t& connection, canvas.connection_list)
 -     {
 -         if (connection.port_out_id == port_id || connection.port_in_id == port_id)
 -             port_con_list.append(connection.connection_id);
 -     }
 - 
 -     return port_con_list;
 - }
 - 
 - int CanvasGetConnectedPort(int connection_id, int port_id)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasGetConnectedPort(%i, %i)", connection_id, port_id);
 - 
 -     foreach (const connection_dict_t& connection, canvas.connection_list)
 -     {
 -         if (connection.connection_id == connection_id)
 -         {
 -             if (connection.port_out_id == port_id)
 -                 return connection.port_in_id;
 -             else
 -                 return connection.port_out_id;
 -         }
 -     }
 - 
 -     qCritical("PatchCanvas::CanvasGetConnectedPort(%i, %i) - unable to find connection", connection_id, port_id);
 -     return 0;
 - }
 - 
 - void CanvasRemoveAnimation(CanvasFadeAnimation* f_animation)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasRemoveAnimation(%p)", f_animation);
 - 
 -     foreach2 (const animation_dict_t& animation, canvas.animation_list)
 -         if (animation.animation == f_animation)
 -         {
 -             delete animation.animation;
 -             canvas.animation_list.takeAt(i);
 -             break;
 -         }
 -     }
 - }
 - 
 - void CanvasPostponedGroups()
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasPostponedGroups()");
 - }
 - 
 - void CanvasCallback(CallbackAction action, int value1, int value2, QString value_str)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasCallback(%i, %i, %i, %s)", action, value1, value2, value_str.toStdString().data());
 - 
 -     canvas.callback(action, value1, value2, value_str);
 - }
 - 
 - void CanvasItemFX(QGraphicsItem* item, bool show, bool destroy)
 - {
 -     if (canvas.debug)
 -         qDebug("PatchCanvas::CanvasItemFX(%p, %s, %s)", item, bool2str(show), bool2str(destroy));
 - 
 -     // Check if item already has an animationItemFX
 -     foreach2 (const animation_dict_t& animation, canvas.animation_list)
 -         if (animation.item == item)
 -         {
 -             if (animation.animation)
 -             {
 -                 animation.animation->stop();
 -                 delete animation.animation;
 -             }
 -             canvas.animation_list.takeAt(i);
 -             break;
 -         }
 -     }
 - 
 -     CanvasFadeAnimation* animation = new CanvasFadeAnimation(item, show);
 -     animation->setDuration(show ? 750 : 500);
 - 
 -     animation_dict_t animation_dict;
 -     animation_dict.animation = animation;
 -     animation_dict.item = item;
 -     canvas.animation_list.append(animation_dict);
 - 
 -     if (show)
 -     {
 -         QObject::connect(animation, SIGNAL(finished()), canvas.qobject, SLOT(AnimationIdle()));
 -     }
 -     else
 -     {
 -         if (destroy)
 -             QObject::connect(animation, SIGNAL(finished()), canvas.qobject, SLOT(AnimationDestroy()));
 -         else
 -             QObject::connect(animation, SIGNAL(finished()), canvas.qobject, SLOT(AnimationHide()));
 -     }
 - 
 -     animation->start();
 - }
 - 
 - void CanvasRemoveItemFX(QGraphicsItem* item)
 - {
 -     if (canvas.debug)
 -       qDebug("PatchCanvas::CanvasRemoveItemFX(%p)", item);
 - 
 -     switch (item->type())
 -     {
 -     case CanvasBoxType:
 -     {
 -         CanvasBox* box = (CanvasBox*)item;
 -         box->removeIconFromScene();
 -         canvas.scene->removeItem(box);
 -         delete box;
 -     }
 -     case CanvasPortType:
 -     {
 -         CanvasPort* port = (CanvasPort*)item;
 -         canvas.scene->removeItem(port);
 -         delete port;
 -     }
 -     case CanvasLineType:
 -     case CanvasBezierLineType:
 -     {
 -         AbstractCanvasLine* line = (AbstractCanvasLine*)item;
 -         line->deleteFromScene();
 -     }
 -     default:
 -         break;
 -     }
 - }
 - 
 - END_NAMESPACE_PATCHCANVAS
 
 
  |