diff --git a/src/catia.py b/src/catia.py index 5da1aa5..5a59c1c 100755 --- a/src/catia.py +++ b/src/catia.py @@ -93,9 +93,9 @@ iConnInput = 2 # ------------------------------------------------------------------------------------------------------------ # Catia Main Window -class CatiaMainW(AbstractJackW, ui_catia.Ui_CatiaMainW): +class CatiaMainW(AbstractCanvasJackClass, ui_catia.Ui_CatiaMainW): def __init__(self, parent=None): - AbstractJackW.__init__(self, parent, "Catia") + AbstractCanvasJackClass.__init__(self, parent, "Catia") self.setupUi(self) self.m_groupList = [] @@ -210,8 +210,8 @@ class CatiaMainW(AbstractJackW, ui_catia.Ui_CatiaMainW): # ------------------------------------------------------------- # Set-up Connections - setCanvasConnections(self) - setJackConnections(self, ["jack", "buffer-size", "transport", "misc"]) + self.setCanvasConnections() + self.setJackConnections(["jack", "buffer-size", "transport", "misc"]) self.connect(self.act_tools_jack_start, SIGNAL("triggered()"), SLOT("slot_JackServerStart()")) self.connect(self.act_tools_jack_stop, SIGNAL("triggered()"), SLOT("slot_JackServerStop()")) diff --git a/src/claudia.py b/src/claudia.py index 29d4682..8363741 100755 --- a/src/claudia.py +++ b/src/claudia.py @@ -571,9 +571,9 @@ class ClaudiaLauncherW(QDialog): # ------------------------------------------------------------------------------------------------------------ # Claudia Main Window -class ClaudiaMainW(AbstractJackW, ui_claudia.Ui_ClaudiaMainW): +class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): def __init__(self, parent=None): - AbstractJackW.__init__(self, parent, "Claudia") + AbstractCanvasJackClass.__init__(self, parent, "Claudia") self.setupUi(self) self.m_lastItemType = None @@ -755,8 +755,8 @@ class ClaudiaMainW(AbstractJackW, ui_claudia.Ui_ClaudiaMainW): # ------------------------------------------------------------- # Set-up Connections - setCanvasConnections(self) - setJackConnections(self, ["jack", "transport", "misc"]) + self.setCanvasConnections() + self.setJackConnections(["jack", "transport", "misc"]) self.connect(self.act_studio_new, SIGNAL("triggered()"), SLOT("slot_studio_new()")) self.connect(self.act_studio_start, SIGNAL("triggered()"), SLOT("slot_studio_start()")) diff --git a/src/shared_canvas.py b/src/shared_canvas.py index 6c8de0f..b7abff6 100644 --- a/src/shared_canvas.py +++ b/src/shared_canvas.py @@ -15,83 +15,3 @@ # GNU General Public License for more details. # # For a full copy of the GNU General Public License see the COPYING file - -# Imports (Global) -from PyQt4.QtCore import SIGNAL -from PyQt4.QtGui import QFileDialog, QImage, QPainter, QPrinter, QPrintDialog - -# Imports (Custom Stuff) -import patchcanvas - -# ------------------------------------------------------------------------------------------------------------ - -# Shared Canvas code -def canvas_arrange(): - patchcanvas.arrange() - -def canvas_refresh(self_): - patchcanvas.clear() - self_.init_ports() - -def canvas_zoom_fit(self_): - self_.scene.zoom_fit() - -def canvas_zoom_in(self_): - self_.scene.zoom_in() - -def canvas_zoom_out(self_): - self_.scene.zoom_out() - -def canvas_zoom_reset(self_): - self_.scene.zoom_reset() - -def canvas_print(self_): - self_.scene.clearSelection() - self_.m_export_printer = QPrinter() - dialog = QPrintDialog(self_.m_export_printer, self_) - - if dialog.exec_(): - painter = QPainter(self_.m_export_printer) - painter.setRenderHint(QPainter.Antialiasing) - painter.setRenderHint(QPainter.TextAntialiasing) - self_.scene.render(painter) - -def canvas_save_image(self_): - newPath = QFileDialog.getSaveFileName(self_, self_.tr("Save Image"), filter=self_.tr("PNG Image (*.png);;JPEG Image (*.jpg)")) - - if newPath: - self_.scene.clearSelection() - - if newPath.endswith((".jpg", ".jpG", ".jPG", ".JPG", ".JPg", ".Jpg")): - img_format = "JPG" - elif newPath.endswith((".png", ".pnG", ".pNG", ".PNG", ".PNg", ".Png")): - img_format = "PNG" - else: - # File-dialog may not auto-add the extension - img_format = "PNG" - newPath += ".png" - - self_.m_export_image = QImage(self_.scene.sceneRect().width(), self_.scene.sceneRect().height(), QImage.Format_RGB32) - painter = QPainter(self_.m_export_image) - painter.setRenderHint(QPainter.Antialiasing) # TODO - set true, cleanup this - painter.setRenderHint(QPainter.TextAntialiasing) - self_.scene.render(painter) - self_.m_export_image.save(newPath, img_format, 100) - -# ------------------------------------------------------------------------------------------------------------ - -# Shared Connections -def setCanvasConnections(self_): - self_.act_canvas_arrange.setEnabled(False) # TODO, later - self_.connect(self_.act_canvas_arrange, SIGNAL("triggered()"), lambda: canvas_arrange()) - self_.connect(self_.act_canvas_refresh, SIGNAL("triggered()"), lambda: canvas_refresh(self_)) - self_.connect(self_.act_canvas_zoom_fit, SIGNAL("triggered()"), lambda: canvas_zoom_fit(self_)) - self_.connect(self_.act_canvas_zoom_in, SIGNAL("triggered()"), lambda: canvas_zoom_in(self_)) - self_.connect(self_.act_canvas_zoom_out, SIGNAL("triggered()"), lambda: canvas_zoom_out(self_)) - self_.connect(self_.act_canvas_zoom_100, SIGNAL("triggered()"), lambda: canvas_zoom_reset(self_)) - self_.connect(self_.act_canvas_print, SIGNAL("triggered()"), lambda: canvas_print(self_)) - self_.connect(self_.act_canvas_save_image, SIGNAL("triggered()"), lambda: canvas_save_image(self_)) - self_.connect(self_.b_canvas_zoom_fit, SIGNAL("clicked()"), lambda: canvas_zoom_fit(self_)) - self_.connect(self_.b_canvas_zoom_in, SIGNAL("clicked()"), lambda: canvas_zoom_in(self_)) - self_.connect(self_.b_canvas_zoom_out, SIGNAL("clicked()"), lambda: canvas_zoom_out(self_)) - self_.connect(self_.b_canvas_zoom_100, SIGNAL("clicked()"), lambda: canvas_zoom_reset(self_)) diff --git a/src/shared_jack.py b/src/shared_jack.py index d365420..44d326a 100644 --- a/src/shared_jack.py +++ b/src/shared_jack.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Common/Shared code related to JACK +# Common/Shared code related to Canvas and JACK # Copyright (C) 2010-2012 Filipe Coelho # # This program is free software; you can redistribute it and/or modify @@ -20,13 +20,13 @@ # Imports (Global) from PyQt4.QtCore import pyqtSlot, QSettings, QTimer -from PyQt4.QtGui import QCursor, QFontMetrics, QMainWindow, QMenu +from PyQt4.QtGui import QCursor, QFontMetrics, QImage, QMainWindow, QMenu, QPainter, QPrinter, QPrintDialog # ------------------------------------------------------------------------------------------------------------ # Imports (Custom Stuff) -import jacksettings -import logs, render +import patchcanvas +import jacksettings, logs, render from shared import * from jacklib_helpers import * @@ -90,9 +90,9 @@ jack = JackObject() jack.client = None # ------------------------------------------------------------------------------------------------------------ -# Abstract JACK Window +# Abstract Canvas and JACK Class -class AbstractJackW(QMainWindow): +class AbstractCanvasJackClass(QMainWindow): def __init__(self, parent, appName): QMainWindow.__init__(self, parent) @@ -112,7 +112,7 @@ class AbstractJackW(QMainWindow): self.settings = QSettings("Cadence", appName) # ----------------------------------------------------------------- - # Property change calls + # JACK Property change calls def jack_setBufferSize(self, bufferSize): if self.m_bufferSize == bufferSize: @@ -152,7 +152,7 @@ class AbstractJackW(QMainWindow): self.jack_setSampleRate(int(text)) # ----------------------------------------------------------------- - # Transport calls + # JACK Transport calls def setTransportView(self, view): if view == TRANSPORT_VIEW_HMS: @@ -225,7 +225,7 @@ class AbstractJackW(QMainWindow): self.setTransportView(TRANSPORT_VIEW_FRAMES) # ----------------------------------------------------------------- - # Refresh GUI stuff + # Refresh JACK stuff def refreshDSPLoad(self): if not jack.client: return @@ -289,7 +289,7 @@ class AbstractJackW(QMainWindow): self.m_lastTransportState = state # ----------------------------------------------------------------- - # Set GUI stuff + # Set JACK stuff def setBufferSize(self, bufferSize, forced=False): if self.m_bufferSize == bufferSize and not forced: @@ -401,46 +401,124 @@ class AbstractJackW(QMainWindow): renderW.exec_() del renderW -# ------------------------------------------------------------------------------------------------------------ -# Shared Connections - -def setJackConnections(self_, modes): - if "jack" in modes: - self_.connect(self_.act_jack_clear_xruns, SIGNAL("triggered()"), SLOT("slot_JackClearXruns()")) - self_.connect(self_.act_jack_render, SIGNAL("triggered()"), SLOT("slot_showRender()")) - self_.connect(self_.act_jack_configure, SIGNAL("triggered()"), SLOT("slot_showJackSettings()")) - self_.connect(self_.b_jack_clear_xruns, SIGNAL("clicked()"), SLOT("slot_JackClearXruns()")) - self_.connect(self_.b_jack_configure, SIGNAL("clicked()"), SLOT("slot_showJackSettings()")) - self_.connect(self_.b_jack_render, SIGNAL("clicked()"), SLOT("slot_showRender()")) - self_.connect(self_.cb_buffer_size, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_jackBufferSize_ComboBox(QString)")) - self_.connect(self_.cb_sample_rate, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_jackSampleRate_ComboBox(QString)")) - self_.connect(self_.b_xruns, SIGNAL("clicked()"), SLOT("slot_JackClearXruns()")) - - if "buffer-size" in modes: - self_.connect(self_.act_jack_bf_16, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_32, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_64, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_128, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_256, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_512, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_1024, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_2048, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_4096, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - self_.connect(self_.act_jack_bf_8192, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) - - if "transport" in modes: - self_.connect(self_.act_transport_play, SIGNAL("triggered(bool)"), SLOT("slot_transportPlayPause(bool)")) - self_.connect(self_.act_transport_stop, SIGNAL("triggered()"), SLOT("slot_transportStop()")) - self_.connect(self_.act_transport_backwards, SIGNAL("triggered()"), SLOT("slot_transportBackwards()")) - self_.connect(self_.act_transport_forwards, SIGNAL("triggered()"), SLOT("slot_transportForwards()")) - self_.connect(self_.b_transport_play, SIGNAL("clicked(bool)"), SLOT("slot_transportPlayPause(bool)")) - self_.connect(self_.b_transport_stop, SIGNAL("clicked()"), SLOT("slot_transportStop()")) - self_.connect(self_.b_transport_backwards, SIGNAL("clicked()"), SLOT("slot_transportBackwards()")) - self_.connect(self_.b_transport_forwards, SIGNAL("clicked()"), SLOT("slot_transportForwards()")) - self_.connect(self_.label_time, SIGNAL("customContextMenuRequested(QPoint)"), SLOT("slot_transportViewMenu()")) - - if "misc" in modes: - if LINUX: - self_.connect(self_.act_show_logs, SIGNAL("triggered()"), SLOT("slot_showLogs()")) - else: - self_.act_show_logs.setEnabled(False) + # ----------------------------------------------------------------- + # Shared Canvas code + + @pyqtSlot() + def slot_canvasArrange(self): + patchcanvas.arrange() + + @pyqtSlot() + def slot_canvasRefresh(self): + patchcanvas.clear() + self.init_ports() + + @pyqtSlot() + def slot_canvasZoomFit(self): + self.scene.zoom_fit() + + @pyqtSlot() + def slot_canvasZoomIn(self): + self.scene.zoom_in() + + @pyqtSlot() + def slot_canvasZoomOut(self): + self.scene.zoom_out() + + @pyqtSlot() + def slot_canvasZoomReset(self): + self.scene.zoom_reset() + + @pyqtSlot() + def slot_canvasPrint(self): + self.scene.clearSelection() + self.m_exportPrinter = QPrinter() + dialog = QPrintDialog(self.m_exportPrinter, self) + + if dialog.exec_(): + painter = QPainter(self.m_exportPrinter) + painter.setRenderHint(QPainter.Antialiasing) + painter.setRenderHint(QPainter.TextAntialiasing) + self.scene.render(painter) + + @pyqtSlot() + def slot_canvasSaveImage(self): + newPath = QFileDialog.getSaveFileName(self, self.tr("Save Image"), filter=self.tr("PNG Image (*.png);;JPEG Image (*.jpg)")) + + if newPath: + self.scene.clearSelection() + + if newPath.endswith((".jpg", ".jpG", ".jPG", ".JPG", ".JPg", ".Jpg")): + imgFormat = "JPG" + elif newPath.endswith((".png", ".pnG", ".pNG", ".PNG", ".PNg", ".Png")): + imgFormat = "PNG" + else: + # File-dialog may not auto-add the extension + imgFormat = "PNG" + newPath += ".png" + + self.m_exportImage = QImage(self.scene.sceneRect().width(), self.scene.sceneRect().height(), QImage.Format_RGB32) + painter = QPainter(self.m_exportImage) + painter.setRenderHint(QPainter.Antialiasing) # TODO - set true, cleanup this + painter.setRenderHint(QPainter.TextAntialiasing) + self.scene.render(painter) + self.m_exportImage.save(newPath, imgFormat, 100) + + # ----------------------------------------------------------------- + # Shared Connections + + def setCanvasConnections(self): + self.act_canvas_arrange.setEnabled(False) # TODO, later + self.connect(self.act_canvas_arrange, SIGNAL("triggered()"), SLOT("slot_canvasArrange()")) + self.connect(self.act_canvas_refresh, SIGNAL("triggered()"), SLOT("slot_canvasRefresh()")) + self.connect(self.act_canvas_zoom_fit, SIGNAL("triggered()"), SLOT("slot_canvasZoomFit()")) + self.connect(self.act_canvas_zoom_in, SIGNAL("triggered()"), SLOT("slot_canvasZoomIn()")) + self.connect(self.act_canvas_zoom_out, SIGNAL("triggered()"), SLOT("slot_canvasZoomOut()")) + self.connect(self.act_canvas_zoom_100, SIGNAL("triggered()"), SLOT("slot_canvasZoomReset()")) + self.connect(self.act_canvas_print, SIGNAL("triggered()"), SLOT("slot_canvasPrint()")) + self.connect(self.act_canvas_save_image, SIGNAL("triggered()"), SLOT("slot_canvasSaveImage()")) + self.connect(self.b_canvas_zoom_fit, SIGNAL("clicked()"), SLOT("slot_canvasZoomFit()")) + self.connect(self.b_canvas_zoom_in, SIGNAL("clicked()"), SLOT("slot_canvasZoomIn()")) + self.connect(self.b_canvas_zoom_out, SIGNAL("clicked()"), SLOT("slot_canvasZoomOut()")) + self.connect(self.b_canvas_zoom_100, SIGNAL("clicked()"), SLOT("slot_canvasZoomReset()")) + + def setJackConnections(self, modes): + if "jack" in modes: + self.connect(self.act_jack_clear_xruns, SIGNAL("triggered()"), SLOT("slot_JackClearXruns()")) + self.connect(self.act_jack_render, SIGNAL("triggered()"), SLOT("slot_showRender()")) + self.connect(self.act_jack_configure, SIGNAL("triggered()"), SLOT("slot_showJackSettings()")) + self.connect(self.b_jack_clear_xruns, SIGNAL("clicked()"), SLOT("slot_JackClearXruns()")) + self.connect(self.b_jack_configure, SIGNAL("clicked()"), SLOT("slot_showJackSettings()")) + self.connect(self.b_jack_render, SIGNAL("clicked()"), SLOT("slot_showRender()")) + self.connect(self.cb_buffer_size, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_jackBufferSize_ComboBox(QString)")) + self.connect(self.cb_sample_rate, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_jackSampleRate_ComboBox(QString)")) + self.connect(self.b_xruns, SIGNAL("clicked()"), SLOT("slot_JackClearXruns()")) + + if "buffer-size" in modes: + self.connect(self.act_jack_bf_16, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_32, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_64, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_128, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_256, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_512, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_1024, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_2048, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_4096, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + self.connect(self.act_jack_bf_8192, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu()")) + + if "transport" in modes: + self.connect(self.act_transport_play, SIGNAL("triggered(bool)"), SLOT("slot_transportPlayPause(bool)")) + self.connect(self.act_transport_stop, SIGNAL("triggered()"), SLOT("slot_transportStop()")) + self.connect(self.act_transport_backwards, SIGNAL("triggered()"), SLOT("slot_transportBackwards()")) + self.connect(self.act_transport_forwards, SIGNAL("triggered()"), SLOT("slot_transportForwards()")) + self.connect(self.b_transport_play, SIGNAL("clicked(bool)"), SLOT("slot_transportPlayPause(bool)")) + self.connect(self.b_transport_stop, SIGNAL("clicked()"), SLOT("slot_transportStop()")) + self.connect(self.b_transport_backwards, SIGNAL("clicked()"), SLOT("slot_transportBackwards()")) + self.connect(self.b_transport_forwards, SIGNAL("clicked()"), SLOT("slot_transportForwards()")) + self.connect(self.label_time, SIGNAL("customContextMenuRequested(QPoint)"), SLOT("slot_transportViewMenu()")) + + if "misc" in modes: + if LINUX: + self.connect(self.act_show_logs, SIGNAL("triggered()"), SLOT("slot_showLogs()")) + else: + self.act_show_logs.setEnabled(False)