/* * Patchbay Canvas engine using QGraphicsView/Scene * Copyright (C) 2010-2012 Filipe Coelho * * 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 "canvasbezierlinemov.h" #include #include "canvasport.h" START_NAMESPACE_PATCHCANVAS CanvasBezierLineMov::CanvasBezierLineMov(PortMode port_mode, PortType port_type, QGraphicsItem* parent) : QGraphicsPathItem(parent, canvas.scene) { m_port_mode = port_mode; m_port_type = port_type; // Port position doesn't change while moving around line p_itemX = scenePos().x(); p_itemY = scenePos().y(); p_width = ((CanvasPort*)parentItem())->getPortWidth(); QPen pen; if (port_type == PORT_TYPE_AUDIO_JACK) pen = QPen(canvas.theme->line_audio_jack, 2); else if (port_type == PORT_TYPE_MIDI_JACK) pen = QPen(canvas.theme->line_midi_jack, 2); else if (port_type == PORT_TYPE_MIDI_A2J) pen = QPen(canvas.theme->line_midi_a2j, 2); else if (port_type == PORT_TYPE_MIDI_ALSA) pen = QPen(canvas.theme->line_midi_alsa, 2); else { qWarning("PatchCanvas::CanvasBezierLineMov(%s, %s, %p) - invalid port type", port_mode2str(port_mode), port_type2str(port_type), parent); pen = QPen(Qt::black); } QColor color(0,0,0,0); setBrush(color); setPen(pen); } void CanvasBezierLineMov::deleteFromScene() { canvas.scene->removeItem(this); delete this; } void CanvasBezierLineMov::updateLinePos(QPointF scenePos) { int old_x, old_y, mid_x, new_x, final_x, final_y; if (m_port_mode == PORT_MODE_INPUT) { old_x = 0; old_y = 7.5; mid_x = abs(scenePos.x()-p_itemX)/2; new_x = old_x-mid_x; } else if (m_port_mode == PORT_MODE_OUTPUT) { old_x = p_width+12; old_y = 7.5; mid_x = abs(scenePos.x()-(p_itemX+old_x))/2; new_x = old_x+mid_x; } else return; final_x = scenePos.x()-p_itemX; final_y = scenePos.y()-p_itemY; QPainterPath path(QPointF(old_x, old_y)); path.cubicTo(new_x, old_y, new_x, final_y, final_x, final_y); setPath(path); } int CanvasBezierLineMov::type() const { return CanvasBezierLineMovType; } void CanvasBezierLineMov::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { painter->setRenderHint(QPainter::Antialiasing, bool(options.antialiasing)); QGraphicsPathItem::paint(painter, option, widget); } END_NAMESPACE_PATCHCANVAS