diff --git a/src/catarina.py b/src/catarina.py index 343681d..74395ae 100755 --- a/src/catarina.py +++ b/src/catarina.py @@ -799,7 +799,7 @@ class CatarinaMainW(QMainWindow, ui_catarina.Ui_CatarinaMainW): patchcanvas.addGroup(group[iGroupId], group[iGroupName], patchcanvas.SPLIT_YES if (group[iGroupSplit]) else patchcanvas.SPLIT_NO, group[iGroupIcon]) for group_pos in self.m_group_list_pos: - patchcanvas.setGroupPos(group_pos[iGroupPosId], group_pos[iGroupPosX_o], group_pos[iGroupPosY_o], group_pos[iGroupPosX_i], group_pos[iGroupPosY_i]) + patchcanvas.setGroupPosFull(group_pos[iGroupPosId], group_pos[iGroupPosX_o], group_pos[iGroupPosY_o], group_pos[iGroupPosX_i], group_pos[iGroupPosY_i]) for port in self.m_port_list: patchcanvas.addPort(port[iPortGroup], port[iPortId], port[iPortName], port[iPortMode], port[iPortType]) diff --git a/src/claudia.py b/src/claudia.py index 9f04194..5772484 100755 --- a/src/claudia.py +++ b/src/claudia.py @@ -1149,7 +1149,7 @@ class ClaudiaMainW(QMainWindow, ui_claudia.Ui_ClaudiaMainW): if x != None and y != None: if x2 is None: x2 = "%f" % (float(x) + 50) if y2 is None: y2 = "%f" % (float(y) + 50) - patchcanvas.setGroupPos(group_id, float(x), float(y), float(x2), float(y2)) + patchcanvas.setGroupPosFull(group_id, float(x), float(y), float(x2), float(y2)) QTimer.singleShot(0, self.miniCanvasPreview, SLOT("update()")) diff --git a/src/icons/bitmaps/canvas/frame_node_header.png b/src/icons/bitmaps/canvas/frame_node_header.png new file mode 100644 index 0000000..4bf749a Binary files /dev/null and b/src/icons/bitmaps/canvas/frame_node_header.png differ diff --git a/src/icons/bitmaps/canvas/frame_port_bg.png b/src/icons/bitmaps/canvas/frame_port_bg.png new file mode 100644 index 0000000..2e78d8c Binary files /dev/null and b/src/icons/bitmaps/canvas/frame_port_bg.png differ diff --git a/src/icons/icons.qrc b/src/icons/icons.qrc index 93bc247..ebfa4f7 100644 --- a/src/icons/icons.qrc +++ b/src/icons/icons.qrc @@ -93,6 +93,8 @@ bitmaps/led-big_off.png bitmaps/carla_about.png bitmaps/carla_knobs1.png + bitmaps/canvas/frame_node_header.png + bitmaps/canvas/frame_port_bg.png bitmaps/textures/metal_1-512px.jpg bitmaps/textures/metal_2-512px.jpg bitmaps/textures/metal_3-512px.jpg diff --git a/src/patchcanvas.py b/src/patchcanvas.py index 2968d6c..8356c3e 100644 --- a/src/patchcanvas.py +++ b/src/patchcanvas.py @@ -20,7 +20,7 @@ # Imports (Global) from PyQt4.QtCore import pyqtSlot, qDebug, qCritical, qFatal, qWarning, Qt, QObject, SIGNAL, SLOT -from PyQt4.QtCore import QAbstractAnimation, QLineF, QPointF, QRectF, QSettings, QTimer +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, QInputDialog, QLineEdit, QMenu from PyQt4.QtGui import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem @@ -430,7 +430,7 @@ def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION): canvas.last_z_value += 1 group_sbox.setZValue(canvas.last_z_value) - if options.auto_hide_groups == False and options.eyecandy == EYECANDY_FULL: + if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups: CanvasItemFX(group_sbox, True) else: @@ -448,7 +448,7 @@ def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION): canvas.group_list.append(group_dict) - if options.auto_hide_groups == False and options.eyecandy == EYECANDY_FULL: + if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups: CanvasItemFX(group_box, True) QTimer.singleShot(0, canvas.scene, SLOT("update()")) @@ -677,9 +677,9 @@ def getGroupPos(group_id, port_mode=PORT_MODE_OUTPUT): return QPointF(0, 0) def setGroupPos(group_id, group_pos_x, group_pos_y): - setGroupPos(group_id, group_pos_x, group_pos_y, group_pos_x, group_pos_y) + setGroupPosFull(group_id, group_pos_x, group_pos_y, group_pos_x, group_pos_y) -def setGroupPos(group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i): +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)) @@ -1049,15 +1049,17 @@ def CanvasRemoveItemFX(item): if item.type() == CanvasBoxType: item.removeIconFromScene() canvas.scene.removeItem(item) - del item - elif item.type() == CanvasBoxType: + elif item.type() == CanvasPortType: canvas.scene.removeItem(item) - del item elif item.type() in (CanvasLineType, CanvasBezierLineType): item.deleteFromScene() + # Force deletion of item if needed + if item.type() in (CanvasBoxType, CanvasPortType): + del item + # ------------------------------------------------------------------------------ # patchscene.cpp @@ -1267,7 +1269,7 @@ class CanvasFadeAnimation(QAbstractAnimation): return self.m_item def setDuration(self, time): - if self.m_show == False and self.m_item.opacity() == 0: + if self.m_item.opacity() == 0 and not self.m_show: self._duration = 0 else: self.m_item.show() @@ -1340,7 +1342,10 @@ class CanvasLine(QGraphicsLineItem): def updateLinePos(self): if self.item1.getPortMode() == PORT_MODE_OUTPUT: - line = QLineF(self.item1.scenePos().x() + self.item1.getPortWidth() + 12, self.item1.scenePos().y() + 7.5, self.item2.scenePos().x(), self.item2.scenePos().y() + 7.5) + line = QLineF(self.item1.scenePos().x() + self.item1.getPortWidth() + 12, + self.item1.scenePos().y() + float(canvas.theme.port_height)/2, + self.item2.scenePos().x(), + self.item2.scenePos().y() + float(canvas.theme.port_height)/2) self.setLine(line) self.m_lineSelected = False @@ -1433,10 +1438,10 @@ class CanvasBezierLine(QGraphicsPathItem): def updateLinePos(self): if self.item1.getPortMode() == PORT_MODE_OUTPUT: item1_x = self.item1.scenePos().x() + self.item1.getPortWidth() + 12 - item1_y = self.item1.scenePos().y() + 7.5 + item1_y = self.item1.scenePos().y() + float(canvas.theme.port_height)/2 item2_x = self.item2.scenePos().x() - item2_y = self.item2.scenePos().y() + 7.5 + item2_y = self.item2.scenePos().y() + float(canvas.theme.port_height)/2 item1_mid_x = abs(item1_x - item2_x) / 2 item1_new_x = item1_x + item1_mid_x @@ -1530,10 +1535,10 @@ class CanvasLineMov(QGraphicsLineItem): if self.m_port_mode == PORT_MODE_INPUT: item_pos[0] = 0 - item_pos[1] = 7.5 + item_pos[1] = float(canvas.theme.port_height)/2 elif self.m_port_mode == PORT_MODE_OUTPUT: item_pos[0] = self.p_width + 12 - item_pos[1] = 7.5 + item_pos[1] = float(canvas.theme.port_height)/2 else: return @@ -1584,12 +1589,12 @@ class CanvasBezierLineMov(QGraphicsPathItem): def updateLinePos(self, scenePos): if self.m_port_mode == PORT_MODE_INPUT: old_x = 0 - old_y = 7.5 + old_y = float(canvas.theme.port_height)/2 mid_x = abs(scenePos.x() - self.p_itemX) / 2 new_x = old_x - mid_x elif self.m_port_mode == PORT_MODE_OUTPUT: old_x = self.p_width + 12 - old_y = 7.5 + old_y = float(canvas.theme.port_height)/2 mid_x = abs(scenePos.x() - (self.p_itemX + old_x)) / 2 new_x = old_x + mid_x else: @@ -1623,8 +1628,8 @@ class CanvasPort(QGraphicsItem): self.m_port_name = port_name # Base Variables - self.m_port_width = 15 - self.m_port_height = 15 + self.m_port_width = 15 + self.m_port_height = canvas.theme.port_height self.m_port_font = QFont(canvas.theme.port_font_name, canvas.theme.port_font_size, canvas.theme.port_font_state) self.m_line_mov = None @@ -1833,7 +1838,7 @@ class CanvasPort(QGraphicsItem): poly_locx = [0, 0, 0, 0, 0] if self.m_port_mode == PORT_MODE_INPUT: - text_pos = QPointF(3, 12) + text_pos = QPointF(3, canvas.theme.port_text_ypos) if canvas.theme.port_mode == Theme.THEME_PORT_POLYGON: poly_locx[0] = 0 @@ -1852,7 +1857,7 @@ class CanvasPort(QGraphicsItem): return elif self.m_port_mode == PORT_MODE_OUTPUT: - text_pos = QPointF(9, 12) + text_pos = QPointF(9, canvas.theme.port_text_ypos) if canvas.theme.port_mode == Theme.THEME_PORT_POLYGON: poly_locx[0] = self.m_port_width + 12 @@ -1876,16 +1881,24 @@ class CanvasPort(QGraphicsItem): if self.m_port_type == PORT_TYPE_AUDIO_JACK: poly_color = canvas.theme.port_audio_jack_bg_sel if self.isSelected() else canvas.theme.port_audio_jack_bg - poly_pen = canvas.theme.port_audio_jack_pen_sel if self.isSelected() else canvas.theme.port_audio_jack_pen + poly_pen = canvas.theme.port_audio_jack_pen_sel if self.isSelected() else canvas.theme.port_audio_jack_pen + text_pen = canvas.theme.port_audio_jack_text_sel if self.isSelected() else canvas.theme.port_audio_jack_text + conn_pen = canvas.theme.port_audio_jack_pen_sel elif self.m_port_type == PORT_TYPE_MIDI_JACK: poly_color = canvas.theme.port_midi_jack_bg_sel if self.isSelected() else canvas.theme.port_midi_jack_bg - poly_pen = canvas.theme.port_midi_jack_pen_sel if self.isSelected() else canvas.theme.port_midi_jack_pen + poly_pen = canvas.theme.port_midi_jack_pen_sel if self.isSelected() else canvas.theme.port_midi_jack_pen + text_pen = canvas.theme.port_midi_jack_text_sel if self.isSelected() else canvas.theme.port_midi_jack_text + conn_pen = canvas.theme.port_midi_jack_pen_sel elif self.m_port_type == PORT_TYPE_MIDI_A2J: poly_color = canvas.theme.port_midi_a2j_bg_sel if self.isSelected() else canvas.theme.port_midi_a2j_bg - poly_pen = canvas.theme.port_midi_a2j_pen_sel if self.isSelected() else canvas.theme.port_midi_a2j_pen + poly_pen = canvas.theme.port_midi_a2j_pen_sel if self.isSelected() else canvas.theme.port_midi_a2j_pen + text_pen = canvas.theme.port_midi_a2j_text_sel if self.isSelected() else canvas.theme.port_midi_a2j_text + conn_pen = canvas.theme.port_midi_a2j_pen_sel elif self.m_port_type == PORT_TYPE_MIDI_ALSA: poly_color = canvas.theme.port_midi_alsa_bg_sel if self.isSelected() else canvas.theme.port_midi_alsa_bg - poly_pen = canvas.theme.port_midi_alsa_pen_sel if self.isSelected() else canvas.theme.port_midi_alsa_pen + poly_pen = canvas.theme.port_midi_alsa_pen_sel if self.isSelected() else canvas.theme.port_midi_alsa_pen + text_pen = canvas.theme.port_midi_alsa_text_sel if self.isSelected() else canvas.theme.port_midi_alsa_text + conn_pen = canvas.theme.port_midi_alsa_pen_sel else: qCritical("PatchCanvas::CanvasPort.paint() - invalid port type '%s'" % port_type2str(self.m_port_type)) return @@ -1893,15 +1906,21 @@ class CanvasPort(QGraphicsItem): polygon = QPolygonF() 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) + polygon += QPointF(poly_locx[2], float(canvas.theme.port_height)/2) + polygon += QPointF(poly_locx[3], canvas.theme.port_height) + polygon += QPointF(poly_locx[4], canvas.theme.port_height) + + if canvas.theme.port_bg_pixmap: + portRect = polygon.boundingRect() + portPos = portRect.topLeft() + painter.drawTiledPixmap(portRect, canvas.theme.port_bg_pixmap, portPos) + else: + painter.setBrush(poly_color) - painter.setBrush(poly_color) painter.setPen(poly_pen) painter.drawPolygon(polygon) - painter.setPen(canvas.theme.port_text) + painter.setPen(text_pen) painter.setFont(self.m_port_font) painter.drawText(text_pos, self.m_port_name) @@ -1910,6 +1929,17 @@ class CanvasPort(QGraphicsItem): if connection.port_out_id == self.m_port_id or connection.port_in_id == self.m_port_id: connection.widget.setLineSelected(self.isSelected()) + if canvas.theme.idx == Theme.THEME_OOSTUDIO and canvas.theme.port_bg_pixmap: + painter.setPen(Qt.NoPen) + painter.setBrush(conn_pen.brush()) + + if self.m_port_mode == PORT_MODE_INPUT: + connRect = QRectF(portRect.topLeft(), QSizeF(2, portRect.height())) + else: + connRect = QRectF(QPointF(portRect.right()-2, portRect.top()), QSizeF(2, portRect.height())) + + painter.drawRect(connRect) + self.m_last_selected_state = self.isSelected() # ------------------------------------------------------------------------------ @@ -1926,12 +1956,12 @@ class CanvasBox(QGraphicsItem): QGraphicsItem.__init__(self, parent, canvas.scene) # Save Variables, useful for later - self.m_group_id = group_id + self.m_group_id = group_id self.m_group_name = group_name # Base Variables - self.p_width = 50 - self.p_height = 25 + self.p_width = 50 + self.p_height = canvas.theme.box_header_height + canvas.theme.box_header_spacing + 1 self.m_last_pos = QPointF() self.m_splitted = False @@ -1949,7 +1979,10 @@ class CanvasBox(QGraphicsItem): self.m_font_port = QFont(canvas.theme.port_font_name, canvas.theme.port_font_size, canvas.theme.port_font_state) # Icon - self.icon_svg = CanvasIcon(icon, self.m_group_name, self) + if canvas.theme.box_use_icon: + self.icon_svg = CanvasIcon(icon, self.m_group_name, self) + else: + self.icon_svg = None # Shadow if options.eyecandy: @@ -1987,7 +2020,8 @@ class CanvasBox(QGraphicsItem): return self.m_port_list_ids def setIcon(self, icon): - self.icon_svg.setIcon(icon, self.m_group_name) + if self.icon_svg: + self.icon_svg.setIcon(icon, self.m_group_name) def setSplit(self, split, mode=PORT_MODE_NULL): self.m_splitted = split @@ -2055,7 +2089,7 @@ class CanvasBox(QGraphicsItem): def checkItemPos(self): if not canvas.size_rect.isNull(): pos = self.scenePos() - if canvas.size_rect.contains(pos) == False or canvas.size_rect.contains(pos + QPointF(self.p_width, self.p_height)) == False: + if canvas.size_rect.contains(pos) == False or canvas.size_rect.contains(pos + QPointF(self.p_width, self.p_height)) == False: # FIXME if pos.x() < canvas.size_rect.x(): self.setPos(canvas.size_rect.x(), pos.y()) elif pos.x() + self.p_width > canvas.size_rect.width(): @@ -2068,21 +2102,24 @@ class CanvasBox(QGraphicsItem): self.setPos(pos.x(), canvas.size_rect.height() - self.p_height) def removeIconFromScene(self): - canvas.scene.removeItem(self.icon_svg) + if self.icon_svg: + canvas.scene.removeItem(self.icon_svg) def updatePositions(self): self.prepareGeometryChange() - max_in_width = 0 - max_in_height = 24 - max_out_width = 0 - max_out_height = 24 + max_in_width = 0 + max_in_height = canvas.theme.box_header_height + canvas.theme.box_header_spacing + max_out_width = 0 + max_out_height = canvas.theme.box_header_height + canvas.theme.box_header_spacing + port_spacing = canvas.theme.port_height + canvas.theme.port_spacing + have_audio_jack_in = have_midi_jack_in = have_midi_a2j_in = have_midi_alsa_in = False have_audio_jack_out = have_midi_jack_out = have_midi_a2j_out = have_midi_alsa_out = False # reset box size - self.p_width = 50 - self.p_height = 25 + self.p_width = 50 + self.p_height = canvas.theme.box_header_height + canvas.theme.box_header_spacing + 1 # Check Text Name size app_name_size = QFontMetrics(self.m_font_name).width(self.m_group_name) + 30 @@ -2098,7 +2135,7 @@ class CanvasBox(QGraphicsItem): # Get Max Box Width/Height for port in port_list: if port.port_mode == PORT_MODE_INPUT: - max_in_height += 18 + max_in_height += port_spacing size = QFontMetrics(self.m_font_port).width(port.port_name) if size > max_in_width: @@ -2106,19 +2143,19 @@ class CanvasBox(QGraphicsItem): if port.port_type == PORT_TYPE_AUDIO_JACK and not have_audio_jack_in: have_audio_jack_in = True - max_in_height += 2 + max_in_height += canvas.theme.port_spacingT elif port.port_type == PORT_TYPE_MIDI_JACK and not have_midi_jack_in: have_midi_jack_in = True - max_in_height += 2 + max_in_height += canvas.theme.port_spacingT elif port.port_type == PORT_TYPE_MIDI_A2J and not have_midi_a2j_in: have_midi_a2j_in = True - max_in_height += 2 + max_in_height += canvas.theme.port_spacingT elif port.port_type == PORT_TYPE_MIDI_ALSA and not have_midi_alsa_in: have_midi_alsa_in = True - max_in_height += 2 + max_in_height += canvas.theme.port_spacingT elif port.port_mode == PORT_MODE_OUTPUT: - max_out_height += 18 + max_out_height += port_spacing size = QFontMetrics(self.m_font_port).width(port.port_name) if size > max_out_width: @@ -2126,16 +2163,20 @@ class CanvasBox(QGraphicsItem): if port.port_type == PORT_TYPE_AUDIO_JACK and not have_audio_jack_out: have_audio_jack_out = True - max_out_height += 2 + max_out_height += canvas.theme.port_spacingT elif port.port_type == PORT_TYPE_MIDI_JACK and not have_midi_jack_out: have_midi_jack_out = True - max_out_height += 2 + max_out_height += canvas.theme.port_spacingT elif port.port_type == PORT_TYPE_MIDI_A2J and not have_midi_a2j_out: have_midi_a2j_out = True - max_out_height += 2 + max_out_height += canvas.theme.port_spacingT elif port.port_type == PORT_TYPE_MIDI_ALSA and not have_midi_alsa_out: have_midi_alsa_out = True - max_out_height += 2 + max_out_height += canvas.theme.port_spacingT + + if canvas.theme.port_spacingT == 0: + max_in_height += 2 + max_out_height += 2 final_width = 30 + max_in_width + max_out_width if final_width > self.p_width: @@ -2148,28 +2189,34 @@ class CanvasBox(QGraphicsItem): self.p_height = max_out_height # Remove bottom space - self.p_height -= 2 + self.p_height -= canvas.theme.port_spacingT - last_in_pos = 24 - last_out_pos = 24 - last_in_type = PORT_TYPE_NULL + if canvas.theme.box_header_spacing > 0: + if len(port_list) == 0: + self.p_height -= canvas.theme.box_header_spacing + else: + self.p_height -= canvas.theme.box_header_spacing/2 + + last_in_pos = canvas.theme.box_header_height + canvas.theme.box_header_spacing + last_out_pos = canvas.theme.box_header_height + canvas.theme.box_header_spacing + last_in_type = PORT_TYPE_NULL last_out_type = PORT_TYPE_NULL # Re-position ports, AUDIO_JACK for port in port_list: if port.port_type == PORT_TYPE_AUDIO_JACK: if port.port_mode == PORT_MODE_INPUT: - port.widget.setPos(QPointF(1, last_in_pos)) + port.widget.setPos(QPointF(1 + canvas.theme.port_offset, last_in_pos)) port.widget.setPortWidth(max_in_width) - last_in_pos += 18 + last_in_pos += port_spacing last_in_type = port.port_type elif port.port_mode == PORT_MODE_OUTPUT: - port.widget.setPos(QPointF(self.p_width - max_out_width - 13, last_out_pos)) + port.widget.setPos(QPointF(self.p_width - max_out_width - canvas.theme.port_offset - 13, last_out_pos)) port.widget.setPortWidth(max_out_width) - last_out_pos += 18 + last_out_pos += port_spacing last_out_type = port.port_type # Re-position ports, MIDI_JACK @@ -2177,22 +2224,22 @@ class CanvasBox(QGraphicsItem): if port.port_type == PORT_TYPE_MIDI_JACK: if port.port_mode == PORT_MODE_INPUT: if last_in_type != PORT_TYPE_NULL and port.port_type != last_in_type: - last_in_pos += 2 + last_in_pos += canvas.theme.port_spacingT - port.widget.setPos(QPointF(1, last_in_pos)) + port.widget.setPos(QPointF(1 + canvas.theme.port_offset, last_in_pos)) port.widget.setPortWidth(max_in_width) - last_in_pos += 18 + last_in_pos += port_spacing last_in_type = port.port_type elif port.port_mode == PORT_MODE_OUTPUT: if last_out_type != PORT_TYPE_NULL and port.port_type != last_out_type: - last_out_pos += 2 + last_out_pos += canvas.theme.port_spacingT - port.widget.setPos(QPointF(self.p_width - max_out_width - 13, last_out_pos)) + port.widget.setPos(QPointF(self.p_width - max_out_width - canvas.theme.port_offset - 13, last_out_pos)) port.widget.setPortWidth(max_out_width) - last_out_pos += 18 + last_out_pos += port_spacing last_out_type = port.port_type # Re-position ports, MIDI_A2J @@ -2200,22 +2247,22 @@ class CanvasBox(QGraphicsItem): if port.port_type == PORT_TYPE_MIDI_A2J: if port.port_mode == PORT_MODE_INPUT: if last_in_type != PORT_TYPE_NULL and port.port_type != last_in_type: - last_in_pos += 2 + last_in_pos += canvas.theme.port_spacingT - port.widget.setPos(QPointF(1, last_in_pos)) + port.widget.setPos(QPointF(1 + canvas.theme.port_offset, last_in_pos)) port.widget.setPortWidth(max_in_width) - last_in_pos += 18 + last_in_pos += port_spacing last_in_type = port.port_type elif port.port_mode == PORT_MODE_OUTPUT: if last_out_type != PORT_TYPE_NULL and port.port_type != last_out_type: - last_out_pos += 2 + last_out_pos += canvas.theme.port_spacingT - port.widget.setPos(QPointF(self.p_width - max_out_width - 13, last_out_pos)) + port.widget.setPos(QPointF(self.p_width - max_out_width - canvas.theme.port_offset - 13, last_out_pos)) port.widget.setPortWidth(max_out_width) - last_out_pos += 18 + last_out_pos += port_spacing last_out_type = port.port_type # Re-position ports, MIDI_ALSA @@ -2223,22 +2270,22 @@ class CanvasBox(QGraphicsItem): if port.port_type == PORT_TYPE_MIDI_ALSA: if port.port_mode == PORT_MODE_INPUT: if last_in_type != PORT_TYPE_NULL and port.port_type != last_in_type: - last_in_pos += 2 + last_in_pos += canvas.theme.port_spacingT - port.widget.setPos(QPointF(1, last_in_pos)) + port.widget.setPos(QPointF(1 + canvas.theme.port_offset, last_in_pos)) port.widget.setPortWidth(max_in_width) - last_in_pos += 18 + last_in_pos += port_spacing last_in_type = port.port_type elif port.port_mode == PORT_MODE_OUTPUT: if last_out_type != PORT_TYPE_NULL and port.port_type != last_out_type: - last_out_pos += 2 + last_out_pos += canvas.theme.port_spacingT - port.widget.setPos(QPointF(self.p_width - max_out_width - 13, last_out_pos)) + port.widget.setPos(QPointF(self.p_width - max_out_width - canvas.theme.port_offset - 13, last_out_pos)) port.widget.setPortWidth(max_out_width) - last_out_pos += 18 + last_out_pos += port_spacing last_out_type = port.port_type self.repaintLines(True) @@ -2313,6 +2360,7 @@ class CanvasBox(QGraphicsItem): elif port.port_mode == PORT_MODE_OUTPUT: haveOuts = True + # FIXME if self.m_splitted == False and bool(haveIns and haveOuts) == False: act_x_sep2.setVisible(False) act_x_split_join.setVisible(False) @@ -2385,23 +2433,48 @@ class CanvasBox(QGraphicsItem): def paint(self, painter, option, widget): painter.setRenderHint(QPainter.Antialiasing, False) + # Draw rectangle if self.isSelected(): painter.setPen(canvas.theme.box_pen_sel) else: painter.setPen(canvas.theme.box_pen) - box_gradient = QLinearGradient(0, 0, 0, self.p_height) - box_gradient.setColorAt(0, canvas.theme.box_bg_1) - box_gradient.setColorAt(1, canvas.theme.box_bg_2) + if canvas.theme.box_bg_type == Theme.THEME_BG_GRADIENT: + box_gradient = QLinearGradient(0, 0, 0, self.p_height) + box_gradient.setColorAt(0, canvas.theme.box_bg_1) + box_gradient.setColorAt(1, canvas.theme.box_bg_2) + painter.setBrush(box_gradient) + else: + painter.setBrush(canvas.theme.box_bg_1) - painter.setBrush(box_gradient) painter.drawRect(0, 0, self.p_width, self.p_height) - text_pos = QPointF(25, 16) + # Draw pixmap header + if canvas.theme.box_header_pixmap: + painter.setPen(Qt.NoPen) + painter.setBrush(canvas.theme.box_bg_2) + painter.drawRect(1, 1, self.p_width-2, canvas.theme.box_header_height) + headerPos = QPointF(1, 1) + headerRect = QRectF(2, 2, self.p_width-4, canvas.theme.box_header_height-3) + painter.drawTiledPixmap(headerRect, canvas.theme.box_header_pixmap, headerPos) + + # Draw text painter.setFont(self.m_font_name) - painter.setPen(canvas.theme.box_text) - painter.drawText(text_pos, self.m_group_name) + + if self.isSelected(): + painter.setPen(canvas.theme.box_text_sel) + else: + painter.setPen(canvas.theme.box_text) + + if canvas.theme.box_use_icon: + textPos = QPointF(25, canvas.theme.box_text_ypos) + else: + appNameSize = QFontMetrics(self.m_font_name).width(self.m_group_name) + rem = self.p_width - appNameSize + textPos = QPointF(rem/2, canvas.theme.box_text_ypos) + + painter.drawText(textPos, self.m_group_name) self.repaintLines() @@ -2453,9 +2526,9 @@ class CanvasIcon(QGraphicsSvgItem): self.p_size = QRectF(5, 2, 16, 16) elif icon == ICON_LADISH_ROOM: + # TODO - make a unique ladish-room icon icon_path = ":/scalable/pb_hardware.svg" self.p_size = QRectF(5, 2, 16, 16) - # TODO - make a unique ladish-room icon else: self.p_size = QRectF(0, 0, 0, 0) diff --git a/src/patchcanvas_theme.py b/src/patchcanvas_theme.py index 2f1352f..73a4485 100644 --- a/src/patchcanvas_theme.py +++ b/src/patchcanvas_theme.py @@ -17,7 +17,7 @@ # For a full copy of the GNU General Public License see the COPYING file from PyQt4.QtCore import Qt -from PyQt4.QtGui import QColor, QFont, QPen +from PyQt4.QtGui import QColor, QFont, QPen, QPixmap class Theme(object): # enum PortType @@ -25,17 +25,22 @@ class Theme(object): THEME_PORT_POLYGON = 1 # enum List - THEME_MODERN_DARK = 0 - THEME_CLASSIC_DARK = 1 - THEME_MAX = 2 + THEME_MODERN_DARK = 0 + THEME_MODERN_DARK_TINY = 1 + THEME_CLASSIC_DARK = 2 + THEME_OOSTUDIO = 3 + THEME_MAX = 4 + + # enum BackgroundType + THEME_BG_SOLID = 0 + THEME_BG_GRADIENT = 1 def __init__(self, idx): object.__init__(self) - if idx == self.THEME_MODERN_DARK: - # Name this theme - self.name = "Modern Dark" + self.idx = idx + if idx == self.THEME_MODERN_DARK: # Canvas self.canvas_bg = QColor(0, 0, 0) @@ -45,13 +50,29 @@ class Theme(object): self.box_bg_1 = QColor(32, 34, 35) self.box_bg_2 = QColor(43, 47, 48) self.box_shadow = QColor(89, 89, 89, 180) + self.box_header_pixmap = None + self.box_header_height = 24 + self.box_header_spacing = 0 self.box_text = QPen(QColor(240, 240, 240), 0) + self.box_text_sel = self.box_text + self.box_text_ypos = 16 self.box_font_name = "Deja Vu Sans" self.box_font_size = 8 self.box_font_state = QFont.Bold + self.box_bg_type = self.THEME_BG_GRADIENT + self.box_use_icon = True + # Ports + self.port_text = QPen(QColor(250, 250, 250), 0) + self.port_text_ypos = 12 + self.port_bg_pixmap = None + self.port_font_name = "Deja Vu Sans" + self.port_font_size = 8 + self.port_font_state = QFont.Normal + self.port_mode = self.THEME_PORT_POLYGON + self.port_audio_jack_pen = QPen(QColor(63, 90, 126), 1) self.port_audio_jack_pen_sel = QPen(QColor(63 + 30, 90 + 30, 126 + 30), 1) self.port_midi_jack_pen = QPen(QColor(159, 44, 42), 1) @@ -70,12 +91,102 @@ class Theme(object): self.port_midi_alsa_bg = QColor(64, 112, 18) self.port_midi_alsa_bg_sel = QColor(64 + 50, 112 + 50, 18 + 50) + self.port_audio_jack_text = self.port_text + self.port_audio_jack_text_sel = self.port_text + self.port_midi_jack_text = self.port_text + self.port_midi_jack_text_sel = self.port_text + self.port_midi_a2j_text = self.port_text + self.port_midi_a2j_text_sel = self.port_text + self.port_midi_alsa_text = self.port_text + self.port_midi_alsa_text_sel = self.port_text + + self.port_height = 15 + self.port_offset = 0 + self.port_spacing = 3 + self.port_spacingT = 2 + + # Lines + self.line_audio_jack = QColor(63, 90, 126) + self.line_audio_jack_sel = QColor(63 + 90, 90 + 90, 126 + 90) + self.line_audio_jack_glow = QColor(100, 100, 200) + self.line_midi_jack = QColor(159, 44, 42) + self.line_midi_jack_sel = QColor(159 + 90, 44 + 90, 42 + 90) + self.line_midi_jack_glow = QColor(200, 100, 100) + self.line_midi_a2j = QColor(137, 76, 43) + self.line_midi_a2j_sel = QColor(137 + 90, 76 + 90, 43 + 90) + self.line_midi_a2j_glow = QColor(166, 133, 133) + self.line_midi_alsa = QColor(93, 141, 46) + self.line_midi_alsa_sel = QColor(93 + 90, 141 + 90, 46 + 90) + self.line_midi_alsa_glow = QColor(100, 200, 100) + + self.rubberband_pen = QPen(QColor(206, 207, 208), 1, Qt.SolidLine) + self.rubberband_brush = QColor(76, 77, 78, 100) + + elif idx == self.THEME_MODERN_DARK_TINY: + # Canvas + self.canvas_bg = QColor(0, 0, 0) + + # Boxes + self.box_pen = QPen(QColor(76, 77, 78), 1, Qt.SolidLine) + self.box_pen_sel = QPen(QColor(206, 207, 208), 1, Qt.DashLine) + self.box_bg_1 = QColor(32, 34, 35) + self.box_bg_2 = QColor(43, 47, 48) + self.box_shadow = QColor(89, 89, 89, 180) + self.box_header_pixmap = None + self.box_header_height = 14 + self.box_header_spacing = 0 + + self.box_text = QPen(QColor(240, 240, 240), 0) + self.box_text_sel = self.box_text + self.box_text_ypos = 10 + self.box_font_name = "Deja Vu Sans" + self.box_font_size = 7 + self.box_font_state = QFont.Bold + + self.box_bg_type = self.THEME_BG_GRADIENT + self.box_use_icon = False + + # Ports self.port_text = QPen(QColor(250, 250, 250), 0) + self.port_text_ypos = 9 + self.port_bg_pixmap = None self.port_font_name = "Deja Vu Sans" - self.port_font_size = 8 + self.port_font_size = 6 self.port_font_state = QFont.Normal self.port_mode = self.THEME_PORT_POLYGON + self.port_audio_jack_pen = QPen(QColor(63, 90, 126), 1) + self.port_audio_jack_pen_sel = QPen(QColor(63 + 30, 90 + 30, 126 + 30), 1) + self.port_midi_jack_pen = QPen(QColor(159, 44, 42), 1) + self.port_midi_jack_pen_sel = QPen(QColor(159 + 30, 44 + 30, 42 + 30), 1) + self.port_midi_a2j_pen = QPen(QColor(137, 76, 43), 1) + self.port_midi_a2j_pen_sel = QPen(QColor(137 + 30, 76 + 30, 43 + 30), 1) + self.port_midi_alsa_pen = QPen(QColor(93, 141, 46), 1) + self.port_midi_alsa_pen_sel = QPen(QColor(93 + 30, 141 + 30, 46 + 30), 1) + + self.port_audio_jack_bg = QColor(35, 61, 99) + self.port_audio_jack_bg_sel = QColor(35 + 50, 61 + 50, 99 + 50) + self.port_midi_jack_bg = QColor(120, 15, 16) + self.port_midi_jack_bg_sel = QColor(120 + 50, 15 + 50, 16 + 50) + self.port_midi_a2j_bg = QColor(101, 47, 16) + self.port_midi_a2j_bg_sel = QColor(101 + 50, 47 + 50, 16 + 50) + self.port_midi_alsa_bg = QColor(64, 112, 18) + self.port_midi_alsa_bg_sel = QColor(64 + 50, 112 + 50, 18 + 50) + + self.port_audio_jack_text = self.port_text + self.port_audio_jack_text_sel = self.port_text + self.port_midi_jack_text = self.port_text + self.port_midi_jack_text_sel = self.port_text + self.port_midi_a2j_text = self.port_text + self.port_midi_a2j_text_sel = self.port_text + self.port_midi_alsa_text = self.port_text + self.port_midi_alsa_text_sel = self.port_text + + self.port_height = 11 + self.port_offset = 0 + self.port_spacing = 2 + self.port_spacingT = 1 + # Lines self.line_audio_jack = QColor(63, 90, 126) self.line_audio_jack_sel = QColor(63 + 90, 90 + 90, 126 + 90) @@ -94,9 +205,6 @@ class Theme(object): self.rubberband_brush = QColor(76, 77, 78, 100) elif idx == self.THEME_CLASSIC_DARK: - # Name this theme - self.name = "Classic Dark" - # Canvas self.canvas_bg = QColor(0, 0, 0) @@ -106,13 +214,29 @@ class Theme(object): self.box_bg_1 = QColor(30, 34, 36) self.box_bg_2 = QColor(30, 34, 36) self.box_shadow = QColor(89, 89, 89, 180) + self.box_header_pixmap = None + self.box_header_height = 19 + self.box_header_spacing = 0 self.box_text = QPen(QColor(255, 255, 255), 0) + self.box_text_sel = self.box_text + self.box_text_ypos = 12 self.box_font_name = "Sans" self.box_font_size = 9 self.box_font_state = QFont.Normal + self.box_bg_type = self.THEME_BG_GRADIENT + self.box_use_icon = False + # Ports + self.port_text = QPen(QColor(250, 250, 250), 0) + self.port_text_ypos = 11 + self.port_bg_pixmap = None + self.port_font_name = "Sans" + self.port_font_size = 8 + self.port_font_state = QFont.Normal + self.port_mode = self.THEME_PORT_SQUARE + self.port_audio_jack_pen = QPen(QColor(35, 61, 99), 0) self.port_audio_jack_pen_sel = QPen(QColor(255, 0, 0), 0) self.port_midi_jack_pen = QPen(QColor(120, 15, 16), 0) @@ -131,11 +255,19 @@ class Theme(object): self.port_midi_alsa_bg = QColor(63, 112, 19) self.port_midi_alsa_bg_sel = QColor(255, 0, 0) - self.port_text = QPen(QColor(250, 250, 250), 0) - self.port_font_name = "Sans" - self.port_font_size = 8 - self.port_font_state = QFont.Normal - self.port_mode = self.THEME_PORT_SQUARE + self.port_audio_jack_text = self.port_text + self.port_audio_jack_text_sel = self.port_text + self.port_midi_jack_text = self.port_text + self.port_midi_jack_text_sel = self.port_text + self.port_midi_a2j_text = self.port_text + self.port_midi_a2j_text_sel = self.port_text + self.port_midi_alsa_text = self.port_text + self.port_midi_alsa_text_sel = self.port_text + + self.port_height = 14 + self.port_offset = -1 + self.port_spacing = 1 + self.port_spacingT = 0 # Lines self.line_audio_jack = QColor(53, 78, 116) @@ -154,14 +286,104 @@ class Theme(object): self.rubberband_pen = QPen(QColor(147, 151, 143), 2, Qt.SolidLine) self.rubberband_brush = QColor(35, 61, 99, 100) + elif idx == self.THEME_OOSTUDIO: + # Canvas + self.canvas_bg = QColor(11, 11, 11) + + # Boxes + self.box_pen = QPen(QColor(76, 77, 78), 1, Qt.SolidLine) + self.box_pen_sel = QPen(QColor(189, 122, 214), 1, Qt.DashLine) + self.box_bg_1 = QColor(46, 46, 46) + self.box_bg_2 = QColor(23, 23, 23) + self.box_shadow = QColor(89, 89, 89, 180) + self.box_header_pixmap = QPixmap(":/bitmaps/canvas/frame_node_header.png") + self.box_header_height = 22 + self.box_header_spacing = 6 + + self.box_text = QPen(QColor(144, 144, 144), 0) + self.box_text_sel = QPen(QColor(189, 122, 214), 0) + self.box_text_ypos = 16 + self.box_font_name = "Deja Vu Sans" + self.box_font_size = 8 + self.box_font_state = QFont.Bold + + self.box_bg_type = self.THEME_BG_SOLID + self.box_use_icon = False + + # Ports + normalPortBG = QColor(46, 46, 46) + selPortBG = QColor(23, 23, 23) + + self.port_text = QPen(QColor(155, 155, 155), 0) + self.port_text_ypos = 14 + self.port_bg_pixmap = QPixmap(":/bitmaps/canvas/frame_port_bg.png") + self.port_font_name = "Deja Vu Sans" + self.port_font_size = 8 + self.port_font_state = QFont.Normal + self.port_mode = self.THEME_PORT_SQUARE + + self.port_audio_jack_pen = QPen(selPortBG, 2) + self.port_audio_jack_pen_sel = QPen(QColor(1, 230, 238), 1) + self.port_midi_jack_pen = QPen(selPortBG, 2) + self.port_midi_jack_pen_sel = QPen(QColor(252, 118, 118), 1) + self.port_midi_a2j_pen = QPen(selPortBG, 2) + self.port_midi_a2j_pen_sel = QPen(QColor(137, 76, 43), 1) + self.port_midi_alsa_pen = QPen(selPortBG, 2) + self.port_midi_alsa_pen_sel = QPen(QColor(129, 244, 118), 0) + + self.port_audio_jack_bg = normalPortBG + self.port_audio_jack_bg_sel = selPortBG + self.port_midi_jack_bg = normalPortBG + self.port_midi_jack_bg_sel = selPortBG + self.port_midi_a2j_bg = normalPortBG + self.port_midi_a2j_bg_sel = selPortBG + self.port_midi_alsa_bg = normalPortBG + self.port_midi_alsa_bg_sel = selPortBG + + self.port_audio_jack_text = self.port_text + self.port_audio_jack_text_sel = self.port_audio_jack_pen_sel + self.port_midi_jack_text = self.port_text + self.port_midi_jack_text_sel = self.port_midi_jack_pen_sel + self.port_midi_a2j_text = self.port_text + self.port_midi_a2j_text_sel = self.port_midi_a2j_pen_sel + self.port_midi_alsa_text = self.port_text + self.port_midi_alsa_text_sel = self.port_midi_alsa_pen_sel + + # missing, ports 2 + self.port_height = 19 + self.port_offset = 1 + self.port_spacing = 5 + self.port_spacingT = 0 + + # Lines + self.line_audio_jack = QColor(64, 64, 64) + self.line_audio_jack_sel = QColor(1, 230, 238) + self.line_audio_jack_glow = QColor(100, 200, 100) + self.line_midi_jack = QColor(64, 64, 64) + self.line_midi_jack_sel = QColor(252, 118, 118) + self.line_midi_jack_glow = QColor(200, 100, 100) + self.line_midi_a2j = QColor(64, 64, 64) + self.line_midi_a2j_sel = QColor(137+90, 76+90, 43+90) + self.line_midi_a2j_glow = QColor(166, 133, 133) + self.line_midi_alsa = QColor(64, 64, 64) + self.line_midi_alsa_sel = QColor(129, 244, 118) + self.line_midi_alsa_glow = QColor(100, 200, 100) + + self.rubberband_pen = QPen(QColor(1, 230, 238), 2, Qt.SolidLine) + self.rubberband_brush = QColor(90, 90, 90, 100) + def getDefaultTheme(): return Theme.THEME_MODERN_DARK def getThemeName(idx): if idx == Theme.THEME_MODERN_DARK: return "Modern Dark" + elif idx == Theme.THEME_MODERN_DARK_TINY: + return "Modern Dark (Tiny)" elif idx == Theme.THEME_CLASSIC_DARK: return "Classic Dark" + elif idx == Theme.THEME_OOSTUDIO: + return "OpenOctave Studio" else: return ""