@@ -19,12 +19,12 @@ Packagers can make use of the 'PREFIX' and 'DESTDIR' variable during install, li | |||
The required build dependencies are: <i>(devel packages of these)</i> | |||
- JACK | |||
- Qt4 | |||
- PyQt4 (Py3 version) | |||
- Qt5 | |||
- PyQt5 (Py3 version) | |||
On Debian and Ubuntu, use these commands to install all build dependencies: <br/> | |||
`$ sudo apt-get install libjack-dev libqt4-dev qt4-dev-tools` <br/> | |||
`$ sudo apt-get install python-qt4-dev python3-pyqt4 pyqt4-dev-tools` | |||
`$ sudo apt-get install libjack-jackd2-dev qtbase5-dev, qtbase5-dev-tools` <br/> | |||
`$ sudo apt-get install python3-pyqt5 python3-pyqt5.qtsvg pyqt5-dev-tools` | |||
To run all the apps/tools, you'll additionally need: | |||
@@ -8,14 +8,14 @@ PREFIX = /usr/local | |||
DESTDIR = | |||
LINK = ln -s | |||
PYUIC ?= pyuic4 | |||
PYRCC ?= pyrcc4 -py3 | |||
PYUIC ?= pyuic5 | |||
PYRCC ?= pyrcc5 | |||
# Detect X11 rules dir | |||
ifeq "$(wildcard /etc/X11/xinit/xinitrc.d/ )" "" | |||
X11_RC_DIR = $(DESTDIR)/etc/X11/Xsession.d/ | |||
else | |||
ifeq "$(wildcard /etc/X11/Xsession.d/ )" "" | |||
X11_RC_DIR = $(DESTDIR)/etc/X11/xinit/xinitrc.d/ | |||
else | |||
X11_RC_DIR = $(DESTDIR)/etc/X11/Xsession.d/ | |||
endif | |||
# ----------------------------------------------------------------------------------------------------------------------------------------- | |||
@@ -164,7 +164,7 @@ install: | |||
# Install addtional stuff for Cadence | |||
install -m 644 data/pulse2jack/* $(DESTDIR)$(PREFIX)/share/cadence/pulse2jack/ | |||
install -m 644 data/pulse2loopback/* $(DESTDIR)$(PREFIX)/share/cadence/pulse2loopback/ | |||
install -m 644 data/61cadence-session-inject $(X11_RC_DIR) | |||
install -m 755 data/61cadence-session-inject $(X11_RC_DIR) | |||
# Install addtional stuff for Claudia | |||
cp -r data/icons/* $(DESTDIR)$(PREFIX)/share/cadence/icons/ | |||
@@ -1,7 +1,7 @@ | |||
# --- README for Cadence --- | |||
Cadence is a set of tools useful for audio production. <br/> | |||
It's being developed by falkTX, using Python3 and Qt4 (and some C++ where needed). | |||
It's being developed by falkTX, using Python3 and Qt5 (and some C++ where needed). | |||
The tools share the same base source code, so most of them look quite similar (which is intentional). <br/> | |||
Also, lots of custom widgets were coded when needed (like pixmapdial, pixmapkeyboard, patchcanvas and systray). <br/> | |||
@@ -10,8 +10,14 @@ CXX ?= g++ | |||
MOC ?= $(shell pkg-config --variable=moc_location QtCore) | |||
RCC ?= $(shell pkg-config --variable=rcc_location QtCore) | |||
UIC ?= $(shell pkg-config --variable=uic_location QtCore) | |||
STRIP ?= strip | |||
WINDRES ?= windres | |||
HOSTBINS = $(shell pkg-config --variable=host_bins Qt5Core) | |||
MOC ?= $(HOSTBINS)/moc | |||
RCC ?= $(HOSTBINS)/rcc | |||
UIC ?= $(HOSTBINS)/uic | |||
# -------------------------------------------------------------- | |||
DEBUG ?= false | |||
@@ -20,10 +26,12 @@ ifeq ($(DEBUG),true) | |||
BASE_FLAGS = -O0 -g -Wall -Wextra | |||
BASE_FLAGS += -DDEBUG | |||
else | |||
BASE_FLAGS = -O2 -ffast-math -mtune=generic -msse -mfpmath=sse -Wall -Wextra | |||
BASE_FLAGS = -O3 -ffast-math -Wall -Wextra | |||
BASE_FLAGS += -DNDEBUG | |||
endif | |||
BASE_FLAGS += -fPIC | |||
BUILD_C_FLAGS = $(BASE_FLAGS) -std=c99 $(CFLAGS) | |||
BUILD_CXX_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS) | |||
LINK_FLAGS = $(LDFLAGS) | |||
@@ -9,8 +9,8 @@ include ../Makefile.mk | |||
# -------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -I../widgets | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
ifeq ($(HAVE_JACKSESSION),true) | |||
BUILD_CXX_FLAGS += -DHAVE_JACKSESSION | |||
@@ -27,9 +27,9 @@ | |||
#include "../widgets/digitalpeakmeter.hpp" | |||
#include <cmath> | |||
#include <QtGui/QApplication> | |||
#include <QtGui/QIcon> | |||
#include <QtGui/QMessageBox> | |||
#include <QtWidgets/QApplication> | |||
#include <QtWidgets/QMessageBox> | |||
// ------------------------------- | |||
@@ -134,17 +134,13 @@ void reconnect_ports() | |||
} | |||
else | |||
{ | |||
if (jack_port_t* const jRecPort1 = jackbridge_port_by_name(jClient, "system:capture_1")) | |||
{ | |||
if (jackbridge_port_by_name(jClient, "system:capture_1") != nullptr) | |||
if (! jackbridge_port_connected_to(jPort1, "system:capture_1")) | |||
jackbridge_connect(jClient, "system:capture_1", nameIn1.toUtf8().constData()); | |||
} | |||
if (jack_port_t* const jRecPort2 = jackbridge_port_by_name(jClient, "system:capture_2")) | |||
{ | |||
if (jackbridge_port_by_name(jClient, "system:capture_2") != nullptr) | |||
if (! jackbridge_port_connected_to(jPort2, "system:capture_2")) | |||
jackbridge_connect(jClient, "system:capture_2", nameIn2.toUtf8().constData()); | |||
} | |||
} | |||
} | |||
@@ -19,7 +19,7 @@ | |||
#define __DIGITALPEAKMETER_HPP__ | |||
#include <QtCore/QTimer> | |||
#include <QtGui/QWidget> | |||
#include <QtWidgets/QWidget> | |||
class DigitalPeakMeter : public QWidget | |||
{ | |||
@@ -19,7 +19,7 @@ | |||
#define __PIXMAPDIAL_HPP__ | |||
#include <QtGui/QPixmap> | |||
#include <QtGui/QDial> | |||
#include <QtWidgets/QDial> | |||
class PixmapDial : public QDial | |||
{ | |||
@@ -20,7 +20,7 @@ | |||
#include <map> | |||
#include <QtGui/QPixmap> | |||
#include <QtGui/QWidget> | |||
#include <QtWidgets/QWidget> | |||
class PixmapKeyboard : public QWidget | |||
{ | |||
@@ -9,8 +9,8 @@ include ../Makefile.mk | |||
# -------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -I../widgets | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
ifeq ($(HAVE_JACKSESSION),true) | |||
BUILD_CXX_FLAGS += -DHAVE_JACKSESSION | |||
@@ -29,13 +29,13 @@ | |||
#include <QtCore/QSettings> | |||
#include <QtCore/QTimer> | |||
#include <QtGui/QApplication> | |||
#include <QtGui/QGraphicsItem> | |||
#include <QtGui/QGraphicsScene> | |||
#include <QtGui/QGraphicsSceneEvent> | |||
#include <QtGui/QKeyEvent> | |||
#include <QtGui/QMainWindow> | |||
#include <QtGui/QMessageBox> | |||
#include <QtWidgets/QApplication> | |||
#include <QtWidgets/QGraphicsItem> | |||
#include <QtWidgets/QGraphicsScene> | |||
#include <QtWidgets/QGraphicsSceneEvent> | |||
#include <QtWidgets/QMainWindow> | |||
#include <QtWidgets/QMessageBox> | |||
// ------------------------------- | |||
@@ -3,7 +3,7 @@ | |||
# Imports (Global) | |||
import dbus, signal, sys | |||
from PyQt4.QtCore import QCoreApplication, QObject | |||
from PyQt5.QtCore import QCoreApplication, QObject | |||
# DBus | |||
class DBus(object): | |||
@@ -98,6 +98,8 @@ class CadenceUnityApp(QObject): | |||
if __name__ == '__main__': | |||
# Imports (Unity) | |||
from gi import require_version as gi_require_version | |||
gi_require_version('Unity', '7.0') | |||
from gi.repository import Unity | |||
# App initialization | |||
@@ -782,13 +782,6 @@ | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QPushButton" name="b_a2j_export_hw"> | |||
<property name="text"> | |||
<string>Export HW...</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<spacer name="horizontalSpacer_8"> | |||
<property name="orientation"> | |||
@@ -823,16 +816,16 @@ | |||
</spacer> | |||
</item> | |||
<item> | |||
<widget class="QCheckBox" name="cb_a2j_autostart"> | |||
<widget class="QCheckBox" name="cb_a2j_autoexport"> | |||
<property name="text"> | |||
<string>Auto-start at login</string> | |||
<string>Export hardware ports</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QToolButton" name="tb_a2j_options"> | |||
<widget class="QCheckBox" name="cb_a2j_autostart"> | |||
<property name="text"> | |||
<string>...</string> | |||
<string>Start with Jack</string> | |||
</property> | |||
</widget> | |||
</item> | |||
@@ -419,7 +419,7 @@ | |||
<x>0</x> | |||
<y>0</y> | |||
<width>651</width> | |||
<height>19</height> | |||
<height>20</height> | |||
</rect> | |||
</property> | |||
<widget class="QMenu" name="menu_File"> | |||
@@ -483,7 +483,6 @@ | |||
<addaction name="separator"/> | |||
<addaction name="menu_Zoom"/> | |||
<addaction name="separator"/> | |||
<addaction name="act_canvas_print"/> | |||
<addaction name="act_canvas_save_image"/> | |||
</widget> | |||
<addaction name="menu_File"/> | |||
@@ -677,15 +676,6 @@ | |||
<string>Ctrl+G</string> | |||
</property> | |||
</action> | |||
<action name="act_canvas_print"> | |||
<property name="icon"> | |||
<iconset resource="../resources.qrc"> | |||
<normaloff>:/16x16/document-print.png</normaloff>:/16x16/document-print.png</iconset> | |||
</property> | |||
<property name="text"> | |||
<string>Print...</string> | |||
</property> | |||
</action> | |||
<action name="act_canvas_save_image"> | |||
<property name="text"> | |||
<string>Save Image...</string> | |||
@@ -458,7 +458,7 @@ | |||
<x>0</x> | |||
<y>0</y> | |||
<width>702</width> | |||
<height>19</height> | |||
<height>20</height> | |||
</rect> | |||
</property> | |||
<widget class="QMenu" name="menu_File"> | |||
@@ -501,7 +501,6 @@ | |||
<addaction name="act_canvas_refresh"/> | |||
<addaction name="menu_Canvas_Zoom"/> | |||
<addaction name="separator"/> | |||
<addaction name="act_canvas_print"/> | |||
<addaction name="act_canvas_save_image"/> | |||
</widget> | |||
<widget class="QMenu" name="menu_Tools"> | |||
@@ -940,15 +939,6 @@ | |||
<string>Save As &Template...</string> | |||
</property> | |||
</action> | |||
<action name="act_canvas_print"> | |||
<property name="icon"> | |||
<iconset resource="../resources.qrc"> | |||
<normaloff>:/16x16/document-print.png</normaloff>:/16x16/document-print.png</iconset> | |||
</property> | |||
<property name="text"> | |||
<string>&Print...</string> | |||
</property> | |||
</action> | |||
<action name="act_canvas_save_image"> | |||
<property name="text"> | |||
<string>Save &Image...</string> | |||
@@ -770,7 +770,7 @@ | |||
<x>0</x> | |||
<y>0</y> | |||
<width>877</width> | |||
<height>19</height> | |||
<height>20</height> | |||
</rect> | |||
</property> | |||
<widget class="QMenu" name="menu_Studio"> | |||
@@ -916,7 +916,6 @@ | |||
<addaction name="act_canvas_refresh"/> | |||
<addaction name="menu_Canvas_Zoom"/> | |||
<addaction name="separator"/> | |||
<addaction name="act_canvas_print"/> | |||
<addaction name="act_canvas_save_image"/> | |||
</widget> | |||
<addaction name="menu_Studio"/> | |||
@@ -1346,15 +1345,6 @@ | |||
<string>Ctrl+1</string> | |||
</property> | |||
</action> | |||
<action name="act_canvas_print"> | |||
<property name="icon"> | |||
<iconset resource="../resources.qrc"> | |||
<normaloff>:/16x16/document-print.png</normaloff>:/16x16/document-print.png</iconset> | |||
</property> | |||
<property name="text"> | |||
<string>Print...</string> | |||
</property> | |||
</action> | |||
<action name="act_canvas_save_image"> | |||
<property name="text"> | |||
<string>Save Image...</string> | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# Cadence, JACK utilities | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -20,8 +20,13 @@ | |||
# Imports (Global) | |||
from platform import architecture | |||
from PyQt4.QtCore import QFileSystemWatcher, QThread | |||
from PyQt4.QtGui import QApplication, QDialogButtonBox, QLabel, QMainWindow, QSizePolicy | |||
if True: | |||
from PyQt5.QtCore import QFileSystemWatcher, QThread, QSemaphore | |||
from PyQt5.QtWidgets import QApplication, QDialogButtonBox, QLabel, QMainWindow, QSizePolicy | |||
else: | |||
from PyQt4.QtCore import QFileSystemWatcher, QThread, QSemaphore | |||
from PyQt4.QtGui import QApplication, QDialogButtonBox, QLabel, QMainWindow, QSizePolicy | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -38,19 +43,16 @@ from shared_canvasjack import * | |||
from shared_settings import * | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Safe import getoutput | |||
# Import getoutput | |||
if sys.version_info >= (3, 0): | |||
from subprocess import getoutput | |||
else: | |||
from commands import getoutput | |||
from subprocess import getoutput | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Try Import DBus | |||
try: | |||
import dbus | |||
from dbus.mainloop.qt import DBusQtMainLoop | |||
from dbus.mainloop.pyqt5 import DBusQtMainLoop | |||
haveDBus = True | |||
except: | |||
haveDBus = False | |||
@@ -511,6 +513,8 @@ def initSystemChecks(): | |||
# Wait while JACK restarts | |||
class ForceRestartThread(QThread): | |||
progressChanged = pyqtSignal(int) | |||
def __init__(self, parent): | |||
QThread.__init__(self, parent) | |||
@@ -519,34 +523,43 @@ class ForceRestartThread(QThread): | |||
def wasJackStarted(self): | |||
return self.m_wasStarted | |||
def startA2J(self): | |||
if not gDBus.a2j.get_hw_export() and GlobalSettings.value("A2J/AutoExport", True, type=bool): | |||
gDBus.a2j.set_hw_export(True) | |||
gDBus.a2j.start() | |||
def run(self): | |||
# Not started yet | |||
self.m_wasStarted = False | |||
self.emit(SIGNAL("progressChanged(int)"), 0) | |||
self.progressChanged.emit(0) | |||
# Stop JACK safely first, if possible | |||
runFunctionInMainThread(tryCloseJackDBus) | |||
self.progressChanged.emit(20) | |||
# Kill All | |||
stopAllAudioProcesses() | |||
self.emit(SIGNAL("progressChanged(int)"), 30) | |||
stopAllAudioProcesses(False) | |||
self.progressChanged.emit(30) | |||
# Connect to jackdbus | |||
self.parent().DBusReconnect() | |||
runFunctionInMainThread(self.parent().DBusReconnect) | |||
if not gDBus.jack: | |||
return | |||
for x in range(30): | |||
self.emit(SIGNAL("progressChanged(int)"), 30+x*2) | |||
self.progressChanged.emit(30+x*2) | |||
procsList = getProcList() | |||
if "jackdbus" in procsList: | |||
break | |||
else: | |||
sleep(0.1) | |||
self.emit(SIGNAL("progressChanged(int)"), 90) | |||
self.progressChanged.emit(90) | |||
# Start it | |||
gDBus.jack.StartServer() | |||
self.emit(SIGNAL("progressChanged(int)"), 93) | |||
runFunctionInMainThread(gDBus.jack.StartServer) | |||
self.progressChanged.emit(93) | |||
# If we made it this far, then JACK is started | |||
self.m_wasStarted = True | |||
@@ -558,15 +571,13 @@ class ForceRestartThread(QThread): | |||
startAlsaAudioLoopBridge() | |||
sleep(0.5) | |||
self.emit(SIGNAL("progressChanged(int)"), 94) | |||
self.progressChanged.emit(94) | |||
# ALSA-MIDI | |||
if GlobalSettings.value("A2J/AutoStart", True, type=bool) and gDBus.a2j and not bool(gDBus.a2j.is_started()): | |||
a2jExportHW = GlobalSettings.value("A2J/ExportHW", True, type=bool) | |||
gDBus.a2j.set_hw_export(a2jExportHW) | |||
gDBus.a2j.start() | |||
if GlobalSettings.value("A2J/AutoStart", True, type=bool) and not bool(gDBus.a2j.is_started()): | |||
runFunctionInMainThread(self.startA2J) | |||
self.emit(SIGNAL("progressChanged(int)"), 96) | |||
self.progressChanged.emit(96) | |||
# PulseAudio | |||
if GlobalSettings.value("Pulse2JACK/AutoStart", True, type=bool) and not isPulseAudioBridged(): | |||
@@ -575,7 +586,7 @@ class ForceRestartThread(QThread): | |||
else: | |||
os.system("cadence-pulse2jack") | |||
self.emit(SIGNAL("progressChanged(int)"), 100) | |||
self.progressChanged.emit(100) | |||
# Force Restart Dialog | |||
class ForceWaitDialog(QDialog, ui_cadence_rwait.Ui_Dialog): | |||
@@ -587,8 +598,8 @@ class ForceWaitDialog(QDialog, ui_cadence_rwait.Ui_Dialog): | |||
self.rThread = ForceRestartThread(self) | |||
self.rThread.start() | |||
self.connect(self.rThread, SIGNAL("progressChanged(int)"), self.progressBar, SLOT("setValue(int)")) | |||
self.connect(self.rThread, SIGNAL("finished()"), SLOT("slot_rThreadFinished()")) | |||
self.rThread.progressChanged.connect(self.progressBar.setValue) | |||
self.rThread.finished.connect(self.slot_rThreadFinished) | |||
def DBusReconnect(self): | |||
self.parent().DBusReconnect() | |||
@@ -627,8 +638,8 @@ class ToolBarJackDialog(QDialog, ui_cadence_tb_jack.Ui_Dialog): | |||
if self.m_ladishLoaded: | |||
self.fillStudioNames() | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setOptions()")) | |||
self.connect(self.rb_ladish, SIGNAL("clicked()"), SLOT("slot_maybeFillStudioNames()")) | |||
self.accepted.connect(self.slot_setOptions) | |||
self.rb_ladish.clicked.connect(self.slot_maybeFillStudioNames) | |||
def fillStudioNames(self): | |||
gDBus.ladish_control = gDBus.bus.get_object("org.ladish", "/org/ladish/Control") | |||
@@ -690,7 +701,7 @@ class ToolBarAlsaAudioDialog(QDialog, ui_cadence_tb_alsa.Ui_Dialog): | |||
else: | |||
self.comboBox.setCurrentIndex(0) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setOptions()")) | |||
self.accepted.connect(self.slot_setOptions) | |||
@pyqtSlot() | |||
def slot_setOptions(self): | |||
@@ -706,24 +717,6 @@ class ToolBarAlsaAudioDialog(QDialog, ui_cadence_tb_alsa.Ui_Dialog): | |||
QDialog.done(self, r) | |||
self.close() | |||
# Additional ALSA MIDI options | |||
class ToolBarA2JDialog(QDialog, ui_cadence_tb_a2j.Ui_Dialog): | |||
def __init__(self, parent): | |||
QDialog.__init__(self, parent) | |||
self.setupUi(self) | |||
self.cb_export_hw.setChecked(GlobalSettings.value("A2J/ExportHW", True, type=bool)) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setOptions()")) | |||
@pyqtSlot() | |||
def slot_setOptions(self): | |||
GlobalSettings.setValue("A2J/ExportHW", self.cb_export_hw.isChecked()) | |||
def done(self, r): | |||
QDialog.done(self, r) | |||
self.close() | |||
# Additional PulseAudio options | |||
class ToolBarPADialog(QDialog, ui_cadence_tb_pa.Ui_Dialog): | |||
def __init__(self, parent): | |||
@@ -732,7 +725,7 @@ class ToolBarPADialog(QDialog, ui_cadence_tb_pa.Ui_Dialog): | |||
self.cb_playback_only.setChecked(GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool)) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setOptions()")) | |||
self.accepted.connect(self.slot_setOptions) | |||
@pyqtSlot() | |||
def slot_setOptions(self): | |||
@@ -744,6 +737,17 @@ class ToolBarPADialog(QDialog, ui_cadence_tb_pa.Ui_Dialog): | |||
# Main Window | |||
class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
DBusJackServerStartedCallback = pyqtSignal() | |||
DBusJackServerStoppedCallback = pyqtSignal() | |||
DBusJackClientAppearedCallback = pyqtSignal(int, str) | |||
DBusJackClientDisappearedCallback = pyqtSignal(int) | |||
DBusA2JBridgeStartedCallback = pyqtSignal() | |||
DBusA2JBridgeStoppedCallback = pyqtSignal() | |||
SIGTERM = pyqtSignal() | |||
SIGUSR1 = pyqtSignal() | |||
SIGUSR2 = pyqtSignal() | |||
def __init__(self, parent=None): | |||
QMainWindow.__init__(self, parent) | |||
self.setupUi(self) | |||
@@ -797,8 +801,8 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
if haveFreqSelector and os.path.exists(self.m_availGovPath) and os.path.exists(self.m_curGovPath): | |||
self.m_govWatcher = QFileSystemWatcher(self) | |||
self.m_govWatcher.addPath(self.m_curGovPath) | |||
self.connect(self.m_govWatcher, SIGNAL("fileChanged(const QString&)"), SLOT("slot_governorFileChanged()")) | |||
QTimer.singleShot(0, self, SLOT("slot_governorFileChanged()")) | |||
self.m_govWatcher.fileChanged.connect(self.slot_governorFileChanged) | |||
QTimer.singleShot(0, self.slot_governorFileChanged) | |||
availGovFd = open(self.m_availGovPath, "r") | |||
availGovRead = availGovFd.read().strip() | |||
@@ -887,7 +891,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.frame_tweaks_settings.setVisible(False) | |||
for i in range(self.tw_tweaks.rowCount()): | |||
self.tw_tweaks.item(0, i).setTextAlignment(Qt.AlignCenter) | |||
self.tw_tweaks.item(i, 0).setTextAlignment(Qt.AlignCenter) | |||
self.tw_tweaks.setCurrentCell(0, 0) | |||
@@ -1059,7 +1063,6 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.systray.addMenu("a2j", self.tr("ALSA MIDI Bridge")) | |||
self.systray.addMenuAction("a2j", "a2j_start", self.tr("Start")) | |||
self.systray.addMenuAction("a2j", "a2j_stop", self.tr("Stop")) | |||
self.systray.addMenuAction("a2j", "a2j_export_hw", self.tr("Export Hardware Ports...")) | |||
self.systray.addMenu("pulse", self.tr("PulseAudio Bridge")) | |||
self.systray.addMenuAction("pulse", "pulse_start", self.tr("Start")) | |||
self.systray.addMenuAction("pulse", "pulse_stop", self.tr("Stop")) | |||
@@ -1081,7 +1084,6 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.systray.connect("alsa_stop", self.slot_AlsaBridgeStop) | |||
self.systray.connect("a2j_start", self.slot_A2JBridgeStart) | |||
self.systray.connect("a2j_stop", self.slot_A2JBridgeStop) | |||
self.systray.connect("a2j_export_hw", self.slot_A2JBridgeExportHW) | |||
self.systray.connect("pulse_start", self.slot_PulseAudioBridgeStart) | |||
self.systray.connect("pulse_stop", self.slot_PulseAudioBridgeStop) | |||
@@ -1097,14 +1099,14 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.systray.addMenuAction("tools", "app_xy-controller", "XY-Controller") | |||
self.systray.addSeparator("sep2") | |||
self.systray.connect("app_catarina", lambda tool="catarina": self.func_start_tool(tool)) | |||
self.systray.connect("app_catia", lambda tool="catia": self.func_start_tool(tool)) | |||
self.systray.connect("app_claudia", lambda tool="claudia": self.func_start_tool(tool)) | |||
self.systray.connect("app_logs", lambda tool="cadence-logs": self.func_start_tool(tool)) | |||
self.systray.connect("app_meter_in", lambda tool="cadence-jackmeter -in": self.func_start_tool(tool)) | |||
self.systray.connect("app_meter_out", lambda tool="cadence-jackmeter": self.func_start_tool(tool)) | |||
self.systray.connect("app_render", lambda tool="cadence-render": self.func_start_tool(tool)) | |||
self.systray.connect("app_xy-controller", lambda tool="cadence-xycontroller": self.func_start_tool(tool)) | |||
self.systray.connect("app_catarina", self.func_start_catarina) | |||
self.systray.connect("app_catia", self.func_start_catia) | |||
self.systray.connect("app_claudia", self.func_start_claudia) | |||
self.systray.connect("app_logs", self.func_start_logs) | |||
self.systray.connect("app_meter_in", self.func_start_jackmeter_in) | |||
self.systray.connect("app_meter_out", self.func_start_jackmeter) | |||
self.systray.connect("app_render", self.func_start_render) | |||
self.systray.connect("app_xy-controller", self.func_start_xycontroller) | |||
self.systray.setToolTip("Cadence") | |||
self.systray.show() | |||
@@ -1112,81 +1114,79 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
# ------------------------------------------------------------- | |||
# Set-up connections | |||
self.connect(self.b_jack_start, SIGNAL("clicked()"), SLOT("slot_JackServerStart()")) | |||
self.connect(self.b_jack_stop, SIGNAL("clicked()"), SLOT("slot_JackServerStop()")) | |||
self.connect(self.b_jack_restart, SIGNAL("clicked()"), SLOT("slot_JackServerForceRestart()")) | |||
self.connect(self.b_jack_configure, SIGNAL("clicked()"), SLOT("slot_JackServerConfigure()")) | |||
self.connect(self.b_jack_switchmaster, SIGNAL("clicked()"), SLOT("slot_JackServerSwitchMaster()")) | |||
self.connect(self.tb_jack_options, SIGNAL("clicked()"), SLOT("slot_JackOptions()")) | |||
self.connect(self.b_alsa_start, SIGNAL("clicked()"), SLOT("slot_AlsaBridgeStart()")) | |||
self.connect(self.b_alsa_stop, SIGNAL("clicked()"), SLOT("slot_AlsaBridgeStop()")) | |||
self.connect(self.cb_alsa_type, SIGNAL("currentIndexChanged(int)"), SLOT("slot_AlsaBridgeChanged(int)")) | |||
self.connect(self.tb_alsa_options, SIGNAL("clicked()"), SLOT("slot_AlsaAudioBridgeOptions()")) | |||
self.connect(self.b_a2j_start, SIGNAL("clicked()"), SLOT("slot_A2JBridgeStart()")) | |||
self.connect(self.b_a2j_stop, SIGNAL("clicked()"), SLOT("slot_A2JBridgeStop()")) | |||
self.connect(self.b_a2j_export_hw, SIGNAL("clicked()"), SLOT("slot_A2JBridgeExportHW()")) | |||
self.connect(self.tb_a2j_options, SIGNAL("clicked()"), SLOT("slot_A2JBridgeOptions()")) | |||
self.connect(self.b_pulse_start, SIGNAL("clicked()"), SLOT("slot_PulseAudioBridgeStart()")) | |||
self.connect(self.b_pulse_stop, SIGNAL("clicked()"), SLOT("slot_PulseAudioBridgeStop()")) | |||
self.connect(self.tb_pulse_options, SIGNAL("clicked()"), SLOT("slot_PulseAudioBridgeOptions()")) | |||
self.connect(self.pic_catia, SIGNAL("clicked()"), lambda tool="catia": self.func_start_tool(tool)) | |||
self.connect(self.pic_claudia, SIGNAL("clicked()"), lambda tool="claudia": self.func_start_tool(tool)) | |||
self.connect(self.pic_meter_in, SIGNAL("clicked()"), lambda tool="cadence-jackmeter -in": self.func_start_tool(tool)) | |||
self.connect(self.pic_meter_out, SIGNAL("clicked()"), lambda tool="cadence-jackmeter": self.func_start_tool(tool)) | |||
self.connect(self.pic_logs, SIGNAL("clicked()"), lambda tool="cadence-logs": self.func_start_tool(tool)) | |||
self.connect(self.pic_render, SIGNAL("clicked()"), lambda tool="cadence-render": self.func_start_tool(tool)) | |||
self.connect(self.pic_xycontroller, SIGNAL("clicked()"), lambda tool="cadence-xycontroller": self.func_start_tool(tool)) | |||
self.connect(self.b_tweaks_apply_now, SIGNAL("clicked()"), SLOT("slot_tweaksApply()")) | |||
self.connect(self.b_tweak_plugins_add, SIGNAL("clicked()"), SLOT("slot_tweakPluginAdd()")) | |||
self.connect(self.b_tweak_plugins_change, SIGNAL("clicked()"), SLOT("slot_tweakPluginChange()")) | |||
self.connect(self.b_tweak_plugins_remove, SIGNAL("clicked()"), SLOT("slot_tweakPluginRemove()")) | |||
self.connect(self.b_tweak_plugins_reset, SIGNAL("clicked()"), SLOT("slot_tweakPluginReset()")) | |||
self.connect(self.tb_tweak_plugins, SIGNAL("currentChanged(int)"), SLOT("slot_tweakPluginTypeChanged(int)")) | |||
self.connect(self.list_LADSPA, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsLadspaRowChanged(int)")) | |||
self.connect(self.list_DSSI, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsDssiRowChanged(int)")) | |||
self.connect(self.list_LV2, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsLv2RowChanged(int)")) | |||
self.connect(self.list_VST, SIGNAL("currentRowChanged(int)"), SLOT("slot_tweakPluginsVstRowChanged(int)")) | |||
self.connect(self.ch_app_image, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_apps()")) | |||
self.connect(self.cb_app_image, SIGNAL("highlighted(int)"), SLOT("slot_tweakAppImageHighlighted(int)")) | |||
self.connect(self.cb_app_image, SIGNAL("currentIndexChanged(int)"), SLOT("slot_tweakAppImageChanged(int)")) | |||
self.connect(self.ch_app_music, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_apps()")) | |||
self.connect(self.cb_app_music, SIGNAL("highlighted(int)"), SLOT("slot_tweakAppMusicHighlighted(int)")) | |||
self.connect(self.cb_app_music, SIGNAL("currentIndexChanged(int)"), SLOT("slot_tweakAppMusicChanged(int)")) | |||
self.connect(self.ch_app_video, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_apps()")) | |||
self.connect(self.cb_app_video, SIGNAL("highlighted(int)"), SLOT("slot_tweakAppVideoHighlighted(int)")) | |||
self.connect(self.cb_app_video, SIGNAL("currentIndexChanged(int)"), SLOT("slot_tweakAppVideoChanged(int)")) | |||
self.connect(self.ch_app_text, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_apps()")) | |||
self.connect(self.cb_app_text, SIGNAL("highlighted(int)"), SLOT("slot_tweakAppTextHighlighted(int)")) | |||
self.connect(self.cb_app_text, SIGNAL("currentIndexChanged(int)"), SLOT("slot_tweakAppTextChanged(int)")) | |||
self.connect(self.ch_app_browser, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_apps()")) | |||
self.connect(self.cb_app_browser, SIGNAL("highlighted(int)"), SLOT("slot_tweakAppBrowserHighlighted(int)")) | |||
self.connect(self.cb_app_browser, SIGNAL("currentIndexChanged(int)"),SLOT("slot_tweakAppBrowserChanged(int)")) | |||
self.connect(self.sb_wineasio_ins, SIGNAL("valueChanged(int)"), SLOT("slot_tweaksSettingsChanged_wineasio()")) | |||
self.connect(self.sb_wineasio_outs, SIGNAL("valueChanged(int)"), SLOT("slot_tweaksSettingsChanged_wineasio()")) | |||
self.connect(self.cb_wineasio_hw, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_wineasio()")) | |||
self.connect(self.cb_wineasio_autostart, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_wineasio()")) | |||
self.connect(self.cb_wineasio_fixed_bsize, SIGNAL("clicked()"), SLOT("slot_tweaksSettingsChanged_wineasio()")) | |||
self.connect(self.cb_wineasio_bsizes, SIGNAL("currentIndexChanged(int)"), SLOT("slot_tweaksSettingsChanged_wineasio()")) | |||
self.b_jack_start.clicked.connect(self.slot_JackServerStart) | |||
self.b_jack_stop.clicked.connect(self.slot_JackServerStop) | |||
self.b_jack_restart.clicked.connect(self.slot_JackServerForceRestart) | |||
self.b_jack_configure.clicked.connect(self.slot_JackServerConfigure) | |||
self.b_jack_switchmaster.clicked.connect(self.slot_JackServerSwitchMaster) | |||
self.tb_jack_options.clicked.connect(self.slot_JackOptions) | |||
self.b_alsa_start.clicked.connect(self.slot_AlsaBridgeStart) | |||
self.b_alsa_stop.clicked.connect(self.slot_AlsaBridgeStop) | |||
self.cb_alsa_type.currentIndexChanged[int].connect(self.slot_AlsaBridgeChanged) | |||
self.tb_alsa_options.clicked.connect(self.slot_AlsaAudioBridgeOptions) | |||
self.b_a2j_start.clicked.connect(self.slot_A2JBridgeStart) | |||
self.b_a2j_stop.clicked.connect(self.slot_A2JBridgeStop) | |||
self.b_pulse_start.clicked.connect(self.slot_PulseAudioBridgeStart) | |||
self.b_pulse_stop.clicked.connect(self.slot_PulseAudioBridgeStop) | |||
self.tb_pulse_options.clicked.connect(self.slot_PulseAudioBridgeOptions) | |||
self.pic_catia.clicked.connect(self.func_start_catia) | |||
self.pic_claudia.clicked.connect(self.func_start_claudia) | |||
self.pic_meter_in.clicked.connect(self.func_start_jackmeter_in) | |||
self.pic_meter_out.clicked.connect(self.func_start_jackmeter) | |||
self.pic_logs.clicked.connect(self.func_start_logs) | |||
self.pic_render.clicked.connect(self.func_start_render) | |||
self.pic_xycontroller.clicked.connect(self.func_start_xycontroller) | |||
self.b_tweaks_apply_now.clicked.connect(self.slot_tweaksApply) | |||
self.b_tweak_plugins_add.clicked.connect(self.slot_tweakPluginAdd) | |||
self.b_tweak_plugins_change.clicked.connect(self.slot_tweakPluginChange) | |||
self.b_tweak_plugins_remove.clicked.connect(self.slot_tweakPluginRemove) | |||
self.b_tweak_plugins_reset.clicked.connect(self.slot_tweakPluginReset) | |||
self.tb_tweak_plugins.currentChanged.connect(self.slot_tweakPluginTypeChanged) | |||
self.list_LADSPA.currentRowChanged.connect(self.slot_tweakPluginsLadspaRowChanged) | |||
self.list_DSSI.currentRowChanged.connect(self.slot_tweakPluginsDssiRowChanged) | |||
self.list_LV2.currentRowChanged.connect(self.slot_tweakPluginsLv2RowChanged) | |||
self.list_VST.currentRowChanged.connect(self.slot_tweakPluginsVstRowChanged) | |||
self.ch_app_image.clicked.connect(self.slot_tweaksSettingsChanged_apps) | |||
self.cb_app_image.highlighted.connect(self.slot_tweakAppImageHighlighted) | |||
self.cb_app_image.currentIndexChanged[int].connect(self.slot_tweakAppImageChanged) | |||
self.ch_app_music.clicked.connect(self.slot_tweaksSettingsChanged_apps) | |||
self.cb_app_music.highlighted.connect(self.slot_tweakAppMusicHighlighted) | |||
self.cb_app_music.currentIndexChanged[int].connect(self.slot_tweakAppMusicChanged) | |||
self.ch_app_video.clicked.connect(self.slot_tweaksSettingsChanged_apps) | |||
self.cb_app_video.highlighted.connect(self.slot_tweakAppVideoHighlighted) | |||
self.cb_app_video.currentIndexChanged[int].connect(self.slot_tweakAppVideoChanged) | |||
self.ch_app_text.clicked.connect(self.slot_tweaksSettingsChanged_apps) | |||
self.cb_app_text.highlighted.connect(self.slot_tweakAppTextHighlighted) | |||
self.cb_app_text.currentIndexChanged[int].connect(self.slot_tweakAppTextChanged) | |||
self.ch_app_browser.clicked.connect(self.slot_tweaksSettingsChanged_apps) | |||
self.cb_app_browser.highlighted.connect(self.slot_tweakAppBrowserHighlighted) | |||
self.cb_app_browser.currentIndexChanged[int].connect(self.slot_tweakAppBrowserChanged) | |||
self.sb_wineasio_ins.valueChanged.connect(self.slot_tweaksSettingsChanged_wineasio) | |||
self.sb_wineasio_outs.valueChanged.connect(self.slot_tweaksSettingsChanged_wineasio) | |||
self.cb_wineasio_hw.clicked.connect(self.slot_tweaksSettingsChanged_wineasio) | |||
self.cb_wineasio_autostart.clicked.connect(self.slot_tweaksSettingsChanged_wineasio) | |||
self.cb_wineasio_fixed_bsize.clicked.connect(self.slot_tweaksSettingsChanged_wineasio) | |||
self.cb_wineasio_bsizes.currentIndexChanged[int].connect(self.slot_tweaksSettingsChanged_wineasio) | |||
# org.jackaudio.JackControl | |||
self.connect(self, SIGNAL("DBusJackServerStartedCallback()"), SLOT("slot_DBusJackServerStartedCallback()")) | |||
self.connect(self, SIGNAL("DBusJackServerStoppedCallback()"), SLOT("slot_DBusJackServerStoppedCallback()")) | |||
self.DBusJackServerStartedCallback.connect(self.slot_DBusJackServerStartedCallback) | |||
self.DBusJackServerStoppedCallback.connect(self.slot_DBusJackServerStoppedCallback) | |||
# org.jackaudio.JackPatchbay | |||
self.connect(self, SIGNAL("DBusJackClientAppearedCallback(int, QString)"), SLOT("slot_DBusJackClientAppearedCallback(int, QString)")) | |||
self.connect(self, SIGNAL("DBusJackClientDisappearedCallback(int)"), SLOT("slot_DBusJackClientDisappearedCallback(int)")) | |||
self.DBusJackClientAppearedCallback.connect(self.slot_DBusJackClientAppearedCallback) | |||
self.DBusJackClientDisappearedCallback.connect(self.slot_DBusJackClientDisappearedCallback) | |||
# org.gna.home.a2jmidid.control | |||
self.connect(self, SIGNAL("DBusA2JBridgeStartedCallback()"), SLOT("slot_DBusA2JBridgeStartedCallback()")) | |||
self.connect(self, SIGNAL("DBusA2JBridgeStoppedCallback()"), SLOT("slot_DBusA2JBridgeStoppedCallback()")) | |||
self.DBusA2JBridgeStartedCallback.connect(self.slot_DBusA2JBridgeStartedCallback) | |||
self.DBusA2JBridgeStoppedCallback.connect(self.slot_DBusA2JBridgeStoppedCallback) | |||
self.cb_a2j_autoexport.stateChanged[int].connect(self.slot_A2JBridgeExportHW) | |||
# ------------------------------------------------------------- | |||
@@ -1267,6 +1267,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
else: | |||
self.toolBox_alsamidi.setEnabled(False) | |||
self.cb_a2j_autostart.setChecked(False) | |||
self.cb_a2j_autoexport.setChecked(False) | |||
self.label_bridge_a2j.setText("ALSA MIDI Bridge is not installed") | |||
self.settings.setValue("A2J/AutoStart", False) | |||
@@ -1279,35 +1280,35 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
if not newId: | |||
# Something crashed | |||
if appInterface == "org.jackaudio.service": | |||
QTimer.singleShot(0, self, SLOT("slot_handleCrash_jack()")) | |||
QTimer.singleShot(0, self.slot_handleCrash_jack) | |||
elif appInterface == "org.gna.home.a2jmidid": | |||
QTimer.singleShot(0, self, SLOT("slot_handleCrash_a2j()")) | |||
QTimer.singleShot(0, self.slot_handleCrash_a2j) | |||
elif kwds['interface'] == "org.jackaudio.JackControl": | |||
if DEBUG: print("org.jackaudio.JackControl", kwds['member']) | |||
if kwds['member'] == "ServerStarted": | |||
self.emit(SIGNAL("DBusJackServerStartedCallback()")) | |||
self.DBusJackServerStartedCallback.emit() | |||
elif kwds['member'] == "ServerStopped": | |||
self.emit(SIGNAL("DBusJackServerStoppedCallback()")) | |||
self.DBusJackServerStoppedCallback.emit() | |||
elif kwds['interface'] == "org.jackaudio.JackPatchbay": | |||
if gDBus.patchbay and kwds['path'] == gDBus.patchbay.object_path: | |||
if DEBUG: print("org.jackaudio.JackPatchbay,", kwds['member']) | |||
if kwds['member'] == "ClientAppeared": | |||
self.emit(SIGNAL("DBusJackClientAppearedCallback(int, QString)"), args[iJackClientId], args[iJackClientName]) | |||
self.DBusJackClientAppearedCallback.emit(args[iJackClientId], args[iJackClientName]) | |||
elif kwds['member'] == "ClientDisappeared": | |||
self.emit(SIGNAL("DBusJackClientDisappearedCallback(int)"), args[iJackClientId]) | |||
self.DBusJackClientDisappearedCallback.emit(args[iJackClientId]) | |||
elif kwds['interface'] == "org.gna.home.a2jmidid.control": | |||
if DEBUG: print("org.gna.home.a2jmidid.control", kwds['member']) | |||
if kwds['member'] == "bridge_started": | |||
self.emit(SIGNAL("DBusA2JBridgeStartedCallback()")) | |||
self.DBusA2JBridgeStartedCallback.emit() | |||
elif kwds['member'] == "bridge_stopped": | |||
self.emit(SIGNAL("DBusA2JBridgeStoppedCallback()")) | |||
self.DBusA2JBridgeStoppedCallback.emit() | |||
def jackStarted(self): | |||
self.m_last_dsp_load = gDBus.jack.GetLoad() | |||
self.m_last_xruns = gDBus.jack.GetXruns() | |||
self.m_last_xruns = int(gDBus.jack.GetXruns()) | |||
self.m_last_buffer_size = gDBus.jack.GetBufferSize() | |||
self.b_jack_start.setEnabled(False) | |||
@@ -1335,8 +1336,15 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.m_timer500 = self.startTimer(500) | |||
if gDBus.a2j and not gDBus.a2j.is_started(): | |||
self.b_a2j_start.setEnabled(True) | |||
self.systray.setActionEnabled("a2j_start", True) | |||
portsExported = bool(gDBus.a2j.get_hw_export()) | |||
if GlobalSettings.value("A2J/AutoStart", True, type=bool): | |||
if not portsExported and GlobalSettings.value("A2J/AutoExport", True, type=bool): | |||
gDBus.a2j.set_hw_export(True) | |||
portsExported = True | |||
gDBus.a2j.start() | |||
else: | |||
self.b_a2j_start.setEnabled(True) | |||
self.systray.setActionEnabled("a2j_start", True) | |||
self.checkAlsaAudio() | |||
self.checkPulseAudio() | |||
@@ -1382,20 +1390,19 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
def a2jStarted(self): | |||
self.b_a2j_start.setEnabled(False) | |||
self.b_a2j_stop.setEnabled(True) | |||
self.b_a2j_export_hw.setEnabled(False) | |||
self.systray.setActionEnabled("a2j_start", False) | |||
self.systray.setActionEnabled("a2j_stop", True) | |||
self.systray.setActionEnabled("a2j_export_hw", False) | |||
self.label_bridge_a2j.setText(self.tr("ALSA MIDI Bridge is running")) | |||
if bool(gDBus.a2j.get_hw_export()): | |||
self.label_bridge_a2j.setText(self.tr("ALSA MIDI Bridge is running, ports are exported")) | |||
else : | |||
self.label_bridge_a2j.setText(self.tr("ALSA MIDI Bridge is running")) | |||
def a2jStopped(self): | |||
jackRunning = bool(gDBus.jack and gDBus.jack.IsStarted()) | |||
self.b_a2j_start.setEnabled(jackRunning) | |||
self.b_a2j_stop.setEnabled(False) | |||
self.b_a2j_export_hw.setEnabled(True) | |||
self.systray.setActionEnabled("a2j_start", jackRunning) | |||
self.systray.setActionEnabled("a2j_stop", False) | |||
self.systray.setActionEnabled("a2j_export_hw", True) | |||
self.label_bridge_a2j.setText(self.tr("ALSA MIDI Bridge is stopped")) | |||
def checkAlsaAudio(self): | |||
@@ -1511,24 +1518,54 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.label_app_comment.setText(comment) | |||
def updateSystrayTooltip(self): | |||
systrayText = "<table>" | |||
#systrayText += "<tr><td align='center' colspan='2'><h4>Cadence</h4></td></tr>" | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("JACK Status"), self.label_jack_status.text()) | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("Realtime"), self.label_jack_realtime.text()) | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("DSP Load"), self.label_jack_dsp.text()) | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("Xruns"), self.label_jack_xruns.text()) | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("Buffer Size"), self.label_jack_bfsize.text()) | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("Sample Rate"), self.label_jack_srate.text()) | |||
systrayText += "<tr><td align='right'>%s:</td><td>%s</td></tr>" % (self.tr("Block Latency"), self.label_jack_latency.text()) | |||
systrayText += "</table>" | |||
systrayText = "Cadence<br/>" | |||
systrayText += "<font size=\"-1\">" | |||
systrayText += "<b>%s:</b> %s<br/>" % (self.tr("JACK Status"), self.label_jack_status.text()) | |||
systrayText += "<b>%s:</b> %s<br/>" % (self.tr("Realtime"), self.label_jack_realtime.text()) | |||
systrayText += "<b>%s:</b> %s<br/>" % (self.tr("DSP Load"), self.label_jack_dsp.text()) | |||
systrayText += "<b>%s:</b> %s<br/>" % (self.tr("Xruns"), self.label_jack_xruns.text()) | |||
systrayText += "<b>%s:</b> %s<br/>" % (self.tr("Buffer Size"), self.label_jack_bfsize.text()) | |||
systrayText += "<b>%s:</b> %s<br/>" % (self.tr("Sample Rate"), self.label_jack_srate.text()) | |||
systrayText += "<b>%s:</b> %s" % (self.tr("Block Latency"), self.label_jack_latency.text()) | |||
systrayText += "</font><font size=\"-2\"><br/></font>" | |||
self.systray.setToolTip(systrayText) | |||
@pyqtSlot() | |||
def func_start_catarina(self): | |||
self.func_start_tool("catarina") | |||
@pyqtSlot() | |||
def func_start_catia(self): | |||
self.func_start_tool("catia") | |||
@pyqtSlot() | |||
def func_start_claudia(self): | |||
self.func_start_tool("claudia") | |||
@pyqtSlot() | |||
def func_start_logs(self): | |||
self.func_start_tool("cadence-logs") | |||
@pyqtSlot() | |||
def func_start_jackmeter(self): | |||
self.func_start_tool("cadence-jackmeter") | |||
@pyqtSlot() | |||
def func_start_jackmeter_in(self): | |||
self.func_start_tool("cadence-jackmeter -in") | |||
@pyqtSlot() | |||
def func_start_render(self): | |||
self.func_start_tool("cadence-render") | |||
@pyqtSlot() | |||
def func_start_xycontroller(self): | |||
self.func_start_tool("cadence-xycontroller") | |||
def func_start_tool(self, tool): | |||
if sys.argv[0].endswith(".py"): | |||
if tool == "cadence-jacksettings": | |||
tool = "jacksettings" | |||
elif tool == "cadence-logs": | |||
if tool == "cadence-logs": | |||
tool = "logs" | |||
elif tool == "cadence-render": | |||
tool = "render" | |||
@@ -1616,6 +1653,8 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
@pyqtSlot() | |||
def slot_JackServerStop(self): | |||
if gDBus.a2j and bool(gDBus.a2j.is_started()): | |||
gDBus.a2j.stop() | |||
try: | |||
gDBus.jack.StopServer() | |||
except: | |||
@@ -1735,18 +1774,17 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
def slot_A2JBridgeStop(self): | |||
gDBus.a2j.stop() | |||
@pyqtSlot() | |||
def slot_A2JBridgeExportHW(self): | |||
ask = QMessageBox.question(self, self.tr("ALSA MIDI Hardware Export"), self.tr("Enable Hardware Export on the ALSA MIDI Bridge?"), QMessageBox.Yes|QMessageBox.No|QMessageBox.Cancel, QMessageBox.Yes) | |||
@pyqtSlot(int) | |||
def slot_A2JBridgeExportHW(self, state): | |||
a2jWasStarted = bool(gDBus.a2j.is_started()) | |||
if ask == QMessageBox.Yes: | |||
gDBus.a2j.set_hw_export(True) | |||
elif ask == QMessageBox.No: | |||
gDBus.a2j.set_hw_export(False) | |||
if a2jWasStarted: | |||
gDBus.a2j.stop() | |||
@pyqtSlot() | |||
def slot_A2JBridgeOptions(self): | |||
ToolBarA2JDialog(self).exec_() | |||
gDBus.a2j.set_hw_export(bool(state)) | |||
if a2jWasStarted: | |||
gDBus.a2j.start() | |||
@pyqtSlot() | |||
def slot_PulseAudioBridgeStart(self): | |||
@@ -1789,7 +1827,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
if self.cb_cpufreq.currentIndex() == -1: | |||
# First init | |||
self.connect(self.cb_cpufreq, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_changeGovernorMode(QString)")) | |||
self.cb_cpufreq.currentIndexChanged[str].connect(self.slot_changeGovernorMode) | |||
self.cb_cpufreq.blockSignals(True) | |||
@@ -2077,7 +2115,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.setAppDetails(self.cb_app_image.itemText(index)) | |||
@pyqtSlot(int) | |||
def slot_tweakAppImageChanged(self): | |||
def slot_tweakAppImageChanged(self, ignored): | |||
self.setAppDetails(self.cb_app_image.currentText()) | |||
self.func_settings_changed("apps") | |||
@@ -2086,7 +2124,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.setAppDetails(self.cb_app_music.itemText(index)) | |||
@pyqtSlot(int) | |||
def slot_tweakAppMusicChanged(self): | |||
def slot_tweakAppMusicChanged(self, ignored): | |||
self.setAppDetails(self.cb_app_music.currentText()) | |||
self.func_settings_changed("apps") | |||
@@ -2095,7 +2133,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.setAppDetails(self.cb_app_video.itemText(index)) | |||
@pyqtSlot(int) | |||
def slot_tweakAppVideoChanged(self): | |||
def slot_tweakAppVideoChanged(self, ignored): | |||
self.setAppDetails(self.cb_app_video.currentText()) | |||
self.func_settings_changed("apps") | |||
@@ -2104,7 +2142,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.setAppDetails(self.cb_app_text.itemText(index)) | |||
@pyqtSlot(int) | |||
def slot_tweakAppTextChanged(self): | |||
def slot_tweakAppTextChanged(self, ignored): | |||
self.setAppDetails(self.cb_app_text.currentText()) | |||
self.func_settings_changed("apps") | |||
@@ -2113,7 +2151,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.setAppDetails(self.cb_app_browser.itemText(index)) | |||
@pyqtSlot(int) | |||
def slot_tweakAppBrowserChanged(self): | |||
def slot_tweakAppBrowserChanged(self, ignored): | |||
self.setAppDetails(self.cb_app_browser.currentText()) | |||
self.func_settings_changed("apps") | |||
@@ -2251,23 +2289,25 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
GlobalSettings.setValue("JACK/AutoStart", self.cb_jack_autostart.isChecked()) | |||
GlobalSettings.setValue("ALSA-Audio/BridgeIndexType", self.cb_alsa_type.currentIndex()) | |||
GlobalSettings.setValue("A2J/AutoStart", self.cb_a2j_autostart.isChecked()) | |||
GlobalSettings.setValue("A2J/AutoExport", self.cb_a2j_autoexport.isChecked()) | |||
GlobalSettings.setValue("Pulse2JACK/AutoStart", (havePulseAudio and self.cb_pulse_autostart.isChecked())) | |||
def loadSettings(self, geometry): | |||
if geometry: | |||
self.restoreGeometry(self.settings.value("Geometry", "")) | |||
self.restoreGeometry(self.settings.value("Geometry", b"")) | |||
usingAlsaLoop = bool(GlobalSettings.value("ALSA-Audio/BridgeIndexType", iAlsaFileNone, type=int) == iAlsaFileLoop) | |||
self.cb_jack_autostart.setChecked(GlobalSettings.value("JACK/AutoStart", False, type=bool)) | |||
self.cb_jack_autostart.setChecked(GlobalSettings.value("JACK/AutoStart", wantJackStart, type=bool)) | |||
self.cb_a2j_autostart.setChecked(GlobalSettings.value("A2J/AutoStart", True, type=bool)) | |||
self.cb_a2j_autoexport.setChecked(GlobalSettings.value("A2J/AutoExport", True, type=bool)) | |||
self.cb_pulse_autostart.setChecked(GlobalSettings.value("Pulse2JACK/AutoStart", havePulseAudio and not usingAlsaLoop, type=bool)) | |||
def timerEvent(self, event): | |||
if event.timerId() == self.m_timer500: | |||
if gDBus.jack and self.m_last_dsp_load != None: | |||
next_dsp_load = gDBus.jack.GetLoad() | |||
next_xruns = gDBus.jack.GetXruns() | |||
next_xruns = int(gDBus.jack.GetXruns()) | |||
needUpdateTip = False | |||
if self.m_last_dsp_load != next_dsp_load: | |||
@@ -2301,6 +2341,18 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
self.saveSettings() | |||
self.systray.handleQtCloseEvent(event) | |||
# ------------------------------------------------------------------------------------------------------------ | |||
def runFunctionInMainThread(task): | |||
waiter = QSemaphore(1) | |||
def taskInMainThread(): | |||
task() | |||
waiter.release() | |||
QTimer.singleShot(0, taskInMainThread) | |||
waiter.tryAcquire() | |||
#--------------- main ------------------ | |||
if __name__ == '__main__': | |||
# App initialization | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# Cadence ALSA-Loop daemon | |||
# Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2012-2018 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 | |||
@@ -23,7 +23,11 @@ import os | |||
import sys | |||
from signal import signal, SIGINT, SIGTERM | |||
from time import sleep | |||
from PyQt4.QtCore import QProcess | |||
if True: | |||
from PyQt5.QtCore import QProcess | |||
else: | |||
from PyQt4.QtCore import QProcess | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -3,7 +3,10 @@ | |||
# Imports (Global) | |||
import dbus, sys | |||
from PyQt4.QtCore import QCoreApplication | |||
if True: | |||
from PyQt5.QtCore import QCoreApplication | |||
else: | |||
from PyQt4.QtCore import QCoreApplication | |||
# Imports (Custom Stuff) | |||
from shared_cadence import * | |||
@@ -43,7 +46,7 @@ def forceReset(): | |||
# Start JACK, A2J and Pulse, according to user settings | |||
def startSession(systemStarted, secondSystemStartAttempt): | |||
# Check if JACK is set to auto-start | |||
if systemStarted and not GlobalSettings.value("JACK/AutoStart", False, type=bool): | |||
if systemStarted and not GlobalSettings.value("JACK/AutoStart", wantJackStart, type=bool): | |||
print("JACK is set to NOT auto-start on login") | |||
return True | |||
@@ -1,8 +1,8 @@ | |||
#!/usr/bin/env python3 | |||
# -*- coding: utf-8 -*- | |||
# Custom Mini Canvas Preview, a custom Qt4 widget | |||
# Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||
# Custom Mini Canvas Preview, a custom Qt widget | |||
# Copyright (C) 2011-2018 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 | |||
@@ -19,8 +19,14 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import Qt, QRectF, QTimer, SIGNAL, SLOT | |||
from PyQt4.QtGui import QBrush, QColor, QCursor, QFrame, QPainter, QPen | |||
if True: | |||
from PyQt5.QtCore import pyqtSignal, Qt, QRectF, QTimer | |||
from PyQt5.QtGui import QBrush, QColor, QCursor, QPainter, QPen | |||
from PyQt5.QtWidgets import QFrame | |||
else: | |||
from PyQt4.QtCore import pyqtSignal, Qt, QRectF, QTimer | |||
from PyQt4.QtGui import QBrush, QColor, QCursor, QPainter, QPen | |||
from PyQt4.QtGui import QFrame | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Static Variables | |||
@@ -34,6 +40,8 @@ iHeight = 3 | |||
# Widget Class | |||
class CanvasPreviewFrame(QFrame): | |||
miniCanvasMoved = pyqtSignal(float, float) | |||
def __init__(self, parent): | |||
QFrame.__init__(self, parent) | |||
@@ -97,7 +105,7 @@ class CanvasPreviewFrame(QFrame): | |||
def setViewScale(self, scale): | |||
self.fScale = scale | |||
QTimer.singleShot(0, self.fRealParent, SLOT("slot_miniCanvasCheckAll()")) | |||
QTimer.singleShot(0, self.fRealParent.slot_miniCanvasCheckAll) | |||
def setViewSize(self, width, height): | |||
self.fViewRect[iWidth] = width * self.fFakeWidth | |||
@@ -137,7 +145,7 @@ class CanvasPreviewFrame(QFrame): | |||
self.fViewRect[iY] = y + self.fRenderSource.y() | |||
self.update() | |||
self.emit(SIGNAL("miniCanvasMoved(double, double)"), x * self.fScale / self.fFakeWidth, y * self.fScale / self.fFakeHeight) | |||
self.miniCanvasMoved.emit(x * self.fScale / self.fFakeWidth, y * self.fScale / self.fFakeHeight) | |||
def mousePressEvent(self, event): | |||
if event.button() == Qt.LeftButton: | |||
@@ -176,7 +184,7 @@ class CanvasPreviewFrame(QFrame): | |||
else: | |||
painter.setBrush(self.fViewBg) | |||
painter.setPen(self.fViewBg) | |||
painter.drawRoundRect(2, 2, self.width()-6, self.height()-6, 3, 3) | |||
painter.drawRoundedRect(2, 2, self.width()-6, self.height()-6, 3, 3) | |||
self.fScene.render(painter, self.fRenderSource, self.fRenderTarget, Qt.KeepAspectRatio) | |||
@@ -199,6 +207,8 @@ class CanvasPreviewFrame(QFrame): | |||
def resizeEvent(self, event): | |||
self.fRenderSource = self.getRenderSource() | |||
if self.fRealParent: | |||
QTimer.singleShot(0, self.fRealParent, SLOT("slot_miniCanvasCheckAll()")) | |||
if self.fRealParent is not None: | |||
QTimer.singleShot(0, self.fRealParent.slot_miniCanvasCheckAll) | |||
QFrame.resizeEvent(self, event) |
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# PatchCanvas test application | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,9 +19,14 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, QSettings | |||
from PyQt4.QtGui import QApplication, QDialog, QDialogButtonBox, QTableWidgetItem | |||
from PyQt4.QtXml import QDomDocument | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, QSettings | |||
from PyQt5.QtWidgets import QApplication, QDialog, QDialogButtonBox, QTableWidgetItem | |||
from PyQt5.QtXml import QDomDocument | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, QSettings | |||
from PyQt4.QtGui import QApplication, QDialog, QDialogButtonBox, QTableWidgetItem | |||
from PyQt4.QtXml import QDomDocument | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -42,7 +47,7 @@ from shared_settings import * | |||
# Try Import OpenGL | |||
try: | |||
from PyQt4.QtOpenGL import QGLWidget | |||
from PyQt5.QtOpenGL import QGLWidget | |||
hasGL = True | |||
except: | |||
hasGL = False | |||
@@ -86,8 +91,8 @@ class CatarinaAddGroupW(QDialog, ui_catarina_addgroup.Ui_CatarinaAddGroupW): | |||
for group in group_list: | |||
self.m_group_list_names.append(group[iGroupName]) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.le_group_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.le_group_name.textChanged.connect(self.slot_checkText) | |||
self.ret_group_name = "" | |||
self.ret_group_split = False | |||
@@ -127,9 +132,9 @@ class CatarinaRemoveGroupW(QDialog, ui_catarina_removegroup.Ui_CatarinaRemoveGro | |||
self.tw_group_list.setItem(index, 2, twi_group_split) | |||
index += 1 | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.tw_group_list, SIGNAL("cellDoubleClicked(int, int)"), SLOT("accept()")) | |||
self.connect(self.tw_group_list, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkCell(int)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.tw_group_list.cellDoubleClicked.connect(self.accept) | |||
self.tw_group_list.currentCellChanged.connect(self.slot_checkCell) | |||
self.ret_group_id = -1 | |||
@@ -163,15 +168,15 @@ class CatarinaRenameGroupW(QDialog, ui_catarina_renamegroup.Ui_CatarinaRenameGro | |||
self.cb_group_to_rename.addItem("%i - %s" % (group[iGroupId], group[iGroupName])) | |||
self.m_group_list_names.append(group[iGroupName]) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.cb_group_to_rename, SIGNAL("currentIndexChanged(int)"), SLOT("slot_checkItem()")) | |||
self.connect(self.le_new_group_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.cb_group_to_rename.currentIndexChanged[int].connect(self.slot_checkItem) | |||
self.le_new_group_name.textChanged.connect(self.slot_checkText) | |||
self.ret_group_id = -1 | |||
self.ret_new_group_name = "" | |||
@pyqtSlot() | |||
def slot_checkItem(self): | |||
@pyqtSlot(int) | |||
def slot_checkItem(self, ignored): | |||
self.slot_checkText(self.le_new_group_name.text()) | |||
@pyqtSlot(str) | |||
@@ -204,8 +209,8 @@ class CatarinaAddPortW(QDialog, ui_catarina_addport.Ui_CatarinaAddPortW): | |||
for group in group_list: | |||
self.cb_group.addItem("%i - %s" % (group[iGroupId], group[iGroupName])) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.le_port_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.le_port_name.textChanged.connect(self.slot_checkText) | |||
self.ret_group_id = -1 | |||
self.ret_port_name = "" | |||
@@ -243,15 +248,15 @@ class CatarinaRemovePortW(QDialog, ui_catarina_removeport.Ui_CatarinaRemovePortW | |||
self.m_group_list = group_list | |||
self.m_port_list = port_list | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.tw_port_list, SIGNAL("cellDoubleClicked(int, int)"), SLOT("accept()")) | |||
self.connect(self.tw_port_list, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkCell(int)")) | |||
self.connect(self.rb_input, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_output, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_audio_jack, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_midi_jack, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_midi_a2j, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_midi_alsa, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.tw_port_list.cellDoubleClicked.connect(self.accept) | |||
self.tw_port_list.currentCellChanged.connect(self.slot_checkCell) | |||
self.rb_input.clicked.connect(self.slot_reAddPorts) | |||
self.rb_output.clicked.connect(self.slot_reAddPorts) | |||
self.rb_audio_jack.clicked.connect(self.slot_reAddPorts) | |||
self.rb_midi_jack.clicked.connect(self.slot_reAddPorts) | |||
self.rb_midi_a2j.clicked.connect(self.slot_reAddPorts) | |||
self.rb_midi_alsa.clicked.connect(self.slot_reAddPorts) | |||
self.ret_port_id = -1 | |||
self.reAddPorts() | |||
@@ -325,16 +330,16 @@ class CatarinaRenamePortW(QDialog, ui_catarina_renameport.Ui_CatarinaRenamePortW | |||
self.m_group_list = group_list | |||
self.m_port_list = port_list | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.tw_port_list, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkCell()")) | |||
self.connect(self.le_new_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.tw_port_list.currentCellChanged.connect(self.slot_checkCell) | |||
self.le_new_name.textChanged.connect(self.slot_checkText) | |||
self.connect(self.rb_input, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_output, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_audio_jack, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_midi_jack, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_midi_a2j, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.connect(self.rb_midi_alsa, SIGNAL("clicked()"), SLOT("slot_reAddPorts()")) | |||
self.rb_input.clicked.connect(self.slot_reAddPorts) | |||
self.rb_output.clicked.connect(self.slot_reAddPorts) | |||
self.rb_audio_jack.clicked.connect(self.slot_reAddPorts) | |||
self.rb_midi_jack.clicked.connect(self.slot_reAddPorts) | |||
self.rb_midi_a2j.clicked.connect(self.slot_reAddPorts) | |||
self.rb_midi_alsa.clicked.connect(self.slot_reAddPorts) | |||
self.ret_port_id = -1 | |||
self.ret_new_port_name = "" | |||
@@ -429,13 +434,13 @@ class CatarinaConnectPortsW(QDialog, ui_catarina_connectports.Ui_CatarinaConnect | |||
elif port[iPortType] == patchcanvas.PORT_TYPE_MIDI_ALSA: | |||
self.m_ports_midi_alsa.append(port) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.rb_audio_jack, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.rb_midi_jack, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.rb_midi_a2j, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.rb_midi_alsa, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.lw_outputs, SIGNAL("currentRowChanged(int)"), SLOT("slot_checkOutSelection(int)")) | |||
self.connect(self.lw_inputs, SIGNAL("currentRowChanged(int)"), SLOT("slot_checkInSelection(int)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.rb_audio_jack.clicked.connect(self.slot_portTypeChanged) | |||
self.rb_midi_jack.clicked.connect(self.slot_portTypeChanged) | |||
self.rb_midi_a2j.clicked.connect(self.slot_portTypeChanged) | |||
self.rb_midi_alsa.clicked.connect(self.slot_portTypeChanged) | |||
self.lw_outputs.currentRowChanged.connect(self.slot_checkOutSelection) | |||
self.lw_inputs.currentRowChanged.connect(self.slot_checkInSelection) | |||
self.ret_port_out_id = -1 | |||
self.ret_port_in_id = -1 | |||
@@ -510,13 +515,13 @@ class CatarinaDisconnectPortsW(QDialog, ui_catarina_disconnectports.Ui_CatarinaD | |||
self.m_port_list = port_list | |||
self.m_connection_list = connection_list | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.tw_connections, SIGNAL("cellDoubleClicked(int, int)"), SLOT("accept()")) | |||
self.connect(self.tw_connections, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelection(int)")) | |||
self.connect(self.rb_audio_jack, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.rb_midi_jack, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.rb_midi_a2j, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.connect(self.rb_midi_alsa, SIGNAL("clicked()"), SLOT("slot_portTypeChanged()")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.tw_connections.cellDoubleClicked.connect(self.accept) | |||
self.tw_connections.currentCellChanged.connect(self.slot_checkSelection) | |||
self.rb_audio_jack.clicked.connect(self.slot_portTypeChanged) | |||
self.rb_midi_jack.clicked.connect(self.slot_portTypeChanged) | |||
self.rb_midi_a2j.clicked.connect(self.slot_portTypeChanged) | |||
self.rb_midi_alsa.clicked.connect(self.slot_portTypeChanged) | |||
self.ret_port_out_id = -1 | |||
self.ret_port_in_id = -1 | |||
@@ -659,39 +664,39 @@ class CatarinaMainW(AbstractCanvasJackClass): | |||
patchcanvas.setFeatures(p_features) | |||
patchcanvas.init("Catarina", self.scene, self.canvasCallback, DEBUG) | |||
self.connect(self.ui.act_project_new, SIGNAL("triggered()"), SLOT("slot_projectNew()")) | |||
self.connect(self.ui.act_project_open, SIGNAL("triggered()"), SLOT("slot_projectOpen()")) | |||
self.connect(self.ui.act_project_save, SIGNAL("triggered()"), SLOT("slot_projectSave()")) | |||
self.connect(self.ui.act_project_save_as, SIGNAL("triggered()"), SLOT("slot_projectSaveAs()")) | |||
self.connect(self.ui.b_project_new, SIGNAL("clicked()"), SLOT("slot_projectNew()")) | |||
self.connect(self.ui.b_project_open, SIGNAL("clicked()"), SLOT("slot_projectOpen()")) | |||
self.connect(self.ui.b_project_save, SIGNAL("clicked()"), SLOT("slot_projectSave()")) | |||
self.connect(self.ui.b_project_save_as, SIGNAL("clicked()"), SLOT("slot_projectSaveAs()")) | |||
self.connect(self.ui.act_patchbay_add_group, SIGNAL("triggered()"), SLOT("slot_groupAdd()")) | |||
self.connect(self.ui.act_patchbay_remove_group, SIGNAL("triggered()"), SLOT("slot_groupRemove()")) | |||
self.connect(self.ui.act_patchbay_rename_group, SIGNAL("triggered()"), SLOT("slot_groupRename()")) | |||
self.connect(self.ui.act_patchbay_add_port, SIGNAL("triggered()"), SLOT("slot_portAdd()")) | |||
self.connect(self.ui.act_patchbay_remove_port, SIGNAL("triggered()"), SLOT("slot_portRemove()")) | |||
self.connect(self.ui.act_patchbay_rename_port, SIGNAL("triggered()"), SLOT("slot_portRename()")) | |||
self.connect(self.ui.act_patchbay_connect_ports, SIGNAL("triggered()"), SLOT("slot_connectPorts()")) | |||
self.connect(self.ui.act_patchbay_disconnect_ports, SIGNAL("triggered()"), SLOT("slot_disconnectPorts()")) | |||
self.connect(self.ui.b_group_add, SIGNAL("clicked()"), SLOT("slot_groupAdd()")) | |||
self.connect(self.ui.b_group_remove, SIGNAL("clicked()"), SLOT("slot_groupRemove()")) | |||
self.connect(self.ui.b_group_rename, SIGNAL("clicked()"), SLOT("slot_groupRename()")) | |||
self.connect(self.ui.b_port_add, SIGNAL("clicked()"), SLOT("slot_portAdd()")) | |||
self.connect(self.ui.b_port_remove, SIGNAL("clicked()"), SLOT("slot_portRemove()")) | |||
self.connect(self.ui.b_port_rename, SIGNAL("clicked()"), SLOT("slot_portRename()")) | |||
self.connect(self.ui.b_ports_connect, SIGNAL("clicked()"), SLOT("slot_connectPorts()")) | |||
self.connect(self.ui.b_ports_disconnect, SIGNAL("clicked()"), SLOT("slot_disconnectPorts()")) | |||
self.ui.act_project_new.triggered.connect(self.slot_projectNew) | |||
self.ui.act_project_open.triggered.connect(self.slot_projectOpen) | |||
self.ui.act_project_save.triggered.connect(self.slot_projectSave) | |||
self.ui.act_project_save_as.triggered.connect(self.slot_projectSaveAs) | |||
self.ui.b_project_new.clicked.connect(self.slot_projectNew) | |||
self.ui.b_project_open.clicked.connect(self.slot_projectOpen) | |||
self.ui.b_project_save.clicked.connect(self.slot_projectSave) | |||
self.ui.b_project_save_as.clicked.connect(self.slot_projectSaveAs) | |||
self.ui.act_patchbay_add_group.triggered.connect(self.slot_groupAdd) | |||
self.ui.act_patchbay_remove_group.triggered.connect(self.slot_groupRemove) | |||
self.ui.act_patchbay_rename_group.triggered.connect(self.slot_groupRename) | |||
self.ui.act_patchbay_add_port.triggered.connect(self.slot_portAdd) | |||
self.ui.act_patchbay_remove_port.triggered.connect(self.slot_portRemove) | |||
self.ui.act_patchbay_rename_port.triggered.connect(self.slot_portRename) | |||
self.ui.act_patchbay_connect_ports.triggered.connect(self.slot_connectPorts) | |||
self.ui.act_patchbay_disconnect_ports.triggered.connect(self.slot_disconnectPorts) | |||
self.ui.b_group_add.clicked.connect(self.slot_groupAdd) | |||
self.ui.b_group_remove.clicked.connect(self.slot_groupRemove) | |||
self.ui.b_group_rename.clicked.connect(self.slot_groupRename) | |||
self.ui.b_port_add.clicked.connect(self.slot_portAdd) | |||
self.ui.b_port_remove.clicked.connect(self.slot_portRemove) | |||
self.ui.b_port_rename.clicked.connect(self.slot_portRename) | |||
self.ui.b_ports_connect.clicked.connect(self.slot_connectPorts) | |||
self.ui.b_ports_disconnect.clicked.connect(self.slot_disconnectPorts) | |||
self.setCanvasConnections() | |||
self.connect(self.ui.act_settings_configure, SIGNAL("triggered()"), SLOT("slot_configureCatarina()")) | |||
self.ui.act_settings_configure.triggered.connect(self.slot_configureCatarina) | |||
self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCatarina()")) | |||
self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) | |||
self.ui.act_help_about.triggered.connect(self.slot_aboutCatarina) | |||
self.ui.act_help_about_qt.triggered.connect(app.aboutQt) | |||
self.connect(self, SIGNAL("SIGUSR1()"), SLOT("slot_projectSave()")) | |||
self.SIGUSR1.connect(self.slot_projectSave) | |||
# Dummy timer to keep events active | |||
self.fUpdateTimer = self.startTimer(1000) | |||
@@ -1035,6 +1040,7 @@ class CatarinaMainW(AbstractCanvasJackClass): | |||
@pyqtSlot() | |||
def slot_projectSaveAs(self): | |||
path = QFileDialog.getSaveFileName(self, self.tr("Save State"), filter=self.tr("Catarina XML Document (*.xml)")) | |||
path = path[0] | |||
if path: | |||
self.m_save_path = path | |||
self.saveFile(path) | |||
@@ -1255,7 +1261,7 @@ class CatarinaMainW(AbstractCanvasJackClass): | |||
QMessageBox.about(self, self.tr("About Catarina"), self.tr("<h3>Catarina</h3>" | |||
"<br>Version %s" | |||
"<br>Catarina is a testing ground for the 'PatchCanvas' module.<br>" | |||
"<br>Copyright (C) 2010-2013 falkTX") % VERSION) | |||
"<br>Copyright (C) 2010-2018 falkTX") % VERSION) | |||
def saveSettings(self): | |||
settings = QSettings() | |||
@@ -1267,7 +1273,7 @@ class CatarinaMainW(AbstractCanvasJackClass): | |||
settings = QSettings() | |||
if geometry: | |||
self.restoreGeometry(settings.value("Geometry", "")) | |||
self.restoreGeometry(settings.value("Geometry", b"")) | |||
showToolbar = settings.value("ShowToolbar", True, type=bool) | |||
self.ui.act_settings_show_toolbar.setChecked(showToolbar) | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# JACK Patchbay | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -28,7 +28,7 @@ from shared_settings import * | |||
try: | |||
import dbus | |||
from dbus.mainloop.qt import DBusQtMainLoop | |||
from dbus.mainloop.pyqt5 import DBusQtMainLoop | |||
haveDBus = True | |||
except: | |||
haveDBus = False | |||
@@ -37,7 +37,7 @@ except: | |||
# Try Import OpenGL | |||
try: | |||
from PyQt4.QtOpenGL import QGLWidget | |||
from PyQt5.QtOpenGL import QGLWidget | |||
hasGL = True | |||
except: | |||
hasGL = False | |||
@@ -215,26 +215,26 @@ class CatiaMainW(AbstractCanvasJackClass): | |||
self.setCanvasConnections() | |||
self.setJackConnections(["jack", "buffer-size", "transport", "misc"]) | |||
self.connect(self.ui.act_tools_jack_start, SIGNAL("triggered()"), SLOT("slot_JackServerStart()")) | |||
self.connect(self.ui.act_tools_jack_stop, SIGNAL("triggered()"), SLOT("slot_JackServerStop()")) | |||
self.connect(self.ui.act_tools_a2j_start, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStart()")) | |||
self.connect(self.ui.act_tools_a2j_stop, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStop()")) | |||
self.connect(self.ui.act_tools_a2j_export_hw, SIGNAL("triggered()"), SLOT("slot_A2JBridgeExportHW()")) | |||
self.ui.act_tools_jack_start.triggered.connect(self.slot_JackServerStart) | |||
self.ui.act_tools_jack_stop.triggered.connect(self.slot_JackServerStop) | |||
self.ui.act_tools_a2j_start.triggered.connect(self.slot_A2JBridgeStart) | |||
self.ui.act_tools_a2j_stop.triggered.connect(self.slot_A2JBridgeStop) | |||
self.ui.act_tools_a2j_export_hw.triggered.connect(self.slot_A2JBridgeExportHW) | |||
self.connect(self.ui.act_settings_show_alsa, SIGNAL("triggered(bool)"), SLOT("slot_showAlsaMIDI(bool)")) | |||
self.connect(self.ui.act_configure, SIGNAL("triggered()"), SLOT("slot_configureCatia()")) | |||
self.ui.act_settings_show_alsa.triggered.connect(self.slot_showAlsaMIDI) | |||
self.ui.act_configure.triggered.connect(self.slot_configureCatia) | |||
self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCatia()")) | |||
self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) | |||
self.ui.act_help_about.triggered.connect(self.slot_aboutCatia) | |||
self.ui.act_help_about_qt.triggered.connect(app.aboutQt) | |||
self.connect(self, SIGNAL("XRunCallback()"), SLOT("slot_XRunCallback()")) | |||
self.connect(self, SIGNAL("BufferSizeCallback(int)"), SLOT("slot_BufferSizeCallback(int)")) | |||
self.connect(self, SIGNAL("SampleRateCallback(int)"), SLOT("slot_SampleRateCallback(int)")) | |||
self.connect(self, SIGNAL("ClientRenameCallback(QString, QString)"), SLOT("slot_ClientRenameCallback(QString, QString)")) | |||
self.connect(self, SIGNAL("PortRegistrationCallback(int, bool)"), SLOT("slot_PortRegistrationCallback(int, bool)")) | |||
self.connect(self, SIGNAL("PortConnectCallback(int, int, bool)"), SLOT("slot_PortConnectCallback(int, int, bool)")) | |||
self.connect(self, SIGNAL("PortRenameCallback(int, QString, QString)"), SLOT("slot_PortRenameCallback(int, QString, QString)")) | |||
self.connect(self, SIGNAL("ShutdownCallback()"), SLOT("slot_ShutdownCallback()")) | |||
self.XRunCallback.connect(self.slot_XRunCallback) | |||
self.BufferSizeCallback.connect(self.slot_BufferSizeCallback) | |||
self.SampleRateCallback.connect(self.slot_SampleRateCallback) | |||
self.ClientRenameCallback.connect(self.slot_ClientRenameCallback) | |||
self.PortRegistrationCallback.connect(self.slot_PortRegistrationCallback) | |||
self.PortConnectCallback.connect(self.slot_PortConnectCallback) | |||
self.PortRenameCallback.connect(self.slot_PortRenameCallback) | |||
self.ShutdownCallback.connect(self.slot_ShutdownCallback) | |||
# ------------------------------------------------------------- | |||
# Set-up DBus | |||
@@ -1022,9 +1022,9 @@ class CatiaMainW(AbstractCanvasJackClass): | |||
if not newId: | |||
# Something crashed | |||
if appInterface == "org.gna.home.a2jmidid": | |||
QTimer.singleShot(0, self, SLOT("slot_handleCrash_a2j()")) | |||
QTimer.singleShot(0, self.slot_handleCrash_a2j) | |||
elif appInterface == "org.jackaudio.service": | |||
QTimer.singleShot(0, self, SLOT("slot_handleCrash_jack()")) | |||
QTimer.singleShot(0, self.slot_handleCrash_jack) | |||
elif kwds['interface'] == "org.jackaudio.JackControl": | |||
if kwds['member'] == "ServerStarted": | |||
@@ -1055,37 +1055,37 @@ class CatiaMainW(AbstractCanvasJackClass): | |||
def JackXRunCallback(self, arg): | |||
if DEBUG: print("JackXRunCallback()") | |||
self.emit(SIGNAL("XRunCallback()")) | |||
self.XRunCallback.emit() | |||
return 0 | |||
def JackBufferSizeCallback(self, bufferSize, arg): | |||
if DEBUG: print("JackBufferSizeCallback(%i)" % bufferSize) | |||
self.emit(SIGNAL("BufferSizeCallback(int)"), bufferSize) | |||
self.BufferSizeCallback.emit(bufferSize) | |||
return 0 | |||
def JackSampleRateCallback(self, sampleRate, arg): | |||
if DEBUG: print("JackSampleRateCallback(%i)" % sampleRate) | |||
self.emit(SIGNAL("SampleRateCallback(int)"), sampleRate) | |||
self.SampleRateCallback.emit(sampleRate) | |||
return 0 | |||
def JackClientRenameCallback(self, oldName, newName, arg): | |||
if DEBUG: print("JackClientRenameCallback(\"%s\", \"%s\")" % (oldName, newName)) | |||
self.emit(SIGNAL("ClientRenameCallback(QString, QString)"), str(oldName, encoding="utf-8"), str(newName, encoding="utf-8")) | |||
self.ClientRenameCallback.emit(str(oldName, encoding="utf-8"), str(newName, encoding="utf-8")) | |||
return 0 | |||
def JackPortRegistrationCallback(self, portId, registerYesNo, arg): | |||
if DEBUG: print("JackPortRegistrationCallback(%i, %i)" % (portId, registerYesNo)) | |||
self.emit(SIGNAL("PortRegistrationCallback(int, bool)"), portId, bool(registerYesNo)) | |||
self.PortRegistrationCallback.emit(portId, bool(registerYesNo)) | |||
return 0 | |||
def JackPortConnectCallback(self, portA, portB, connectYesNo, arg): | |||
if DEBUG: print("JackPortConnectCallback(%i, %i, %i)" % (portA, portB, connectYesNo)) | |||
self.emit(SIGNAL("PortConnectCallback(int, int, bool)"), portA, portB, bool(connectYesNo)) | |||
self.PortConnectCallback.emit(portA, portB, bool(connectYesNo)) | |||
return 0 | |||
def JackPortRenameCallback(self, portId, oldName, newName, arg): | |||
if DEBUG: print("JackPortRenameCallback(%i, \"%s\", \"%s\")" % (portId, oldName, newName)) | |||
self.emit(SIGNAL("PortRenameCallback(int, QString, QString)"), portId, str(oldName, encoding="utf-8"), str(newName, encoding="utf-8")) | |||
self.PortRenameCallback.emit(portId, str(oldName, encoding="utf-8"), str(newName, encoding="utf-8")) | |||
return 0 | |||
def JackSessionCallback(self, event, arg): | |||
@@ -1107,7 +1107,7 @@ class CatiaMainW(AbstractCanvasJackClass): | |||
def JackShutdownCallback(self, arg): | |||
if DEBUG: print("JackShutdownCallback()") | |||
self.emit(SIGNAL("ShutdownCallback()")) | |||
self.ShutdownCallback.emit() | |||
return 0 | |||
@pyqtSlot(bool) | |||
@@ -1318,7 +1318,7 @@ class CatiaMainW(AbstractCanvasJackClass): | |||
QMessageBox.about(self, self.tr("About Catia"), self.tr("<h3>Catia</h3>" | |||
"<br>Version %s" | |||
"<br>Catia is a nice JACK Patchbay with A2J Bridge integration.<br>" | |||
"<br>Copyright (C) 2010-2013 falkTX" % VERSION)) | |||
"<br>Copyright (C) 2010-2018 falkTX" % VERSION)) | |||
def saveSettings(self): | |||
settings = QSettings() | |||
@@ -1333,7 +1333,7 @@ class CatiaMainW(AbstractCanvasJackClass): | |||
settings = QSettings() | |||
if geometry: | |||
self.restoreGeometry(settings.value("Geometry", "")) | |||
self.restoreGeometry(settings.value("Geometry", b"")) | |||
showAlsaMidi = settings.value("ShowAlsaMIDI", False, type=bool) | |||
self.ui.act_settings_show_alsa.setChecked(showAlsaMidi) | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# LADISH frontend | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -20,8 +20,13 @@ | |||
# Imports (Global) | |||
from time import ctime | |||
from PyQt4.QtCore import QPointF | |||
from PyQt4.QtGui import QAction, QApplication, QCheckBox, QHBoxLayout, QVBoxLayout, QTableWidgetItem, QTreeWidgetItem | |||
if True: | |||
from PyQt5.QtCore import QPointF | |||
from PyQt5.QtWidgets import QAction, QApplication, QCheckBox, QHBoxLayout, QVBoxLayout, QTableWidgetItem, QTreeWidgetItem | |||
else: | |||
from PyQt4.QtCore import QPointF | |||
from PyQt4.QtGui import QAction, QApplication, QCheckBox, QHBoxLayout, QVBoxLayout, QTableWidgetItem, QTreeWidgetItem | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -43,7 +48,7 @@ from shared_settings import * | |||
try: | |||
import dbus | |||
from dbus.mainloop.qt import DBusQtMainLoop | |||
from dbus.mainloop.pyqt5 import DBusQtMainLoop | |||
haveDBus = True | |||
except: | |||
haveDBus = False | |||
@@ -52,7 +57,7 @@ except: | |||
# Try Import OpenGL | |||
try: | |||
from PyQt4.QtOpenGL import QGLWidget | |||
from PyQt5.QtOpenGL import QGLWidget | |||
hasGL = True | |||
except: | |||
hasGL = False | |||
@@ -207,8 +212,8 @@ class StudioNameW(QDialog): | |||
for studio in studioList: | |||
self.fStudioList.append(str(studio[iStudioListName])) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.ui.le_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.ui.le_name.textChanged.connect(self.slot_checkText) | |||
self.fRetStudioName = "" | |||
@@ -252,9 +257,9 @@ class StudioListW(QDialog, ui_claudia_studiolist.Ui_StudioListW): | |||
index += 1 | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.tableWidget, SIGNAL("cellDoubleClicked(int, int)"), SLOT("accept()")) | |||
self.connect(self.tableWidget, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelection(int)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.tableWidget.cellDoubleClicked.connect(self.accept) | |||
self.tableWidget.currentCellChanged.connect(self.slot_checkSelection) | |||
if self.tableWidget.rowCount() > 0: | |||
self.tableWidget.setCurrentCell(0, 0) | |||
@@ -287,8 +292,8 @@ class CreateRoomW(QDialog, ui_claudia_createroom.Ui_CreateRoomW): | |||
for template_name, template_dict in templates_list: | |||
self.lw_templates.addItem(template_name) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.le_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.le_name.textChanged.connect(self.slot_checkText) | |||
if self.lw_templates.count() > 0: | |||
self.lw_templates.setCurrentRow(0) | |||
@@ -332,10 +337,10 @@ class ProjectNameW(QDialog, ui_claudia_projectname.Ui_ProjectNameW): | |||
self.m_proj_folder = proj_folder | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.b_open, SIGNAL("clicked()"), SLOT("slot_checkFolder()")) | |||
self.connect(self.le_path, SIGNAL("textChanged(QString)"), SLOT("slot_checkText_path(QString)")) | |||
self.connect(self.le_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText_name(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.b_open.clicked.connect(self.slot_checkFolder) | |||
self.le_path.textChanged.connect(self.slot_checkText_path) | |||
self.le_name.textChanged.connect(self.slot_checkText_name) | |||
self.ret_project_name = "" | |||
self.ret_project_path = "" | |||
@@ -384,9 +389,9 @@ class ProjectPropertiesW(QDialog, ui_claudia_projectproperties.Ui_ProjectPropert | |||
self.m_default_name = name | |||
self.m_last_name = name | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.le_name, SIGNAL("textChanged(QString)"), SLOT("slot_checkText_name(QString)")) | |||
self.connect(self.cb_save_now, SIGNAL("clicked(bool)"), SLOT("slot_checkSaveNow(bool)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.le_name.textChanged.connect(self.slot_checkText_name) | |||
self.cb_save_now.clicked.connect(self.slot_checkSaveNow) | |||
self.le_name.setText(name) | |||
self.le_description.setText(description) | |||
@@ -458,8 +463,8 @@ class RunCustomW(QDialog, ui_claudia_runcustom.Ui_RunCustomW): | |||
self.rb_level_lash.setEnabled(False) | |||
self.rb_level_js.setEnabled(False) | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_setReturn()")) | |||
self.connect(self.le_command, SIGNAL("textChanged(QString)"), SLOT("slot_checkText(QString)")) | |||
self.accepted.connect(self.slot_setReturn) | |||
self.le_command.textChanged.connect(self.slot_checkText) | |||
self.ret_app_obj = None | |||
@@ -532,8 +537,8 @@ class ClaudiaLauncherW(QDialog): | |||
self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) | |||
self.connect(self.buttonBox.button(QDialogButtonBox.Ok), SIGNAL("clicked()"), SLOT("slot_addAppToLADISH()")) | |||
self.connect(self.buttonBox.button(QDialogButtonBox.Close), SIGNAL("clicked()"), self, SLOT("reject()")) | |||
self.buttonBox.button(QDialogButtonBox.Ok).clicked.connect(self.slot_addAppToLADISH) | |||
self.buttonBox.button(QDialogButtonBox.Close).clicked.connect(self.reject) | |||
# ---------------------------------------- | |||
# Callbacks | |||
@@ -580,7 +585,7 @@ class ClaudiaLauncherW(QDialog): | |||
def loadSettings(self): | |||
if self.settings.contains("Geometry"): | |||
self.restoreGeometry(self.settings.value("Geometry", "")) | |||
self.restoreGeometry(self.settings.value("Geometry", b"")) | |||
else: | |||
self.resize(850, 500) | |||
self.launcher.loadSettings() | |||
@@ -597,6 +602,33 @@ class ClaudiaLauncherW(QDialog): | |||
# Claudia Main Window | |||
class ClaudiaMainW(AbstractCanvasJackClass): | |||
DBusCrashCallback = pyqtSignal(str) | |||
DBusServerStartedCallback = pyqtSignal() | |||
DBusServerStoppedCallback = pyqtSignal() | |||
DBusClientAppearedCallback = pyqtSignal(int, str) | |||
DBusClientDisappearedCallback = pyqtSignal(int) | |||
DBusClientRenamedCallback = pyqtSignal(int, str) | |||
DBusPortAppearedCallback = pyqtSignal(int, int, str, int, int) | |||
DBusPortDisppearedCallback = pyqtSignal(int) | |||
DBusPortRenamedCallback = pyqtSignal(int, str) | |||
DBusPortsConnectedCallback = pyqtSignal(int, int, int) | |||
DBusPortsDisconnectedCallback = pyqtSignal(int) | |||
DBusStudioAppearedCallback = pyqtSignal() | |||
DBusStudioDisappearedCallback = pyqtSignal() | |||
DBusQueueExecutionHaltedCallback = pyqtSignal() | |||
DBusCleanExitCallback = pyqtSignal() | |||
DBusStudioStartedCallback = pyqtSignal() | |||
DBusStudioStoppedCallback = pyqtSignal() | |||
DBusStudioRenamedCallback = pyqtSignal(str) | |||
DBusStudioCrashedCallback = pyqtSignal() | |||
DBusRoomAppearedCallback = pyqtSignal(str, str) | |||
DBusRoomDisappearedCallback = pyqtSignal(str) | |||
DBusRoomChangedCallback = pyqtSignal() | |||
DBusProjectPropertiesChanged = pyqtSignal(str, str) | |||
DBusAppAdded2Callback = pyqtSignal(str, int, str, bool, bool, str) | |||
DBusAppRemovedCallback = pyqtSignal(str, int) | |||
DBusAppStateChanged2Callback = pyqtSignal(str, int, str, bool, bool, str) | |||
def __init__(self, parent=None): | |||
AbstractCanvasJackClass.__init__(self, "Claudia", ui_claudia.Ui_ClaudiaMainW, parent) | |||
@@ -752,7 +784,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
self.ui.miniCanvasPreview.setRealParent(self) | |||
self.ui.miniCanvasPreview.setViewTheme(patchcanvas.canvas.theme.canvas_bg, patchcanvas.canvas.theme.rubberband_brush, patchcanvas.canvas.theme.rubberband_pen.color()) | |||
self.ui.miniCanvasPreview.init(self.scene, DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT) | |||
QTimer.singleShot(100, self, SLOT("slot_miniCanvasInit()")) | |||
QTimer.singleShot(100, self.slot_miniCanvasInit) | |||
# ------------------------------------------------------------- | |||
# Check DBus | |||
@@ -795,104 +827,104 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
self.setCanvasConnections() | |||
self.setJackConnections(["jack", "transport", "misc"]) | |||
self.connect(self.ui.act_studio_new, SIGNAL("triggered()"), SLOT("slot_studio_new()")) | |||
self.connect(self.ui.act_studio_start, SIGNAL("triggered()"), SLOT("slot_studio_start()")) | |||
self.connect(self.ui.act_studio_stop, SIGNAL("triggered()"), SLOT("slot_studio_stop()")) | |||
self.connect(self.ui.act_studio_save, SIGNAL("triggered()"), SLOT("slot_studio_save()")) | |||
self.connect(self.ui.act_studio_save_as, SIGNAL("triggered()"), SLOT("slot_studio_save_as()")) | |||
self.connect(self.ui.act_studio_rename, SIGNAL("triggered()"), SLOT("slot_studio_rename()")) | |||
self.connect(self.ui.act_studio_unload, SIGNAL("triggered()"), SLOT("slot_studio_unload()")) | |||
self.connect(self.ui.act_tools_a2j_start, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStart()")) | |||
self.connect(self.ui.act_tools_a2j_stop, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStop()")) | |||
self.connect(self.ui.act_tools_a2j_export_hw, SIGNAL("triggered()"), SLOT("slot_A2JBridgeExportHW()")) | |||
self.connect(self.ui.b_studio_new, SIGNAL("clicked()"), SLOT("slot_studio_new()")) | |||
self.connect(self.ui.b_studio_load, SIGNAL("clicked()"), SLOT("slot_studio_load_b()")) | |||
self.connect(self.ui.b_studio_save, SIGNAL("clicked()"), SLOT("slot_studio_save()")) | |||
self.connect(self.ui.b_studio_save_as, SIGNAL("clicked()"), SLOT("slot_studio_save_as()")) | |||
self.connect(self.ui.b_studio_start, SIGNAL("clicked()"), SLOT("slot_studio_start()")) | |||
self.connect(self.ui.b_studio_stop, SIGNAL("clicked()"), SLOT("slot_studio_stop()")) | |||
self.connect(self.ui.menu_studio_load, SIGNAL("aboutToShow()"), SLOT("slot_updateMenuStudioList_Load()")) | |||
self.connect(self.ui.menu_studio_delete, SIGNAL("aboutToShow()"), SLOT("slot_updateMenuStudioList_Delete()")) | |||
self.connect(self.ui.act_room_create, SIGNAL("triggered()"), SLOT("slot_room_create()")) | |||
self.connect(self.ui.menu_room_delete, SIGNAL("aboutToShow()"), SLOT("slot_updateMenuRoomList()")) | |||
self.connect(self.ui.act_project_new, SIGNAL("triggered()"), SLOT("slot_project_new()")) | |||
self.connect(self.ui.act_project_save, SIGNAL("triggered()"), SLOT("slot_project_save()")) | |||
self.connect(self.ui.act_project_save_as, SIGNAL("triggered()"), SLOT("slot_project_save_as()")) | |||
self.connect(self.ui.act_project_unload, SIGNAL("triggered()"), SLOT("slot_project_unload()")) | |||
self.connect(self.ui.act_project_properties, SIGNAL("triggered()"), SLOT("slot_project_properties()")) | |||
self.connect(self.ui.b_project_new, SIGNAL("clicked()"), SLOT("slot_project_new()")) | |||
self.connect(self.ui.b_project_load, SIGNAL("clicked()"), SLOT("slot_project_load()")) | |||
self.connect(self.ui.b_project_save, SIGNAL("clicked()"), SLOT("slot_project_save()")) | |||
self.connect(self.ui.b_project_save_as, SIGNAL("clicked()"), SLOT("slot_project_save_as()")) | |||
self.connect(self.ui.menu_project_load, SIGNAL("aboutToShow()"), SLOT("slot_updateMenuProjectList()")) | |||
self.connect(self.ui.act_app_add_new, SIGNAL("triggered()"), SLOT("slot_app_add_new()")) | |||
self.connect(self.ui.act_app_run_custom, SIGNAL("triggered()"), SLOT("slot_app_run_custom()")) | |||
self.connect(self.ui.treeWidget, SIGNAL("itemSelectionChanged()"), SLOT("slot_checkCurrentRoom()")) | |||
#self.connect(self.ui.treeWidget, SIGNAL("itemPressed(QTreeWidgetItem*, int)"), SLOT("slot_checkCurrentRoom()")) | |||
self.connect(self.ui.treeWidget, SIGNAL("itemDoubleClicked(QTreeWidgetItem*, int)"), SLOT("slot_doubleClickedAppList(QTreeWidgetItem*, int)")) | |||
self.connect(self.ui.treeWidget, SIGNAL("customContextMenuRequested(QPoint)"), SLOT("slot_showAppListCustomMenu()")) | |||
self.connect(self.ui.miniCanvasPreview, SIGNAL("miniCanvasMoved(double, double)"), SLOT("slot_miniCanvasMoved(double, double)")) | |||
self.connect(self.ui.graphicsView.horizontalScrollBar(), SIGNAL("valueChanged(int)"), SLOT("slot_horizontalScrollBarChanged(int)")) | |||
self.connect(self.ui.graphicsView.verticalScrollBar(), SIGNAL("valueChanged(int)"), SLOT("slot_verticalScrollBarChanged(int)")) | |||
self.connect(self.scene, SIGNAL("sceneGroupMoved(int, int, QPointF)"), SLOT("slot_canvasItemMoved(int, int, QPointF)")) | |||
self.connect(self.scene, SIGNAL("scaleChanged(double)"), SLOT("slot_canvasScaleChanged(double)")) | |||
self.connect(self.ui.act_settings_configure, SIGNAL("triggered()"), SLOT("slot_configureClaudia()")) | |||
self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutClaudia()")) | |||
self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) | |||
self.ui.act_studio_new.triggered.connect(self.slot_studio_new) | |||
self.ui.act_studio_start.triggered.connect(self.slot_studio_start) | |||
self.ui.act_studio_stop.triggered.connect(self.slot_studio_stop) | |||
self.ui.act_studio_save.triggered.connect(self.slot_studio_save) | |||
self.ui.act_studio_save_as.triggered.connect(self.slot_studio_save_as) | |||
self.ui.act_studio_rename.triggered.connect(self.slot_studio_rename) | |||
self.ui.act_studio_unload.triggered.connect(self.slot_studio_unload) | |||
self.ui.act_tools_a2j_start.triggered.connect(self.slot_A2JBridgeStart) | |||
self.ui.act_tools_a2j_stop.triggered.connect(self.slot_A2JBridgeStop) | |||
self.ui.act_tools_a2j_export_hw.triggered.connect(self.slot_A2JBridgeExportHW) | |||
self.ui.b_studio_new.clicked.connect(self.slot_studio_new) | |||
self.ui.b_studio_load.clicked.connect(self.slot_studio_load_b) | |||
self.ui.b_studio_save.clicked.connect(self.slot_studio_save) | |||
self.ui.b_studio_save_as.clicked.connect(self.slot_studio_save_as) | |||
self.ui.b_studio_start.clicked.connect(self.slot_studio_start) | |||
self.ui.b_studio_stop.clicked.connect(self.slot_studio_stop) | |||
self.ui.menu_studio_load.aboutToShow.connect(self.slot_updateMenuStudioList_Load) | |||
self.ui.menu_studio_delete.aboutToShow.connect(self.slot_updateMenuStudioList_Delete) | |||
self.ui.act_room_create.triggered.connect(self.slot_room_create) | |||
self.ui.menu_room_delete.aboutToShow.connect(self.slot_updateMenuRoomList) | |||
self.ui.act_project_new.triggered.connect(self.slot_project_new) | |||
self.ui.act_project_save.triggered.connect(self.slot_project_save) | |||
self.ui.act_project_save_as.triggered.connect(self.slot_project_save_as) | |||
self.ui.act_project_unload.triggered.connect(self.slot_project_unload) | |||
self.ui.act_project_properties.triggered.connect(self.slot_project_properties) | |||
self.ui.b_project_new.clicked.connect(self.slot_project_new) | |||
self.ui.b_project_load.clicked.connect(self.slot_project_load) | |||
self.ui.b_project_save.clicked.connect(self.slot_project_save) | |||
self.ui.b_project_save_as.clicked.connect(self.slot_project_save_as) | |||
self.ui.menu_project_load.aboutToShow.connect(self.slot_updateMenuProjectList) | |||
self.ui.act_app_add_new.triggered.connect(self.slot_app_add_new) | |||
self.ui.act_app_run_custom.triggered.connect(self.slot_app_run_custom) | |||
self.ui.treeWidget.itemSelectionChanged.connect(self.slot_checkCurrentRoom) | |||
#self.ui.treeWidget.itemPressed.connect(self.slot_checkCurrentRoom) | |||
self.ui.treeWidget.itemDoubleClicked.connect(self.slot_doubleClickedAppList) | |||
self.ui.treeWidget.customContextMenuRequested.connect(self.slot_showAppListCustomMenu) | |||
self.ui.miniCanvasPreview.miniCanvasMoved.connect(self.slot_miniCanvasMoved) | |||
self.ui.graphicsView.horizontalScrollBar().valueChanged.connect(self.slot_horizontalScrollBarChanged) | |||
self.ui.graphicsView.verticalScrollBar().valueChanged.connect(self.slot_verticalScrollBarChanged) | |||
self.scene.sceneGroupMoved.connect(self.slot_canvasItemMoved) | |||
self.scene.scaleChanged.connect(self.slot_canvasScaleChanged) | |||
self.ui.act_settings_configure.triggered.connect(self.slot_configureClaudia) | |||
self.ui.act_help_about.triggered.connect(self.slot_aboutClaudia) | |||
self.ui.act_help_about_qt.triggered.connect(app.aboutQt) | |||
# org.freedesktop.DBus | |||
self.connect(self, SIGNAL("DBusCrashCallback(QString)"), SLOT("slot_DBusCrashCallback(QString)")) | |||
self.DBusCrashCallback.connect(self.slot_DBusCrashCallback) | |||
# org.jackaudio.JackControl | |||
self.connect(self, SIGNAL("DBusServerStartedCallback()"), SLOT("slot_DBusServerStartedCallback()")) | |||
self.connect(self, SIGNAL("DBusServerStoppedCallback()"), SLOT("slot_DBusServerStoppedCallback()")) | |||
self.DBusServerStartedCallback.connect(self.slot_DBusServerStartedCallback) | |||
self.DBusServerStoppedCallback.connect(self.slot_DBusServerStoppedCallback) | |||
# org.jackaudio.JackPatchbay | |||
self.connect(self, SIGNAL("DBusClientAppearedCallback(int, QString)"), SLOT("slot_DBusClientAppearedCallback(int, QString)")) | |||
self.connect(self, SIGNAL("DBusClientDisappearedCallback(int)"), SLOT("slot_DBusClientDisappearedCallback(int)")) | |||
self.connect(self, SIGNAL("DBusClientRenamedCallback(int, QString)"), SLOT("slot_DBusClientRenamedCallback(int, QString)")) | |||
self.connect(self, SIGNAL("DBusPortAppearedCallback(int, int, QString, int, int)"), SLOT("slot_DBusPortAppearedCallback(int, int, QString, int, int)")) | |||
self.connect(self, SIGNAL("DBusPortDisppearedCallback(int)"), SLOT("slot_DBusPortDisppearedCallback(int)")) | |||
self.connect(self, SIGNAL("DBusPortRenamedCallback(int, QString)"), SLOT("slot_DBusPortRenamedCallback(int, QString)")) | |||
self.connect(self, SIGNAL("DBusPortsConnectedCallback(int, int, int)"), SLOT("slot_DBusPortsConnectedCallback(int, int, int)")) | |||
self.connect(self, SIGNAL("DBusPortsDisconnectedCallback(int)"), SLOT("slot_DBusPortsDisconnectedCallback(int)")) | |||
self.DBusClientAppearedCallback.connect(self.slot_DBusClientAppearedCallback) | |||
self.DBusClientDisappearedCallback.connect(self.slot_DBusClientDisappearedCallback) | |||
self.DBusClientRenamedCallback.connect(self.slot_DBusClientRenamedCallback) | |||
self.DBusPortAppearedCallback.connect(self.slot_DBusPortAppearedCallback) | |||
self.DBusPortDisppearedCallback.connect(self.slot_DBusPortDisppearedCallback) | |||
self.DBusPortRenamedCallback.connect(self.slot_DBusPortRenamedCallback) | |||
self.DBusPortsConnectedCallback.connect(self.slot_DBusPortsConnectedCallback) | |||
self.DBusPortsDisconnectedCallback.connect(self.slot_DBusPortsDisconnectedCallback) | |||
# org.ladish.Control | |||
self.connect(self, SIGNAL("DBusStudioAppearedCallback()"), SLOT("slot_DBusStudioAppearedCallback()")) | |||
self.connect(self, SIGNAL("DBusStudioDisappearedCallback()"), SLOT("slot_DBusStudioDisappearedCallback()")) | |||
self.connect(self, SIGNAL("DBusQueueExecutionHaltedCallback()"), SLOT("slot_DBusQueueExecutionHaltedCallback()")) | |||
self.connect(self, SIGNAL("DBusCleanExitCallback()"), SLOT("slot_DBusCleanExitCallback()")) | |||
self.DBusStudioAppearedCallback.connect(self.slot_DBusStudioAppearedCallback) | |||
self.DBusStudioDisappearedCallback.connect(self.slot_DBusStudioDisappearedCallback) | |||
self.DBusQueueExecutionHaltedCallback.connect(self.slot_DBusQueueExecutionHaltedCallback) | |||
self.DBusCleanExitCallback.connect(self.slot_DBusCleanExitCallback) | |||
# org.ladish.Studio | |||
self.connect(self, SIGNAL("DBusStudioStartedCallback()"), SLOT("slot_DBusStudioStartedCallback()")) | |||
self.connect(self, SIGNAL("DBusStudioStoppedCallback()"), SLOT("slot_DBusStudioStoppedCallback()")) | |||
self.connect(self, SIGNAL("DBusStudioRenamedCallback(QString)"), SLOT("slot_DBusStudioRenamedCallback(QString)")) | |||
self.connect(self, SIGNAL("DBusStudioCrashedCallback()"), SLOT("slot_DBusStudioCrashedCallback()")) | |||
self.connect(self, SIGNAL("DBusRoomAppearedCallback(QString, QString)"), SLOT("slot_DBusRoomAppearedCallback(QString, QString)")) | |||
self.connect(self, SIGNAL("DBusRoomDisappearedCallback(QString)"), SLOT("slot_DBusRoomDisappearedCallback(QString)")) | |||
#self.connect(self, SIGNAL("DBusRoomChangedCallback()"), SLOT("slot_DBusRoomChangedCallback()")) | |||
self.DBusStudioStartedCallback.connect(self.slot_DBusStudioStartedCallback) | |||
self.DBusStudioStoppedCallback.connect(self.slot_DBusStudioStoppedCallback) | |||
self.DBusStudioRenamedCallback.connect(self.slot_DBusStudioRenamedCallback) | |||
self.DBusStudioCrashedCallback.connect(self.slot_DBusStudioCrashedCallback) | |||
self.DBusRoomAppearedCallback.connect(self.slot_DBusRoomAppearedCallback) | |||
self.DBusRoomDisappearedCallback.connect(self.slot_DBusRoomDisappearedCallback) | |||
#self.DBusRoomChangedCallback.connect(self.slot_DBusRoomChangedCallback) | |||
# org.ladish.Room | |||
self.connect(self, SIGNAL("DBusProjectPropertiesChanged(QString, QString)"), SLOT("slot_DBusProjectPropertiesChanged(QString, QString)")) | |||
self.DBusProjectPropertiesChanged.connect(self.slot_DBusProjectPropertiesChanged) | |||
# org.ladish.AppSupervisor | |||
self.connect(self, SIGNAL("DBusAppAdded2Callback(QString, int, QString, bool, bool, QString)"), SLOT("slot_DBusAppAdded2Callback(QString, int, QString, bool, bool, QString)")) | |||
self.connect(self, SIGNAL("DBusAppRemovedCallback(QString, int)"), SLOT("slot_DBusAppRemovedCallback(QString, int)")) | |||
self.connect(self, SIGNAL("DBusAppStateChanged2Callback(QString, int, QString, bool, bool, QString)"), SLOT("slot_DBusAppStateChanged2Callback(QString, int, QString, bool, bool, QString)")) | |||
self.DBusAppAdded2Callback.connect(self.slot_DBusAppAdded2Callback) | |||
self.DBusAppRemovedCallback.connect(self.slot_DBusAppRemovedCallback) | |||
self.DBusAppStateChanged2Callback.connect(self.slot_DBusAppStateChanged2Callback) | |||
# JACK | |||
self.connect(self, SIGNAL("JackBufferSizeCallback(int)"), SLOT("slot_JackBufferSizeCallback(int)")) | |||
self.connect(self, SIGNAL("JackSampleRateCallback(int)"), SLOT("slot_JackSampleRateCallback(int)")) | |||
self.connect(self, SIGNAL("JackShutdownCallback()"), SLOT("slot_JackShutdownCallback()")) | |||
self.BufferSizeCallback.connect(self.slot_JackBufferSizeCallback) | |||
self.SampleRateCallback.connect(self.slot_JackSampleRateCallback) | |||
self.ShutdownCallback.connect(self.slot_JackShutdownCallback) | |||
# ------------------------------------------------------------- | |||
# Set-up DBus | |||
@@ -1161,7 +1193,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
source_group_id, source_group_name, source_port_id, source_port_name, target_group_id, target_group_name, target_port_id, target_port_name, conn_id = conn | |||
self.canvas_connect_ports(int(conn_id), int(source_port_id), int(target_port_id)) | |||
QTimer.singleShot(1000 if (self.fSavedSettings['Canvas/EyeCandy']) else 0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(1000 if (self.fSavedSettings['Canvas/EyeCandy']) else 0, self.ui.miniCanvasPreview.update) | |||
def room_add(self, room_path, room_name): | |||
room_index = int(room_path.replace("/org/ladish/Room", "")) | |||
@@ -1254,35 +1286,35 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
if y2 is None: y2 = "%f" % (float(y) + 50) | |||
patchcanvas.setGroupPosFull(groupId, float(x), float(y), float(x2), float(y2)) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_remove_group(self, group_id): | |||
patchcanvas.removeGroup(group_id) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_rename_group(self, group_id, new_group_name): | |||
patchcanvas.renameGroup(group_id, new_group_name) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_add_port(self, group_id, port_id, port_name, port_mode, port_type): | |||
patchcanvas.addPort(group_id, port_id, port_name, port_mode, port_type) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_remove_port(self, port_id): | |||
patchcanvas.removePort(port_id) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_rename_port(self, port_id, new_port_name): | |||
patchcanvas.renamePort(port_id, new_port_name) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_connect_ports(self, connection_id, port_a, port_b): | |||
patchcanvas.connectPorts(connection_id, port_a, port_b) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def canvas_disconnect_ports(self, connection_id): | |||
patchcanvas.disconnectPorts(connection_id) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||
QTimer.singleShot(0, self.ui.miniCanvasPreview.update) | |||
def jackStarted(self): | |||
if jacksettings.needsInit(): | |||
@@ -1497,85 +1529,85 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
if not newId: | |||
# Something crashed | |||
if appInterface == "org.gna.home.a2jmidid": | |||
QTimer.singleShot(0, self, SLOT("slot_handleCrash_a2j()")) | |||
QTimer.singleShot(0, self.slot_handleCrash_a2j) | |||
elif appInterface in ("org.jackaudio.service", "org.ladish"): | |||
# Prevent any more dbus calls | |||
gDBus.jack = None | |||
gJack.client = None | |||
jacksettings.initBus(None) | |||
self.emit(SIGNAL("DBusCrashCallback(QString)"), appInterface) | |||
self.DBusCrashCallback.emit(appInterface) | |||
elif kwds['interface'] == "org.jackaudio.JackControl": | |||
if DEBUG: print("DBus signal @org.jackaudio.JackControl,", kwds['member']) | |||
if kwds['member'] == "ServerStarted": | |||
self.emit(SIGNAL("DBusServerStartedCallback()")) | |||
self.DBusServerStartedCallback.emit() | |||
elif kwds['member'] == "ServerStopped": | |||
self.emit(SIGNAL("DBusServerStoppedCallback()")) | |||
self.DBusServerStoppedCallback.emit() | |||
elif kwds['interface'] == "org.jackaudio.JackPatchbay": | |||
if gDBus.patchbay and kwds['path'] == gDBus.patchbay.object_path: | |||
if DEBUG: print("DBus signal @org.jackaudio.JackPatchbay,", kwds['member']) | |||
if kwds['member'] == "ClientAppeared": | |||
self.emit(SIGNAL("DBusClientAppearedCallback(int, QString)"), args[iJackClientId], args[iJackClientName]) | |||
self.DBusClientAppearedCallback.emit(args[iJackClientId], args[iJackClientName]) | |||
elif kwds['member'] == "ClientDisappeared": | |||
self.emit(SIGNAL("DBusClientDisappearedCallback(int)"), args[iJackClientId]) | |||
self.DBusClientDisappearedCallback.emit(args[iJackClientId]) | |||
elif kwds['member'] == "ClientRenamed": | |||
self.emit(SIGNAL("DBusClientRenamedCallback(int, QString)"), args[iRenamedId], args[iRenamedNewName]) | |||
self.DBusClientRenamedCallback.emit(args[iRenamedId], args[iRenamedNewName]) | |||
elif kwds['member'] == "PortAppeared": | |||
self.emit(SIGNAL("DBusPortAppearedCallback(int, int, QString, int, int)"), args[iJackClientId], args[iJackPortId], args[iJackPortName], args[iJackPortFlags], args[iJackPortType]) | |||
self.DBusPortAppearedCallback.emit(args[iJackClientId], args[iJackPortId], args[iJackPortName], args[iJackPortFlags], args[iJackPortType]) | |||
elif kwds['member'] == "PortDisappeared": | |||
self.emit(SIGNAL("DBusPortDisppearedCallback(int)"), args[iJackPortId]) | |||
self.DBusPortDisppearedCallback.emit(args[iJackPortId]) | |||
elif kwds['member'] == "PortRenamed": | |||
self.emit(SIGNAL("DBusPortRenamedCallback(int, QString)"), args[iJackPortId], args[iJackPortNewName]) | |||
self.DBusPortRenamedCallback.emit(args[iJackPortId], args[iJackPortNewName]) | |||
elif kwds['member'] == "PortsConnected": | |||
self.emit(SIGNAL("DBusPortsConnectedCallback(int, int, int)"), args[iJackConnId], args[iSourcePortId], args[iTargetPortId]) | |||
self.DBusPortsConnectedCallback.emit(args[iJackConnId], args[iSourcePortId], args[iTargetPortId]) | |||
elif kwds['member'] == "PortsDisconnected": | |||
self.emit(SIGNAL("DBusPortsDisconnectedCallback(int)"), args[iJackConnId]) | |||
self.DBusPortsDisconnectedCallback.emit(args[iJackConnId]) | |||
elif kwds['interface'] == "org.ladish.Control": | |||
if DEBUG: print("DBus signal @org.ladish.Control,", kwds['member']) | |||
if kwds['member'] == "StudioAppeared": | |||
self.emit(SIGNAL("DBusStudioAppearedCallback()")) | |||
self.DBusStudioAppearedCallback.emit() | |||
elif kwds['member'] == "StudioDisappeared": | |||
self.emit(SIGNAL("DBusStudioDisappearedCallback()")) | |||
self.DBusStudioDisappearedCallback.emit() | |||
elif kwds['member'] == "QueueExecutionHalted": | |||
self.emit(SIGNAL("DBusQueueExecutionHaltedCallback()")) | |||
self.DBusQueueExecutionHaltedCallback.emit() | |||
elif kwds['member'] == "CleanExit": | |||
self.emit(SIGNAL("DBusCleanExitCallback()")) | |||
self.DBusCleanExitCallback.emit() | |||
elif kwds['interface'] == "org.ladish.Studio": | |||
if DEBUG: print("DBus signal @org.ladish.Studio,", kwds['member']) | |||
if kwds['member'] == "StudioStarted": | |||
self.emit(SIGNAL("DBusStudioStartedCallback()")) | |||
self.DBusStudioStartedCallback.emit() | |||
elif kwds['member'] == "StudioStopped": | |||
self.emit(SIGNAL("DBusStudioStoppedCallback()")) | |||
self.DBusStudioStoppedCallback.emit() | |||
elif kwds['member'] == "StudioRenamed": | |||
self.emit(SIGNAL("DBusStudioRenamedCallback(QString)"), args[iStudioRenamedName]) | |||
self.DBusStudioRenamedCallback.emit(args[iStudioRenamedName]) | |||
elif kwds['member'] == "StudioCrashed": | |||
self.emit(SIGNAL("DBusStudioCrashedCallback()")) | |||
self.DBusStudioCrashedCallback.emit() | |||
elif kwds['member'] == "RoomAppeared": | |||
self.emit(SIGNAL("DBusRoomAppearedCallback(QString, QString)"), args[iRoomAppearedPath], args[iRoomAppearedDict]['name']) | |||
self.DBusRoomAppearedCallback.emit(args[iRoomAppearedPath], args[iRoomAppearedDict]['name']) | |||
elif kwds['member'] == "RoomDisappeared": | |||
self.emit(SIGNAL("DBusRoomDisappearedCallback(QString)"), args[iRoomAppearedPath]) | |||
self.DBusRoomDisappearedCallback.emit(args[iRoomAppearedPath]) | |||
#elif kwds['member'] == "RoomChanged": | |||
#self.emit(SIGNAL("DBusRoomChangedCallback()")) | |||
#self.DBusRoomChangedCallback.emit() | |||
elif kwds['interface'] == "org.ladish.Room": | |||
if DEBUG: print("DBus signal @org.ladish.Room,", kwds['member']) | |||
if kwds['member'] == "ProjectPropertiesChanged": | |||
if "name" in args[iProjChangedDict].keys(): | |||
self.emit(SIGNAL("DBusProjectPropertiesChanged(QString, QString)"), kwds['path'], args[iProjChangedDict]['name']) | |||
self.DBusProjectPropertiesChanged.emit(kwds['path'], args[iProjChangedDict]['name']) | |||
else: | |||
self.emit(SIGNAL("DBusProjectPropertiesChanged(QString, QString)"), kwds['path'], "") | |||
self.DBusProjectPropertiesChanged.emit(kwds['path'], "") | |||
elif kwds['interface'] == "org.ladish.AppSupervisor": | |||
if DEBUG: print("DBus signal @org.ladish.AppSupervisor,", kwds['member']) | |||
if kwds['member'] == "AppAdded2": | |||
self.emit(SIGNAL("DBusAppAdded2Callback(QString, int, QString, bool, bool, QString)"), kwds['path'], args[iAppChangedNumber], args[iAppChangedName], args[iAppChangedActive], args[iAppChangedTerminal], args[iAppChangedLevel]) | |||
self.DBusAppAdded2Callback.emit(kwds['path'], args[iAppChangedNumber], args[iAppChangedName], args[iAppChangedActive], args[iAppChangedTerminal], args[iAppChangedLevel]) | |||
elif kwds['member'] == "AppRemoved": | |||
self.emit(SIGNAL("DBusAppRemovedCallback(QString, int)"), kwds['path'], args[iAppChangedNumber]) | |||
self.DBusAppRemovedCallback.emit(kwds['path'], args[iAppChangedNumber]) | |||
elif kwds['member'] == "AppStateChanged2": | |||
self.emit(SIGNAL("DBusAppStateChanged2Callback(QString, int, QString, bool, bool, QString)"), kwds['path'], args[iAppChangedNumber], args[iAppChangedName], args[iAppChangedActive], args[iAppChangedTerminal], args[iAppChangedLevel]) | |||
self.DBusAppStateChanged2Callback.emit(kwds['path'], args[iAppChangedNumber], args[iAppChangedName], args[iAppChangedActive], args[iAppChangedTerminal], args[iAppChangedLevel]) | |||
elif kwds['interface'] == "org.gna.home.a2jmidid.control": | |||
if kwds['member'] == "bridge_started": | |||
@@ -1618,17 +1650,17 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
def JackBufferSizeCallback(self, buffer_size, arg): | |||
if DEBUG: print("JackBufferSizeCallback(%i)" % buffer_size) | |||
self.emit(SIGNAL("JackBufferSizeCallback(int)"), buffer_size) | |||
self.BufferSizeCallback.emit(buffer_size) | |||
return 0 | |||
def JackSampleRateCallback(self, sample_rate, arg): | |||
if DEBUG: print("JackSampleRateCallback(%i)" % sample_rate) | |||
self.emit(SIGNAL("JackSampleRateCallback(int)"), sample_rate) | |||
self.SampleRateCallback.emit(sample_rate) | |||
return 0 | |||
def JackShutdownCallback(self, arg): | |||
if DEBUG: print("JackShutdownCallback()") | |||
self.emit(SIGNAL("JackShutdownCallback()")) | |||
if DEBUG: print("JackShutdownCallback") | |||
self.ShutdownCallback.emit() | |||
return 0 | |||
@pyqtSlot() | |||
@@ -1645,7 +1677,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
@pyqtSlot() | |||
def slot_studio_load_m(self): | |||
studio_name = self.sender().text() | |||
studio_name = self.sender().property("data") | |||
if studio_name: | |||
gDBus.ladish_control.LoadStudio(studio_name) | |||
@@ -1679,7 +1711,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
@pyqtSlot() | |||
def slot_studio_delete_m(self): | |||
studio_name = self.sender().text() | |||
studio_name = self.sender().property("data") | |||
if studio_name: | |||
gDBus.ladish_control.DeleteStudio(studio_name) | |||
@@ -1691,7 +1723,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
@pyqtSlot() | |||
def slot_room_delete_m(self): | |||
room_name = self.sender().text() | |||
room_name = self.sender().property("data") | |||
if room_name: | |||
gDBus.ladish_studio.DeleteRoom(room_name) | |||
@@ -1716,7 +1748,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
@pyqtSlot() | |||
def slot_project_load_m(self): | |||
act_x_text = self.sender().text() | |||
act_x_text = self.sender().property("data") | |||
if act_x_text: | |||
proj_path = "/" + act_x_text.rsplit("[/", 1)[-1].rsplit("]", 1)[0] | |||
gDBus.ladish_room.LoadProject(proj_path) | |||
@@ -1892,8 +1924,9 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
for studio in studio_list: | |||
studio_name = str(studio[iStudioListName]) | |||
act_x_studio = QAction(studio_name, self.ui.menu_studio_load) | |||
act_x_studio.setProperty("data", studio_name); | |||
self.ui.menu_studio_load.addAction(act_x_studio) | |||
self.connect(act_x_studio, SIGNAL("triggered()"), SLOT("slot_studio_load_m()")) | |||
act_x_studio.triggered.connect(self.slot_studio_load_m) | |||
@pyqtSlot() | |||
def slot_updateMenuStudioList_Delete(self): | |||
@@ -1908,8 +1941,9 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
for studio in studio_list: | |||
studio_name = str(studio[iStudioListName]) | |||
act_x_studio = QAction(studio_name, self.ui.menu_studio_delete) | |||
act_x_studio.setProperty("data", studio_name); | |||
self.ui.menu_studio_delete.addAction(act_x_studio) | |||
self.connect(act_x_studio, SIGNAL("triggered()"), SLOT("slot_studio_delete_m()")) | |||
act_x_studio.triggered.connect(self.slot_studio_delete_m) | |||
@pyqtSlot() | |||
def slot_updateMenuRoomList(self): | |||
@@ -1923,8 +1957,9 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
ladish_room = gDBus.bus.get_object("org.ladish", room_path) | |||
room_name = ladish_room.GetName() | |||
act_x_room = QAction(room_name, self.ui.menu_room_delete) | |||
act_x_room.setProperty("data", room_name); | |||
self.ui.menu_room_delete.addAction(act_x_room) | |||
self.connect(act_x_room, SIGNAL("triggered()"), SLOT("slot_room_delete_m()")) | |||
act_x_room.triggered.connect(self.slot_room_delete_m) | |||
else: | |||
self.createEmptyMenuRoomActon() | |||
@@ -1938,7 +1973,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
self.ui.menu_project_load.clear() | |||
act_project_load = QAction(self.tr("Load from folder..."), self.ui.menu_project_load) | |||
self.ui.menu_project_load.addAction(act_project_load) | |||
self.connect(act_project_load, SIGNAL("triggered()"), SLOT("slot_project_load()")) | |||
act_project_load.triggered.connect(self.slot_project_load) | |||
ladish_recent_iface = dbus.Interface(gDBus.ladish_room, "org.ladish.RecentItems") | |||
proj_list = ladish_recent_iface.get(RECENT_PROJECTS_STORE_MAX_ITEMS) | |||
@@ -1953,8 +1988,9 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
act_x_text = "%s [%s]" % (proj_name, proj_path) | |||
act_x_proj = QAction(act_x_text, self.ui.menu_project_load) | |||
act_x_proj.setProperty("data", act_x_text); | |||
self.ui.menu_project_load.addAction(act_x_proj) | |||
self.connect(act_x_proj, SIGNAL("triggered()"), SLOT("slot_project_load_m()")) | |||
act_x_proj.triggered.connect(self.slot_project_load_m) | |||
@pyqtSlot() | |||
def slot_showAppListCustomMenu(self): | |||
@@ -2193,11 +2229,11 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
if appInterface == "org.jackaudio.service": | |||
if not (self.m_crashedJACK or self.m_crashedLADISH): | |||
self.m_crashedJACK = True | |||
QTimer.singleShot(1000, self, SLOT("slot_handleCrash_jack()")) | |||
QTimer.singleShot(1000, self.slot_handleCrash_jack) | |||
elif appInterface == "org.ladish": | |||
if not (self.m_crashedJACK or self.m_crashedLADISH): | |||
self.m_crashedLADISH = True | |||
QTimer.singleShot(1000, self, SLOT("slot_handleCrash_ladish()")) | |||
QTimer.singleShot(1000, self.slot_handleCrash_ladish) | |||
@pyqtSlot() | |||
def slot_DBusServerStartedCallback(self): | |||
@@ -2310,7 +2346,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
@pyqtSlot() | |||
def slot_DBusStudioCrashedCallback(self): | |||
QTimer.singleShot(0, self, SLOT("slot_handleCrash_studio()")) | |||
QTimer.singleShot(0, self.slot_handleCrash_studio) | |||
@pyqtSlot(str, str) | |||
def slot_DBusRoomAppearedCallback(self, room_path, room_name): | |||
@@ -2619,7 +2655,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
QMessageBox.about(self, self.tr("About Claudia"), self.tr("<h3>Claudia</h3>" | |||
"<br>Version %s" | |||
"<br>Claudia is a Graphical User Interface to LADISH.<br>" | |||
"<br>Copyright (C) 2010-2013 falkTX" % VERSION)) | |||
"<br>Copyright (C) 2010-2018 falkTX" % VERSION)) | |||
def saveSettings(self): | |||
settings = QSettings() | |||
@@ -2636,7 +2672,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
settings = QSettings() | |||
if geometry: | |||
self.restoreGeometry(settings.value("Geometry", "")) | |||
self.restoreGeometry(settings.value("Geometry", b"")) | |||
splitterSizes = settings.value("SplitterSizes", "") | |||
if splitterSizes: | |||
@@ -2671,7 +2707,7 @@ class ClaudiaMainW(AbstractCanvasJackClass): | |||
self.ui.act_app_add_new.setEnabled(USE_CLAUDIA_ADD_NEW) | |||
def resizeEvent(self, event): | |||
QTimer.singleShot(0, self, SLOT("slot_miniCanvasCheckSize()")) | |||
QTimer.singleShot(0, self.slot_miniCanvasCheckSize) | |||
QMainWindow.resizeEvent(self, event) | |||
def timerEvent(self, event): | |||
@@ -38,7 +38,7 @@ list_DAW = [ | |||
[ "muse", "MusE", "DAW", "muse", "muse", TEMPLATE_YES, LEVEL_0, (1, 1, 0, 1, "Native", 1, 1, "ALSA + JACK"), ("file:///usr/share/doc/muse/html/window_ref.html", "http://www.muse-sequencer.org/") ], | |||
[ "musescore", "MuseScore", "MIDI Composer", "mscore", "mscore", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "ALSA | JACK"), ("file:///usr/share/kxstudio/docs/MuseScore-en.pdf", "http://www.musescore.org/") ], | |||
[ "musescore", "MuseScore", "MIDI Composer", "mscore", "mscore", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 1, 1, "ALSA | JACK"), ("file:///usr/share/kxstudio/docs/MuseScore-en.pdf", "http://www.musescore.org/") ], | |||
[ "non-sequencer", "Non-Sequencer", "MIDI Sequencer", "non-sequencer", "non-sequencer", TEMPLATE_YES, LEVEL_NSM, (0, 0, 0, 0, "", 1, 1, "JACK"), ("file:///usr/share/doc/non-sequencer/MANUAL.html", "http://non.tuxfamily.org/wiki/Non%20Sequencer") ], | |||
[ "non-timeline", "Non-Timeline", "DAW", "non-timeline", "non-timeline", TEMPLATE_YES, LEVEL_NSM, (0, 0, 0, 0, "", 1, 0, "CV + OSC"), ("file:///usr/share/doc/non-timeline/MANUAL.html", "http://non.tuxfamily.org/wiki/Non%20Timeline") ], | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# ... TODO | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,10 +19,15 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, Qt, QTimer, QSettings | |||
from PyQt4.QtGui import QMainWindow, QTableWidgetItem, QWidget | |||
from random import randint | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, Qt, QTimer, QSettings | |||
from PyQt5.QtWidgets import QMainWindow, QTableWidgetItem, QWidget | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, Qt, QTimer, QSettings | |||
from PyQt4.QtGui import QMainWindow, QTableWidgetItem, QWidget | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom) | |||
@@ -150,10 +155,11 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
if not os.path.exists(iconPath): | |||
os.mkdir(iconPath) | |||
if os.path.exists(os.path.join(sys.path[0], "..", "icons")): | |||
os.system("cp -r '%s' '%s'" % (os.path.join(sys.path[0], "..", "icons", "claudia-hicolor"), iconPath)) | |||
elif os.path.exists(os.path.join(sys.path[0], "..", "data", "icons")): | |||
os.system("cp -r '%s' '%s'" % (os.path.join(sys.path[0], "..", "data", "icons", "claudia-hicolor"), iconPath)) | |||
syspath = sys.path[0] | |||
if os.path.exists(os.path.join(syspath, "..", "icons")): | |||
os.system("cp -r '%s' '%s'" % (os.path.join(syspath, "..", "icons", "claudia-hicolor"), iconPath)) | |||
elif os.path.exists(os.path.join(syspath, "..", "data", "icons")): | |||
os.system("cp -r '%s' '%s'" % (os.path.join(syspath, "..", "data", "icons", "claudia-hicolor"), iconPath)) | |||
os.system("sed -i 's/X-CURRENT-THEME-X/%s/' '%s'" % (self.m_lastThemeName, os.path.join(iconPath, "claudia-hicolor", "index.theme"))) | |||
@@ -170,22 +176,22 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
self.refreshAll() | |||
self.connect(self.tabWidget, SIGNAL("currentChanged(int)"), SLOT("slot_checkSelectedTab(int)")) | |||
self.connect(self.listDAW, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedDAW(int)")) | |||
self.connect(self.listHost, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedHost(int)")) | |||
self.connect(self.listInstrument, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedInstrument(int)")) | |||
self.connect(self.listBristol, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedBristol(int)")) | |||
self.connect(self.listPlugin, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedPlugin(int)")) | |||
self.connect(self.listEffect, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedEffect(int)")) | |||
self.connect(self.listTool, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedTool(int)")) | |||
self.connect(self.listDAW, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.connect(self.listHost, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.connect(self.listInstrument, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.connect(self.listBristol, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.connect(self.listPlugin, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.connect(self.listEffect, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.connect(self.listTool, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedList()")) | |||
self.tabWidget.currentChanged.connect(self.slot_checkSelectedTab) | |||
self.listDAW.currentCellChanged.connect(self.slot_checkSelectedDAW) | |||
self.listHost.currentCellChanged.connect(self.slot_checkSelectedHost) | |||
self.listInstrument.currentCellChanged.connect(self.slot_checkSelectedInstrument) | |||
self.listBristol.currentCellChanged.connect(self.slot_checkSelectedBristol) | |||
self.listPlugin.currentCellChanged.connect(self.slot_checkSelectedPlugin) | |||
self.listEffect.currentCellChanged.connect(self.slot_checkSelectedEffect) | |||
self.listTool.currentCellChanged.connect(self.slot_checkSelectedTool) | |||
self.listDAW.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
self.listHost.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
self.listInstrument.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
self.listBristol.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
self.listPlugin.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
self.listEffect.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
self.listTool.cellDoubleClicked.connect(self.slot_doubleClickedList) | |||
def getSelectedAppAndBinary(self): | |||
tabIndex = self.tabWidget.currentIndex() | |||
@@ -208,7 +214,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
if tabIndex == iTabPlugin: | |||
plugin = self.listPlugin.item(self.listPlugin.currentRow(), 0).data(Qt.UserRole) | |||
return (plugin["name"], "carla-single %s" % plugin["label"]) | |||
return (plugin["name"], "carla-single lv2 %s" % plugin["label"]) | |||
if tabIndex == iTabEffect: | |||
item = self.listEffect.item(self.listEffect.currentRow(), 0).data(Qt.UserRole) | |||
@@ -270,14 +276,16 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
tmplte_cmd = "" | |||
tmplte_lvl = "0" | |||
if os.path.exists(os.path.join(sys.path[0], "..", "templates")): | |||
tmplte_dir = os.path.join(sys.path[0], "..", "templates") | |||
elif os.path.exists(os.path.join(sys.path[0], "..", "data", "templates")): | |||
tmplte_dir = os.path.join(sys.path[0], "..", "data", "templates") | |||
syspath = sys.path[0] | |||
if os.path.exists(os.path.join(syspath, "..", "templates")): | |||
tmplte_dir = os.path.join(syspath, "..", "templates") | |||
elif os.path.exists(os.path.join(syspath, "..", "data", "templates")): | |||
tmplte_dir = os.path.join(syspath, "..", "data", "templates") | |||
else: | |||
app = None | |||
tmplte_cmd = binary | |||
print("ClaudiaLauncher::createAppTemplate() - Failed to find template dir") | |||
return False | |||
if not os.path.exists(proj_folder): | |||
os.mkdir(proj_folder) | |||
@@ -299,7 +307,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
tmplte_lvl = "1" | |||
elif binary.startswith("carla-single"): | |||
tmplte_cmd = binary | |||
tmplte_cmd = binary + " " + proj_folder | |||
tmplte_lvl = "1" | |||
elif binary == "ardour": | |||
@@ -484,6 +492,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
else: | |||
print("ClaudiaLauncher::createAppTemplate(%s) - Failed to parse app name" % app) | |||
return False | |||
if tmplte_file is not None: | |||
os.system('sed -i "s|X_SR_X-CLAUDIA-X_SR_X|%s|" "%s"' % (proj_srate, tmplte_file)) | |||
@@ -492,6 +501,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
appBus = self.callback_getAppBus() | |||
appBus.RunCustom2(False, tmplte_cmd, app, tmplte_lvl) | |||
return True | |||
def parentR(self): | |||
return self._parent | |||
@@ -816,7 +826,8 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
if haveCarla and os.path.exists("/usr/lib/carla/libcarla_utils.so"): | |||
utils = CarlaUtils("/usr/lib/carla/libcarla_utils.so") | |||
last_pos = 0 | |||
for i in range(utils.get_cached_plugin_count(PLUGIN_LV2, os.getenv("LV2_PATH", "~/.lv2:/usr/lib/lv2:/usr/local/lib/lv2"))): | |||
lv2path = os.getenv("LV2_PATH", "~/.lv2:/usr/lib/lv2:/usr/local/lib/lv2") | |||
for i in range(utils.get_cached_plugin_count(PLUGIN_LV2, lv2path)): | |||
plugin = utils.get_cached_plugin_info(PLUGIN_LV2, i) | |||
if (plugin["hints"] & PLUGIN_HAS_CUSTOM_UI) == 0: | |||
@@ -1119,7 +1130,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW): | |||
if __name__ == '__main__': | |||
import dbus | |||
from signal import signal, SIG_IGN, SIGUSR1 | |||
from PyQt4.QtGui import QApplication | |||
from PyQt5.QtWidgets import QApplication | |||
import jacklib, ui_claudia_launcher_app | |||
# DBus connections | |||
@@ -1149,7 +1160,7 @@ if __name__ == '__main__': | |||
# Check for JACK | |||
self.jack_client = jacklib.client_open("klaudia", jacklib.JackNoStartServer, None) | |||
if not self.jack_client: | |||
QTimer.singleShot(0, self, SLOT("slot_showJackError()")) | |||
QTimer.singleShot(0, self.slot_showJackError) | |||
return | |||
# Set-up GUI | |||
@@ -1175,15 +1186,15 @@ if __name__ == '__main__': | |||
else: | |||
self.slot_enableLADISH(False) | |||
self.connect(self.b_start, SIGNAL("clicked()"), SLOT("slot_startApp()")) | |||
self.connect(self.b_add, SIGNAL("clicked()"), SLOT("slot_addAppToLADISH()")) | |||
self.connect(self.b_refresh, SIGNAL("clicked()"), SLOT("slot_refreshStudioList()")) | |||
self.b_start.clicked.connect(self.slot_startApp) | |||
self.b_add.clicked.connect(self.slot_addAppToLADISH) | |||
self.b_refresh.clicked.connect(self.slot_refreshStudioList) | |||
self.connect(self.co_ladi_room, SIGNAL("currentIndexChanged(int)"), SLOT("slot_checkSelectedRoom(int)")) | |||
self.connect(self.groupLADISH, SIGNAL("toggled(bool)"), SLOT("slot_enableLADISH(bool)")) | |||
self.co_ladi_room.currentIndexChanged[int].connect(self.slot_checkSelectedRoom) | |||
self.groupLADISH.toggled.connect(self.slot_enableLADISH) | |||
self.connect(self.le_url, SIGNAL("textChanged(QString)"), SLOT("slot_checkFolderUrl(QString)")) | |||
self.connect(self.b_open, SIGNAL("clicked()"), SLOT("slot_getAndSetPath()")) | |||
self.le_url.textChanged.connect(self.slot_checkFolderUrl) | |||
self.b_open.clicked.connect(self.slot_getAndSetPath) | |||
def getIcon(self, icon): | |||
return self.launcher.getIcon(icon) | |||
@@ -1326,7 +1337,7 @@ if __name__ == '__main__': | |||
self.launcher.saveSettings() | |||
def loadSettings(self): | |||
self.restoreGeometry(self.settings.value("Geometry", "")) | |||
self.restoreGeometry(self.settings.value("Geometry", b"")) | |||
self.launcher.loadSettings() | |||
def closeEvent(self, event): | |||
@@ -1,8 +1,8 @@ | |||
#!/usr/bin/env python3 | |||
# -*- coding: utf-8 -*- | |||
# Clickable Label, a custom Qt4 widget | |||
# Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||
# Clickable Label, a custom Qt widget | |||
# Copyright (C) 2011-2018 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 | |||
@@ -19,23 +19,31 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, Qt, QTimer, SIGNAL, SLOT | |||
from PyQt4.QtGui import QLabel | |||
if True: | |||
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QTimer | |||
from PyQt5.QtWidgets import QLabel | |||
else: | |||
from PyQt4.QtCore import pyqtSignal, pyqtSlot, Qt, QTimer | |||
from PyQt4.QtGui import QLabel | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Widget Class | |||
class ClickableLabel(QLabel): | |||
clicked = pyqtSignal() | |||
def __init__(self, parent): | |||
QLabel.__init__(self, parent) | |||
self.setCursor(Qt.PointingHandCursor) | |||
def mousePressEvent(self, event): | |||
self.emit(SIGNAL("clicked()")) | |||
self.clicked.emit() | |||
# Use busy cursor for 2 secs | |||
self.setCursor(Qt.WaitCursor) | |||
QTimer.singleShot(2000, self, SLOT("slot_setNormalCursor()")) | |||
QTimer.singleShot(2000, self.slot_setNormalCursor) | |||
QLabel.mousePressEvent(self, event) | |||
@pyqtSlot() | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# JACK Settings Dialog | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,10 +19,17 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, Qt, QSettings, QTimer, SIGNAL, SLOT | |||
from PyQt4.QtGui import QDialog, QDialogButtonBox, QFontMetrics, QMessageBox | |||
from sys import platform, version_info | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, Qt, QSettings, QTimer | |||
from PyQt5.QtGui import QFontMetrics | |||
from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QMessageBox | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, Qt, QSettings, QTimer | |||
from PyQt4.QtGui import QFontMetrics | |||
from PyQt4.QtGui import QDialog, QDialogButtonBox, QMessageBox | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -196,13 +203,15 @@ class JackSettingsW(QDialog): | |||
# Align driver text and hide non available ones | |||
driverList = gJackctl.ReadContainer(["drivers"])[1] | |||
fontMetris = QFontMetrics(self.ui.obj_server_driver.font()) | |||
maxWidth = 75 | |||
for i in range(self.ui.obj_server_driver.rowCount()): | |||
self.ui.obj_server_driver.item(0, i).setTextAlignment(Qt.AlignCenter) | |||
item = self.ui.obj_server_driver.item(i, 0) | |||
item.setTextAlignment(Qt.AlignCenter) | |||
itexText = self.ui.obj_server_driver.item(0, i).text() | |||
itemWidth = QFontMetrics(self.ui.obj_server_driver.font()).width(itexText)+25 | |||
itexText = item.text() | |||
itemWidth = fontMetris.width(itexText)+25 | |||
if itemWidth > maxWidth: | |||
maxWidth = itemWidth | |||
@@ -216,14 +225,14 @@ class JackSettingsW(QDialog): | |||
# ------------------------------------------------------------- | |||
# Set-up connections | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_saveJackSettings()")) | |||
self.connect(self.ui.buttonBox.button(QDialogButtonBox.Reset), SIGNAL("clicked()"), SLOT("slot_resetJackSettings()")) | |||
self.accepted.connect(self.slot_saveJackSettings) | |||
self.ui.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self.slot_resetJackSettings) | |||
self.connect(self.ui.obj_driver_duplex, SIGNAL("clicked(bool)"), SLOT("slot_checkDuplexSelection(bool)")) | |||
self.connect(self.ui.obj_server_driver, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkDriverSelection(int)")) | |||
self.ui.obj_driver_duplex.clicked.connect(self.slot_checkDuplexSelection) | |||
self.ui.obj_server_driver.currentCellChanged.connect(self.slot_checkDriverSelection) | |||
self.connect(self.ui.obj_driver_capture, SIGNAL("currentIndexChanged(int)"), SLOT("slot_checkALSASelection()")) | |||
self.connect(self.ui.obj_driver_playback, SIGNAL("currentIndexChanged(int)"), SLOT("slot_checkALSASelection()")) | |||
self.ui.obj_driver_capture.currentIndexChanged[int].connect(self.slot_checkALSASelection) | |||
self.ui.obj_driver_playback.currentIndexChanged[int].connect(self.slot_checkALSASelection) | |||
# ------------------------------------------------------------- | |||
# Load initial settings | |||
@@ -395,28 +404,30 @@ class JackSettingsW(QDialog): | |||
elif attribute == "alias": | |||
self.ui.obj_server_alias.setChecked(bool(value)) | |||
elif attribute == "client-timeout": | |||
self.setComboBoxValue(self.ui.obj_server_client_timeout, str(value)) | |||
self.setComboBoxValue(self.ui.obj_server_client_timeout, str(int(value))) | |||
elif attribute == "clock-source": | |||
value = str(value) | |||
if value == "c": | |||
self.ui.obj_server_clock_source_cycle.setChecked(True) | |||
elif value == "h": | |||
self.ui.obj_server_clock_source_hpet.setChecked(True) | |||
elif value == "s": | |||
self.ui.obj_server_clock_source_system.setChecked(True) | |||
if len(str(value)) == 1 : | |||
value = str(value) | |||
if value == "c": | |||
self.ui.obj_server_clock_source_cycle.setChecked(True) | |||
elif value == "h": | |||
self.ui.obj_server_clock_source_hpet.setChecked(True) | |||
elif value == "s": | |||
self.ui.obj_server_clock_source_system.setChecked(True) | |||
else: | |||
value = int(value) | |||
self.fBrokenServerClockSource = True | |||
if value == str(JACK_TIMER_SYSTEM_CLOCK): | |||
if value == JACK_TIMER_SYSTEM_CLOCK: | |||
self.ui.obj_server_clock_source_system.setChecked(True) | |||
elif value == str(JACK_TIMER_CYCLE_COUNTER): | |||
elif value == JACK_TIMER_CYCLE_COUNTER: | |||
self.ui.obj_server_clock_source_cycle.setChecked(True) | |||
elif value == str(JACK_TIMER_HPET): | |||
elif value == JACK_TIMER_HPET: | |||
self.ui.obj_server_clock_source_hpet.setChecked(True) | |||
else: | |||
self.ui.obj_server_clock_source.setEnabled(False) | |||
print("JackSettingsW::saveServerSettings() - Invalid clock-source value '%s'" % value) | |||
elif attribute == "port-max": | |||
self.setComboBoxValue(self.ui.obj_server_port_max, str(value)) | |||
self.setComboBoxValue(self.ui.obj_server_port_max, str(int(value))) | |||
elif attribute == "replace-registry": | |||
self.ui.obj_server_replace_registry.setChecked(bool(value)) | |||
elif attribute == "sync": | |||
@@ -618,17 +629,21 @@ class JackSettingsW(QDialog): | |||
elif attribute == "capture": | |||
if self.fDriverName == "firewire": | |||
self.ui.obj_driver_capture.setCurrentIndex(1 if bool(value) else 0) | |||
elif self.fDriverName == "dummy": | |||
self.setComboBoxValue(self.ui.obj_driver_capture, str(int(value)), True) | |||
else: | |||
self.setComboBoxValue(self.ui.obj_driver_capture, str(value), True) | |||
elif attribute == "playback": | |||
if self.fDriverName == "firewire": | |||
self.ui.obj_driver_playback.setCurrentIndex(1 if bool(value) else 0) | |||
elif self.fDriverName == "dummy": | |||
self.setComboBoxValue(self.ui.obj_driver_playback, str(int(value)), True) | |||
else: | |||
self.setComboBoxValue(self.ui.obj_driver_playback, str(value), True) | |||
elif attribute == "rate": | |||
self.setComboBoxValue(self.ui.obj_driver_rate, str(value)) | |||
self.setComboBoxValue(self.ui.obj_driver_rate, str(int(value))) | |||
elif attribute == "period": | |||
self.setComboBoxValue(self.ui.obj_driver_period, str(value)) | |||
self.setComboBoxValue(self.ui.obj_driver_period, str(int(value))) | |||
elif attribute == "nperiods": | |||
self.ui.obj_driver_nperiods.setValue(int(value)) | |||
elif attribute == "hwmon": | |||
@@ -725,8 +740,8 @@ class JackSettingsW(QDialog): | |||
# ----------------------------------------------------------------- | |||
# Qt SLOT calls | |||
@pyqtSlot() | |||
def slot_checkALSASelection(self): | |||
@pyqtSlot(int) | |||
def slot_checkALSASelection(self, ignored=0): | |||
if self.fDriverName == "alsa": | |||
check = bool(self.ui.obj_driver_duplex.isChecked() and (self.ui.obj_driver_capture.currentIndex() > 0 or self.ui.obj_driver_playback.currentIndex() > 0)) | |||
self.ui.obj_driver_device.setEnabled(not check) | |||
@@ -845,22 +860,22 @@ class JackSettingsW(QDialog): | |||
self.ui.obj_driver_channels_label.setEnabled(driverHasFeature("channels")) | |||
# Misc stuff | |||
if self.ui.obj_server_driver.item(0, row).text() == "ALSA": | |||
if self.ui.obj_server_driver.item(row, 0).text() == "ALSA": | |||
self.ui.toolbox_driver_misc.setCurrentIndex(1) | |||
self.ui.obj_driver_capture_label.setText(self.tr("Input Device:")) | |||
self.ui.obj_driver_playback_label.setText(self.tr("Output Device:")) | |||
elif self.ui.obj_server_driver.item(0, row).text() == "Dummy": | |||
elif self.ui.obj_server_driver.item(row, 0).text() == "Dummy": | |||
self.ui.toolbox_driver_misc.setCurrentIndex(2) | |||
self.ui.obj_driver_capture_label.setText(self.tr("Input Ports:")) | |||
self.ui.obj_driver_playback_label.setText(self.tr("Output Ports:")) | |||
elif self.ui.obj_server_driver.item(0, row).text() == "FireWire": | |||
elif self.ui.obj_server_driver.item(row, 0).text() == "FireWire": | |||
self.ui.toolbox_driver_misc.setCurrentIndex(3) | |||
self.ui.obj_driver_capture_label.setText(self.tr("Capture Ports:")) | |||
self.ui.obj_driver_playback_label.setText(self.tr("Playback Ports:")) | |||
elif self.ui.obj_server_driver.item(0, row).text() == "Loopback": | |||
elif self.ui.obj_server_driver.item(row, 0).text() == "Loopback": | |||
self.ui.toolbox_driver_misc.setCurrentIndex(4) | |||
else: | |||
@@ -892,7 +907,7 @@ class JackSettingsW(QDialog): | |||
def loadSettings(self): | |||
settings = QSettings("Cadence", "JackSettings") | |||
self.restoreGeometry(settings.value("Geometry", "")) | |||
self.restoreGeometry(settings.value("Geometry", b"")) | |||
self.ui.tabWidget.setCurrentIndex(settings.value("CurrentTab", 0, type=int)) | |||
def closeEvent(self, event): | |||
@@ -910,7 +925,8 @@ if __name__ == '__main__': | |||
# Additional imports | |||
import resources_rc | |||
from sys import argv as sys_argv, exit as sys_exit | |||
from PyQt4.QtGui import QApplication, QIcon | |||
from PyQt5.QtGui import QIcon | |||
from PyQt5.QtWidgets import QApplication | |||
# App initialization | |||
app = QApplication(sys_argv) | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# JACK, A2J, LASH and LADISH Logs Viewer | |||
# Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2011-2018 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 | |||
@@ -19,8 +19,14 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, Qt, QFile, QIODevice, QMutex, QMutexLocker, QTextStream, QThread, QSettings | |||
from PyQt4.QtGui import QDialog, QPalette, QSyntaxHighlighter | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, Qt, QFile, QIODevice, QMutex, QMutexLocker, QTextStream, QThread, QSettings | |||
from PyQt5.QtGui import QPalette, QSyntaxHighlighter | |||
from PyQt5.QtWidgets import QDialog | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, Qt, QFile, QIODevice, QMutex, QMutexLocker, QTextStream, QThread, QSettings | |||
from PyQt4.QtGui import QPalette, QSyntaxHighlighter | |||
from PyQt4.QtGui import QDialog | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -118,6 +124,8 @@ class SyntaxHighlighter_LADISH(QSyntaxHighlighter): | |||
class LogsReadThread(QThread): | |||
MAX_INITIAL_SIZE = 2*1024*1024 # 2Mb | |||
updateLogs = pyqtSignal() | |||
def __init__(self, parent): | |||
QThread.__init__(self, parent) | |||
@@ -236,7 +244,7 @@ class LogsReadThread(QThread): | |||
textLADISH = "" | |||
self.fRealParent.setLogsText(textJACK, textA2J, textLASH, textLADISH) | |||
self.emit(SIGNAL("updateLogs()")) | |||
self.updateLogs.emit() | |||
if not self.fCloseNow: | |||
self.sleep(1) | |||
@@ -279,6 +287,10 @@ class LogsW(QDialog): | |||
if not os.path.exists(LOG_FILE_LADISH): | |||
LOG_FILE_LADISH = None | |||
SIGTERM = pyqtSignal() | |||
SIGUSR1 = pyqtSignal() | |||
SIGUSR2 = pyqtSignal() | |||
def __init__(self, parent): | |||
QDialog.__init__(self, parent) | |||
self.ui = ui_logs.Ui_LogsW() | |||
@@ -349,8 +361,8 @@ class LogsW(QDialog): | |||
# ------------------------------------------------------------- | |||
# Set-up connections | |||
self.connect(self.ui.b_purge, SIGNAL("clicked()"), SLOT("slot_purgeLogs()")) | |||
self.connect(self.fReadThread, SIGNAL("updateLogs()"), SLOT("slot_updateLogs()")) | |||
self.ui.b_purge.clicked.connect(self.slot_purgeLogs) | |||
self.fReadThread.updateLogs.connect(self.slot_updateLogs) | |||
# ------------------------------------------------------------- | |||
@@ -405,7 +417,7 @@ class LogsW(QDialog): | |||
def loadSettings(self): | |||
settings = QSettings("Cadence", "Cadence-Logs") | |||
self.restoreGeometry(settings.value("Geometry", "")) | |||
self.restoreGeometry(settings.value("Geometry", b"")) | |||
def saveSettings(self): | |||
settings = QSettings("Cadence", "Cadence-Logs") | |||
@@ -431,7 +443,7 @@ class LogsW(QDialog): | |||
if __name__ == '__main__': | |||
# Additional imports | |||
from PyQt4.QtGui import QApplication | |||
from PyQt5.QtWidgets import QApplication | |||
# App initialization | |||
app = QApplication(sys.argv) | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# PatchBay Canvas engine using QGraphicsView/Scene | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -17,14 +17,24 @@ | |||
# For a full copy of the GNU General Public License see the GPL.txt file | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSignal, pyqtSlot, qDebug, 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 | |||
from PyQt4.QtGui import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem | |||
from PyQt4.QtGui import QGraphicsColorizeEffect, QGraphicsDropShadowEffect | |||
from PyQt4.QtGui import QInputDialog, QLineEdit, QMenu | |||
from PyQt4.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||
if True: | |||
from PyQt5.QtCore import pyqtSignal, pyqtSlot, qDebug, 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 | |||
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem | |||
from PyQt5.QtWidgets import QGraphicsColorizeEffect, QGraphicsDropShadowEffect | |||
from PyQt5.QtWidgets import QInputDialog, QLineEdit, QMenu | |||
from PyQt5.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||
else: | |||
from PyQt4.QtCore import pyqtSignal, pyqtSlot, qDebug, 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 | |||
from PyQt4.QtGui import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem | |||
from PyQt4.QtGui import QGraphicsColorizeEffect, QGraphicsDropShadowEffect | |||
from PyQt4.QtGui import QInputDialog, QLineEdit, QMenu | |||
from PyQt4.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||
# Imports (Theme) | |||
from patchcanvas_theme import * | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# PatchBay Canvas Themes | |||
# Copyright (C) 2010-2012 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,8 +19,12 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import Qt | |||
from PyQt4.QtGui import QColor, QFont, QPen, QPixmap | |||
if True: | |||
from PyQt5.QtCore import Qt | |||
from PyQt5.QtGui import QColor, QFont, QPen, QPixmap | |||
else: | |||
from PyQt4.QtCore import Qt | |||
from PyQt4.QtGui import QColor, QFont, QPen, QPixmap | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# patchcanvas-theme.cpp | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# JACK-Capture frontend, with freewheel and transport support | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,10 +19,15 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, QProcess, QTime, QTimer, QSettings | |||
from PyQt4.QtGui import QDialog | |||
from time import sleep | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, QProcess, QTime, QTimer, QSettings | |||
from PyQt5.QtWidgets import QDialog | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, QProcess, QTime, QTimer, QSettings | |||
from PyQt4.QtGui import QDialog | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -138,15 +143,15 @@ class RenderW(QDialog): | |||
# ------------------------------------------------------------- | |||
# Set-up connections | |||
self.connect(self.ui.b_render, SIGNAL("clicked()"), SLOT("slot_renderStart()")) | |||
self.connect(self.ui.b_stop, SIGNAL("clicked()"), SLOT("slot_renderStop()")) | |||
self.connect(self.ui.b_open, SIGNAL("clicked()"), SLOT("slot_getAndSetPath()")) | |||
self.connect(self.ui.b_now_start, SIGNAL("clicked()"), SLOT("slot_setStartNow()")) | |||
self.connect(self.ui.b_now_end, SIGNAL("clicked()"), SLOT("slot_setEndNow()")) | |||
self.connect(self.ui.te_start, SIGNAL("timeChanged(const QTime)"), SLOT("slot_updateStartTime(const QTime)")) | |||
self.connect(self.ui.te_end, SIGNAL("timeChanged(const QTime)"), SLOT("slot_updateEndTime(const QTime)")) | |||
self.connect(self.ui.group_time, SIGNAL("clicked(bool)"), SLOT("slot_transportChecked(bool)")) | |||
self.connect(self.fTimer, SIGNAL("timeout()"), SLOT("slot_updateProgressbar()")) | |||
self.ui.b_render.clicked.connect(self.slot_renderStart) | |||
self.ui.b_stop.clicked.connect(self.slot_renderStop) | |||
self.ui.b_open.clicked.connect(self.slot_getAndSetPath) | |||
self.ui.b_now_start.clicked.connect(self.slot_setStartNow) | |||
self.ui.b_now_end.clicked.connect(self.slot_setEndNow) | |||
self.ui.te_start.timeChanged.connect(self.slot_updateStartTime) | |||
self.ui.te_end.timeChanged.connect(self.slot_updateEndTime) | |||
self.ui.group_time.clicked.connect(self.slot_transportChecked) | |||
self.fTimer.timeout.connect(self.slot_updateProgressbar) | |||
# ------------------------------------------------------------- | |||
@@ -375,7 +380,7 @@ class RenderW(QDialog): | |||
def loadSettings(self): | |||
settings = QSettings("Cadence", "Cadence-Render") | |||
self.restoreGeometry(settings.value("Geometry", "")) | |||
self.restoreGeometry(settings.value("Geometry", b"")) | |||
outputFolder = settings.value("OutputFolder", HOME) | |||
@@ -429,7 +434,7 @@ class RenderW(QDialog): | |||
if __name__ == '__main__': | |||
# Additional imports | |||
from PyQt4.QtGui import QApplication | |||
from PyQt5.QtWidgets import QApplication | |||
# App initialization | |||
app = QApplication(sys.argv) | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# Common/Shared code | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -23,14 +23,21 @@ import os | |||
import sys | |||
from codecs import open as codecopen | |||
from unicodedata import normalize | |||
from PyQt4.QtCore import qWarning, SIGNAL, SLOT | |||
from PyQt4.QtGui import QApplication, QFileDialog, QIcon, QMessageBox | |||
if True: | |||
from PyQt5.QtCore import pyqtSignal, qWarning | |||
from PyQt5.QtGui import QIcon | |||
from PyQt5.QtWidgets import QApplication, QFileDialog, QMessageBox | |||
else: | |||
from PyQt4.QtCore import pyqtSignal, qWarning | |||
from PyQt4.QtGui import QIcon | |||
from PyQt4.QtGui import QApplication, QFileDialog, QMessageBox | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Set Platform | |||
if sys.platform == "darwin": | |||
from PyQt4.QtGui import qt_mac_set_menubar_icons | |||
from PyQt5.QtGui import qt_mac_set_menubar_icons | |||
qt_mac_set_menubar_icons(False) | |||
HAIKU = False | |||
LINUX = False | |||
@@ -67,10 +74,18 @@ try: | |||
except: | |||
haveSignal = False | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Safe exception hook, needed for PyQt5 | |||
def sys_excepthook(typ, value, tback): | |||
return sys.__excepthook__(typ, value, tback) | |||
sys.excepthook = sys_excepthook | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Set Version | |||
VERSION = "0.8.1" | |||
VERSION = "0.9.0" | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Set Debug mode | |||
@@ -216,8 +231,8 @@ def setUpSignals(self_): | |||
signal(SIGUSR1, signalHandler) | |||
signal(SIGUSR2, signalHandler) | |||
gGui.connect(gGui, SIGNAL("SIGTERM()"), closeWindowHandler) | |||
gGui.connect(gGui, SIGNAL("SIGUSR2()"), showWindowHandler) | |||
gGui.SIGTERM.connect(closeWindowHandler) | |||
gGui.SIGUSR2.connect(showWindowHandler) | |||
def signalHandler(sig, frame): | |||
global gGui | |||
@@ -226,11 +241,11 @@ def signalHandler(sig, frame): | |||
return | |||
if sig in (SIGINT, SIGTERM): | |||
gGui.emit(SIGNAL("SIGTERM()")) | |||
gGui.SIGTERM.emit() | |||
elif sig == SIGUSR1: | |||
gGui.emit(SIGNAL("SIGUSR1()")) | |||
gGui.SIGUSR1.emit() | |||
elif sig == SIGUSR2: | |||
gGui.emit(SIGNAL("SIGUSR2()")) | |||
gGui.SIGUSR2.emit() | |||
def closeWindowHandler(): | |||
global gGui | |||
@@ -271,7 +286,6 @@ def setIcons(self_, modes): | |||
gGui.ui.act_canvas_zoom_in.setIcon(getIcon("zoom-in")) | |||
gGui.ui.act_canvas_zoom_out.setIcon(getIcon("zoom-out")) | |||
gGui.ui.act_canvas_zoom_100.setIcon(getIcon("zoom-original")) | |||
gGui.ui.act_canvas_print.setIcon(getIcon("document-print")) | |||
gGui.ui.b_canvas_zoom_fit.setIcon(getIcon("zoom-fit-best")) | |||
gGui.ui.b_canvas_zoom_in.setIcon(getIcon("zoom-in")) | |||
gGui.ui.b_canvas_zoom_out.setIcon(getIcon("zoom-out")) | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# Common/Shared code for Cadence | |||
# Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2012-2018 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 | |||
@@ -19,9 +19,13 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import QProcess, QSettings | |||
from time import sleep | |||
if True: | |||
from PyQt5.QtCore import QProcess, QSettings | |||
else: | |||
from PyQt4.QtCore import QProcess, QSettings | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -68,6 +72,11 @@ iAlsaFileMax = 4 | |||
GlobalSettings = QSettings("Cadence", "GlobalSettings") | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# KXStudio Check | |||
wantJackStart = os.path.exists("/usr/share/kxstudio/config/config/Cadence/GlobalSettings.conf") | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Get Process list | |||
@@ -130,8 +139,9 @@ def tryCloseJackDBus(): | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Stop all audio processes, used for force-restart | |||
def stopAllAudioProcesses(): | |||
tryCloseJackDBus() | |||
def stopAllAudioProcesses(tryCloseJack = True): | |||
if tryCloseJack: | |||
tryCloseJackDBus() | |||
if not (HAIKU or LINUX or MACOS): | |||
print("stopAllAudioProcesses() - Not supported in this system") | |||
@@ -140,7 +150,7 @@ def stopAllAudioProcesses(): | |||
process = QProcess() | |||
# Tell pulse2jack script to create files, prevents pulseaudio respawn | |||
process.start("cadence-pulse2jack", "--dummy") | |||
process.start("cadence-pulse2jack", ["--dummy"]) | |||
process.waitForFinished() | |||
procsTerm = ["a2j", "a2jmidid", "artsd", "jackd", "jackdmp", "knotify4", "lash", "ladishd", "ladiappd", "ladiconfd", "jmcore"] | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# Common/Shared code related to Canvas and JACK | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,8 +19,14 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, QTimer | |||
from PyQt4.QtGui import QCursor, QFontMetrics, QImage, QMainWindow, QMenu, QPainter, QPrinter, QPrintDialog | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, QTimer | |||
from PyQt5.QtGui import QCursor, QFontMetrics, QImage, QPainter | |||
from PyQt5.QtWidgets import QMainWindow, QMenu | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, QTimer | |||
from PyQt4.QtGui import QCursor, QFontMetrics, QImage, QPainter | |||
from PyQt4.QtGui import QMainWindow, QMenu | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -95,6 +101,19 @@ gJack.client = None | |||
# Abstract Canvas and JACK Class | |||
class AbstractCanvasJackClass(QMainWindow): | |||
XRunCallback = pyqtSignal() | |||
BufferSizeCallback = pyqtSignal(int) | |||
SampleRateCallback = pyqtSignal(int) | |||
ClientRenameCallback = pyqtSignal(str, str) | |||
PortRegistrationCallback = pyqtSignal(int, bool) | |||
PortConnectCallback = pyqtSignal(int, int, bool) | |||
PortRenameCallback = pyqtSignal(int, str, str) | |||
ShutdownCallback = pyqtSignal() | |||
SIGTERM = pyqtSignal() | |||
SIGUSR1 = pyqtSignal() | |||
SIGUSR2 = pyqtSignal() | |||
def __init__(self, appName, UiClass, parent): | |||
QMainWindow.__init__(self, parent) | |||
@@ -477,23 +496,10 @@ class AbstractCanvasJackClass(QMainWindow): | |||
def slot_canvasZoomReset(self): | |||
self.scene.zoom_reset() | |||
@pyqtSlot() | |||
def slot_canvasPrint(self): | |||
self.scene.clearSelection() | |||
self.fExportPrinter = QPrinter() | |||
dialog = QPrintDialog(self.fExportPrinter, self) | |||
if dialog.exec_(): | |||
painter = QPainter(self.fExportPrinter) | |||
painter.save() | |||
painter.setRenderHint(QPainter.Antialiasing, True) | |||
painter.setRenderHint(QPainter.TextAntialiasing, True) | |||
self.scene.render(painter) | |||
painter.restore() | |||
@pyqtSlot() | |||
def slot_canvasSaveImage(self): | |||
newPath = QFileDialog.getSaveFileName(self, self.tr("Save Image"), filter=self.tr("PNG Image (*.png);;JPEG Image (*.jpg)")) | |||
newPath = newPath[0] | |||
if not newPath: | |||
return | |||
@@ -523,56 +529,55 @@ class AbstractCanvasJackClass(QMainWindow): | |||
def setCanvasConnections(self): | |||
self.ui.act_canvas_arrange.setEnabled(False) # TODO, later | |||
self.connect(self.ui.act_canvas_arrange, SIGNAL("triggered()"), SLOT("slot_canvasArrange()")) | |||
self.connect(self.ui.act_canvas_refresh, SIGNAL("triggered()"), SLOT("slot_canvasRefresh()")) | |||
self.connect(self.ui.act_canvas_zoom_fit, SIGNAL("triggered()"), SLOT("slot_canvasZoomFit()")) | |||
self.connect(self.ui.act_canvas_zoom_in, SIGNAL("triggered()"), SLOT("slot_canvasZoomIn()")) | |||
self.connect(self.ui.act_canvas_zoom_out, SIGNAL("triggered()"), SLOT("slot_canvasZoomOut()")) | |||
self.connect(self.ui.act_canvas_zoom_100, SIGNAL("triggered()"), SLOT("slot_canvasZoomReset()")) | |||
self.connect(self.ui.act_canvas_print, SIGNAL("triggered()"), SLOT("slot_canvasPrint()")) | |||
self.connect(self.ui.act_canvas_save_image, SIGNAL("triggered()"), SLOT("slot_canvasSaveImage()")) | |||
self.connect(self.ui.b_canvas_zoom_fit, SIGNAL("clicked()"), SLOT("slot_canvasZoomFit()")) | |||
self.connect(self.ui.b_canvas_zoom_in, SIGNAL("clicked()"), SLOT("slot_canvasZoomIn()")) | |||
self.connect(self.ui.b_canvas_zoom_out, SIGNAL("clicked()"), SLOT("slot_canvasZoomOut()")) | |||
self.connect(self.ui.b_canvas_zoom_100, SIGNAL("clicked()"), SLOT("slot_canvasZoomReset()")) | |||
self.ui.act_canvas_arrange.triggered.connect(self.slot_canvasArrange) | |||
self.ui.act_canvas_refresh.triggered.connect(self.slot_canvasRefresh) | |||
self.ui.act_canvas_zoom_fit.triggered.connect(self.slot_canvasZoomFit) | |||
self.ui.act_canvas_zoom_in.triggered.connect(self.slot_canvasZoomIn) | |||
self.ui.act_canvas_zoom_out.triggered.connect(self.slot_canvasZoomOut) | |||
self.ui.act_canvas_zoom_100.triggered.connect(self.slot_canvasZoomReset) | |||
self.ui.act_canvas_save_image.triggered.connect(self.slot_canvasSaveImage) | |||
self.ui.b_canvas_zoom_fit.clicked.connect(self.slot_canvasZoomFit) | |||
self.ui.b_canvas_zoom_in.clicked.connect(self.slot_canvasZoomIn) | |||
self.ui.b_canvas_zoom_out.clicked.connect(self.slot_canvasZoomOut) | |||
self.ui.b_canvas_zoom_100.clicked.connect(self.slot_canvasZoomReset) | |||
def setJackConnections(self, modes): | |||
if "jack" in modes: | |||
self.connect(self.ui.act_jack_clear_xruns, SIGNAL("triggered()"), SLOT("slot_JackClearXruns()")) | |||
self.connect(self.ui.act_jack_render, SIGNAL("triggered()"), SLOT("slot_showRender()")) | |||
self.connect(self.ui.act_jack_configure, SIGNAL("triggered()"), SLOT("slot_showJackSettings()")) | |||
self.connect(self.ui.b_jack_clear_xruns, SIGNAL("clicked()"), SLOT("slot_JackClearXruns()")) | |||
self.connect(self.ui.b_jack_configure, SIGNAL("clicked()"), SLOT("slot_showJackSettings()")) | |||
self.connect(self.ui.b_jack_render, SIGNAL("clicked()"), SLOT("slot_showRender()")) | |||
self.connect(self.ui.cb_buffer_size, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_jackBufferSize_ComboBox(QString)")) | |||
self.connect(self.ui.cb_sample_rate, SIGNAL("currentIndexChanged(QString)"), SLOT("slot_jackSampleRate_ComboBox(QString)")) | |||
self.connect(self.ui.b_xruns, SIGNAL("clicked()"), SLOT("slot_JackClearXruns()")) | |||
self.ui.act_jack_clear_xruns.triggered.connect(self.slot_JackClearXruns) | |||
self.ui.act_jack_render.triggered.connect(self.slot_showRender) | |||
self.ui.act_jack_configure.triggered.connect(self.slot_showJackSettings) | |||
self.ui.b_jack_clear_xruns.clicked.connect(self.slot_JackClearXruns) | |||
self.ui.b_jack_configure.clicked.connect(self.slot_showJackSettings) | |||
self.ui.b_jack_render.clicked.connect(self.slot_showRender) | |||
self.ui.cb_buffer_size.currentIndexChanged[str].connect(self.slot_jackBufferSize_ComboBox) | |||
self.ui.cb_sample_rate.currentIndexChanged[str].connect(self.slot_jackSampleRate_ComboBox) | |||
self.ui.b_xruns.clicked.connect(self.slot_JackClearXruns) | |||
if "buffer-size" in modes: | |||
self.connect(self.ui.act_jack_bf_16, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_32, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_64, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_128, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_256, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_512, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_1024, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_2048, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_4096, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.connect(self.ui.act_jack_bf_8192, SIGNAL("triggered(bool)"), SLOT("slot_jackBufferSize_Menu(bool)")) | |||
self.ui.act_jack_bf_16.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_32.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_64.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_128.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_256.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_512.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_1024.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_2048.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_4096.triggered.connect(self.slot_jackBufferSize_Menu) | |||
self.ui.act_jack_bf_8192.triggered.connect(self.slot_jackBufferSize_Menu) | |||
if "transport" in modes: | |||
self.connect(self.ui.act_transport_play, SIGNAL("triggered(bool)"), SLOT("slot_transportPlayPause(bool)")) | |||
self.connect(self.ui.act_transport_stop, SIGNAL("triggered()"), SLOT("slot_transportStop()")) | |||
self.connect(self.ui.act_transport_backwards, SIGNAL("triggered()"), SLOT("slot_transportBackwards()")) | |||
self.connect(self.ui.act_transport_forwards, SIGNAL("triggered()"), SLOT("slot_transportForwards()")) | |||
self.connect(self.ui.b_transport_play, SIGNAL("clicked(bool)"), SLOT("slot_transportPlayPause(bool)")) | |||
self.connect(self.ui.b_transport_stop, SIGNAL("clicked()"), SLOT("slot_transportStop()")) | |||
self.connect(self.ui.b_transport_backwards, SIGNAL("clicked()"), SLOT("slot_transportBackwards()")) | |||
self.connect(self.ui.b_transport_forwards, SIGNAL("clicked()"), SLOT("slot_transportForwards()")) | |||
self.connect(self.ui.label_time, SIGNAL("customContextMenuRequested(QPoint)"), SLOT("slot_transportViewMenu()")) | |||
self.ui.act_transport_play.triggered.connect(self.slot_transportPlayPause) | |||
self.ui.act_transport_stop.triggered.connect(self.slot_transportStop) | |||
self.ui.act_transport_backwards.triggered.connect(self.slot_transportBackwards) | |||
self.ui.act_transport_forwards.triggered.connect(self.slot_transportForwards) | |||
self.ui.b_transport_play.clicked.connect(self.slot_transportPlayPause) | |||
self.ui.b_transport_stop.clicked.connect(self.slot_transportStop) | |||
self.ui.b_transport_backwards.clicked.connect(self.slot_transportBackwards) | |||
self.ui.b_transport_forwards.clicked.connect(self.slot_transportForwards) | |||
self.ui.label_time.customContextMenuRequested.connect(self.slot_transportViewMenu) | |||
if "misc" in modes: | |||
if LINUX: | |||
self.connect(self.ui.act_show_logs, SIGNAL("triggered()"), SLOT("slot_showLogs()")) | |||
self.ui.act_show_logs.triggered.connect(self.slot_showLogs) | |||
else: | |||
self.ui.act_show_logs.setEnabled(False) |
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# Common/Shared code related to the Settings dialog | |||
# Copyright (C) 2010-2013 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2010-2018 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 | |||
@@ -19,8 +19,12 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
from PyQt4.QtCore import pyqtSlot, QSettings | |||
from PyQt4.QtGui import QDialog, QDialogButtonBox | |||
if True: | |||
from PyQt5.QtCore import pyqtSlot, QSettings | |||
from PyQt5.QtWidgets import QDialog, QDialogButtonBox | |||
else: | |||
from PyQt4.QtCore import pyqtSlot, QSettings | |||
from PyQt4.QtGui import QDialog, QDialogButtonBox | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -134,9 +138,9 @@ class SettingsW(QDialog): | |||
# ------------------------------------------------------------- | |||
# Set-up connections | |||
self.connect(self, SIGNAL("accepted()"), SLOT("slot_saveSettings()")) | |||
self.connect(self.ui.buttonBox.button(QDialogButtonBox.Reset), SIGNAL("clicked()"), SLOT("slot_resetSettings()")) | |||
self.connect(self.ui.b_main_def_folder_open, SIGNAL("clicked()"), SLOT("slot_getAndSetProjectPath()")) | |||
self.accepted.connect(self.slot_saveSettings) | |||
self.ui.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self.slot_resetSettings) | |||
self.ui.b_main_def_folder_open.clicked.connect(self.slot_getAndSetProjectPath) | |||
def loadSettings(self): | |||
settings = QSettings() | |||
@@ -2,7 +2,7 @@ | |||
# -*- coding: utf-8 -*- | |||
# KDE, App-Indicator or Qt Systray | |||
# Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> | |||
# Copyright (C) 2011-2018 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 | |||
@@ -18,42 +18,31 @@ | |||
# Imports (Global) | |||
import os, sys | |||
from PyQt4.QtCore import QTimer, SIGNAL | |||
from PyQt4.QtGui import QAction, QIcon, QMainWindow, QMenu, QSystemTrayIcon | |||
if True: | |||
from PyQt5.QtCore import QTimer | |||
from PyQt5.QtGui import QIcon | |||
from PyQt5.QtWidgets import QAction, QMainWindow, QMenu, QSystemTrayIcon | |||
else: | |||
from PyQt4.QtCore import QTimer | |||
from PyQt4.QtGui import QIcon | |||
from PyQt4.QtGui import QAction, QMainWindow, QMenu, QSystemTrayIcon | |||
try: | |||
if False and os.getenv("DESKTOP_SESSION") in ("ubuntu", "ubuntu-2d") and not os.path.exists("/var/cadence/no_app_indicators"): | |||
# Check current Qt theme. If Gtk+, use Gtk2 AppIndicator | |||
style = None | |||
if len(sys.argv) > 2 and "-style" in sys.argv: | |||
i = sys.argv.index("-style") | |||
if i < len(sys.argv): | |||
style = sys.argv[i+1] | |||
check_cmd = "python3 -c 'import sys; from PyQt4.QtGui import QApplication; app = QApplication(sys.argv); print(app.style().objectName())'" | |||
if style: | |||
check_cmd += " -style %s" % style | |||
from subprocess import getoutput | |||
needsGtk2 = bool(getoutput(check_cmd).strip().lower() in ("gtk", "gtk+")) | |||
if needsGtk2: | |||
from gi import pygtkcompat | |||
pygtkcompat.enable() | |||
pygtkcompat.enable_gtk(version="2.0") | |||
from gi.repository import Gtk, AppIndicator | |||
else: | |||
from gi.repository import Gtk, AppIndicator3 as AppIndicator | |||
from gi import require_version | |||
require_version('Gtk', '3.0') | |||
from gi.repository import Gtk | |||
require_version('AppIndicator3', '0.1') | |||
from gi.repository import AppIndicator3 as AppIndicator | |||
TrayEngine = "AppIndicator" | |||
elif os.getenv("KDE_SESSION_VERSION") >= 5: | |||
TrayEngine = "Qt" | |||
elif (os.getenv("KDE_FULL_SESSION") or os.getenv("DESKTOP_SESSION") == "kde-plasma") and not os.path.exists("/etc/debian_version"): | |||
from PyKDE4.kdeui import KAction, KIcon, KMenu, KStatusNotifierItem | |||
TrayEngine = "KDE" | |||
#elif os.getenv("KDE_SESSION_VERSION") >= 5: | |||
#TrayEngine = "Qt" | |||
#elif os.getenv("KDE_FULL_SESSION") or os.getenv("DESKTOP_SESSION") == "kde-plasma": | |||
#from PyKDE5.kdeui import KAction, KIcon, KMenu, KStatusNotifierItem | |||
#TrayEngine = "KDE" | |||
else: | |||
TrayEngine = "Qt" | |||
@@ -117,7 +106,7 @@ class GlobalSysTray(object): | |||
self.tray = QSystemTrayIcon(getIcon(icon)) | |||
self.tray.setContextMenu(self.menu) | |||
self.tray.setParent(parent) | |||
self.tray.connect(self.tray, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.qt_systray_clicked) | |||
self.tray.activated.connect(self.qt_systray_clicked) | |||
# ------------------------------------------------------------------------------------------- | |||
@@ -289,14 +278,11 @@ class GlobalSysTray(object): | |||
act_widget = self.act_indexes[i][iActWidget] | |||
if TrayEngine == "KDE": | |||
self.tray.connect(act_widget, SIGNAL("triggered()"), act_func) | |||
elif TrayEngine == "AppIndicator": | |||
if TrayEngine == "AppIndicator": | |||
act_widget.connect("activate", self.gtk_call_func, act_name_id) | |||
elif TrayEngine == "Qt": | |||
self.tray.connect(act_widget, SIGNAL("triggered()"), act_func) | |||
elif TrayEngine in ("KDE", "Qt"): | |||
act_widget.triggered.connect(act_func) | |||
self.act_indexes[i][iActFunc] = act_func | |||
@@ -488,12 +474,14 @@ class GlobalSysTray(object): | |||
def isTrayAvailable(self): | |||
if TrayEngine in ("KDE", "Qt"): | |||
# Ask Qt | |||
return QSystemTrayIcon.isSystemTrayAvailable() | |||
elif TrayEngine == "AppIndicator": | |||
if TrayEngine == "AppIndicator": | |||
# Ubuntu/Unity always has a systray | |||
return True | |||
else: | |||
return False | |||
return False | |||
def handleQtCloseEvent(self, event): | |||
if self.isTrayAvailable() and self._parent.isVisible(): | |||
@@ -654,13 +642,16 @@ class GlobalSysTray(object): | |||
self._parent.hide() | |||
self._parent.close() | |||
if self._app: | |||
self._app.quit() | |||
def __raiseWindow(self): | |||
self._parent.activateWindow() | |||
self._parent.raise_() | |||
#--------------- main ------------------ | |||
if __name__ == '__main__': | |||
from PyQt4.QtGui import QApplication, QDialog, QMessageBox | |||
from PyQt5.QtWidgets import QApplication, QDialog, QMessageBox | |||
class ExampleGUI(QDialog): | |||
def __init__(self, parent=None): | |||