import logging import media from PySide6.QtWidgets import ( QMainWindow, QDialog, QDialogButtonBox, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QListWidgetItem, QLabel, QPlainTextEdit, QProgressBar, QPushButton, QLineEdit ) from PySide6.QtCore import Qt try: from config import APP_NAME as ROOT_LOGGER_NAME except ImportError: ROOT_LOGGER_NAME = 'root' logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) class RowWidget(QWidget): """ Ein Widget, das eine einzelne Zeile in unserer Liste darstellt. Es enthält eine Nummer (QLabel), ein Textfeld (QPlainTextEdit) und einen Fortschrittsbalken (QProgressBar). """ def __init__(self, number: int, parent=None): super().__init__(parent) self.number_label = QLabel(f"{number}.") self.text_edit = QPlainTextEdit() self.progress_bar = QProgressBar() self.text_edit.setFixedHeight(31) self.number_label.setFixedWidth(30) self.number_label.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignRight) layout = QHBoxLayout() layout.addWidget(self.number_label) layout.addWidget(self.text_edit) layout.addWidget(self.progress_bar) self.setLayout(layout) class MainWindow(QMainWindow): KEY_ALBUM_ARTIST = "Interpret" KEY_ALBUM_ALBUM = "Album" KEY_ALBUM_YEAR = "Jahr" KEY_ALBUM_GENRE = "Genre" FIELD_NAMES = [KEY_ALBUM_ARTIST, KEY_ALBUM_ALBUM, KEY_ALBUM_YEAR, KEY_ALBUM_GENRE] def __init__(self, basepath): super().__init__() self.__basepath__ = basepath # self.setWindowTitle("PySide6 Listenanwendung") self.setGeometry(100, 100, 900, 600) # Fensterbreite angepasst self.set_status("Ready...") self.__album_lines__ = [] main_widget = QWidget() main_layout = QVBoxLayout(main_widget) self.setCentralWidget(main_widget) disc_layout = QHBoxLayout() album_layout = QVBoxLayout() # Create fields for Album Information for i in range(0, len(self.FIELD_NAMES)): # Add label label = QLabel(self.FIELD_NAMES[i]) # Add title line_edit = QLineEdit() line_edit.setMaximumWidth(300) line_edit.setPlaceholderText("Title...") # Add title to list for later use self.__album_lines__.append(line_edit) # Add both to album_layout album_layout.addWidget(label) album_layout.addWidget(line_edit) # Add stretch to place entries to top album_layout.addStretch() # Add album and disc_layout disc_layout.addLayout(album_layout) main_layout.addLayout(disc_layout) self.list_widget = QListWidget() disc_layout.addWidget(self.list_widget) button_layout = QHBoxLayout() main_layout.addLayout(button_layout) self.button_read = QPushButton("Read Disc") self.button_read.clicked.connect(self.read_it) button_layout.addWidget(self.button_read) self.button_rip = QPushButton("Rip Disc") self.button_rip.setDisabled(True) self.button_rip.clicked.connect(self.rip_it) button_layout.addWidget(self.button_rip) def set_album_field(self, key, value): i = self.FIELD_NAMES.index(key) line = self.__album_lines__[i] line.setText(value) def get_album_field(self, key): i = self.FIELD_NAMES.index(key) if key == self.KEY_ALBUM_YEAR: return int(self.__album_lines__[i].text()) else: return self.__album_lines__[i].text() def append_title(self, value): num_tracks = self.list_widget.count() + 1 row_widget = RowWidget(num_tracks) row_widget.text_edit.setPlainText(value) row_widget.progress_bar.setValue(0) list_item = QListWidgetItem(self.list_widget) list_item.setSizeHint(row_widget.sizeHint()) self.list_widget.addItem(list_item) self.list_widget.setItemWidget(list_item, row_widget) def set_status(self, status): self.statusBar().showMessage(status) def set_title_progress(self, num, value): list_item = self.list_widget.item(num) row_widget = self.list_widget.itemWidget(list_item) row_widget.progress_bar.setValue(value) def read_it(self): print("read_it button action not yet implemented...") def rip_it(self): print("rip_it button action not yet implemented...") class SelectionDialog(QDialog): """ A custom dialog to select an item from a list. """ def __init__(self, parent, title, items): super().__init__(parent) self.setWindowTitle(title) self.setMinimumWidth(300) # Layout layout = QVBoxLayout(self) # List widget for options self.list_widget = QListWidget() self.list_widget.addItems(items) if items: self.list_widget.setCurrentRow(0) # Select first item by default # Add a double-click shortcut to accept the dialog self.list_widget.itemDoubleClicked.connect(self.accept) layout.addWidget(self.list_widget) # Standard OK and Cancel buttons button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel) button_box.accepted.connect(self.accept) button_box.rejected.connect(self.reject) layout.addWidget(button_box) def get_selected_index(self): """Returns the index of the currently selected item.""" return self.list_widget.currentRow()