Settings page, themes and cut path check for future updates. Volume now saved to config.

This commit is contained in:
BarsTiger
2022-11-29 23:27:20 +02:00
parent e9b7f1fdc1
commit 4d698235a1
14 changed files with 374 additions and 15 deletions

View File

@@ -202,6 +202,96 @@ class Ui_MainWindow(object):
self.content.addWidget(self.download_page) self.content.addWidget(self.download_page)
self.settings_page = QtWidgets.QWidget() self.settings_page = QtWidgets.QWidget()
self.settings_page.setObjectName("settings_page") 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.content.addWidget(self.settings_page)
self.main_content_to_player_box_lay.addWidget(self.content) self.main_content_to_player_box_lay.addWidget(self.content)
self.player_box = QtWidgets.QWidget(self.main_content_to_player_box) self.player_box = QtWidgets.QWidget(self.main_content_to_player_box)
@@ -259,6 +349,7 @@ class Ui_MainWindow(object):
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
self.menu.setCurrentRow(-1) self.menu.setCurrentRow(-1)
self.pads_content.setCurrentIndex(0) self.pads_content.setCurrentIndex(0)
self.settings_tabs_widget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, 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_first_pads_collection_label.setText(_translate("MainWindow", "Pads collection 1"))
self.edit_second_pads_collection_label.setText(_translate("MainWindow", "Pads collection 2")) 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.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 import gui.images_rc

View File

@@ -697,7 +697,242 @@ QListWidget:item:selected {
<widget class="QWidget" name="stream_page"/> <widget class="QWidget" name="stream_page"/>
<widget class="QWidget" name="collab_page"/> <widget class="QWidget" name="collab_page"/>
<widget class="QWidget" name="download_page"/> <widget class="QWidget" name="download_page"/>
<widget class="QWidget" name="settings_page"/> <widget class="QWidget" name="settings_page">
<layout class="QVBoxLayout" name="settings_page_lay">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="settings_tabs_widget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="audio_devices_settings_tab">
<attribute name="title">
<string>Audio</string>
</attribute>
<layout class="QVBoxLayout" name="audio_devices_settings_tab_lay">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignTop">
<widget class="QGroupBox" name="play_options_group">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Play options</string>
</property>
<layout class="QVBoxLayout" name="play_options_group_lay">
<property name="topMargin">
<number>5</number>
</property>
<item>
<widget class="QLabel" name="output_device_play_label">
<property name="text">
<string>Output device (or virtual mic input)</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="output_device_play_box">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="preview_device_play_label">
<property name="text">
<string>Preview device (your headphones)</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="preview_device_play_box">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item alignment="Qt::AlignTop">
<widget class="QGroupBox" name="restream_options_group">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Microphone restream options</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="topMargin">
<number>5</number>
</property>
<item>
<widget class="QCheckBox" name="restream_micro_checkbox">
<property name="text">
<string>Restream microphone</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="input_device_restream_label">
<property name="text">
<string>Input microphone</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="input_device_restream_box">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="output_device_restream_label">
<property name="text">
<string>Output device (virtual mic input)</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="output_device_restream_box">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="audio_devices_settings_tab_spacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="general_settings_tab">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QVBoxLayout" name="general_settings_tab_lay">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<widget class="QLabel" name="theme_label">
<property name="text">
<string> App theme (restart needed)</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="theme_box">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<item>
<property name="text">
<string>Dark gray</string>
</property>
</item>
<item>
<property name="text">
<string>Black</string>
</property>
</item>
<item>
<property name="text">
<string>Black acrylic</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="general_settings_tab_spacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
<item> <item>
@@ -806,13 +1041,6 @@ QListWidget:item:selected {
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="player_track_label">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

View File

@@ -3,6 +3,7 @@ from PyQt5.QtWidgets import QMainWindow
from gui.modules import menu from gui.modules import menu
from gui.modules import pads from gui.modules import pads
from gui.modules import player from gui.modules import player
from gui.modules import settings
from modules.player.player import Player from modules.player.player import Player
@@ -17,3 +18,4 @@ def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player):
menu.register_handlers(ui) menu.register_handlers(ui)
pads.register_handlers(ui, MainWindow, p) pads.register_handlers(ui, MainWindow, p)
player.register_handlers(ui, MainWindow, p) player.register_handlers(ui, MainWindow, p)
settings.register_handlers(ui)

View File

@@ -16,6 +16,7 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow):
:return: :return:
""" """
ui.content.setCurrentIndex(0) ui.content.setCurrentIndex(0)
ui.volume_box.setValue(Config.get().volume)
MainWindow.setStyleSheet(styles.centralwidget()) MainWindow.setStyleSheet(styles.centralwidget())
ui.menu.setStyleSheet(styles.menupage()) ui.menu.setStyleSheet(styles.menupage())

View File

@@ -24,13 +24,13 @@ def fill_pads(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player):
button = QtWidgets.QPushButton() button = QtWidgets.QPushButton()
button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
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( button.clicked.connect(
( (
lambda: ( lambda: (
p.set_media(ui.first_pads_dict[MainWindow.sender().text()]), p.set_media(ui.first_pads_dict[MainWindow.sender().text()]),
p.play(ui) p.play(ui)
) if MainWindow.sender().text() != "File doesn't exist" else None )
) )
) )
Pads.update("first_pads", ui.first_pads_dict) 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 = QtWidgets.QPushButton()
button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
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( button.clicked.connect(
( (
lambda: ( lambda: (
p.set_media(ui.second_pads_dict[MainWindow.sender().text()]), p.set_media(ui.second_pads_dict[MainWindow.sender().text()]),
p.play(ui) p.play(ui)
) if MainWindow.sender().text() != "File doesn't exist" else None )
) )
) )
Pads.update("second_pads", ui.second_pads_dict) Pads.update("second_pads", ui.second_pads_dict)

View File

@@ -2,6 +2,7 @@ from gui.gui import Ui_MainWindow
from PyQt5 import QtGui from PyQt5 import QtGui
from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QMainWindow
from modules.player.player import Player from modules.player.player import Player
from modules.config import Config
def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player): 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 = QtGui.QIcon()
pause_icon.addPixmap(QtGui.QPixmap(":/img/img/pause.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 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.play_pause_button.clicked.connect(lambda: p.playpause(ui))
ui.timer.timeout.connect(lambda: (ui.player_time_slider.setValue(p.get_position()), 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() ui.play_pause_button.setIcon(play_icon) if not p.mediaplayer_out.is_playing()

View File

@@ -0,0 +1 @@
from .handlers import *

View File

View File

@@ -0,0 +1 @@
from .handlers import *

View File

@@ -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()))

View File

@@ -6,3 +6,4 @@ from dataclasses_json import dataclass_json
@dataclass(frozen=True) @dataclass(frozen=True)
class ConfigModel: class ConfigModel:
theme: str theme: str
volume: int

View File

@@ -7,7 +7,8 @@ class Config:
@staticmethod @staticmethod
def default(): def default():
return { return {
"theme": "Dark gray" "theme": "Dark gray",
"volume": 100
} }
@staticmethod @staticmethod

View File

@@ -68,3 +68,6 @@ class Player(object):
def set_position(self, pos: float): def set_position(self, pos: float):
self.mediaplayer_preview.set_position(pos) self.mediaplayer_preview.set_position(pos)
self.mediaplayer_out.set_position(pos) self.mediaplayer_out.set_position(pos)
def update_devices(self):
pass

View File

@@ -6,4 +6,5 @@ dataclasses-json
requests requests
python-vlc python-vlc
sounddevice sounddevice
numpy numpy
validators