|
- /*
- * 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 "canvasport.h"
-
- #include <QtCore/QTimer>
- #include <QtGui/QCursor>
- #include <QtGui/QGraphicsSceneContextMenuEvent>
- #include <QtGui/QGraphicsSceneMouseEvent>
- #include <QtGui/QInputDialog>
- #include <QtGui/QMenu>
- #include <QtGui/QPainter>
-
- #include "canvaslinemov.h"
- #include "canvasbezierlinemov.h"
- #include "canvasbox.h"
-
- START_NAMESPACE_PATCHCANVAS
-
- CanvasPort::CanvasPort(int port_id, QString port_name, PortMode port_mode, PortType port_type, QGraphicsItem* parent) :
- QGraphicsItem(parent, canvas.scene)
- {
- // Save Variables, useful for later
- m_port_id = port_id;
- m_port_mode = port_mode;
- m_port_type = port_type;
- m_port_name = port_name;
-
- // Base Variables
- m_port_width = 15;
- m_port_height = 15;
- m_port_font = QFont(canvas.theme->port_font_name, canvas.theme->port_font_size, canvas.theme->port_font_state);
-
- m_line_mov = 0;
- m_hover_item = 0;
- m_last_selected_state = false;
-
- m_mouse_down = false;
- m_cursor_moving = false;
-
- setFlags(QGraphicsItem::ItemIsSelectable);
- }
-
- int CanvasPort::getPortId()
- {
- return m_port_id;
- }
-
- PortMode CanvasPort::getPortMode()
- {
- return m_port_mode;
- }
-
- PortType CanvasPort::getPortType()
- {
- return m_port_type;
- }
-
- QString CanvasPort::getPortName()
- {
- return m_port_name;
- }
-
- QString CanvasPort::getFullPortName()
- {
- return ((CanvasBox*)parentItem())->getGroupName()+":"+m_port_name;
- }
-
- int CanvasPort::getPortWidth()
- {
- return m_port_width;
- }
-
- int CanvasPort::getPortHeight()
- {
- return m_port_height;
- }
-
- void CanvasPort::setPortMode(PortMode port_mode)
- {
- m_port_mode = port_mode;
- update();
- }
-
- void CanvasPort::setPortType(PortType port_type)
- {
- m_port_type = port_type;
- update();
- }
-
- void CanvasPort::setPortName(QString port_name)
- {
- if (QFontMetrics(m_port_font).width(port_name) < QFontMetrics(m_port_font).width(m_port_name))
- QTimer::singleShot(0, canvas.scene, SLOT(update()));
-
- m_port_name = port_name;
- update();
- }
-
- void CanvasPort::setPortWidth(int port_width)
- {
- if (port_width < m_port_width)
- QTimer::singleShot(0, canvas.scene, SLOT(update()));
-
- m_port_width = port_width;
- update();
- }
-
- int CanvasPort::type() const
- {
- return CanvasPortType;
- }
-
- void CanvasPort::mousePressEvent(QGraphicsSceneMouseEvent* event)
- {
- m_hover_item = 0;
- m_mouse_down = (event->button() == Qt::LeftButton);
- m_cursor_moving = false;
- QGraphicsItem::mousePressEvent(event);
- }
-
- void CanvasPort::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
- {
- if (m_mouse_down)
- {
- if (m_cursor_moving == false)
- {
- setCursor(QCursor(Qt::CrossCursor));
- m_cursor_moving = true;
-
- foreach (const connection_dict_t& connection, canvas.connection_list)
- {
- if (connection.port_out_id == m_port_id || connection.port_in_id == m_port_id)
- connection.widget->setLocked(true);
- }
- }
-
- if (! m_line_mov)
- {
- if (options.use_bezier_lines)
- m_line_mov = new CanvasBezierLineMov(m_port_mode, m_port_type, this);
- else
- m_line_mov = new CanvasLineMov(m_port_mode, m_port_type, this);
-
- canvas.last_z_value += 1;
- m_line_mov->setZValue(canvas.last_z_value);
- canvas.last_z_value += 1;
- parentItem()->setZValue(canvas.last_z_value);
- }
-
- CanvasPort* item = 0;
- QList<QGraphicsItem*> items = canvas.scene->items(event->scenePos(), Qt::ContainsItemShape, Qt::AscendingOrder);
- for (int i=0; i < items.count(); i++)
- {
- if (items[i]->type() == CanvasPortType)
- {
- if (items[i] != this)
- {
- if (! item)
- item = (CanvasPort*)items[i];
- else if (items[i]->parentItem()->zValue() > item->parentItem()->zValue())
- item = (CanvasPort*)items[i];
- }
- }
- }
-
- if (m_hover_item and m_hover_item != item)
- m_hover_item->setSelected(false);
-
- if (item)
- {
- bool a2j_connection = (item->getPortType() == PORT_TYPE_MIDI_JACK && m_port_type == PORT_TYPE_MIDI_A2J) || (item->getPortType() == PORT_TYPE_MIDI_A2J && m_port_type == PORT_TYPE_MIDI_JACK);
- if (item->getPortMode() != m_port_mode && (item->getPortType() == m_port_type || a2j_connection))
- {
- item->setSelected(true);
- m_hover_item = item;
- }
- else
- m_hover_item = 0;
- }
- else
- m_hover_item = 0;
-
- m_line_mov->updateLinePos(event->scenePos());
- return event->accept();
- }
-
- QGraphicsItem::mouseMoveEvent(event);
- }
-
- void CanvasPort::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
- {
- if (m_mouse_down)
- {
- if (m_line_mov)
- {
- m_line_mov->deleteFromScene();
- m_line_mov = 0;
- }
-
- foreach (const connection_dict_t& connection, canvas.connection_list)
- {
- if (connection.port_out_id == m_port_id || connection.port_in_id == m_port_id)
- connection.widget->setLocked(false);
- }
-
- if (m_hover_item)
- {
- bool check = false;
- foreach (const connection_dict_t& connection, canvas.connection_list)
- {
- if ( (connection.port_out_id == m_port_id && connection.port_in_id == m_hover_item->getPortId()) ||
- (connection.port_out_id == m_hover_item->getPortId() && connection.port_in_id == m_port_id) )
- {
- canvas.callback(ACTION_PORTS_DISCONNECT, connection.connection_id, 0, "");
- check = true;
- break;
- }
- }
-
- if (check == false)
- {
- if (m_port_mode == PORT_MODE_OUTPUT)
- canvas.callback(ACTION_PORTS_CONNECT, m_port_id, m_hover_item->getPortId(), "");
- else
- canvas.callback(ACTION_PORTS_CONNECT, m_hover_item->getPortId(), m_port_id, "");
- }
-
- canvas.scene->clearSelection();
- }
- }
-
- if (m_cursor_moving)
- setCursor(QCursor(Qt::ArrowCursor));
-
- m_hover_item = 0;
- m_mouse_down = false;
- m_cursor_moving = false;
- QGraphicsItem::mouseReleaseEvent(event);
- }
-
- void CanvasPort::contextMenuEvent(QGraphicsSceneContextMenuEvent* event)
- {
- canvas.scene->clearSelection();
- setSelected(true);
-
- QMenu menu;
- QMenu discMenu("Disconnect", &menu);
-
- QList<int> port_con_list = CanvasGetPortConnectionList(m_port_id);
-
- if (port_con_list.count() > 0)
- {
- foreach (int port_id, port_con_list)
- {
- int port_con_id = CanvasGetConnectedPort(port_id, m_port_id);
- QAction* act_x_disc = discMenu.addAction(CanvasGetFullPortName(port_con_id));
- act_x_disc->setData(port_id);
- QObject::connect(act_x_disc, SIGNAL(triggered()), canvas.qobject, SLOT(PortContextMenuDisconnect()));
- }
- }
- else
- {
- QAction* act_x_disc = discMenu.addAction("No connections");
- act_x_disc->setEnabled(false);
- }
-
- menu.addMenu(&discMenu);
- QAction* act_x_disc_all = menu.addAction("Disconnect &All");
- QAction* act_x_sep_1 = menu.addSeparator();
- QAction* act_x_info = menu.addAction("Get &Info");
- QAction* act_x_rename = menu.addAction("&Rename");
-
- if (features.port_info == false)
- act_x_info->setVisible(false);
-
- if (features.port_rename == false)
- act_x_rename->setVisible(false);
-
- if (features.port_info == false && features.port_rename == false)
- act_x_sep_1->setVisible(false);
-
- QAction* act_selected = menu.exec(event->screenPos());
-
- if (act_selected == act_x_disc_all)
- {
- foreach (int port_id, port_con_list)
- canvas.callback(ACTION_PORTS_DISCONNECT, port_id, 0, "");
- }
- else if (act_selected == act_x_info)
- {
- canvas.callback(ACTION_PORT_INFO, m_port_id, 0, "");
- }
- else if (act_selected == act_x_rename)
- {
- bool ok_check;
- QString new_name = QInputDialog::getText(0, "Rename Port", "New name:", QLineEdit::Normal, m_port_name, &ok_check);
- if (ok_check and new_name.isEmpty() == false)
- {
- canvas.callback(ACTION_PORT_RENAME, m_port_id, 0, new_name);
- }
- }
-
- event->accept();
- }
-
- QRectF CanvasPort::boundingRect() const
- {
- return QRectF(0, 0, m_port_width+12, m_port_height);
- }
-
- void CanvasPort::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
- {
- painter->setRenderHint(QPainter::Antialiasing, (options.antialiasing == ANTIALIASING_FULL));
-
- QPointF text_pos;
- int poly_locx[5] = { 0 };
-
- if (m_port_mode == PORT_MODE_INPUT)
- {
- text_pos = QPointF(3, 12);
-
- if (canvas.theme->port_mode == Theme::THEME_PORT_POLYGON)
- {
- poly_locx[0] = 0;
- poly_locx[1] = m_port_width+5;
- poly_locx[2] = m_port_width+12;
- poly_locx[3] = m_port_width+5;
- poly_locx[4] = 0;
- }
- else if (canvas.theme->port_mode == Theme::THEME_PORT_SQUARE)
- {
- poly_locx[0] = 0;
- poly_locx[1] = m_port_width+5;
- poly_locx[2] = m_port_width+5;
- poly_locx[3] = m_port_width+5;
- poly_locx[4] = 0;
- }
- else
- {
- qCritical("PatchCanvas::CanvasPort->paint() - invalid theme port mode '%i'", canvas.theme->port_mode);
- return;
- }
- }
- else if (m_port_mode == PORT_MODE_OUTPUT)
- {
- text_pos = QPointF(9, 12);
-
- if (canvas.theme->port_mode == Theme::THEME_PORT_POLYGON)
- {
- poly_locx[0] = m_port_width+12;
- poly_locx[1] = 7;
- poly_locx[2] = 0;
- poly_locx[3] = 7;
- poly_locx[4] = m_port_width+12;
- }
- else if (canvas.theme->port_mode == Theme::THEME_PORT_SQUARE)
- {
- poly_locx[0] = m_port_width+12;
- poly_locx[1] = 5;
- poly_locx[2] = 5;
- poly_locx[3] = 5;
- poly_locx[4] = m_port_width+12;
- }
- else
- {
- qCritical("PatchCanvas::CanvasPort->paint() - invalid theme port mode '%i'", canvas.theme->port_mode);
- return;
- }
- }
- else
- {
- qCritical("PatchCanvas::CanvasPort->paint() - invalid port mode '%s'", port_mode2str(m_port_mode));
- return;
- }
-
- QColor poly_color;
- QPen poly_pen;
-
- if (m_port_type == PORT_TYPE_AUDIO_JACK)
- {
- poly_color = isSelected() ? canvas.theme->port_audio_jack_bg_sel : canvas.theme->port_audio_jack_bg;
- poly_pen = isSelected() ? canvas.theme->port_audio_jack_pen_sel : canvas.theme->port_audio_jack_pen;
- }
- else if (m_port_type == PORT_TYPE_MIDI_JACK)
- {
- poly_color = isSelected() ? canvas.theme->port_midi_jack_bg_sel : canvas.theme->port_midi_jack_bg;
- poly_pen = isSelected() ? canvas.theme->port_midi_jack_pen_sel : canvas.theme->port_midi_jack_pen;
- }
- else if (m_port_type == PORT_TYPE_MIDI_A2J)
- {
- poly_color = isSelected() ? canvas.theme->port_midi_a2j_bg_sel : canvas.theme->port_midi_a2j_bg;
- poly_pen = isSelected() ? canvas.theme->port_midi_a2j_pen_sel : canvas.theme->port_midi_a2j_pen;
- }
- else if (m_port_type == PORT_TYPE_MIDI_ALSA)
- {
- poly_color = isSelected() ? canvas.theme->port_midi_alsa_bg_sel : canvas.theme->port_midi_alsa_bg;
- poly_pen = isSelected() ? canvas.theme->port_midi_alsa_pen_sel : canvas.theme->port_midi_alsa_pen;
- }
- else
- {
- qCritical("PatchCanvas::CanvasPort->paint() - invalid port type '%s'", port_type2str(m_port_type));
- return;
- }
-
- QPolygonF polygon;
- polygon += QPointF(poly_locx[0], 0);
- polygon += QPointF(poly_locx[1], 0);
- polygon += QPointF(poly_locx[2], 7.5);
- polygon += QPointF(poly_locx[3], 15);
- polygon += QPointF(poly_locx[4], 15);
-
- painter->setBrush(poly_color);
- painter->setPen(poly_pen);
- painter->drawPolygon(polygon);
-
- painter->setPen(canvas.theme->port_text);
- painter->setFont(m_port_font);
- painter->drawText(text_pos, m_port_name);
-
- if (isSelected() != m_last_selected_state)
- {
- foreach (const connection_dict_t& connection, canvas.connection_list)
- {
- if (connection.port_out_id == m_port_id || connection.port_in_id == m_port_id)
- connection.widget->setLineSelected(isSelected());
- }
- }
-
- m_last_selected_state = isSelected();
- }
-
- END_NAMESPACE_PATCHCANVAS
|