#!/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()