| 
							- #!/usr/bin/env python3
 - # -*- coding: utf-8 -*-
 - 
 - # Carla plugin host
 - # Copyright (C) 2011-2022 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 the Free Software Foundation; either version 2 of
 - # the License, or any later version.
 - #
 - # This program is distributed in the hope that it will be useful,
 - # but WITHOUT ANY WARRANTY; without even the implied warranty of
 - # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 - # GNU General Public License for more details.
 - #
 - # For a full copy of the GNU General Public License see the doc/GPL.txt file.
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Imports (Global)
 - 
 - import os
 - 
 - from PyQt5.QtCore import pyqtSlot, Qt
 - from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QWidget
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Imports (Carla)
 - 
 - from utils import QSafeSettings
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Imports (Local)
 - 
 - from jackappdialog_ui import Ui_JackAppDialog
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Imports (API)
 - 
 - SESSION_MGR_NONE   = 0
 - SESSION_MGR_AUTO   = 1
 - SESSION_MGR_JACK   = 2
 - SESSION_MGR_LADISH = 3
 - SESSION_MGR_NSM    = 4
 - 
 - FLAG_CONTROL_WINDOW              = 0x01
 - FLAG_CAPTURE_FIRST_WINDOW        = 0x02
 - FLAG_BUFFERS_ADDITION_MODE       = 0x10
 - FLAG_MIDI_OUTPUT_CHANNEL_MIXDOWN = 0x20
 - FLAG_EXTERNAL_START              = 0x40
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Jack Application Dialog
 - 
 - UI_SESSION_NONE   = 0
 - UI_SESSION_LADISH = 1
 - UI_SESSION_NSM    = 2
 - 
 - class JackAppDialog(QDialog):
 -     def __init__(self, parent: QWidget, projectFilename: str):
 -         QDialog.__init__(self, parent)
 -         self.ui = Ui_JackAppDialog()
 -         self.ui.setupUi(self)
 - 
 -         self.fProjectFilename = projectFilename
 - 
 -         # --------------------------------------------------------------------------------------------------------------
 -         # UI setup
 - 
 -         self.ui.group_error.setVisible(False)
 -         self.adjustSize()
 -         self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
 - 
 -         # --------------------------------------------------------------------------------------------------------------
 -         # Load settings
 - 
 -         self._loadSettings()
 - 
 -         # --------------------------------------------------------------------------------------------------------------
 -         # Set-up connections
 - 
 -         self.finished.connect(self._slot_saveSettings)
 -         self.ui.cb_session_mgr.currentIndexChanged.connect(self._slot_sessionManagerChanged)
 -         self.ui.le_command.textChanged.connect(self._slot_commandChanged)
 - 
 -     # -----------------------------------------------------------------------------------------------------------------
 -     # public methods
 - 
 -     def getCommandAndFlags(self):
 -         name    = self.ui.le_name.text()
 -         command = self.ui.le_command.text()
 -         smgr    = SESSION_MGR_NONE
 -         flags   = 0x0
 - 
 -         if not name:
 -             name = os.path.basename(command.split(" ",1)[0]).title()
 - 
 -         uiSessionMgrIndex = self.ui.cb_session_mgr.currentIndex()
 -         if uiSessionMgrIndex == UI_SESSION_LADISH:
 -             smgr = SESSION_MGR_LADISH
 -         elif uiSessionMgrIndex == UI_SESSION_NSM:
 -             smgr = SESSION_MGR_NSM
 - 
 -         if self.ui.cb_manage_window.isChecked():
 -             flags |= FLAG_CONTROL_WINDOW
 -         if self.ui.cb_capture_first_window.isChecked():
 -             flags |= FLAG_CAPTURE_FIRST_WINDOW
 -         if self.ui.cb_buffers_addition_mode.isChecked():
 -             flags |= FLAG_BUFFERS_ADDITION_MODE
 -         if self.ui.cb_out_midi_mixdown.isChecked():
 -             flags |= FLAG_MIDI_OUTPUT_CHANNEL_MIXDOWN
 -         if self.ui.cb_external_start.isChecked():
 -             flags |= FLAG_EXTERNAL_START
 - 
 -         bv = ord('0')
 -         v1 = chr(bv + self.ui.sb_audio_ins.value())
 -         v2 = chr(bv + self.ui.sb_audio_outs.value())
 -         v3 = chr(bv + self.ui.sb_midi_ins.value())
 -         v4 = chr(bv + self.ui.sb_midi_outs.value())
 -         v5 = chr(bv + smgr)
 -         v6 = chr(bv + flags)
 -         labelSetup = f"{v1}{v2}{v3}{v4}{v5}{v6}"
 - 
 -         return (command, name, labelSetup)
 - 
 -     # -----------------------------------------------------------------------------------------------------------------
 -     # private methods
 - 
 -     def _checkIfButtonBoxShouldBeEnabled(self, index: int, command: str):
 -         enabled = len(command) > 0
 -         showErr = ""
 - 
 -         # NSM applications must not be abstract or absolute paths, and must not contain arguments
 -         if enabled and index == UI_SESSION_NSM:
 -             if command[0] in (".", "/"):
 -                 showErr = self.tr("NSM applications cannot use abstract or absolute paths")
 -             elif " " in command or ";" in command or "&" in command:
 -                 showErr = self.tr("NSM applications cannot use CLI arguments")
 -             elif not self.fProjectFilename:
 -                 showErr = self.tr("You need to save the current Carla project before NSM can be used")
 - 
 -         if showErr:
 -             enabled = False
 -             self.ui.l_error.setText(showErr)
 -             self.ui.group_error.setVisible(True)
 -         else:
 -             self.ui.group_error.setVisible(False)
 - 
 -         self.ui.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enabled)
 - 
 -     def _loadSettings(self):
 -         settings = QSafeSettings("falkTX", "CarlaAddJackApp")
 - 
 -         smName = settings.value("SessionManager", "", str)
 - 
 -         if smName == "LADISH (SIGUSR1)":
 -             self.ui.cb_session_mgr.setCurrentIndex(UI_SESSION_LADISH)
 -         elif smName == "NSM":
 -             self.ui.cb_session_mgr.setCurrentIndex(UI_SESSION_NSM)
 -         else:
 -             self.ui.cb_session_mgr.setCurrentIndex(UI_SESSION_NONE)
 - 
 -         self.ui.le_command.setText(settings.value("Command", "", str))
 -         self.ui.le_name.setText(settings.value("Name", "", str))
 -         self.ui.sb_audio_ins.setValue(settings.value("NumAudioIns", 2, int))
 -         self.ui.sb_audio_ins.setValue(settings.value("NumAudioIns", 2, int))
 -         self.ui.sb_audio_outs.setValue(settings.value("NumAudioOuts", 2, int))
 -         self.ui.sb_midi_ins.setValue(settings.value("NumMidiIns", 0, int))
 -         self.ui.sb_midi_outs.setValue(settings.value("NumMidiOuts", 0, int))
 -         self.ui.cb_manage_window.setChecked(settings.value("ManageWindow", True, bool))
 -         self.ui.cb_capture_first_window.setChecked(settings.value("CaptureFirstWindow", False, bool))
 -         self.ui.cb_out_midi_mixdown.setChecked(settings.value("MidiOutMixdown", False, bool))
 - 
 -         self._checkIfButtonBoxShouldBeEnabled(self.ui.cb_session_mgr.currentIndex(),
 -                                               self.ui.le_command.text())
 - 
 -     # -----------------------------------------------------------------------------------------------------------------
 -     # private slots
 - 
 -     @pyqtSlot(str)
 -     def _slot_commandChanged(self, command: str):
 -         self._checkIfButtonBoxShouldBeEnabled(self.ui.cb_session_mgr.currentIndex(), command)
 - 
 -     @pyqtSlot(int)
 -     def _slot_sessionManagerChanged(self, index: int):
 -         self._checkIfButtonBoxShouldBeEnabled(index, self.ui.le_command.text())
 - 
 -     @pyqtSlot()
 -     def _slot_saveSettings(self):
 -         settings = QSafeSettings("falkTX", "CarlaAddJackApp")
 -         settings.setValue("Command", self.ui.le_command.text())
 -         settings.setValue("Name", self.ui.le_name.text())
 -         settings.setValue("SessionManager", self.ui.cb_session_mgr.currentText())
 -         settings.setValue("NumAudioIns", self.ui.sb_audio_ins.value())
 -         settings.setValue("NumAudioOuts", self.ui.sb_audio_outs.value())
 -         settings.setValue("NumMidiIns", self.ui.sb_midi_ins.value())
 -         settings.setValue("NumMidiOuts", self.ui.sb_midi_outs.value())
 -         settings.setValue("ManageWindow", self.ui.cb_manage_window.isChecked())
 -         settings.setValue("CaptureFirstWindow", self.ui.cb_capture_first_window.isChecked())
 -         settings.setValue("MidiOutMixdown", self.ui.cb_out_midi_mixdown.isChecked())
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Testing
 - 
 - if __name__ == '__main__':
 -     import sys
 -     # pylint: disable=ungrouped-imports
 -     from PyQt5.QtWidgets import QApplication
 -     # pylint: enable=ungrouped-imports
 - 
 -     _app = QApplication(sys.argv)
 -     _gui = JackAppDialog(None, "")
 - 
 -     if _gui.exec_():
 -         _command, _name, _labelSetup = _gui.getCommandAndFlags()
 -         print("Results:")
 -         print(f"\tCommand:    {_command}")
 -         print(f"\tName:       {_name}")
 -         print(f"\tLabelSetup: {_labelSetup}")
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 
 
  |