diff --git a/gui/gui.py b/gui/gui.py index dcb8e8c..9ce7ff3 100644 --- a/gui/gui.py +++ b/gui/gui.py @@ -202,6 +202,96 @@ class Ui_MainWindow(object): self.content.addWidget(self.download_page) self.settings_page = QtWidgets.QWidget() self.settings_page.setObjectName("settings_page") + self.settings_page_lay = QtWidgets.QVBoxLayout(self.settings_page) + self.settings_page_lay.setContentsMargins(0, 0, 0, 0) + self.settings_page_lay.setObjectName("settings_page_lay") + self.settings_tabs_widget = QtWidgets.QTabWidget(self.settings_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.settings_tabs_widget.sizePolicy().hasHeightForWidth()) + self.settings_tabs_widget.setSizePolicy(sizePolicy) + self.settings_tabs_widget.setObjectName("settings_tabs_widget") + self.audio_devices_settings_tab = QtWidgets.QWidget() + self.audio_devices_settings_tab.setObjectName("audio_devices_settings_tab") + self.audio_devices_settings_tab_lay = QtWidgets.QVBoxLayout(self.audio_devices_settings_tab) + self.audio_devices_settings_tab_lay.setContentsMargins(0, 0, 0, 0) + self.audio_devices_settings_tab_lay.setObjectName("audio_devices_settings_tab_lay") + self.play_options_group = QtWidgets.QGroupBox(self.audio_devices_settings_tab) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.play_options_group.sizePolicy().hasHeightForWidth()) + self.play_options_group.setSizePolicy(sizePolicy) + self.play_options_group.setObjectName("play_options_group") + self.play_options_group_lay = QtWidgets.QVBoxLayout(self.play_options_group) + self.play_options_group_lay.setContentsMargins(-1, 5, -1, -1) + self.play_options_group_lay.setObjectName("play_options_group_lay") + self.output_device_play_label = QtWidgets.QLabel(self.play_options_group) + self.output_device_play_label.setObjectName("output_device_play_label") + self.play_options_group_lay.addWidget(self.output_device_play_label) + self.output_device_play_box = QtWidgets.QComboBox(self.play_options_group) + self.output_device_play_box.setMinimumSize(QtCore.QSize(0, 30)) + self.output_device_play_box.setObjectName("output_device_play_box") + self.play_options_group_lay.addWidget(self.output_device_play_box) + self.preview_device_play_label = QtWidgets.QLabel(self.play_options_group) + self.preview_device_play_label.setObjectName("preview_device_play_label") + self.play_options_group_lay.addWidget(self.preview_device_play_label) + self.preview_device_play_box = QtWidgets.QComboBox(self.play_options_group) + self.preview_device_play_box.setMinimumSize(QtCore.QSize(0, 30)) + self.preview_device_play_box.setObjectName("preview_device_play_box") + self.play_options_group_lay.addWidget(self.preview_device_play_box) + self.audio_devices_settings_tab_lay.addWidget(self.play_options_group, 0, QtCore.Qt.AlignTop) + self.restream_options_group = QtWidgets.QGroupBox(self.audio_devices_settings_tab) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.restream_options_group.sizePolicy().hasHeightForWidth()) + self.restream_options_group.setSizePolicy(sizePolicy) + self.restream_options_group.setObjectName("restream_options_group") + self.verticalLayout = QtWidgets.QVBoxLayout(self.restream_options_group) + self.verticalLayout.setContentsMargins(-1, 5, -1, -1) + self.verticalLayout.setObjectName("verticalLayout") + self.restream_micro_checkbox = QtWidgets.QCheckBox(self.restream_options_group) + self.restream_micro_checkbox.setObjectName("restream_micro_checkbox") + self.verticalLayout.addWidget(self.restream_micro_checkbox) + self.input_device_restream_label = QtWidgets.QLabel(self.restream_options_group) + self.input_device_restream_label.setObjectName("input_device_restream_label") + self.verticalLayout.addWidget(self.input_device_restream_label) + self.input_device_restream_box = QtWidgets.QComboBox(self.restream_options_group) + self.input_device_restream_box.setMinimumSize(QtCore.QSize(0, 30)) + self.input_device_restream_box.setObjectName("input_device_restream_box") + self.verticalLayout.addWidget(self.input_device_restream_box) + self.output_device_restream_label = QtWidgets.QLabel(self.restream_options_group) + self.output_device_restream_label.setObjectName("output_device_restream_label") + self.verticalLayout.addWidget(self.output_device_restream_label) + self.output_device_restream_box = QtWidgets.QComboBox(self.restream_options_group) + self.output_device_restream_box.setMinimumSize(QtCore.QSize(0, 30)) + self.output_device_restream_box.setObjectName("output_device_restream_box") + self.verticalLayout.addWidget(self.output_device_restream_box) + self.audio_devices_settings_tab_lay.addWidget(self.restream_options_group, 0, QtCore.Qt.AlignTop) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.audio_devices_settings_tab_lay.addItem(spacerItem) + self.settings_tabs_widget.addTab(self.audio_devices_settings_tab, "") + self.general_settings_tab = QtWidgets.QWidget() + self.general_settings_tab.setObjectName("general_settings_tab") + self.general_settings_tab_lay = QtWidgets.QVBoxLayout(self.general_settings_tab) + self.general_settings_tab_lay.setContentsMargins(3, 3, 3, 3) + self.general_settings_tab_lay.setObjectName("general_settings_tab_lay") + self.theme_label = QtWidgets.QLabel(self.general_settings_tab) + self.theme_label.setObjectName("theme_label") + self.general_settings_tab_lay.addWidget(self.theme_label) + self.theme_box = QtWidgets.QComboBox(self.general_settings_tab) + self.theme_box.setMinimumSize(QtCore.QSize(0, 30)) + self.theme_box.setObjectName("theme_box") + self.theme_box.addItem("") + self.theme_box.addItem("") + self.theme_box.addItem("") + self.general_settings_tab_lay.addWidget(self.theme_box) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.general_settings_tab_lay.addItem(spacerItem1) + self.settings_tabs_widget.addTab(self.general_settings_tab, "") + self.settings_page_lay.addWidget(self.settings_tabs_widget) self.content.addWidget(self.settings_page) self.main_content_to_player_box_lay.addWidget(self.content) self.player_box = QtWidgets.QWidget(self.main_content_to_player_box) @@ -259,6 +349,7 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.menu.setCurrentRow(-1) self.pads_content.setCurrentIndex(0) + self.settings_tabs_widget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): @@ -289,6 +380,19 @@ class Ui_MainWindow(object): self.edit_first_pads_collection_label.setText(_translate("MainWindow", "Pads collection 1")) self.edit_second_pads_collection_label.setText(_translate("MainWindow", "Pads collection 2")) self.pads_content.setTabText(self.pads_content.indexOf(self.edit_pads_tab), _translate("MainWindow", "Edit pads")) + self.play_options_group.setTitle(_translate("MainWindow", "Play options")) + self.output_device_play_label.setText(_translate("MainWindow", "Output device (or virtual mic input)")) + self.preview_device_play_label.setText(_translate("MainWindow", "Preview device (your headphones)")) + self.restream_options_group.setTitle(_translate("MainWindow", "Microphone restream options")) + self.restream_micro_checkbox.setText(_translate("MainWindow", "Restream microphone")) + self.input_device_restream_label.setText(_translate("MainWindow", "Input microphone")) + self.output_device_restream_label.setText(_translate("MainWindow", "Output device (virtual mic input)")) + self.settings_tabs_widget.setTabText(self.settings_tabs_widget.indexOf(self.audio_devices_settings_tab), _translate("MainWindow", "Audio")) + self.theme_label.setText(_translate("MainWindow", " App theme (restart needed)")) + self.theme_box.setItemText(0, _translate("MainWindow", "Dark gray")) + self.theme_box.setItemText(1, _translate("MainWindow", "Black")) + self.theme_box.setItemText(2, _translate("MainWindow", "Black acrylic")) + self.settings_tabs_widget.setTabText(self.settings_tabs_widget.indexOf(self.general_settings_tab), _translate("MainWindow", "General")) import gui.images_rc diff --git a/gui/gui.ui b/gui/gui.ui index ac5ec18..92aaa96 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -697,7 +697,242 @@ QListWidget:item:selected { - + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + 0 + + + + Audio + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Play options + + + + 5 + + + + + Output device (or virtual mic input) + + + + + + + + 0 + 30 + + + + + + + + Preview device (your headphones) + + + + + + + + 0 + 30 + + + + + + + + + + + + 0 + 0 + + + + Microphone restream options + + + + 5 + + + + + Restream microphone + + + + + + + Input microphone + + + + + + + + 0 + 30 + + + + + + + + Output device (virtual mic input) + + + + + + + + 0 + 30 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + General + + + + 3 + + + 3 + + + 3 + + + 3 + + + + + App theme (restart needed) + + + + + + + + 0 + 30 + + + + + Dark gray + + + + + Black + + + + + Black acrylic + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + @@ -806,13 +1041,6 @@ QListWidget:item:selected { - - - - - - - diff --git a/gui/modules/handlers/register.py b/gui/modules/handlers/register.py index aff8dce..52d50d7 100644 --- a/gui/modules/handlers/register.py +++ b/gui/modules/handlers/register.py @@ -3,6 +3,7 @@ from PyQt5.QtWidgets import QMainWindow from gui.modules import menu from gui.modules import pads from gui.modules import player +from gui.modules import settings from modules.player.player import Player @@ -17,3 +18,4 @@ def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player): menu.register_handlers(ui) pads.register_handlers(ui, MainWindow, p) player.register_handlers(ui, MainWindow, p) + settings.register_handlers(ui) diff --git a/gui/modules/initialize/setup_ui.py b/gui/modules/initialize/setup_ui.py index 5f546cf..dae1209 100644 --- a/gui/modules/initialize/setup_ui.py +++ b/gui/modules/initialize/setup_ui.py @@ -16,6 +16,7 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow): :return: """ ui.content.setCurrentIndex(0) + ui.volume_box.setValue(Config.get().volume) MainWindow.setStyleSheet(styles.centralwidget()) ui.menu.setStyleSheet(styles.menupage()) diff --git a/gui/modules/pads/fill_pads_from_settings.py b/gui/modules/pads/fill_pads_from_settings.py index 582c879..5b42e57 100644 --- a/gui/modules/pads/fill_pads_from_settings.py +++ b/gui/modules/pads/fill_pads_from_settings.py @@ -24,13 +24,13 @@ def fill_pads(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player): button = QtWidgets.QPushButton() button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) - button.setText(os.path.split(item)[-1][:24:] if os.path.exists(item) else "File doesn't exist") + button.setText(os.path.split(item)[-1][:24:]) button.clicked.connect( ( lambda: ( p.set_media(ui.first_pads_dict[MainWindow.sender().text()]), p.play(ui) - ) if MainWindow.sender().text() != "File doesn't exist" else None + ) ) ) Pads.update("first_pads", ui.first_pads_dict) @@ -50,13 +50,13 @@ def fill_pads(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player): button = QtWidgets.QPushButton() button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) - button.setText(os.path.split(item)[-1][:24:] if os.path.exists(item) else "File doesn't exist") + button.setText(os.path.split(item)[-1][:24:]) button.clicked.connect( ( lambda: ( p.set_media(ui.second_pads_dict[MainWindow.sender().text()]), p.play(ui) - ) if MainWindow.sender().text() != "File doesn't exist" else None + ) ) ) Pads.update("second_pads", ui.second_pads_dict) diff --git a/gui/modules/player/handlers.py b/gui/modules/player/handlers.py index 84707de..af0e9af 100644 --- a/gui/modules/player/handlers.py +++ b/gui/modules/player/handlers.py @@ -2,6 +2,7 @@ from gui.gui import Ui_MainWindow from PyQt5 import QtGui from PyQt5.QtWidgets import QMainWindow from modules.player.player import Player +from modules.config import Config def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player): @@ -19,7 +20,8 @@ def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player): pause_icon = QtGui.QIcon() pause_icon.addPixmap(QtGui.QPixmap(":/img/img/pause.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - ui.volume_box.valueChanged.connect(lambda: p.set_volume(ui.volume_box.value())) + ui.volume_box.valueChanged.connect(lambda: (p.set_volume(ui.volume_box.value()), + Config.update('volume', ui.volume_box.value()))) ui.play_pause_button.clicked.connect(lambda: p.playpause(ui)) ui.timer.timeout.connect(lambda: (ui.player_time_slider.setValue(p.get_position()), ui.play_pause_button.setIcon(play_icon) if not p.mediaplayer_out.is_playing() diff --git a/gui/modules/restreammic/__init__.py b/gui/modules/restreammic/__init__.py new file mode 100644 index 0000000..d7ed779 --- /dev/null +++ b/gui/modules/restreammic/__init__.py @@ -0,0 +1 @@ +from .handlers import * diff --git a/gui/modules/restreammic/handlers.py b/gui/modules/restreammic/handlers.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/modules/settings/__init__.py b/gui/modules/settings/__init__.py new file mode 100644 index 0000000..d7ed779 --- /dev/null +++ b/gui/modules/settings/__init__.py @@ -0,0 +1 @@ +from .handlers import * diff --git a/gui/modules/settings/handlers.py b/gui/modules/settings/handlers.py new file mode 100644 index 0000000..204ad53 --- /dev/null +++ b/gui/modules/settings/handlers.py @@ -0,0 +1,14 @@ +from gui.gui import Ui_MainWindow +from modules.config import Config + + +def register_handlers(ui: Ui_MainWindow): + """ + Register this module handlers + :param ui: + :return: + """ + + ui.theme_box.setCurrentText(Config.get().theme) + + ui.theme_box.currentTextChanged.connect(lambda: Config.update("theme", ui.theme_box.currentText())) diff --git a/modules/config/model.py b/modules/config/model.py index 9337379..8d3f9d0 100644 --- a/modules/config/model.py +++ b/modules/config/model.py @@ -6,3 +6,4 @@ from dataclasses_json import dataclass_json @dataclass(frozen=True) class ConfigModel: theme: str + volume: int diff --git a/modules/config/settings.py b/modules/config/settings.py index ecfab38..9b897df 100644 --- a/modules/config/settings.py +++ b/modules/config/settings.py @@ -7,7 +7,8 @@ class Config: @staticmethod def default(): return { - "theme": "Dark gray" + "theme": "Dark gray", + "volume": 100 } @staticmethod diff --git a/modules/player/player.py b/modules/player/player.py index f3c1cb8..4205ebf 100644 --- a/modules/player/player.py +++ b/modules/player/player.py @@ -68,3 +68,6 @@ class Player(object): def set_position(self, pos: float): self.mediaplayer_preview.set_position(pos) self.mediaplayer_out.set_position(pos) + + def update_devices(self): + pass diff --git a/requirements.txt b/requirements.txt index 7b1f91d..093ce34 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ dataclasses-json requests python-vlc sounddevice -numpy \ No newline at end of file +numpy +validators \ No newline at end of file