181 lines
5.6 KiB
Python
181 lines
5.6 KiB
Python
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()
|