Browse Source

Rework patchbay animation system, now full eyecandy works 100% :D

tags/1.9.7
falkTX 9 years ago
parent
commit
ec91ff364d
1 changed files with 108 additions and 111 deletions
  1. +108
    -111
      source/patchcanvas.py

+ 108
- 111
source/patchcanvas.py View File

@@ -25,7 +25,7 @@ from carla_config import *
# Imports (Global)

if config_UseQt5:
from PyQt5.QtCore import pyqtSignal, pyqtSlot, qDebug, qCritical, qFatal, qWarning, Qt, QObject
from PyQt5.QtCore import pyqtSignal, pyqtSlot, qCritical, qFatal, qWarning, Qt, QObject
from PyQt5.QtCore import QAbstractAnimation, QLineF, QPointF, QRectF, QSizeF, QSettings, QTimer
from PyQt5.QtGui import QColor, QLinearGradient, QPen, QPolygonF, QPainter, QPainterPath
from PyQt5.QtGui import QCursor, QFont, QFontMetrics
@@ -33,7 +33,7 @@ if config_UseQt5:
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem
from PyQt5.QtWidgets import QGraphicsColorizeEffect, QGraphicsDropShadowEffect, QMenu
else:
from PyQt4.QtCore import pyqtSignal, pyqtSlot, qDebug, qCritical, qFatal, qWarning, Qt, QObject
from PyQt4.QtCore import pyqtSignal, pyqtSlot, qCritical, qFatal, qWarning, Qt, QObject
from PyQt4.QtCore import QAbstractAnimation, QLineF, QPointF, QRectF, QSizeF, QSettings, QTimer
from PyQt4.QtGui import QColor, QLinearGradient, QPen, QPolygonF, QPainter, QPainterPath
from PyQt4.QtGui import QCursor, QFont, QFontMetrics
@@ -199,28 +199,29 @@ class CanvasObject(QObject):
QObject.__init__(self, parent)

@pyqtSlot()
def AnimationIdle(self):
def AnimationFinishedShow(self):
animation = self.sender()
if animation:
CanvasRemoveAnimation(animation)
animation.forceStop()
canvas.animation_list.remove(animation)

@pyqtSlot()
def AnimationHide(self):
def AnimationFinishedHide(self):
animation = self.sender()
if animation:
animation.forceStop()
canvas.animation_list.remove(animation)
item = animation.item()
if item:
item.hide()
CanvasRemoveAnimation(animation)
if item: item.hide()

@pyqtSlot()
def AnimationDestroy(self):
def AnimationFinishedDestroy(self):
animation = self.sender()
if animation:
animation.forceStop()
canvas.animation_list.remove(animation)
item = animation.item()
if item:
CanvasRemoveItemFX(item)
CanvasRemoveAnimation(animation)
if item: CanvasRemoveItemFX(item)

@pyqtSlot()
def PortContextMenuDisconnect(self):
@@ -331,7 +332,7 @@ def setFeatures(new_features):

def init(appName, scene, callback, debug=False):
if debug:
qDebug("PatchCanvas::init(\"%s\", %s, %s, %s)" % (appName, scene, callback, bool2str(debug)))
print("PatchCanvas::init(\"%s\", %s, %s, %s)" % (appName, scene, callback, bool2str(debug)))

if canvas.initiated:
qCritical("PatchCanvas::init() - already initiated")
@@ -372,7 +373,7 @@ def init(appName, scene, callback, debug=False):

def clear():
if canvas.debug:
qDebug("PatchCanvas::clear()")
print("PatchCanvas::clear()")

group_list_ids = []
port_list_ids = []
@@ -403,20 +404,31 @@ def clear():
canvas.port_list = []
canvas.connection_list = []

canvas.scene.clear()
canvas.scene.clearSelection()

animatedItems = []
for animation in canvas.animation_list:
animatedItems.append(animation.item())

for item in canvas.scene.items():
if item.type() != CanvasIconType and item not in animatedItems:
canvas.scene.removeItem(item)
del item

canvas.initiated = False

QTimer.singleShot(0, canvas.scene.update)

def setInitialPos(x, y):
if canvas.debug:
qDebug("PatchCanvas::setInitialPos(%i, %i)" % (x, y))
print("PatchCanvas::setInitialPos(%i, %i)" % (x, y))

canvas.initial_pos.setX(x)
canvas.initial_pos.setY(y)

def setCanvasSize(x, y, width, height):
if canvas.debug:
qDebug("PatchCanvas::setCanvasSize(%i, %i, %i, %i)" % (x, y, width, height))
print("PatchCanvas::setCanvasSize(%i, %i, %i, %i)" % (x, y, width, height))

canvas.size_rect.setX(x)
canvas.size_rect.setY(y)
@@ -425,7 +437,7 @@ def setCanvasSize(x, y, width, height):

def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION):
if canvas.debug:
qDebug("PatchCanvas::addGroup(%i, %s, %s, %s)" % (group_id, group_name.encode(), split2str(split), icon2str(icon)))
print("PatchCanvas::addGroup(%i, %s, %s, %s)" % (group_id, group_name.encode(), split2str(split), icon2str(icon)))

for group in canvas.group_list:
if group.group_id == group_id:
@@ -472,7 +484,7 @@ def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION):
group_sbox.setZValue(canvas.last_z_value)

if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups:
CanvasItemFX(group_sbox, True)
CanvasItemFX(group_sbox, True, False)

group_sbox.checkItemPos()

@@ -494,13 +506,13 @@ def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION):
canvas.group_list.append(group_dict)

if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups:
CanvasItemFX(group_box, True)
return CanvasItemFX(group_box, True, False)

QTimer.singleShot(0, canvas.scene.update)

def removeGroup(group_id):
if canvas.debug:
qDebug("PatchCanvas::removeGroup(%i)" % group_id)
print("PatchCanvas::removeGroup(%i)" % group_id)

for group in canvas.group_list:
if group.group_id == group_id:
@@ -543,7 +555,7 @@ def removeGroup(group_id):

def renameGroup(group_id, new_group_name):
if canvas.debug:
qDebug("PatchCanvas::renameGroup(%i, %s)" % (group_id, new_group_name.encode()))
print("PatchCanvas::renameGroup(%i, %s)" % (group_id, new_group_name.encode()))

for group in canvas.group_list:
if group.group_id == group_id:
@@ -560,7 +572,7 @@ def renameGroup(group_id, new_group_name):

def splitGroup(group_id):
if canvas.debug:
qDebug("PatchCanvas::splitGroup(%i)" % group_id)
print("PatchCanvas::splitGroup(%i)" % group_id)

item = None
group_name = ""
@@ -631,7 +643,7 @@ def splitGroup(group_id):

def joinGroup(group_id):
if canvas.debug:
qDebug("PatchCanvas::joinGroup(%i)" % group_id)
print("PatchCanvas::joinGroup(%i)" % group_id)

item = None
s_item = None
@@ -710,7 +722,7 @@ def joinGroup(group_id):

def getGroupPos(group_id, port_mode=PORT_MODE_OUTPUT):
if canvas.debug:
qDebug("PatchCanvas::getGroupPos(%i, %s)" % (group_id, port_mode2str(port_mode)))
print("PatchCanvas::getGroupPos(%i, %s)" % (group_id, port_mode2str(port_mode)))

for group in canvas.group_list:
if group.group_id == group_id:
@@ -732,7 +744,7 @@ def setGroupPos(group_id, group_pos_x, group_pos_y):

def setGroupPosFull(group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i):
if canvas.debug:
qDebug("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i)" % (group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i))
print("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i)" % (group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i))

for group in canvas.group_list:
if group.group_id == group_id:
@@ -748,7 +760,7 @@ def setGroupPosFull(group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group

def setGroupIcon(group_id, icon):
if canvas.debug:
qDebug("PatchCanvas::setGroupIcon(%i, %s)" % (group_id, icon2str(icon)))
print("PatchCanvas::setGroupIcon(%i, %s)" % (group_id, icon2str(icon)))

for group in canvas.group_list:
if group.group_id == group_id:
@@ -765,7 +777,7 @@ def setGroupIcon(group_id, icon):

def getPluginAsGroup(plugin_id):
if canvas.debug:
qDebug("PatchCanvas::getPluginAsGroup(%i)" % plugin_id)
print("PatchCanvas::getPluginAsGroup(%i)" % plugin_id)

for group in canvas.group_list:
if group.plugin_id == plugin_id:
@@ -776,7 +788,7 @@ def getPluginAsGroup(plugin_id):

def setGroupAsPlugin(group_id, plugin_id, hasUi):
if canvas.debug:
qDebug("PatchCanvas::setGroupAsPlugin(%i, %i, %s)" % (group_id, plugin_id, bool2str(hasUi)))
print("PatchCanvas::setGroupAsPlugin(%i, %i, %s)" % (group_id, plugin_id, bool2str(hasUi)))

for group in canvas.group_list:
if group.group_id == group_id:
@@ -791,7 +803,7 @@ def setGroupAsPlugin(group_id, plugin_id, hasUi):

def addPort(group_id, port_id, port_name, port_mode, port_type, is_alternate=False):
if canvas.debug:
qDebug("PatchCanvas::addPort(%i, %i, %s, %s, %s, %s)" % (group_id, port_id, port_name.encode(), port_mode2str(port_mode), port_type2str(port_type), bool2str(is_alternate)))
print("PatchCanvas::addPort(%i, %i, %s, %s, %s, %s)" % (group_id, port_id, port_name.encode(), port_mode2str(port_mode), port_type2str(port_type), bool2str(is_alternate)))

for port in canvas.port_list:
if port.group_id == group_id and port.port_id == port_id:
@@ -815,9 +827,6 @@ def addPort(group_id, port_id, port_name, port_mode, port_type, is_alternate=Fal
qCritical("PatchCanvas::addPort(%i, %i, %s, %s, %s) - Unable to find parent group" % (group_id, port_id, port_name.encode(), port_mode2str(port_mode), port_type2str(port_type)))
return

if options.eyecandy == EYECANDY_FULL:
CanvasItemFX(port_widget, True)

port_dict = port_dict_t()
port_dict.group_id = group_id
port_dict.port_id = port_id
@@ -830,20 +839,22 @@ def addPort(group_id, port_id, port_name, port_mode, port_type, is_alternate=Fal

box_widget.updatePositions()

if options.eyecandy == EYECANDY_FULL:
return CanvasItemFX(port_widget, True, False)

QTimer.singleShot(0, canvas.scene.update)

def removePort(group_id, port_id):
if canvas.debug:
qDebug("PatchCanvas::removePort(%i, %i)" % (group_id, port_id))
print("PatchCanvas::removePort(%i, %i)" % (group_id, port_id))

for port in canvas.port_list:
if port.group_id == group_id and port.port_id == port_id:
item = port.widget
item.parentItem().removePortFromGroup(port_id)
canvas.scene.removeItem(item)
del item

canvas.port_list.remove(port)
del item

QTimer.singleShot(0, canvas.scene.update)
return
@@ -852,7 +863,7 @@ def removePort(group_id, port_id):

def renamePort(group_id, port_id, new_port_name):
if canvas.debug:
qDebug("PatchCanvas::renamePort(%i, %i, %s)" % (group_id, port_id, new_port_name.encode()))
print("PatchCanvas::renamePort(%i, %i, %s)" % (group_id, port_id, new_port_name.encode()))

for port in canvas.port_list:
if port.group_id == group_id and port.port_id == port_id:
@@ -867,7 +878,7 @@ def renamePort(group_id, port_id, new_port_name):

def connectPorts(connection_id, group_out_id, port_out_id, group_in_id, port_in_id):
if canvas.debug:
qDebug("PatchCanvas::connectPorts(%i, %i, %i, %i, %i)" % (connection_id, group_out_id, port_out_id, group_in_id, port_in_id))
print("PatchCanvas::connectPorts(%i, %i, %i, %i, %i)" % (connection_id, group_out_id, port_out_id, group_in_id, port_in_id))

port_out = None
port_in = None
@@ -915,13 +926,13 @@ def connectPorts(connection_id, group_out_id, port_out_id, group_in_id, port_in_

if options.eyecandy == EYECANDY_FULL:
item = connection_dict.widget
CanvasItemFX(item, True)
return CanvasItemFX(item, True, False)

QTimer.singleShot(0, canvas.scene.update)

def disconnectPorts(connection_id):
if canvas.debug:
qDebug("PatchCanvas::disconnectPorts(%i)" % connection_id)
print("PatchCanvas::disconnectPorts(%i)" % connection_id)

line = None
item1 = None
@@ -965,19 +976,20 @@ def disconnectPorts(connection_id):
item2.parentItem().removeLineFromGroup(connection_id)

if options.eyecandy == EYECANDY_FULL:
CanvasItemFX(line, False, True)
else:
line.deleteFromScene()
return CanvasItemFX(line, False, True)

canvas.scene.removeItem(line)
del line

QTimer.singleShot(0, canvas.scene.update)

def arrange():
if canvas.debug:
qDebug("PatchCanvas::arrange()")
print("PatchCanvas::arrange()")

def updateZValues():
if canvas.debug:
qDebug("PatchCanvas::updateZValues()")
print("PatchCanvas::updateZValues()")

for group in canvas.group_list:
group.widgets[0].resetLinesZValue()
@@ -987,7 +999,7 @@ def updateZValues():

def handlePluginRemoved(plugin_id):
if canvas.debug:
qDebug("PatchCanvas::handlePluginRemoved(%i)" % plugin_id)
print("PatchCanvas::handlePluginRemoved(%i)" % plugin_id)

for group in canvas.group_list:
if group.plugin_id < plugin_id:
@@ -1001,7 +1013,7 @@ def handlePluginRemoved(plugin_id):

def handleAllPluginsRemoved():
if canvas.debug:
qDebug("PatchCanvas::handleAllPluginsRemoved()")
print("PatchCanvas::handleAllPluginsRemoved()")

for group in canvas.group_list:
group.plugin_id -= 1
@@ -1014,7 +1026,7 @@ def handleAllPluginsRemoved():

def CanvasGetNewGroupPos(horizontal):
if canvas.debug:
qDebug("PatchCanvas::CanvasGetNewGroupPos(%s)" % bool2str(horizontal))
print("PatchCanvas::CanvasGetNewGroupPos(%s)" % bool2str(horizontal))

new_pos = QPointF(canvas.initial_pos.x(), canvas.initial_pos.y())
items = canvas.scene.items()
@@ -1040,7 +1052,7 @@ def CanvasGetNewGroupPos(horizontal):

def CanvasGetFullPortName(group_id, port_id):
if canvas.debug:
qDebug("PatchCanvas::CanvasGetFullPortName(%i, %i)" % (group_id, port_id))
print("PatchCanvas::CanvasGetFullPortName(%i, %i)" % (group_id, port_id))

for port in canvas.port_list:
if port.group_id == group_id and port.port_id == port_id:
@@ -1055,7 +1067,7 @@ def CanvasGetFullPortName(group_id, port_id):

def CanvasGetPortConnectionList(group_id, port_id):
if canvas.debug:
qDebug("PatchCanvas::CanvasGetPortConnectionList(%i, %i)" % (group_id, port_id))
print("PatchCanvas::CanvasGetPortConnectionList(%i, %i)" % (group_id, port_id))

conn_list = []

@@ -1067,69 +1079,50 @@ def CanvasGetPortConnectionList(group_id, port_id):

return conn_list

def CanvasRemoveAnimation(f_animation):
if canvas.debug:
qDebug("PatchCanvas::CanvasRemoveAnimation(%s)" % f_animation)

for animation in canvas.animation_list:
if animation.animation == f_animation:
canvas.animation_list.remove(animation)
del animation.animation
break

def CanvasCallback(action, value1, value2, value_str):
if canvas.debug:
qDebug("PatchCanvas::CanvasCallback(%i, %i, %i, %s)" % (action, value1, value2, value_str.encode()))
print("PatchCanvas::CanvasCallback(%i, %i, %i, %s)" % (action, value1, value2, value_str.encode()))

canvas.callback(action, value1, value2, value_str)

def CanvasItemFX(item, show, destroy=False):
def CanvasItemFX(item, show, destroy):
if canvas.debug:
qDebug("PatchCanvas::CanvasItemFX(%s, %s, %s)" % (item, bool2str(show), bool2str(destroy)))
print("PatchCanvas::CanvasItemFX(%s, %s, %s)" % (item, bool2str(show), bool2str(destroy)))

# Check if item already has an animationItemFX
# Check if the item already has an animation
for animation in canvas.animation_list:
if animation.item == item:
animation.animation.stop()
if animation.item() == item:
animation.forceStop()
canvas.animation_list.remove(animation)
del animation.animation
del animation
break

animation = CanvasFadeAnimation(item, show)
animation.setDuration(750 if show else 500)

animation_dict = animation_dict_t()
animation_dict.animation = animation
animation_dict.item = item
canvas.animation_list.append(animation_dict)

if show:
animation.finished.connect(canvas.qobject.AnimationIdle)
animation.finished.connect(canvas.qobject.AnimationFinishedShow)
else:
if destroy:
animation.finished.connect(canvas.qobject.AnimationDestroy)
animation.finished.connect(canvas.qobject.AnimationFinishedDestroy)
else:
animation.finished.connect(canvas.qobject.AnimationHide)
animation.finished.connect(canvas.qobject.AnimationFinishedHide)

canvas.animation_list.append(animation)

animation.start()

def CanvasRemoveItemFX(item):
if canvas.debug:
qDebug("PatchCanvas::CanvasRemoveItemFX(%s)" % item)
print("PatchCanvas::CanvasRemoveItemFX(%s)" % item)

if item.type() == CanvasBoxType:
item.removeIconFromScene()
canvas.scene.removeItem(item)

elif item.type() == CanvasPortType:
canvas.scene.removeItem(item)

elif item.type() in (CanvasLineType, CanvasBezierLineType):
pass #item.deleteFromScene()
canvas.scene.removeItem(item)
del item

# Force deletion of item if needed
if item.type() in (CanvasBoxType, CanvasPortType):
del item
QTimer.singleShot(0, canvas.scene.update)

# ------------------------------------------------------------------------------
# patchscene.cpp
@@ -1367,12 +1360,15 @@ class PatchScene(QGraphicsScene):

QGraphicsScene.wheelEvent(self, event)

#def contextMenuEvent(self, event):
#print("context menu event")

# ------------------------------------------------------------------------------
# canvasfadeanimation.cpp

class CanvasFadeAnimation(QAbstractAnimation):
def __init__(self, item, show, parent=None):
QAbstractAnimation.__init__(self, parent)
def __init__(self, item, show):
QAbstractAnimation.__init__(self)

self.m_show = show
self.m_duration = 0
@@ -1381,6 +1377,10 @@ class CanvasFadeAnimation(QAbstractAnimation):
def item(self):
return self.m_item

def forceStop(self):
self.blockSignals(True)
self.stop()

def setDuration(self, time):
if self.m_item.opacity() == 0 and not self.m_show:
self._duration = 0
@@ -1400,7 +1400,13 @@ class CanvasFadeAnimation(QAbstractAnimation):
else:
value = 1.0 - (float(time) / self.m_duration)

self.m_item.setOpacity(value)
try:
self.m_item.setOpacity(value)
except:
print("Error: failed to animate canvas item, already destroyed?")
self.forceStop()
canvas.animation_list.remove(self)
return

if self.m_item.type() == CanvasBoxType:
self.m_item.setShadowOpacity(value)
@@ -1427,10 +1433,6 @@ class CanvasLine(QGraphicsLineItem):
self.setGraphicsEffect(None)
self.updateLinePos()

def deleteFromScene(self):
canvas.scene.removeItem(self)
del self

def isLocked(self):
return self.m_locked

@@ -1524,10 +1526,6 @@ class CanvasBezierLine(QGraphicsPathItem):
self.setGraphicsEffect(None)
self.updateLinePos()

def deleteFromScene(self):
canvas.scene.removeItem(self)
del self

def isLocked(self):
return self.m_locked

@@ -1643,10 +1641,6 @@ class CanvasLineMov(QGraphicsLineItem):

self.setPen(pen)

def deleteFromScene(self):
canvas.scene.removeItem(self)
del self

def updateLinePos(self, scenePos):
item_pos = [0, 0]

@@ -1701,10 +1695,6 @@ class CanvasBezierLineMov(QGraphicsPathItem):
self.setBrush(QColor(0, 0, 0, 0))
self.setPen(pen)

def deleteFromScene(self):
canvas.scene.removeItem(self)
del self

def updateLinePos(self, scenePos):
if self.m_port_mode == PORT_MODE_INPUT:
old_x = 0
@@ -1886,9 +1876,11 @@ class CanvasPort(QGraphicsItem):

def mouseReleaseEvent(self, event):
if self.m_mouse_down:
if self.m_line_mov:
self.m_line_mov.deleteFromScene()
if self.m_line_mov is not None:
item = self.m_line_mov
self.m_line_mov = None
canvas.scene.removeItem(item)
del item

for connection in canvas.connection_list:
if ((connection.group_out_id == self.m_group_id and connection.port_out_id == self.m_port_id) or
@@ -2197,7 +2189,7 @@ class CanvasBox(QGraphicsItem):
self.m_plugin_ui = hasUi

def setIcon(self, icon):
if self.icon_svg:
if self.icon_svg is not None:
self.icon_svg.setIcon(icon, self.m_group_name)

def setSplit(self, split, mode=PORT_MODE_NULL):
@@ -2216,7 +2208,7 @@ class CanvasBox(QGraphicsItem):
if len(self.m_port_list_ids) == 0:
if options.auto_hide_groups:
if options.eyecandy == EYECANDY_FULL:
CanvasItemFX(self, True)
CanvasItemFX(self, True, False)
self.setVisible(True)

new_widget = CanvasPort(self.m_group_id, port_id, port_name, port_mode, port_type, is_alternate, self)
@@ -2247,7 +2239,7 @@ class CanvasBox(QGraphicsItem):
elif self.isVisible():
if options.auto_hide_groups:
if options.eyecandy == EYECANDY_FULL:
CanvasItemFX(self, False)
CanvasItemFX(self, False, False)
else:
self.setVisible(False)

@@ -2280,8 +2272,13 @@ class CanvasBox(QGraphicsItem):
self.setPos(pos.x(), canvas.size_rect.height() - self.p_height)

def removeIconFromScene(self):
if self.icon_svg:
canvas.scene.removeItem(self.icon_svg)
if self.icon_svg is None:
return

item = self.icon_svg
self.icon_svg = None
canvas.scene.removeItem(item)
del item

def updatePositions(self):
self.prepareGeometryChange()


Loading…
Cancel
Save