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.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

View File

@@ -697,7 +697,242 @@ QListWidget:item:selected {
<widget class="QWidget" name="stream_page"/>
<widget class="QWidget" name="collab_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>
</item>
<item>
@@ -806,13 +1041,6 @@ QListWidget:item:selected {
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="player_track_label">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

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

View File

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

View File

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

View File

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

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)
class ConfigModel:
theme: str
volume: int

View File

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

View File

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

View File

@@ -7,3 +7,4 @@ requests
python-vlc
sounddevice
numpy
validators