From b90410f15f370249e0744df3c6711952bdb892c3 Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Thu, 22 Dec 2022 21:42:26 +0200 Subject: [PATCH] Added collections --- gui/gui.py | 79 ++++++++++++++----- gui/gui.ui | 101 ++++++++++++++++++++++++- gui/modules/collections/__init__.py | 1 + gui/modules/collections/collections.py | 36 +++++++++ gui/modules/collections/handlers.py | 11 +++ gui/modules/collections/initialize.py | 34 +++++++++ gui/modules/handlers/register.py | 2 + modules/config/model.py | 2 + modules/config/paths.py | 5 +- 9 files changed, 246 insertions(+), 25 deletions(-) create mode 100644 gui/modules/collections/__init__.py create mode 100644 gui/modules/collections/collections.py create mode 100644 gui/modules/collections/handlers.py create mode 100644 gui/modules/collections/initialize.py diff --git a/gui/gui.py b/gui/gui.py index 69aa242..d73c8dd 100644 --- a/gui/gui.py +++ b/gui/gui.py @@ -187,9 +187,9 @@ class Ui_MainWindow(object): self.content.addWidget(self.pads_page) self.browser_page = QtWidgets.QWidget() self.browser_page.setObjectName("browser_page") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.browser_page) - self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) - self.verticalLayout_2.setObjectName("verticalLayout_2") + self.browser_page_lay = QtWidgets.QVBoxLayout(self.browser_page) + self.browser_page_lay.setContentsMargins(0, 0, 0, 0) + self.browser_page_lay.setObjectName("browser_page_lay") self.browser_page_tabs = QtWidgets.QTabWidget(self.browser_page) self.browser_page_tabs.setObjectName("browser_page_tabs") self.first_filebrowser_tab = QtWidgets.QWidget() @@ -218,11 +218,11 @@ class Ui_MainWindow(object): self.browser_page_tabs.addTab(self.second_filebrowser_tab, "") self.browser_page_options_tab = QtWidgets.QWidget() self.browser_page_options_tab.setObjectName("browser_page_options_tab") - self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.browser_page_options_tab) - self.verticalLayout_3.setObjectName("verticalLayout_3") + self.browser_page_options_tab_lay = QtWidgets.QVBoxLayout(self.browser_page_options_tab) + self.browser_page_options_tab_lay.setObjectName("browser_page_options_tab_lay") self.first_browser_parent_dir_path_label = QtWidgets.QLabel(self.browser_page_options_tab) self.first_browser_parent_dir_path_label.setObjectName("first_browser_parent_dir_path_label") - self.verticalLayout_3.addWidget(self.first_browser_parent_dir_path_label) + self.browser_page_options_tab_lay.addWidget(self.first_browser_parent_dir_path_label) self.first_browser_parent_dir_path_widget = QtWidgets.QWidget(self.browser_page_options_tab) self.first_browser_parent_dir_path_widget.setObjectName("first_browser_parent_dir_path_widget") self.first_browser_parent_dir_path_lay = QtWidgets.QHBoxLayout(self.first_browser_parent_dir_path_widget) @@ -236,10 +236,10 @@ class Ui_MainWindow(object): self.first_browser_parent_dir_button.setMinimumSize(QtCore.QSize(100, 30)) self.first_browser_parent_dir_button.setObjectName("first_browser_parent_dir_button") self.first_browser_parent_dir_path_lay.addWidget(self.first_browser_parent_dir_button) - self.verticalLayout_3.addWidget(self.first_browser_parent_dir_path_widget) + self.browser_page_options_tab_lay.addWidget(self.first_browser_parent_dir_path_widget) self.second_browser_parent_dir_path_label = QtWidgets.QLabel(self.browser_page_options_tab) self.second_browser_parent_dir_path_label.setObjectName("second_browser_parent_dir_path_label") - self.verticalLayout_3.addWidget(self.second_browser_parent_dir_path_label) + self.browser_page_options_tab_lay.addWidget(self.second_browser_parent_dir_path_label) self.second_browser_parent_dir_path_widget = QtWidgets.QWidget(self.browser_page_options_tab) self.second_browser_parent_dir_path_widget.setObjectName("second_browser_parent_dir_path_widget") self.second_browser_parent_dir_path_lay = QtWidgets.QHBoxLayout(self.second_browser_parent_dir_path_widget) @@ -254,14 +254,50 @@ class Ui_MainWindow(object): self.second_browser_parent_dir_button.setMinimumSize(QtCore.QSize(100, 30)) self.second_browser_parent_dir_button.setObjectName("second_browser_parent_dir_button") self.second_browser_parent_dir_path_lay.addWidget(self.second_browser_parent_dir_button) - self.verticalLayout_3.addWidget(self.second_browser_parent_dir_path_widget) + self.browser_page_options_tab_lay.addWidget(self.second_browser_parent_dir_path_widget) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_3.addItem(spacerItem) + self.browser_page_options_tab_lay.addItem(spacerItem) self.browser_page_tabs.addTab(self.browser_page_options_tab, "") - self.verticalLayout_2.addWidget(self.browser_page_tabs) + self.browser_page_lay.addWidget(self.browser_page_tabs) self.content.addWidget(self.browser_page) self.collections_page = QtWidgets.QWidget() self.collections_page.setObjectName("collections_page") + self.collections_page_lay = QtWidgets.QVBoxLayout(self.collections_page) + self.collections_page_lay.setContentsMargins(0, 0, 0, 0) + self.collections_page_lay.setObjectName("collections_page_lay") + self.collections_page_tabs = QtWidgets.QTabWidget(self.collections_page) + self.collections_page_tabs.setObjectName("collections_page_tabs") + self.collections_tab_in_tabs = QtWidgets.QWidget() + self.collections_tab_in_tabs.setObjectName("collections_tab_in_tabs") + self.collections_tab_in_tabs_lay = QtWidgets.QHBoxLayout(self.collections_tab_in_tabs) + self.collections_tab_in_tabs_lay.setContentsMargins(0, 0, 0, 0) + self.collections_tab_in_tabs_lay.setObjectName("collections_tab_in_tabs_lay") + self.collections_listwidget = QtWidgets.QListWidget(self.collections_tab_in_tabs) + self.collections_listwidget.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed) + self.collections_listwidget.setObjectName("collections_listwidget") + self.collections_tab_in_tabs_lay.addWidget(self.collections_listwidget) + self.this_collection_listwidget = QtWidgets.QListWidget(self.collections_tab_in_tabs) + self.this_collection_listwidget.setObjectName("this_collection_listwidget") + self.collections_tab_in_tabs_lay.addWidget(self.this_collection_listwidget) + self.collections_tab_in_tabs_lay.setStretch(0, 1) + self.collections_tab_in_tabs_lay.setStretch(1, 3) + self.collections_page_tabs.addTab(self.collections_tab_in_tabs, "") + self.edit_collections_tabs = QtWidgets.QWidget() + self.edit_collections_tabs.setObjectName("edit_collections_tabs") + self.edit_collections_tabs_lay = QtWidgets.QVBoxLayout(self.edit_collections_tabs) + self.edit_collections_tabs_lay.setContentsMargins(0, 0, 0, 0) + self.edit_collections_tabs_lay.setObjectName("edit_collections_tabs_lay") + self.edit_collections_paths_label = QtWidgets.QLabel(self.edit_collections_tabs) + self.edit_collections_paths_label.setObjectName("edit_collections_paths_label") + self.edit_collections_tabs_lay.addWidget(self.edit_collections_paths_label) + self.edit_collections_paths = QtWidgets.QListWidget(self.edit_collections_tabs) + self.edit_collections_paths.setStyleSheet("font: 15pt \"Segoe UI\";") + self.edit_collections_paths.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed) + self.edit_collections_paths.setDragEnabled(False) + self.edit_collections_paths.setObjectName("edit_collections_paths") + self.edit_collections_tabs_lay.addWidget(self.edit_collections_paths) + self.collections_page_tabs.addTab(self.edit_collections_tabs, "") + self.collections_page_lay.addWidget(self.collections_page_tabs) self.content.addWidget(self.collections_page) self.stream_page = QtWidgets.QWidget() self.stream_page.setObjectName("stream_page") @@ -321,26 +357,26 @@ class Ui_MainWindow(object): 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_options_group_lay = QtWidgets.QVBoxLayout(self.restream_options_group) + self.restream_options_group_lay.setContentsMargins(-1, 5, -1, -1) + self.restream_options_group_lay.setObjectName("restream_options_group_lay") 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.restream_options_group_lay.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.restream_options_group_lay.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.restream_options_group_lay.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.restream_options_group_lay.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.restream_options_group_lay.addWidget(self.output_device_restream_box) self.audio_devices_settings_tab_lay.addWidget(self.restream_options_group, 0, QtCore.Qt.AlignTop) self.use_original_streaming_method_check = QtWidgets.QCheckBox(self.audio_devices_settings_tab) self.use_original_streaming_method_check.setChecked(True) @@ -473,8 +509,10 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.menu.setCurrentRow(-1) + self.content.setCurrentIndex(0) self.pads_content.setCurrentIndex(0) self.browser_page_tabs.setCurrentIndex(0) + self.collections_page_tabs.setCurrentIndex(0) self.settings_tabs_widget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) @@ -515,6 +553,9 @@ class Ui_MainWindow(object): self.second_browser_parent_dir_box.setPlaceholderText(_translate("MainWindow", "C:\\")) self.second_browser_parent_dir_button.setText(_translate("MainWindow", "Choose folder")) self.browser_page_tabs.setTabText(self.browser_page_tabs.indexOf(self.browser_page_options_tab), _translate("MainWindow", "Options")) + self.collections_page_tabs.setTabText(self.collections_page_tabs.indexOf(self.collections_tab_in_tabs), _translate("MainWindow", "Collections")) + self.edit_collections_paths_label.setText(_translate("MainWindow", "Double click row to edit path to collection")) + self.collections_page_tabs.setTabText(self.collections_page_tabs.indexOf(self.edit_collections_tabs), _translate("MainWindow", "Edit collections")) 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)")) diff --git a/gui/gui.ui b/gui/gui.ui index 4313013..3aaaa9f 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -482,6 +482,9 @@ QListWidget:item:selected { + + 0 + @@ -707,7 +710,7 @@ QListWidget:item:selected { - + 0 @@ -779,7 +782,7 @@ QListWidget:item:selected { Options - + @@ -904,7 +907,97 @@ QListWidget:item:selected { - + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + Collections + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed + + + + + + + + + + + Edit collections + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Double click row to edit path to collection + + + + + + + font: 15pt "Segoe UI"; + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed + + + false + + + + + + + + + @@ -1013,7 +1106,7 @@ QListWidget:item:selected { Microphone restream options - + 5 diff --git a/gui/modules/collections/__init__.py b/gui/modules/collections/__init__.py new file mode 100644 index 0000000..d7ed779 --- /dev/null +++ b/gui/modules/collections/__init__.py @@ -0,0 +1 @@ +from .handlers import * diff --git a/gui/modules/collections/collections.py b/gui/modules/collections/collections.py new file mode 100644 index 0000000..9bb1345 --- /dev/null +++ b/gui/modules/collections/collections.py @@ -0,0 +1,36 @@ +from gui.gui import Ui_MainWindow +from modules.config import PathsConfig +import os +from gui.modules.core import popup +from modules.player.player import Player + + +def update_collections_lw(ui: Ui_MainWindow): + ui.all_collections_list = list() + ui.collections_listwidget.clear() + + for item in PathsConfig.get().collections_list: + ui.all_collections_list.append([item.replace("\\", "/").split("/")[-1], item]) + ui.collections_listwidget.addItem(item.replace("\\", "/").split("/")[-1]) + + +def on_collection_click(ui: Ui_MainWindow): + ui.this_collection_listwidget.clear() + try: + ui.this_collection_listwidget.addItems( + [f for f in os.listdir( + ui.all_collections_list[ui.collections_listwidget.currentRow()][1] + ) + if os.path.isfile(os.path.join(ui.all_collections_list[ui.collections_listwidget.currentRow()][1], f))] + ) + except Exception as e: + print(e) + popup.popup("Error", "Cannot access files in this folder") + + +def on_collection_item_double(ui: Ui_MainWindow, p: Player): + p.set_media(os.path.join( + os.path.join(ui.all_collections_list[ui.collections_listwidget.currentRow()][1], + ui.this_collection_listwidget.currentItem().text()) + )) + p.play(ui) diff --git a/gui/modules/collections/handlers.py b/gui/modules/collections/handlers.py new file mode 100644 index 0000000..40bcbec --- /dev/null +++ b/gui/modules/collections/handlers.py @@ -0,0 +1,11 @@ +from gui.modules.collections.initialize import fill_collections_paths, on_path_setting_collection_change +from gui.modules.collections.collections import * + + +def register_handlers(ui: Ui_MainWindow, p: Player): + fill_collections_paths(ui) + update_collections_lw(ui) + + ui.collections_page_tabs.currentChanged.connect(lambda: on_path_setting_collection_change(ui)) + ui.collections_listwidget.itemClicked.connect(lambda: on_collection_click(ui)) + ui.this_collection_listwidget.itemDoubleClicked.connect(lambda: on_collection_item_double(ui, p)) diff --git a/gui/modules/collections/initialize.py b/gui/modules/collections/initialize.py new file mode 100644 index 0000000..dde9f70 --- /dev/null +++ b/gui/modules/collections/initialize.py @@ -0,0 +1,34 @@ +from gui.gui import Ui_MainWindow +from modules.config import PathsConfig +from PyQt5 import QtWidgets, QtCore +from gui.modules.collections.collections import update_collections_lw + + +def on_path_setting_collection_change(ui: Ui_MainWindow): + all_collections = list( + filter( + lambda a: a != "", + list( + map( + lambda x: x.text(), + [ui.edit_collections_paths.item(x) for x in range(ui.edit_collections_paths.count())] + ) + ) + ) + ) + PathsConfig.update("collections_list", all_collections) + fill_collections_paths(ui) + update_collections_lw(ui) + + +def fill_collections_paths(ui: Ui_MainWindow): + ui.edit_collections_paths.clear() + collections = PathsConfig.get().collections_list + for i in range(420): + item = QtWidgets.QListWidgetItem() + item.setFlags( + QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled + ) + item.setText(collections[i] if i < len(collections) else "") + + ui.edit_collections_paths.addItem(item) diff --git a/gui/modules/handlers/register.py b/gui/modules/handlers/register.py index a813f09..e892061 100644 --- a/gui/modules/handlers/register.py +++ b/gui/modules/handlers/register.py @@ -6,6 +6,7 @@ from gui.modules import player from gui.modules import settings from gui.modules import restreammic from gui.modules import explorer +from gui.modules import collections from modules.player.player import Player from modules.restream.restream import Restreamer @@ -17,3 +18,4 @@ def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow, p: Player, rs: settings.register_handlers(ui) restreammic.register_handlers(ui, MainWindow, rs) explorer.register_handlers(ui, p) + collections.register_handlers(ui, p) diff --git a/modules/config/model.py b/modules/config/model.py index 096a4cb..b585141 100644 --- a/modules/config/model.py +++ b/modules/config/model.py @@ -1,5 +1,6 @@ from dataclasses import dataclass from dataclasses_json import dataclass_json +from typing import List @dataclass_json @@ -20,3 +21,4 @@ class ConfigModel: class PathsModel: first_browser_path: str second_browser_path: str + collections_list: List[str] diff --git a/modules/config/paths.py b/modules/config/paths.py index e5db12a..318d782 100644 --- a/modules/config/paths.py +++ b/modules/config/paths.py @@ -8,7 +8,8 @@ class PathsConfig: def default(): return { "first_browser_path": "", - "second_browser_path": "" + "second_browser_path": "", + "collections_list": list() } @staticmethod @@ -31,7 +32,7 @@ class PathsConfig: return PathsConfig.get() @staticmethod - def update(key: str, value: str | None) -> dict: + def update(key: str, value: str | list | None) -> dict: with open("data/config.path", "r") as file: settings = json.load(file)