Wobuzz/wobuzz/ui/settings/settings.py

150 lines
6.2 KiB
Python

#!/usr/bin/python3
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (
QWidget,
QDockWidget,
QTabWidget,
QLineEdit,
QCheckBox,
QPushButton,
QSpinBox,
QVBoxLayout,
QSizePolicy
)
from .category import Category
from .sub_category import SubCategory
class Settings(QDockWidget):
def __init__(self, app, parent=None):
super().__init__(parent)
self.app = app
self.setAllowedAreas(
Qt.DockWidgetArea.LeftDockWidgetArea |
Qt.DockWidgetArea.RightDockWidgetArea |
Qt.DockWidgetArea.BottomDockWidgetArea
)
self.setWindowTitle("Settings")
self.content = QWidget(self)
self.content_layout = QVBoxLayout()
self.content.setLayout(self.content_layout)
self.tabs = QTabWidget(self.content)
self.content_layout.addWidget(self.tabs)
self.file_settings = Category()
self.file_settings.paths = SubCategory("Paths")
self.file_settings.add_sub_category(self.file_settings.paths)
self.file_settings.paths.library_path_input = QLineEdit()
self.file_settings.paths.add_setting("Library Path:", self.file_settings.paths.library_path_input)
self.tabs.addTab(self.file_settings, "Files")
self.behavior_settings = Category()
self.behavior_settings.playlist = SubCategory("Playlist",)
self.behavior_settings.add_sub_category(self.behavior_settings.playlist)
self.behavior_settings.playlist.load_on_start = QCheckBox()
self.behavior_settings.playlist.add_setting("Load on start:", self.behavior_settings.playlist.load_on_start)
self.behavior_settings.track = SubCategory("Track",)
self.behavior_settings.add_sub_category(self.behavior_settings.track)
self.behavior_settings.track.clear_cache = QCheckBox()
self.behavior_settings.track.add_setting(
"Clear cache:",
self.behavior_settings.track.clear_cache,
"Automatically clear the track's cache after it finished. This greatly reduces RAM usage."
)
self.tabs.addTab(self.behavior_settings, "Behavior")
self.appearance_settings = Category()
self.appearance_settings.track_info = SubCategory("Track Info")
self.appearance_settings.add_sub_category(self.appearance_settings.track_info)
self.appearance_settings.track_info.cover_size = QSpinBox()
self.appearance_settings.track_info.cover_size.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
self.appearance_settings.track_info.cover_size.setRange(16, 128)
self.appearance_settings.track_info.cover_size.setSuffix("px")
self.appearance_settings.track_info.cover_size.setSingleStep(10)
self.appearance_settings.track_info.add_setting(
"Album Cover Size",
self.appearance_settings.track_info.cover_size,
"The size of the album cover. (aspect-ratio: 1:1)"
)
self.tabs.addTab(self.appearance_settings, "Appearance")
self.performance_settings = Category()
# self.performance_settings.memory = SubCategory("Memory", "Memory related settings")
# self.performance_settings.add_sub_category(self.performance_settings.memory)
self.performance_settings.cpu = SubCategory("CPU",)
self.performance_settings.add_sub_category(self.performance_settings.cpu)
self.performance_settings.cpu.gui_update_rate = QSpinBox()
self.performance_settings.cpu.gui_update_rate.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
self.performance_settings.cpu.gui_update_rate.setRange(1, 60)
self.performance_settings.cpu.gui_update_rate.setSuffix(" FPS")
self.performance_settings.cpu.gui_update_rate.setSingleStep(5)
self.performance_settings.cpu.add_setting(
"GUI update rate:",
self.performance_settings.cpu.gui_update_rate,
"The rate at which gui-elements like the track-progress-slider get updated.\n"
"Values above 20 don't really make sense for most monitors.\n"
"Decreasing this value will reduce the CPU usage."
)
self.tabs.addTab(self.performance_settings, "Performance")
self.save_button = QPushButton("&Save", self.content)
self.content_layout.addWidget(self.save_button)
self.setWidget(self.content)
self.visibilityChanged.connect(self.update_all)
self.save_button.pressed.connect(self.write_settings)
def update_all(self, _=True): # ignore visible parameter passed by visibilityChanged event
self.file_settings.paths.library_path_input.setText(self.app.settings.library_path)
self.behavior_settings.track.clear_cache.setChecked(self.app.settings.clear_track_cache)
self.behavior_settings.playlist.load_on_start.setChecked(self.app.settings.load_on_start)
self.performance_settings.cpu.gui_update_rate.setValue(self.app.settings.gui_update_rate)
self.appearance_settings.track_info.cover_size.setValue(self.app.settings.album_cover_size)
def update_settings(self, key, value):
match key:
case "library_path":
self.file_settings.paths.library_path_input.setText(value)
case "clear_track_cache":
self.behavior_settings.track.clear_cache.setDown(value)
case "load_on_start":
self.behavior_settings.playlist.load_on_start.setChecked(value)
case "gui_update_rate":
self.performance_settings.cpu.gui_update_rate.setValue(value)
case "track_cover_size":
self.appearance_settings.track_info.cover_size.setValue(value)
def write_settings(self):
self.app.settings.library_path = self.file_settings.paths.library_path_input.text()
self.app.settings.clear_track_cache = self.behavior_settings.track.clear_cache.isChecked()
self.app.settings.load_on_start = self.behavior_settings.playlist.load_on_start.isChecked()
self.app.settings.gui_update_rate = self.performance_settings.cpu.gui_update_rate.value()
self.app.settings.album_cover_size = self.appearance_settings.track_info.cover_size.value()