diff --git a/.travis.yml b/.travis.yml index d462374b3..cfab5839c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,6 +42,12 @@ jobs: env: - TARGET="linux-juce-strict" + # linux with default, tests python code + - os: linux + compiler: gcc + env: + - TARGET="pylint" + before_install: - sh ${TRAVIS_BUILD_DIR}/.travis/before_install.sh diff --git a/.travis/install.sh b/.travis/install.sh index 7a12e1643..806ed96c9 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -89,17 +89,6 @@ elif [ "${TARGET}" = "macos" ]; then pkg-config \ apple-x86-setup -# mkdir /tmp/osx-macports-pkgs -# cd /tmp/osx-macports-pkgs -# wget https://launchpad.net/~kxstudio-team/+archive/ubuntu/builds/+files/apple-macports-flac_1.2.1-1_all.deb -# wget https://launchpad.net/~kxstudio-team/+archive/ubuntu/builds/+files/apple-macports-libiconv_1.14-0_all.deb -# wget https://launchpad.net/~kxstudio-team/+archive/ubuntu/builds/+files/apple-macports-liblo_0.26-1_all.deb -# wget https://launchpad.net/~kxstudio-team/+archive/ubuntu/builds/+files/apple-macports-libogg_1.3.0-1_all.deb -# wget https://launchpad.net/~kxstudio-team/+archive/ubuntu/builds/+files/apple-macports-libsndfile_1.0.25-0_all.deb -# wget https://launchpad.net/~kxstudio-team/+archive/ubuntu/builds/+files/apple-macports-libvorbis_1.3.3-0_all.deb -# cd ~ -# rm -r /tmp/osx-macports-pkgs - elif [ "${TARGET}" = "win32" ]; then sudo apt-get install -y \ mingw32-x-gcc \ @@ -112,15 +101,12 @@ elif [ "${TARGET}" = "win64" ]; then mingw64-x-gcc \ mingw64-x-pkgconfig -fi +elif [ "${TARGET}" = "pylint" ]; then + sudo apt-get install -y \ + pylint3 \ + python3-liblo \ + python3-pyqt5 python3-pyqt5.qtsvg python3-pyqt5.qtopengl python3-rdflib \ + pyqt5-dev-tools \ + qtbase5-dev -# mingw32-x-fluidsynth -# mingw32-x-fftw -# mingw32-x-liblo -# mingw32-x-mxml -# mingw32-x-zlib -# mingw64-x-fluidsynth -# mingw64-x-fftw -# mingw64-x-liblo -# mingw64-x-mxml -# mingw64-x-zlib +fi diff --git a/.travis/script-pylint.sh b/.travis/script-pylint.sh new file mode 100755 index 000000000..d0c7ad095 --- /dev/null +++ b/.travis/script-pylint.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +pylint3 \ + --extension-pkg-whitelist=PyQt5 \ + --disable=\ +bad-whitespace,\ +bare-except,\ +blacklisted-name,\ +duplicate-code,\ +fixme,\ +invalid-name,\ +line-too-long,\ +missing-docstring,\ +too-few-public-methods,\ +too-many-arguments,\ +too-many-branches,\ +too-many-instance-attributes,\ +too-many-lines,\ +too-many-locals,\ +too-many-public-methods,\ +too-many-return-statements,\ +too-many-statements,\ +unused-argument,\ +wrong-import-position \ + source/frontend/carla_{app,backend,backend_qt,settings,shared,utils,widgets}.py + +pylint3 \ + --extension-pkg-whitelist=PyQt5 \ + -E \ + source/frontend/carla_{database,host,skin}.py diff --git a/source/frontend/carla_app.py b/source/frontend/carla_app.py index ab619031d..e4ee6e4f4 100644 --- a/source/frontend/carla_app.py +++ b/source/frontend/carla_app.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Carla application -# Copyright (C) 2013-2019 Filipe Coelho +# Copyright (C) 2013-2020 Filipe Coelho # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -19,14 +19,36 @@ # ------------------------------------------------------------------------------------------------------------ # Imports (Global) +import os +import sys + +# ------------------------------------------------------------------------------------------------------------ +# Imports (ctypes) + +from ctypes import CDLL, RTLD_GLOBAL + +# ------------------------------------------------------------------------------------------------------------ +# Imports (PyQt5) + from PyQt5.QtCore import QT_VERSION, Qt, QCoreApplication -from PyQt5.QtGui import QColor, QPalette +from PyQt5.QtGui import QColor, QIcon, QPalette from PyQt5.QtWidgets import QApplication # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) -from carla_shared import * +from carla_backend import kIs64bit, LINUX, MACOS, WINDOWS + +from carla_shared import ( + CARLA_KEY_MAIN_USE_PRO_THEME, + CARLA_KEY_MAIN_PRO_THEME_COLOR, + CARLA_DEFAULT_MAIN_USE_PRO_THEME, + CARLA_DEFAULT_MAIN_PRO_THEME_COLOR, + CWD, VERSION, + getPaths, + QSafeSettings, + gCarla +) # ------------------------------------------------------------------------------------------------------------ @@ -34,7 +56,7 @@ class CarlaApplication(object): def __init__(self, appName = "Carla2", libPrefix = None): object.__init__(self) - pathBinaries, pathResources = getPaths(libPrefix) + pathBinaries, _ = getPaths(libPrefix) # Needed for MacOS and Windows if os.path.exists(CWD) and (MACOS or WINDOWS): @@ -87,126 +109,10 @@ class CarlaApplication(object): proThemeColor = settings.value(CARLA_KEY_MAIN_PRO_THEME_COLOR, CARLA_DEFAULT_MAIN_PRO_THEME_COLOR, str).lower() if MACOS or proThemeColor == "black": - self.fPalBlack = QPalette() - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Window, QColor(14, 14, 14)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Window, QColor(17, 17, 17)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Window, QColor(17, 17, 17)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.WindowText, QColor(83, 83, 83)) - self.fPalBlack.setColor(QPalette.Active, QPalette.WindowText, QColor(240, 240, 240)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.WindowText, QColor(240, 240, 240)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Base, QColor(6, 6, 6)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Base, QColor(7, 7, 7)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Base, QColor(7, 7, 7)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.AlternateBase, QColor(12, 12, 12)) - self.fPalBlack.setColor(QPalette.Active, QPalette.AlternateBase, QColor(14, 14, 14)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.AlternateBase, QColor(14, 14, 14)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.ToolTipBase, QColor(4, 4, 4)) - self.fPalBlack.setColor(QPalette.Active, QPalette.ToolTipBase, QColor(4, 4, 4)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.ToolTipBase, QColor(4, 4, 4)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.ToolTipText, QColor(230, 230, 230)) - self.fPalBlack.setColor(QPalette.Active, QPalette.ToolTipText, QColor(230, 230, 230)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.ToolTipText, QColor(230, 230, 230)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Text, QColor(74, 74, 74)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Text, QColor(230, 230, 230)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Text, QColor(230, 230, 230)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Button, QColor(24, 24, 24)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Button, QColor(28, 28, 28)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Button, QColor(28, 28, 28)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(90, 90, 90)) - self.fPalBlack.setColor(QPalette.Active, QPalette.ButtonText, QColor(240, 240, 240)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.ButtonText, QColor(240, 240, 240)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.BrightText, QColor(255, 255, 255)) - self.fPalBlack.setColor(QPalette.Active, QPalette.BrightText, QColor(255, 255, 255)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.BrightText, QColor(255, 255, 255)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Light, QColor(191, 191, 191)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Light, QColor(191, 191, 191)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Light, QColor(191, 191, 191)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Midlight, QColor(155, 155, 155)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Midlight, QColor(155, 155, 155)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Midlight, QColor(155, 155, 155)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Dark, QColor(129, 129, 129)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Dark, QColor(129, 129, 129)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Dark, QColor(129, 129, 129)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Mid, QColor(94, 94, 94)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Mid, QColor(94, 94, 94)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Mid, QColor(94, 94, 94)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Shadow, QColor(155, 155, 155)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Shadow, QColor(155, 155, 155)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Shadow, QColor(155, 155, 155)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Highlight, QColor(14, 14, 14)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Highlight, QColor(60, 60, 60)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Highlight, QColor(34, 34, 34)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.HighlightedText, QColor(83, 83, 83)) - self.fPalBlack.setColor(QPalette.Active, QPalette.HighlightedText, QColor(255, 255, 255)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.HighlightedText, QColor(240, 240, 240)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.Link, QColor(34, 34, 74)) - self.fPalBlack.setColor(QPalette.Active, QPalette.Link, QColor(100, 100, 230)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.Link, QColor(100, 100, 230)) - self.fPalBlack.setColor(QPalette.Disabled, QPalette.LinkVisited, QColor(74, 34, 74)) - self.fPalBlack.setColor(QPalette.Active, QPalette.LinkVisited, QColor(230, 100, 230)) - self.fPalBlack.setColor(QPalette.Inactive, QPalette.LinkVisited, QColor(230, 100, 230)) - self.fApp.setPalette(self.fPalBlack) + self.createPaletteBlack() elif proThemeColor == "blue": - self.fPalBlue = QPalette() - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Window, QColor(32, 35, 39)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Window, QColor(37, 40, 45)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Window, QColor(37, 40, 45)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.WindowText, QColor(89, 95, 104)) - self.fPalBlue.setColor(QPalette.Active, QPalette.WindowText, QColor(223, 237, 255)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.WindowText, QColor(223, 237, 255)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Base, QColor(48, 53, 60)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Base, QColor(55, 61, 69)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Base, QColor(55, 61, 69)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.AlternateBase, QColor(60, 64, 67)) - self.fPalBlue.setColor(QPalette.Active, QPalette.AlternateBase, QColor(69, 73, 77)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.AlternateBase, QColor(69, 73, 77)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.ToolTipBase, QColor(182, 193, 208)) - self.fPalBlue.setColor(QPalette.Active, QPalette.ToolTipBase, QColor(182, 193, 208)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.ToolTipBase, QColor(182, 193, 208)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.ToolTipText, QColor(42, 44, 48)) - self.fPalBlue.setColor(QPalette.Active, QPalette.ToolTipText, QColor(42, 44, 48)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.ToolTipText, QColor(42, 44, 48)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Text, QColor(96, 103, 113)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Text, QColor(210, 222, 240)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Text, QColor(210, 222, 240)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Button, QColor(51, 55, 62)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Button, QColor(59, 63, 71)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Button, QColor(59, 63, 71)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(98, 104, 114)) - self.fPalBlue.setColor(QPalette.Active, QPalette.ButtonText, QColor(210, 222, 240)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.ButtonText, QColor(210, 222, 240)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.BrightText, QColor(255, 255, 255)) - self.fPalBlue.setColor(QPalette.Active, QPalette.BrightText, QColor(255, 255, 255)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.BrightText, QColor(255, 255, 255)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Light, QColor(59, 64, 72)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Light, QColor(63, 68, 76)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Light, QColor(63, 68, 76)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Midlight, QColor(48, 52, 59)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Midlight, QColor(51, 56, 63)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Midlight, QColor(51, 56, 63)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Dark, QColor(18, 19, 22)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Dark, QColor(20, 22, 25)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Dark, QColor(20, 22, 25)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Mid, QColor(28, 30, 34)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Mid, QColor(32, 35, 39)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Mid, QColor(32, 35, 39)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Shadow, QColor(13, 14, 16)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Shadow, QColor(15, 16, 18)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Shadow, QColor(15, 16, 18)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Highlight, QColor(32, 35, 39)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Highlight, QColor(14, 14, 17)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Highlight, QColor(27, 28, 33)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.HighlightedText, QColor(89, 95, 104)) - self.fPalBlue.setColor(QPalette.Active, QPalette.HighlightedText, QColor(217, 234, 253)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.HighlightedText, QColor(223, 237, 255)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.Link, QColor(79, 100, 118)) - self.fPalBlue.setColor(QPalette.Active, QPalette.Link, QColor(156, 212, 255)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.Link, QColor(156, 212, 255)) - self.fPalBlue.setColor(QPalette.Disabled, QPalette.LinkVisited, QColor(51, 74, 118)) - self.fPalBlue.setColor(QPalette.Active, QPalette.LinkVisited, QColor(64, 128, 255)) - self.fPalBlue.setColor(QPalette.Inactive, QPalette.LinkVisited, QColor(64, 128, 255)) - self.fApp.setPalette(self.fPalBlue) + self.createPaletteBlue() def createApp(self, appName): if LINUX: @@ -246,6 +152,128 @@ class CarlaApplication(object): self.fApp.setDesktopFileName("carla") self.fApp.setWindowIcon(QIcon(":/scalable/carla.svg")) + def createPaletteBlack(self): + self.fPalBlack = QPalette() + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Window, QColor(14, 14, 14)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Window, QColor(17, 17, 17)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Window, QColor(17, 17, 17)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.WindowText, QColor(83, 83, 83)) + self.fPalBlack.setColor(QPalette.Active, QPalette.WindowText, QColor(240, 240, 240)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.WindowText, QColor(240, 240, 240)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Base, QColor(6, 6, 6)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Base, QColor(7, 7, 7)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Base, QColor(7, 7, 7)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.AlternateBase, QColor(12, 12, 12)) + self.fPalBlack.setColor(QPalette.Active, QPalette.AlternateBase, QColor(14, 14, 14)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.AlternateBase, QColor(14, 14, 14)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.ToolTipBase, QColor(4, 4, 4)) + self.fPalBlack.setColor(QPalette.Active, QPalette.ToolTipBase, QColor(4, 4, 4)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.ToolTipBase, QColor(4, 4, 4)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.ToolTipText, QColor(230, 230, 230)) + self.fPalBlack.setColor(QPalette.Active, QPalette.ToolTipText, QColor(230, 230, 230)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.ToolTipText, QColor(230, 230, 230)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Text, QColor(74, 74, 74)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Text, QColor(230, 230, 230)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Text, QColor(230, 230, 230)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Button, QColor(24, 24, 24)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Button, QColor(28, 28, 28)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Button, QColor(28, 28, 28)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(90, 90, 90)) + self.fPalBlack.setColor(QPalette.Active, QPalette.ButtonText, QColor(240, 240, 240)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.ButtonText, QColor(240, 240, 240)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.BrightText, QColor(255, 255, 255)) + self.fPalBlack.setColor(QPalette.Active, QPalette.BrightText, QColor(255, 255, 255)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.BrightText, QColor(255, 255, 255)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Light, QColor(191, 191, 191)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Light, QColor(191, 191, 191)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Light, QColor(191, 191, 191)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Midlight, QColor(155, 155, 155)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Midlight, QColor(155, 155, 155)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Midlight, QColor(155, 155, 155)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Dark, QColor(129, 129, 129)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Dark, QColor(129, 129, 129)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Dark, QColor(129, 129, 129)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Mid, QColor(94, 94, 94)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Mid, QColor(94, 94, 94)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Mid, QColor(94, 94, 94)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Shadow, QColor(155, 155, 155)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Shadow, QColor(155, 155, 155)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Shadow, QColor(155, 155, 155)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Highlight, QColor(14, 14, 14)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Highlight, QColor(60, 60, 60)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Highlight, QColor(34, 34, 34)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.HighlightedText, QColor(83, 83, 83)) + self.fPalBlack.setColor(QPalette.Active, QPalette.HighlightedText, QColor(255, 255, 255)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.HighlightedText, QColor(240, 240, 240)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.Link, QColor(34, 34, 74)) + self.fPalBlack.setColor(QPalette.Active, QPalette.Link, QColor(100, 100, 230)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.Link, QColor(100, 100, 230)) + self.fPalBlack.setColor(QPalette.Disabled, QPalette.LinkVisited, QColor(74, 34, 74)) + self.fPalBlack.setColor(QPalette.Active, QPalette.LinkVisited, QColor(230, 100, 230)) + self.fPalBlack.setColor(QPalette.Inactive, QPalette.LinkVisited, QColor(230, 100, 230)) + self.fApp.setPalette(self.fPalBlack) + + def createPaletteBlue(self): + self.fPalBlue = QPalette() + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Window, QColor(32, 35, 39)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Window, QColor(37, 40, 45)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Window, QColor(37, 40, 45)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.WindowText, QColor(89, 95, 104)) + self.fPalBlue.setColor(QPalette.Active, QPalette.WindowText, QColor(223, 237, 255)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.WindowText, QColor(223, 237, 255)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Base, QColor(48, 53, 60)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Base, QColor(55, 61, 69)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Base, QColor(55, 61, 69)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.AlternateBase, QColor(60, 64, 67)) + self.fPalBlue.setColor(QPalette.Active, QPalette.AlternateBase, QColor(69, 73, 77)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.AlternateBase, QColor(69, 73, 77)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.ToolTipBase, QColor(182, 193, 208)) + self.fPalBlue.setColor(QPalette.Active, QPalette.ToolTipBase, QColor(182, 193, 208)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.ToolTipBase, QColor(182, 193, 208)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.ToolTipText, QColor(42, 44, 48)) + self.fPalBlue.setColor(QPalette.Active, QPalette.ToolTipText, QColor(42, 44, 48)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.ToolTipText, QColor(42, 44, 48)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Text, QColor(96, 103, 113)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Text, QColor(210, 222, 240)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Text, QColor(210, 222, 240)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Button, QColor(51, 55, 62)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Button, QColor(59, 63, 71)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Button, QColor(59, 63, 71)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(98, 104, 114)) + self.fPalBlue.setColor(QPalette.Active, QPalette.ButtonText, QColor(210, 222, 240)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.ButtonText, QColor(210, 222, 240)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.BrightText, QColor(255, 255, 255)) + self.fPalBlue.setColor(QPalette.Active, QPalette.BrightText, QColor(255, 255, 255)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.BrightText, QColor(255, 255, 255)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Light, QColor(59, 64, 72)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Light, QColor(63, 68, 76)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Light, QColor(63, 68, 76)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Midlight, QColor(48, 52, 59)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Midlight, QColor(51, 56, 63)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Midlight, QColor(51, 56, 63)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Dark, QColor(18, 19, 22)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Dark, QColor(20, 22, 25)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Dark, QColor(20, 22, 25)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Mid, QColor(28, 30, 34)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Mid, QColor(32, 35, 39)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Mid, QColor(32, 35, 39)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Shadow, QColor(13, 14, 16)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Shadow, QColor(15, 16, 18)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Shadow, QColor(15, 16, 18)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Highlight, QColor(32, 35, 39)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Highlight, QColor(14, 14, 17)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Highlight, QColor(27, 28, 33)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.HighlightedText, QColor(89, 95, 104)) + self.fPalBlue.setColor(QPalette.Active, QPalette.HighlightedText, QColor(217, 234, 253)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.HighlightedText, QColor(223, 237, 255)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.Link, QColor(79, 100, 118)) + self.fPalBlue.setColor(QPalette.Active, QPalette.Link, QColor(156, 212, 255)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.Link, QColor(156, 212, 255)) + self.fPalBlue.setColor(QPalette.Disabled, QPalette.LinkVisited, QColor(51, 74, 118)) + self.fPalBlue.setColor(QPalette.Active, QPalette.LinkVisited, QColor(64, 128, 255)) + self.fPalBlue.setColor(QPalette.Inactive, QPalette.LinkVisited, QColor(64, 128, 255)) + self.fApp.setPalette(self.fPalBlue) + def exec_(self): return self.fApp.exec_() diff --git a/source/frontend/carla_backend.py b/source/frontend/carla_backend.py index 3bc475ffe..bfa844785 100644 --- a/source/frontend/carla_backend.py +++ b/source/frontend/carla_backend.py @@ -20,11 +20,20 @@ # Imports (Global) from abc import abstractmethod -from ctypes import * from platform import architecture from struct import pack from sys import platform, maxsize +# ------------------------------------------------------------------------------------------------------------ +# Imports (ctypes) + +from ctypes import ( + c_bool, c_char_p, c_double, c_float, c_int, c_long, c_longdouble, c_longlong, c_ubyte, c_uint, c_void_p, + c_int8, c_int16, c_int32, c_int64, c_uint8, c_uint16, c_uint32, c_uint64, + cast, Structure, + CDLL, CFUNCTYPE, RTLD_GLOBAL, RTLD_LOCAL, POINTER +) + # ------------------------------------------------------------------------------------------------------------ # 64bit check @@ -126,8 +135,10 @@ def toPythonType(value, attr): return value if isinstance(value, bytes): return charPtrToString(value) + # pylint: disable=consider-merging-isinstance if isinstance(value, c_intp_types) or isinstance(value, c_floatp_types): return numPtrToList(value) + # pylint: enable=consider-merging-isinstance if isinstance(value, POINTER(c_char_p)): return charPtrPtrToStringList(value) print("..............", attr, ".....................", value, ":", type(value)) @@ -137,7 +148,9 @@ def toPythonType(value, attr): # Convert a ctypes struct into a python dict def structToDict(struct): + # pylint: disable=protected-access return dict((attr, toPythonType(getattr(struct, attr), attr)) for attr, value in struct._fields_) + # pylint: enable=protected-access # ------------------------------------------------------------------------------------------------------------ # Carla Backend API (base definitions) @@ -2877,6 +2890,9 @@ class CarlaHostDLL(CarlaHostMeta): self.handle = self.lib.carla_standalone_host_init() + self._engineCallback = None + self._fileCallback = None + # -------------------------------------------------------------------------------------------------------- def get_engine_driver_count(self): @@ -3647,8 +3663,8 @@ class CarlaHostPlugin(CarlaHostMeta): if pluginId < len(self.fPluginsInfo): return - for id in range(len(self.fPluginsInfo), pluginId+1): - self.fPluginsInfo[id] = PluginStoreInfo() + for pid in range(len(self.fPluginsInfo), pluginId+1): + self.fPluginsInfo[pid] = PluginStoreInfo() def _set_pluginInfo(self, pluginId, info): plugin = self.fPluginsInfo.get(pluginId, None) @@ -3718,7 +3734,7 @@ class CarlaHostPlugin(CarlaHostMeta): plugin.parameterValues = [] # add placeholders - for x in range(count): + for _ in range(count): plugin.parameterInfo.append(PyCarlaParameterInfo.copy()) plugin.parameterData.append(PyParameterData.copy()) plugin.parameterRanges.append(PyParameterRanges.copy()) @@ -3731,7 +3747,7 @@ class CarlaHostPlugin(CarlaHostMeta): return plugin.programCount = count - plugin.programNames = ["" for x in range(count)] + plugin.programNames = ["" for _ in range(count)] def _set_midiProgramCount(self, pluginId, count): plugin = self.fPluginsInfo.get(pluginId, None) @@ -3740,7 +3756,7 @@ class CarlaHostPlugin(CarlaHostMeta): return plugin.midiProgramCount = count - plugin.midiProgramData = [PyMidiProgramData.copy() for x in range(count)] + plugin.midiProgramData = [PyMidiProgramData.copy() for _ in range(count)] def _set_customDataCount(self, pluginId, count): plugin = self.fPluginsInfo.get(pluginId, None) @@ -3749,7 +3765,7 @@ class CarlaHostPlugin(CarlaHostMeta): return plugin.customDataCount = count - plugin.customData = [PyCustomData.copy() for x in range(count)] + plugin.customData = [PyCustomData.copy() for _ in range(count)] def _set_parameterInfo(self, pluginId, paramIndex, info): plugin = self.fPluginsInfo.get(pluginId, None) diff --git a/source/frontend/carla_backend_qt.py b/source/frontend/carla_backend_qt.py index 152b29fa8..86bfe26f0 100644 --- a/source/frontend/carla_backend_qt.py +++ b/source/frontend/carla_backend_qt.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Carla Backend code (Qt stuff) -# Copyright (C) 2011-2019 Filipe Coelho +# Copyright (C) 2011-2020 Filipe Coelho # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -24,7 +24,7 @@ from PyQt5.QtCore import pyqtSignal, QObject # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) -from carla_backend import * +from carla_backend import CarlaHostNull, CarlaHostDLL, CarlaHostPlugin # ------------------------------------------------------------------------------------------------------------ # Carla Host PyQt signals @@ -98,9 +98,11 @@ class CarlaHostQtDLL(CarlaHostDLL, CarlaHostSignals): # ------------------------------------------------------------------------------------------------------------ # Carla Host object for plugins (using pipes) +# pylint: disable=abstract-method class CarlaHostQtPlugin(CarlaHostPlugin, CarlaHostSignals): def __init__(self): CarlaHostSignals.__init__(self) CarlaHostPlugin.__init__(self) +# pylint: enable=abstract-method # ------------------------------------------------------------------------------------------------------------ diff --git a/source/frontend/carla_control.py b/source/frontend/carla_control.py index a7f777be8..299975e9d 100755 --- a/source/frontend/carla_control.py +++ b/source/frontend/carla_control.py @@ -26,6 +26,7 @@ from PyQt5.QtCore import QEventLoop import ui_carla_osc_connect +from carla_backend_qt import CarlaHostQtPlugin from carla_host import * # ------------------------------------------------------------------------------------------------------------ @@ -104,10 +105,10 @@ class ConnectDialog(QDialog): self.ui.rb_reported_auto.setChecked(False) self.ui.rb_reported_custom.setChecked(True) - self.ui.le_host.setText(settings.value("Host", "127.0.0.1", type=str)) - self.ui.le_reported_host.setText(settings.value("ReportedHost", "", type=str)) - self.ui.sb_tcp_port.setValue(settings.value("TCPPort", CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, type=int)) - self.ui.sb_udp_port.setValue(settings.value("UDPPort", CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, type=int)) + self.ui.le_host.setText(settings.value("Host", "127.0.0.1", str)) + self.ui.le_reported_host.setText(settings.value("ReportedHost", "", str)) + self.ui.sb_tcp_port.setValue(settings.value("TCPPort", CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, int)) + self.ui.sb_udp_port.setValue(settings.value("UDPPort", CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, int)) self.checkIfButtonBoxShouldBeEnabled(self.ui.le_host.text(), self.ui.rb_reported_auto.isChecked(), @@ -717,9 +718,9 @@ class HostWindowOSC(HostWindow): def loadSettings(self, firstTime): settings = HostWindow.loadSettings(self, firstTime) if self.fCustomOscAddress is not None: - self.fOscAddressTCP = settings.value("RemoteAddressTCP", "osc.tcp://127.0.0.1:22752/Carla", type=str) - self.fOscAddressUDP = settings.value("RemoteAddressUDP", "osc.udp://127.0.0.1:22752/Carla", type=str) - self.fOscReportedHost = settings.value("RemoteReportedHost", "", type=str) + self.fOscAddressTCP = settings.value("RemoteAddressTCP", "osc.tcp://127.0.0.1:22752/Carla", str) + self.fOscAddressUDP = settings.value("RemoteAddressUDP", "osc.udp://127.0.0.1:22752/Carla", str) + self.fOscReportedHost = settings.value("RemoteReportedHost", "", str) def saveSettings(self): settings = HostWindow.saveSettings(self) diff --git a/source/frontend/carla_database.py b/source/frontend/carla_database.py index 806e29357..26c343f1b 100755 --- a/source/frontend/carla_database.py +++ b/source/frontend/carla_database.py @@ -33,6 +33,7 @@ import ui_carla_add_jack import ui_carla_database import ui_carla_refresh +from carla_backend import * from carla_shared import * from carla_utils import getPluginTypeAsString, getPluginCategoryAsString @@ -1006,10 +1007,6 @@ class PluginRefreshW(QDialog): self.ui = ui_carla_refresh.Ui_PluginRefreshW() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - self.host = host = CarlaHostNull() - # ------------------------------------------------------------------------------------------------------------- # Internal stuff @@ -1378,12 +1375,6 @@ class PluginRefreshW(QDialog): QDialog.closeEvent(self, event) - # ----------------------------------------------------------------------------------------------------------------- - - def done(self, r): - QDialog.done(self, r) - self.close() - # --------------------------------------------------------------------------------------------------------------------- # Plugin Database Dialog @@ -1400,11 +1391,6 @@ class PluginDatabaseW(QDialog): self.ui = ui_carla_database.Ui_PluginDatabaseW() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - host = CarlaHostNull() - self.host = host - # ---------------------------------------------------------------------------------------------------- # Internal stuff @@ -2218,10 +2204,6 @@ class PluginDatabaseW(QDialog): self.ui.lineEdit.setFocus() QDialog.showEvent(self, event) - def done(self, r): - QDialog.done(self, r) - self.close() - # --------------------------------------------------------------------------------------------------------------------- # Jack Application Dialog @@ -2374,24 +2356,21 @@ class JackApplicationW(QDialog): settings.setValue("CaptureFirstWindow", self.ui.cb_capture_first_window.isChecked()) settings.setValue("MidiOutMixdown", self.ui.cb_out_midi_mixdown.isChecked()) - # ----------------------------------------------------------------------------------------------------------------- - - def done(self, r): - QDialog.done(self, r) - self.close() - # --------------------------------------------------------------------------------------------------------------------- # Main if __name__ == '__main__': from carla_app import CarlaApplication - from carla_host import initHost, loadHostSettings + from carla_host import initHost as _initHost, loadHostSettings as _loadHostSettings + # pylint: disable=ungrouped-imports + from carla_shared import handleInitialCommandLineArguments + # pylint: enable=ungrouped-imports initName, libPrefix = handleInitialCommandLineArguments(__file__ if "__file__" in dir() else None) app = CarlaApplication("Carla2-Database", libPrefix) - host = initHost("Carla2-Database", libPrefix, False, False, False) - loadHostSettings(host) + host = _initHost("Carla2-Database", libPrefix, False, False, False) + _loadHostSettings(host) gui = PluginDatabaseW(None, host) gui.show() diff --git a/source/frontend/carla_host.py b/source/frontend/carla_host.py index 3b291764c..2ce90ebdb 100644 --- a/source/frontend/carla_host.py +++ b/source/frontend/carla_host.py @@ -21,6 +21,16 @@ import json +# ------------------------------------------------------------------------------------------------------------ +# Imports (ctypes) + +from ctypes import ( + byref, pointer +) + +# ------------------------------------------------------------------------------------------------------------ +# Imports (PyQt5) + # This fails in some configurations, assume >= 5.6.0 in that case try: from PyQt5.Qt import PYQT_VERSION @@ -28,7 +38,7 @@ except ImportError: PYQT_VERSION = 0x50600 from PyQt5.QtCore import QT_VERSION, qCritical, QEventLoop, QFileInfo, QModelIndex, QPointF, QTimer, QEvent -from PyQt5.QtGui import QImage, QImageWriter, QPalette, QBrush +from PyQt5.QtGui import QImage, QImageWriter, QPainter, QPalette, QBrush from PyQt5.QtWidgets import QAction, QApplication, QInputDialog, QFileSystemModel, QListWidgetItem, QGraphicsView, QMainWindow # ------------------------------------------------------------------------------------------------------------ @@ -37,6 +47,7 @@ from PyQt5.QtWidgets import QAction, QApplication, QInputDialog, QFileSystemMode import ui_carla_host from carla_app import * +from carla_backend_qt import CarlaHostQtDLL, CarlaHostQtNull from carla_database import * from carla_settings import * from carla_utils import * @@ -3332,7 +3343,7 @@ def runHostWithoutUI(host): if not isinstance(gCarla.nogui, int): oscPort = None - projectFile = getInitialProjectFile(QCoreApplication.instance(), True) + projectFile = getInitialProjectFile(True) if not projectFile: print("Carla no-gui mode can only be used together with a project file.") diff --git a/source/frontend/carla_settings.py b/source/frontend/carla_settings.py index 806735c00..7a6b2e479 100755 --- a/source/frontend/carla_settings.py +++ b/source/frontend/carla_settings.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Carla settings code -# Copyright (C) 2011-2019 Filipe Coelho +# Copyright (C) 2011-2020 Filipe Coelho # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -17,11 +17,10 @@ # For a full copy of the GNU General Public License see the doc/GPL.txt file. # ------------------------------------------------------------------------------------------------------------ -# Imports (Global) +# Imports (PyQt5) -from PyQt5.QtCore import pyqtSlot, QByteArray, QDir -from PyQt5.QtGui import QColor, QCursor, QPainter, QPainterPath -from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget +from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QFileDialog # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) @@ -29,8 +28,152 @@ from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QFrame, QInputDialog, QLi import ui_carla_settings import ui_carla_settings_driver -from carla_shared import * -from patchcanvas.theme import * +from carla_backend import ( + LINUX, MACOS, WINDOWS, + ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL, + ENGINE_DRIVER_DEVICE_CAN_TRIPLE_BUFFER, + ENGINE_DRIVER_DEVICE_VARIABLE_BUFFER_SIZE, + ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE, + ENGINE_PROCESS_MODE_CONTINUOUS_RACK, + ENGINE_OPTION_FILE_PATH, + ENGINE_OPTION_PLUGIN_PATH, + FILE_AUDIO, + FILE_MIDI, + PLUGIN_LADSPA, + PLUGIN_DSSI, + PLUGIN_LV2, + PLUGIN_VST2, + PLUGIN_VST3, + PLUGIN_SF2, + PLUGIN_SFZ +) + +from carla_shared import ( + CARLA_KEY_MAIN_PROJECT_FOLDER, + CARLA_KEY_MAIN_USE_PRO_THEME, + CARLA_KEY_MAIN_PRO_THEME_COLOR, + CARLA_KEY_MAIN_REFRESH_INTERVAL, + CARLA_KEY_MAIN_CONFIRM_EXIT, + CARLA_KEY_MAIN_SHOW_LOGS, + CARLA_KEY_MAIN_EXPERIMENTAL, + CARLA_KEY_CANVAS_THEME, + CARLA_KEY_CANVAS_SIZE, + CARLA_KEY_CANVAS_USE_BEZIER_LINES, + CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, + CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, + #CARLA_KEY_CANVAS_EYE_CANDY, + CARLA_KEY_CANVAS_FANCY_EYE_CANDY, + CARLA_KEY_CANVAS_USE_OPENGL, + CARLA_KEY_CANVAS_ANTIALIASING, + CARLA_KEY_CANVAS_HQ_ANTIALIASING, + CARLA_KEY_CANVAS_INLINE_DISPLAYS, + CARLA_KEY_CANVAS_FULL_REPAINTS, + CARLA_KEY_ENGINE_DRIVER_PREFIX, + CARLA_KEY_ENGINE_AUDIO_DRIVER, + CARLA_KEY_ENGINE_PROCESS_MODE, + CARLA_KEY_ENGINE_FORCE_STEREO, + CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, + CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, + CARLA_KEY_ENGINE_MANAGE_UIS, + CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, + CARLA_KEY_ENGINE_MAX_PARAMETERS, + CARLA_KEY_ENGINE_RESET_XRUNS, + CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, + CARLA_KEY_OSC_ENABLED, + CARLA_KEY_OSC_TCP_PORT_ENABLED, + CARLA_KEY_OSC_TCP_PORT_NUMBER, + CARLA_KEY_OSC_TCP_PORT_RANDOM, + CARLA_KEY_OSC_UDP_PORT_ENABLED, + CARLA_KEY_OSC_UDP_PORT_NUMBER, + CARLA_KEY_OSC_UDP_PORT_RANDOM, + CARLA_KEY_PATHS_AUDIO, + CARLA_KEY_PATHS_MIDI, + CARLA_KEY_PATHS_LADSPA, + CARLA_KEY_PATHS_DSSI, + CARLA_KEY_PATHS_LV2, + CARLA_KEY_PATHS_VST2, + CARLA_KEY_PATHS_VST3, + CARLA_KEY_PATHS_SF2, + CARLA_KEY_PATHS_SFZ, + CARLA_KEY_WINE_EXECUTABLE, + CARLA_KEY_WINE_AUTO_PREFIX, + CARLA_KEY_WINE_FALLBACK_PREFIX, + CARLA_KEY_WINE_RT_PRIO_ENABLED, + CARLA_KEY_WINE_BASE_RT_PRIO, + CARLA_KEY_WINE_SERVER_RT_PRIO, + CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, + CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES, + CARLA_KEY_EXPERIMENTAL_JACK_APPS, + CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, + CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, + CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, + CARLA_DEFAULT_MAIN_PROJECT_FOLDER, + CARLA_DEFAULT_MAIN_USE_PRO_THEME, + CARLA_DEFAULT_MAIN_PRO_THEME_COLOR, + CARLA_DEFAULT_MAIN_REFRESH_INTERVAL, + CARLA_DEFAULT_MAIN_CONFIRM_EXIT, + CARLA_DEFAULT_MAIN_SHOW_LOGS, + #CARLA_DEFAULT_MAIN_EXPERIMENTAL, + CARLA_DEFAULT_CANVAS_THEME, + CARLA_DEFAULT_CANVAS_SIZE, + CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES, + CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS, + CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS, + #CARLA_DEFAULT_CANVAS_EYE_CANDY, + CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY, + CARLA_DEFAULT_CANVAS_USE_OPENGL, + CARLA_DEFAULT_CANVAS_ANTIALIASING, + CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING, + CARLA_DEFAULT_CANVAS_INLINE_DISPLAYS, + CARLA_DEFAULT_CANVAS_FULL_REPAINTS, + CARLA_DEFAULT_FORCE_STEREO, + CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES, + CARLA_DEFAULT_PREFER_UI_BRIDGES, + CARLA_DEFAULT_MANAGE_UIS, + CARLA_DEFAULT_UIS_ALWAYS_ON_TOP, + CARLA_DEFAULT_MAX_PARAMETERS, + CARLA_DEFAULT_RESET_XRUNS, + CARLA_DEFAULT_UI_BRIDGES_TIMEOUT, + CARLA_DEFAULT_AUDIO_BUFFER_SIZE, + CARLA_DEFAULT_AUDIO_SAMPLE_RATE, + CARLA_DEFAULT_AUDIO_TRIPLE_BUFFER, + CARLA_DEFAULT_AUDIO_DRIVER, + CARLA_DEFAULT_PROCESS_MODE, + CARLA_DEFAULT_OSC_ENABLED, + CARLA_DEFAULT_OSC_TCP_PORT_ENABLED, + CARLA_DEFAULT_OSC_TCP_PORT_NUMBER, + CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, + CARLA_DEFAULT_OSC_UDP_PORT_ENABLED, + CARLA_DEFAULT_OSC_UDP_PORT_NUMBER, + CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, + CARLA_DEFAULT_WINE_EXECUTABLE, + CARLA_DEFAULT_WINE_AUTO_PREFIX, + CARLA_DEFAULT_WINE_FALLBACK_PREFIX, + CARLA_DEFAULT_WINE_RT_PRIO_ENABLED, + CARLA_DEFAULT_WINE_BASE_RT_PRIO, + CARLA_DEFAULT_WINE_SERVER_RT_PRIO, + CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES, + CARLA_DEFAULT_EXPERIMENTAL_WINE_BRIDGES, + CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS, + CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT, + CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, + CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL, + CARLA_DEFAULT_FILE_PATH_AUDIO, + CARLA_DEFAULT_FILE_PATH_MIDI, + CARLA_DEFAULT_LADSPA_PATH, + CARLA_DEFAULT_DSSI_PATH, + CARLA_DEFAULT_LV2_PATH, + CARLA_DEFAULT_VST2_PATH, + CARLA_DEFAULT_VST3_PATH, + CARLA_DEFAULT_SF2_PATH, + CARLA_DEFAULT_SFZ_PATH, + getAndSetPath, + fontMetricsHorizontalAdvance, + splitter, + QSafeSettings +) + +from patchcanvas.theme import Theme, getThemeName # ------------------------------------------------------------------------------------------------------------ # ... @@ -50,11 +193,6 @@ class DriverSettingsW(QDialog): self.ui = ui_carla_settings_driver.Ui_DriverSettingsW() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - host = CarlaHostNull() - self.host = host - # ---------------------------------------------------------------------------------------------------- # Internal stuff @@ -169,7 +307,7 @@ class DriverSettingsW(QDialog): else: self.ui.b_panel.setEnabled(False) - if len(self.fBufferSizes) > 0: + if self.fBufferSizes: for bsize in self.fBufferSizes: sbsize = str(bsize) self.ui.cb_buffersize.addItem(sbsize) @@ -181,7 +319,7 @@ class DriverSettingsW(QDialog): self.ui.cb_buffersize.addItem(self.AUTOMATIC_OPTION) self.ui.cb_buffersize.setCurrentIndex(0) - if len(self.fSampleRates) > 0: + if self.fSampleRates: for srate in self.fSampleRates: ssrate = str(int(srate)) self.ui.cb_samplerate.addItem(ssrate) @@ -193,12 +331,6 @@ class DriverSettingsW(QDialog): self.ui.cb_samplerate.addItem(self.AUTOMATIC_OPTION) self.ui.cb_samplerate.setCurrentIndex(0) - # -------------------------------------------------------------------------------------------------------- - - def done(self, r): - QDialog.done(self, r) - self.close() - # ------------------------------------------------------------------------------------------------------------ # Runtime Driver Settings @@ -209,11 +341,6 @@ class RuntimeDriverSettingsW(QDialog): self.ui = ui_carla_settings_driver.Ui_DriverSettingsW() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - host = CarlaHostNull() - self.host = host - driverDeviceInfo = host.get_runtime_engine_driver_device_info() # ---------------------------------------------------------------------------------------------------- @@ -251,7 +378,7 @@ class RuntimeDriverSettingsW(QDialog): self.ui.cb_device.addItem(driverDeviceInfo['name']) self.ui.cb_device.setCurrentIndex(0) - if len(driverDeviceInfo['bufferSizes']) > 0: + if driverDeviceInfo['bufferSizes']: for bsize in driverDeviceInfo['bufferSizes']: sbsize = str(bsize) self.ui.cb_buffersize.addItem(sbsize) @@ -266,7 +393,7 @@ class RuntimeDriverSettingsW(QDialog): if (driverDeviceInfo['hints'] & ENGINE_DRIVER_DEVICE_VARIABLE_BUFFER_SIZE) == 0x0: self.ui.cb_buffersize.setEnabled(False) - if len(driverDeviceInfo['sampleRates']) > 0: + if driverDeviceInfo['sampleRates']: for srate in driverDeviceInfo['sampleRates']: ssrate = str(int(srate)) self.ui.cb_samplerate.addItem(ssrate) @@ -309,12 +436,6 @@ class RuntimeDriverSettingsW(QDialog): def slot_showDevicePanel(self): self.host.show_engine_device_control_panel() - # -------------------------------------------------------------------------------------------------------- - - def done(self, r): - QDialog.done(self, r) - self.close() - # ------------------------------------------------------------------------------------------------------------ # Settings Dialog @@ -356,11 +477,6 @@ class CarlaSettingsW(QDialog): self.ui = ui_carla_settings.Ui_CarlaSettingsW() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - host = CarlaHostNull() - self.host = host - # ---------------------------------------------------------------------------------------------------- # Set-up GUI @@ -636,11 +752,13 @@ class CarlaSettingsW(QDialog): midiPaths.sort() for audioPath in audioPaths: - if not audioPath: continue + if not audioPath: + continue self.ui.lw_files_audio.addItem(audioPath) for midiPath in midiPaths: - if not midiPath: continue + if not midiPath: + continue self.ui.lw_files_midi.addItem(midiPath) # ---------------------------------------------------------------------------------------------------- @@ -663,31 +781,38 @@ class CarlaSettingsW(QDialog): sfzs.sort() for ladspa in ladspas: - if not ladspa: continue + if not ladspa: + continue self.ui.lw_ladspa.addItem(ladspa) for dssi in dssis: - if not dssi: continue + if not dssi: + continue self.ui.lw_dssi.addItem(dssi) for lv2 in lv2s: - if not lv2: continue + if not lv2: + continue self.ui.lw_lv2.addItem(lv2) for vst2 in vst2s: - if not vst2: continue + if not vst2: + continue self.ui.lw_vst.addItem(vst2) for vst3 in vst3s: - if not vst3: continue + if not vst3: + continue self.ui.lw_vst3.addItem(vst3) for sf2 in sf2s: - if not sf2: continue + if not sf2: + continue self.ui.lw_sf2.addItem(sf2) for sfz in sfzs: - if not sfz: continue + if not sfz: + continue self.ui.lw_sfz.addItem(sfz) # ---------------------------------------------------------------------------------------------------- @@ -699,7 +824,7 @@ class CarlaSettingsW(QDialog): self.ui.cb_wine_prefix_detect.setChecked(settings.value(CARLA_KEY_WINE_AUTO_PREFIX, CARLA_DEFAULT_WINE_AUTO_PREFIX, - bool)) + bool)) self.ui.le_wine_prefix_fallback.setText(settings.value(CARLA_KEY_WINE_FALLBACK_PREFIX, CARLA_DEFAULT_WINE_FALLBACK_PREFIX, @@ -1020,7 +1145,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_ladspa.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_ladspa.addItem(path) elif curIndex == self.PLUGINPATH_INDEX_DSSI: @@ -1029,7 +1155,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_dssi.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_dssi.addItem(path) elif curIndex == self.PLUGINPATH_INDEX_LV2: @@ -1038,7 +1165,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_lv2.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_lv2.addItem(path) elif curIndex == self.PLUGINPATH_INDEX_VST2: @@ -1047,7 +1175,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_vst.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_vst.addItem(path) elif curIndex == self.PLUGINPATH_INDEX_VST3: @@ -1056,7 +1185,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_vst3.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_vst3.addItem(path) elif curIndex == self.PLUGINPATH_INDEX_SF2: @@ -1065,7 +1195,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_sf2.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_sf2.addItem(path) elif curIndex == self.PLUGINPATH_INDEX_SFZ: @@ -1074,7 +1205,8 @@ class CarlaSettingsW(QDialog): self.ui.lw_sfz.clear() for path in paths: - if not path: continue + if not path: + continue self.ui.lw_sfz.addItem(path) # ---------------------------------------------------------------------------------------------------- @@ -1357,28 +1489,25 @@ class CarlaSettingsW(QDialog): self.ui.b_filepaths_remove.setEnabled(check) self.ui.b_filepaths_change.setEnabled(check) - # -------------------------------------------------------------------------------------------------------- - - def done(self, r): - QDialog.done(self, r) - self.close() - # ------------------------------------------------------------------------------------------------------------ # Main if __name__ == '__main__': from carla_app import CarlaApplication - from carla_host import initHost, loadHostSettings + from carla_host import initHost as _initHost, loadHostSettings as _loadHostSettings + # pylint: disable=ungrouped-imports + from carla_shared import handleInitialCommandLineArguments + # pylint: enable=ungrouped-imports initName, libPrefix = handleInitialCommandLineArguments(__file__ if "__file__" in dir() else None) - app = CarlaApplication("Carla2-Settings", libPrefix) - host = initHost("Carla2-Settings", libPrefix, False, False, False) - loadHostSettings(host) + _app = CarlaApplication("Carla2-Settings", libPrefix) + _host = _initHost("Carla2-Settings", libPrefix, False, False, False) + _loadHostSettings(_host) - gui = CarlaSettingsW(None, host, True, True) - gui.show() + _gui = CarlaSettingsW(None, _host, True, True) + _gui.show() - app.exit_exec() + _app.exit_exec() # ------------------------------------------------------------------------------------------------------------ diff --git a/source/frontend/carla_shared.py b/source/frontend/carla_shared.py index 96db4be2d..b36c75a66 100644 --- a/source/frontend/carla_shared.py +++ b/source/frontend/carla_shared.py @@ -31,13 +31,8 @@ import sys from math import fmod -from PyQt5.Qt import PYQT_VERSION_STR -from PyQt5.QtCore import qFatal, QT_VERSION, QT_VERSION_STR, qWarning, QDir, QSettings -from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import QFileDialog, QMessageBox - # ------------------------------------------------------------------------------------------------------------ -# Import Signal +# Imports (Signal) from signal import signal, SIGINT, SIGTERM @@ -47,10 +42,25 @@ try: except: haveSIGUSR1 = False +# ------------------------------------------------------------------------------------------------------------ +# Imports (PyQt5) + +from PyQt5.Qt import PYQT_VERSION_STR +from PyQt5.QtCore import qFatal, QT_VERSION, QT_VERSION_STR, qWarning, QDir, QSettings +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QFileDialog, QMessageBox + # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) -from carla_backend_qt import * +from carla_backend import ( + kIs64bit, HAIKU, LINUX, MACOS, WINDOWS, + MAX_DEFAULT_PARAMETERS, + ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, + ENGINE_PROCESS_MODE_PATCHBAY, + ENGINE_TRANSPORT_MODE_INTERNAL, + ENGINE_TRANSPORT_MODE_JACK +) # ------------------------------------------------------------------------------------------------------------ # Platform specific stuff @@ -487,19 +497,21 @@ readEnvVars = True if WINDOWS: # Check if running Wine. If yes, ignore env vars + # pylint: disable=import-error from winreg import ConnectRegistry, OpenKey, CloseKey, HKEY_CURRENT_USER - reg = ConnectRegistry(None, HKEY_CURRENT_USER) + # pylint: enable=import-error + _reg = ConnectRegistry(None, HKEY_CURRENT_USER) try: - key = OpenKey(reg, r"SOFTWARE\Wine") - CloseKey(key) - del key + _key = OpenKey(_reg, r"SOFTWARE\Wine") + CloseKey(_key) + del _key readEnvVars = False except: pass - CloseKey(reg) - del reg + CloseKey(_reg) + del _reg if readEnvVars: CARLA_DEFAULT_LADSPA_PATH = os.getenv("LADSPA_PATH", DEFAULT_LADSPA_PATH).split(splitter) @@ -534,18 +546,13 @@ del DEFAULT_SFZ_PATH # Global Carla object class CarlaObject(object): - __slots__ = [ - 'gui', # Host Window - 'nogui', # Skip UI - 'term', # Terminated by OS signal - 'utils' # Utils object - ] + def __init__(self): + self.gui = None # Host Window + self.nogui = False # Skip UI + self.term = False # Terminated by OS signal + self.utils = None # Utils object gCarla = CarlaObject() -gCarla.gui = None -gCarla.nogui = False -gCarla.term = False -gCarla.utils = None # ------------------------------------------------------------------------------------------------------------ # Set CWD @@ -605,10 +612,9 @@ def isNumber(value): def toList(value): if value is None: return [] - elif not isinstance(value, list): + if not isinstance(value, list): return [value] - else: - return value + return value # ------------------------------------------------------------------------------------------------------------ # Get Icon from user theme, using our own as backup (Oxygen) @@ -672,10 +678,9 @@ def handleInitialCommandLineArguments(file): # ------------------------------------------------------------------------------------------------------------ # Get initial project file (as passed in the command-line parameters) -def getInitialProjectFile(app, skipExistCheck = False): - # FIXME - PyQt mishandles unicode characters, we'll use direct sys.argv for now +def getInitialProjectFile(skipExistCheck = False): + # NOTE: PyQt mishandles unicode characters, we directly use sys.argv instead of qApp->arguments() # see https://riverbankcomputing.com/pipermail/pyqt/2015-January/035395.html - #args = app.arguments()[1:] args = sys.argv[1:] for arg in args: if arg.startswith("--with-appname=") or arg.startswith("--with-libprefix=") or arg.startswith("--osc-gui="): @@ -784,7 +789,7 @@ class QMessageBoxWithBetterWidth(QMessageBox): lines = self.text().strip().split("\n") + self.informativeText().strip().split("\n") - if len(lines) > 0: + if lines: width = 0 for line in lines: @@ -798,18 +803,19 @@ class QMessageBoxWithBetterWidth(QMessageBox): # Safer QSettings class, which does not throw if type mismatches class QSafeSettings(QSettings): - def value(self, key, defaultValue, type): - if not isinstance(defaultValue, type): + def value(self, key, defaultValue, valueType): + if not isinstance(defaultValue, valueType): print("QSafeSettings.value() - defaultValue type mismatch for key", key) try: - return QSettings.value(self, key, defaultValue, type) + return QSettings.value(self, key, defaultValue, valueType) except: return defaultValue # ------------------------------------------------------------------------------------------------------------ # Custom MessageBox +# pylint: disable=too-many-arguments def CustomMessageBox(parent, icon, title, text, extraText="", buttons=QMessageBox.Yes|QMessageBox.No, @@ -822,5 +828,6 @@ def CustomMessageBox(parent, icon, title, text, msgBox.setStandardButtons(buttons) msgBox.setDefaultButton(defButton) return msgBox.exec_() +# pylint: enable=too-many-arguments # ------------------------------------------------------------------------------------------------------------ diff --git a/source/frontend/carla_skin.py b/source/frontend/carla_skin.py index 530d2a1b4..74cbe31db 100644 --- a/source/frontend/carla_skin.py +++ b/source/frontend/carla_skin.py @@ -19,9 +19,9 @@ # ------------------------------------------------------------------------------------------------------------ # Imports (Global) -from PyQt5.QtCore import Qt, QRectF, QLineF -from PyQt5.QtGui import QFont, QFontDatabase, QPen -from PyQt5.QtWidgets import QColorDialog, QFrame, QPushButton +from PyQt5.QtCore import Qt, QRectF, QLineF, QTimer +from PyQt5.QtGui import QColor, QFont, QFontDatabase, QPainter, QPainterPath, QPen +from PyQt5.QtWidgets import QColorDialog, QFrame, QLineEdit, QPushButton # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) @@ -32,8 +32,11 @@ import ui_carla_plugin_compact import ui_carla_plugin_default import ui_carla_plugin_presets +from carla_backend import * +from carla_shared import * from carla_widgets import * from widgets.digitalpeakmeter import DigitalPeakMeter +from widgets.paramspinbox import CustomInputDialog from widgets.scalabledial import ScalableDial # ------------------------------------------------------------------------------------------------------------ @@ -205,11 +208,6 @@ class AbstractPluginSlot(QFrame, PluginEditParentMeta): self.host = host self.fParent = parent - if False: - # kdevelop likes this :) - host = CarlaHostNull() - self.host = host - # ------------------------------------------------------------- # Get plugin info @@ -2005,13 +2003,6 @@ class PluginSlot_Presets(AbstractPluginSlot): # ------------------------------------------------------------------------------------------------------------ def getColorAndSkinStyle(host, pluginId): - if False: - # kdevelop likes this :) - host = CarlaHostNull() - progCount = 0 - pluginInfo = PyCarlaPluginInfo - pluginName = "" - pluginInfo = host.get_plugin_info(pluginId) pluginName = host.get_real_plugin_name(pluginId) pluginLabel = pluginInfo['label'].lower() diff --git a/source/frontend/carla_utils.py b/source/frontend/carla_utils.py index 128b63881..ed120f277 100644 --- a/source/frontend/carla_utils.py +++ b/source/frontend/carla_utils.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Carla Backend utils -# Copyright (C) 2011-2018 Filipe Coelho +# Copyright (C) 2011-2020 Filipe Coelho # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -22,10 +22,48 @@ from os import environ from sys import argv +# ------------------------------------------------------------------------------------------------------------ +# Imports (ctypes) + +from ctypes import ( + c_bool, c_char_p, c_double, c_int, c_uint, c_uint32, c_void_p, + cdll, Structure, + CFUNCTYPE, POINTER +) + # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) -from carla_backend import * +from carla_backend import ( + PLUGIN_NONE, + PLUGIN_INTERNAL, + PLUGIN_LADSPA, + PLUGIN_DSSI, + PLUGIN_LV2, + PLUGIN_VST2, + PLUGIN_VST3, + PLUGIN_AU, + PLUGIN_DLS, + PLUGIN_GIG, + PLUGIN_SF2, + PLUGIN_SFZ, + PLUGIN_JACK, + PLUGIN_CATEGORY_NONE, + PLUGIN_CATEGORY_SYNTH, + PLUGIN_CATEGORY_DELAY, + PLUGIN_CATEGORY_EQ, + PLUGIN_CATEGORY_FILTER, + PLUGIN_CATEGORY_DISTORTION, + PLUGIN_CATEGORY_DYNAMICS, + PLUGIN_CATEGORY_MODULATOR, + PLUGIN_CATEGORY_UTILITY, + PLUGIN_CATEGORY_OTHER, + WINDOWS, + c_enum, c_uintptr, + charPtrToString, + charPtrPtrToStringList, + structToDict +) # ------------------------------------------------------------------------------------------------------------ @@ -46,6 +84,10 @@ def getPluginTypeAsString(ptype): return "VST3" if ptype == PLUGIN_AU: return "AU" + if ptype == PLUGIN_DLS: + return "DLS" + if ptype == PLUGIN_GIG: + return "GIG" if ptype == PLUGIN_SF2: return "SF2" if ptype == PLUGIN_SFZ: @@ -53,7 +95,7 @@ def getPluginTypeAsString(ptype): if ptype == PLUGIN_JACK: return "JACK" - print("getPluginTypeAsString(%i) - invalid type" % ptype); + print("getPluginTypeAsString(%i) - invalid type" % ptype) return "Unknown" def getPluginTypeFromString(stype): @@ -78,6 +120,10 @@ def getPluginTypeFromString(stype): return PLUGIN_VST3 if stype in ("au", "audiounit"): return PLUGIN_AU + if stype == "dls": + return PLUGIN_DLS + if stype == "gig": + return PLUGIN_GIG if stype == "sf2": return PLUGIN_SF2 if stype == "sfz": @@ -295,14 +341,19 @@ class CarlaUtils(object): self.lib.carla_x11_get_window_pos.argtypes = [c_uintptr] self.lib.carla_x11_get_window_pos.restype = POINTER(c_int) + self._pipeClientFunc = None + self._pipeClientCallback = None + # use _putenv on windows if not WINDOWS: self.msvcrt = None return self.msvcrt = cdll.msvcrt + # pylint: disable=protected-access self.msvcrt._putenv.argtypes = [c_char_p] self.msvcrt._putenv.restype = None + # pylint: enable=protected-access # -------------------------------------------------------------------------------------------------------- @@ -312,7 +363,9 @@ class CarlaUtils(object): if WINDOWS: keyvalue = "%s=%s" % (key, value) + # pylint: disable=protected-access self.msvcrt._putenv(keyvalue.encode("utf-8")) + # pylint: enable=protected-access # unset environment variable def unsetenv(self, key): @@ -321,7 +374,9 @@ class CarlaUtils(object): if WINDOWS: keyrm = "%s=" % key + # pylint: disable=protected-access self.msvcrt._putenv(keyrm.encode("utf-8")) + # pylint: enable=protected-access # -------------------------------------------------------------------------------------------------------- diff --git a/source/frontend/carla_widgets.py b/source/frontend/carla_widgets.py index b249abca1..57a89b677 100755 --- a/source/frontend/carla_widgets.py +++ b/source/frontend/carla_widgets.py @@ -19,9 +19,14 @@ # ------------------------------------------------------------------------------------------------------------ # Imports (Global) -from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray, QTimer -from PyQt5.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath, QPalette, QPixmap -from PyQt5.QtWidgets import QDialog, QGroupBox, QInputDialog, QLineEdit, QMenu, QScrollArea, QVBoxLayout, QWidget +from abc import abstractmethod + +# ------------------------------------------------------------------------------------------------------------ +# Imports (PyQt5) + +from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray +from PyQt5.QtGui import QCursor, QIcon, QPalette, QPixmap +from PyQt5.QtWidgets import QDialog, QFileDialog, QInputDialog, QMenu, QMessageBox, QScrollArea, QVBoxLayout, QWidget # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) @@ -31,10 +36,61 @@ import ui_carla_about_juce import ui_carla_edit import ui_carla_parameter -from carla_shared import * -from carla_utils import * +from carla_backend import ( + MACOS, WINDOWS, + BINARY_NATIVE, + PLUGIN_INTERNAL, + PLUGIN_DSSI, + PLUGIN_LV2, + PLUGIN_VST2, + PLUGIN_SF2, + PLUGIN_SFZ, + PLUGIN_CAN_DRYWET, + PLUGIN_CAN_VOLUME, + PLUGIN_CAN_BALANCE, + PLUGIN_CAN_PANNING, + PLUGIN_CATEGORY_SYNTH, + PLUGIN_OPTION_FIXED_BUFFERS, + PLUGIN_OPTION_FORCE_STEREO, + PLUGIN_OPTION_MAP_PROGRAM_CHANGES, + PLUGIN_OPTION_USE_CHUNKS, + PLUGIN_OPTION_SEND_CONTROL_CHANGES, + PLUGIN_OPTION_SEND_CHANNEL_PRESSURE, + PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH, + PLUGIN_OPTION_SEND_PITCHBEND, + PLUGIN_OPTION_SEND_ALL_SOUND_OFF, + PLUGIN_OPTION_SEND_PROGRAM_CHANGES, + PARAMETER_DRYWET, + PARAMETER_VOLUME, + PARAMETER_BALANCE_LEFT, + PARAMETER_BALANCE_RIGHT, + PARAMETER_PANNING, + PARAMETER_CTRL_CHANNEL, + PARAMETER_IS_ENABLED, + PARAMETER_IS_AUTOMABLE, + PARAMETER_IS_READ_ONLY, + PARAMETER_USES_SCALEPOINTS, + PARAMETER_USES_CUSTOM_TEXT, + PARAMETER_CAN_BE_CV_CONTROLLED, + PARAMETER_INPUT, PARAMETER_OUTPUT, + CONTROL_VALUE_NONE, + CONTROL_VALUE_MIDI_PITCHBEND, + CONTROL_VALUE_CV +) + +from carla_shared import ( + MIDI_CC_LIST, MAX_MIDI_CC_LIST_ITEM, + VERSION, + countDecimalPoints, + fontMetricsHorizontalAdvance, + setUpSignals, + gCarla +) + +from carla_utils import getPluginTypeAsString +#) + from widgets.collapsablewidget import CollapsibleBox -from widgets.paramspinbox import CustomInputDialog from widgets.pixmapkeyboard import PixmapKeyboardHArea # ------------------------------------------------------------------------------------------------------------ @@ -54,10 +110,6 @@ class CarlaAboutW(QDialog): self.ui = ui_carla_about.Ui_CarlaAboutW() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - host = CarlaHostNull() - if host.isControl: extraInfo = " - %s" % self.tr("OSC Bridge Version") elif host.isPlugin: @@ -66,10 +118,10 @@ class CarlaAboutW(QDialog): extraInfo = "" self.ui.l_about.setText(self.tr("" - "
Version %s" - "
Carla is a fully-featured audio plugin host%s.
" - "
Copyright (C) 2011-2020 falkTX
" - "" % (VERSION, extraInfo))) + "
Version %s" + "
Carla is a fully-featured audio plugin host%s.
" + "
Copyright (C) 2011-2020 falkTX
" + "" % (VERSION, extraInfo))) if self.ui.about.palette().color(QPalette.Background).blackF() < 0.5: self.ui.l_icons.setPixmap(QPixmap(":/bitmaps/carla_about_black.png")) @@ -181,10 +233,6 @@ class CarlaAboutW(QDialog): self.setWindowFlags(flags) - def done(self, r): - QDialog.done(self, r) - self.close() - # ------------------------------------------------------------------------------------------------------------ # JUCE About dialog @@ -207,10 +255,6 @@ class JuceAboutW(QDialog): self.setWindowFlags(flags) - def done(self, r): - QDialog.done(self, r) - self.close() - # ------------------------------------------------------------------------------------------------------------ # Plugin Parameter @@ -226,11 +270,6 @@ class PluginParameter(QWidget): self.ui = ui_carla_parameter.Ui_PluginParameter() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - host = CarlaHostNull() - self.host = host - # ------------------------------------------------------------- # Internal stuff @@ -562,12 +601,6 @@ class PluginEdit(QDialog): self.ui = ui_carla_edit.Ui_PluginEdit() self.ui.setupUi(self) - if False: - # kdevelop likes this :) - parent = PluginEditParentMeta() - host = CarlaHostNull() - self.host = host - # ------------------------------------------------------------- # Internal stuff @@ -708,7 +741,8 @@ class PluginEdit(QDialog): @pyqtSlot(int, int, int, int) def slot_handleNoteOnCallback(self, pluginId, channel, note, velocity): - if self.fPluginId != pluginId: return + if self.fPluginId != pluginId: + return if self.fControlChannel == channel: self.ui.keyboard.sendNoteOn(note, False) @@ -723,7 +757,8 @@ class PluginEdit(QDialog): @pyqtSlot(int, int, int) def slot_handleNoteOffCallback(self, pluginId, channel, note): - if self.fPluginId != pluginId: return + if self.fPluginId != pluginId: + return if self.fControlChannel == channel: self.ui.keyboard.sendNoteOff(note, False) @@ -733,7 +768,7 @@ class PluginEdit(QDialog): if playItem in self.fPlayingNotes: self.fPlayingNotes.remove(playItem) - if len(self.fPlayingNotes) == 0 and self.fParent is not None: + if self.fPlayingNotes and self.fParent is not None: self.fParent.editDialogMidiActivityChanged(self.fPluginId, False) @pyqtSlot(int) @@ -784,7 +819,7 @@ class PluginEdit(QDialog): self.ui.cb_midi_programs.setItemText(mpIndex, "%03i:%03i - %s" % (mpBank+1, mpProg+1, mpName)) # Update all parameter values - for paramType, paramId, paramWidget in self.fParameterList: + for _, paramId, paramWidget in self.fParameterList: paramWidget.blockSignals(True) paramWidget.setValue(self.host.get_current_parameter_value(self.fPluginId, paramId)) paramWidget.blockSignals(False) @@ -922,7 +957,7 @@ class PluginEdit(QDialog): self.fTabIconTimers = [] # Remove all previous parameters - for x in range(self.ui.tabWidget.count()-1): + for _ in range(self.ui.tabWidget.count()-1): self.ui.tabWidget.widget(1).deleteLater() self.ui.tabWidget.removeTab(1) @@ -1074,8 +1109,8 @@ class PluginEdit(QDialog): #------------------------------------------------------------------ def clearNotes(self): - self.fPlayingNotes = [] - self.ui.keyboard.allNotesOff() + self.fPlayingNotes = [] + self.ui.keyboard.allNotesOff() def noteOn(self, channel, note, velocity): if self.fControlChannel == channel: @@ -1109,25 +1144,25 @@ class PluginEdit(QDialog): self.fParametersToUpdate.append([parameterId, value]) def setParameterDefault(self, parameterId, value): - for paramType, paramId, paramWidget in self.fParameterList: + for _, paramId, paramWidget in self.fParameterList: if paramId == parameterId: paramWidget.setDefault(value) break def setParameterMappedControlIndex(self, parameterId, control): - for paramType, paramId, paramWidget in self.fParameterList: + for _, paramId, paramWidget in self.fParameterList: if paramId == parameterId: paramWidget.setMappedControlIndex(control) break def setParameterMappedRange(self, parameterId, minimum, maximum): - for paramType, paramId, paramWidget in self.fParameterList: + for _, paramId, paramWidget in self.fParameterList: if paramId == parameterId: paramWidget.setMappedRange(minimum, maximum) break def setParameterMidiChannel(self, parameterId, channel): - for paramType, paramId, paramWidget in self.fParameterList: + for _, paramId, paramWidget in self.fParameterList: if paramId == parameterId: paramWidget.setMidiChannel(channel+1) break @@ -1282,7 +1317,7 @@ class PluginEdit(QDialog): self.fCurrentStateFilename = None fileFilter = self.tr("Carla State File (*.carxs)") - filename, ok = QFileDialog.getSaveFileName(self, self.tr("Save Plugin State File"), filter=fileFilter) + filename, _ = QFileDialog.getSaveFileName(self, self.tr("Save Plugin State File"), filter=fileFilter) # FIXME use ok value, test if it works as expected if not filename: @@ -1312,7 +1347,7 @@ class PluginEdit(QDialog): return fileFilter = self.tr("Carla State File (*.carxs)") - filename, ok = QFileDialog.getOpenFileName(self, self.tr("Open Plugin State File"), filter=fileFilter) + filename, _ = QFileDialog.getOpenFileName(self, self.tr("Open Plugin State File"), filter=fileFilter) # FIXME use ok value, test if it works as expected if not filename: @@ -1541,7 +1576,8 @@ class PluginEdit(QDialog): if actSelected == actSet: current = minimum + (maximum-minimum)*(float(sender.value())/10000) value, ok = QInputDialog.getInt(self, self.tr("Set value"), label, round(current*100.0), round(minimum*100.0), round(maximum*100.0), 1) - if ok: value = float(value)/100.0 + if ok: + value = float(value)/100.0 if not ok: return @@ -1594,7 +1630,7 @@ class PluginEdit(QDialog): groupWidgets = {} for paramList, width in paramListFull: - if len(paramList) == 0: + if not paramList: break tabIndex = self.ui.tabWidget.count() @@ -1678,7 +1714,7 @@ class PluginEdit(QDialog): self.setMidiProgram(mpIndex) def _updateParameterValues(self): - for paramType, paramId, paramWidget in self.fParameterList: + for _, paramId, paramWidget in self.fParameterList: paramWidget.blockSignals(True) paramWidget.setValue(self.host.get_current_parameter_value(self.fPluginId, paramId)) paramWidget.blockSignals(False) @@ -1694,7 +1730,7 @@ class PluginEdit(QDialog): def testTimerClose(self): self.close() - app.quit() + _app.quit() #------------------------------------------------------------------ @@ -1714,30 +1750,26 @@ class PluginEdit(QDialog): QDialog.timerEvent(self, event) - def done(self, r): - QDialog.done(self, r) - self.close() - # ------------------------------------------------------------------------------------------------------------ # Main if __name__ == '__main__': from carla_app import CarlaApplication - from carla_host import initHost, loadHostSettings + from carla_host import initHost as _initHost, loadHostSettings as _loadHostSettings - app = CarlaApplication() - host = initHost("Widgets", None, False, False, False) - loadHostSettings(host) + _app = CarlaApplication() + _host = _initHost("Widgets", None, False, False, False) + _loadHostSettings(_host) - host.engine_init("JACK", "Carla-Widgets") - host.add_plugin(BINARY_NATIVE, PLUGIN_DSSI, "/usr/lib/dssi/karplong.so", "karplong", "karplong", 0, None, 0x0) - host.set_active(0, True) + _host.engine_init("JACK", "Carla-Widgets") + _host.add_plugin(BINARY_NATIVE, PLUGIN_DSSI, "/usr/lib/dssi/karplong.so", "karplong", "karplong", 0, None, 0x0) + _host.set_active(0, True) - gui1 = CarlaAboutW(None, host) + gui1 = CarlaAboutW(None, _host) gui1.show() - gui2 = PluginEdit(None, host, 0) + gui2 = PluginEdit(None, _host, 0) gui2.testTimer() gui2.show() - app.exit_exec() + _app.exit_exec()