Refactor UI: Replace Page Tree with List+Dropdown. Fix header rendering and crash.
This commit is contained in:
Binary file not shown.
@@ -1,7 +1,7 @@
|
||||
|
||||
import os
|
||||
from PyQt6.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QTreeWidget, QTreeWidgetItem, QFileDialog, QMenuBar, QMenu, QMessageBox)
|
||||
QListWidget, QListWidgetItem, QComboBox, QLabel, QFileDialog, QMenuBar, QMenu, QMessageBox)
|
||||
from PyQt6.QtGui import QAction, QKeyEvent
|
||||
from PyQt6.QtCore import Qt
|
||||
|
||||
@@ -24,16 +24,38 @@ class MainWindow(QMainWindow):
|
||||
|
||||
self.layout = QHBoxLayout(self.central_widget)
|
||||
|
||||
# Left Panel: Page Tree
|
||||
self.tree = QTreeWidget()
|
||||
self.tree.setHeaderLabel("Pages")
|
||||
self.tree.setFixedWidth(200)
|
||||
self.tree.itemClicked.connect(self.on_page_selected)
|
||||
self.layout.addWidget(self.tree)
|
||||
# Left Panel: Page List
|
||||
left_layout = QVBoxLayout()
|
||||
left_label = QLabel("Pages")
|
||||
left_layout.addWidget(left_label)
|
||||
|
||||
# Center: Teletext Canvas
|
||||
self.page_list = QListWidget()
|
||||
self.page_list.setFixedWidth(150)
|
||||
self.page_list.itemClicked.connect(self.on_page_selected)
|
||||
left_layout.addWidget(self.page_list)
|
||||
|
||||
self.layout.addLayout(left_layout)
|
||||
|
||||
# Center Area Layout (Top Bar + Canvas)
|
||||
center_layout = QVBoxLayout()
|
||||
|
||||
# Top Bar: Subpage Selector
|
||||
top_bar = QHBoxLayout()
|
||||
self.subpage_label = QLabel("Subpage:")
|
||||
self.subpage_combo = QComboBox()
|
||||
self.subpage_combo.setMinimumWidth(250)
|
||||
self.subpage_combo.currentIndexChanged.connect(self.on_subpage_changed)
|
||||
top_bar.addWidget(self.subpage_label)
|
||||
top_bar.addWidget(self.subpage_combo)
|
||||
top_bar.addStretch()
|
||||
|
||||
center_layout.addLayout(top_bar)
|
||||
|
||||
# Canvas
|
||||
self.canvas = TeletextCanvas()
|
||||
self.layout.addWidget(self.canvas, 1) # Expand
|
||||
center_layout.addWidget(self.canvas, 1) # Expand
|
||||
|
||||
self.layout.addLayout(center_layout, 1)
|
||||
|
||||
# Menus
|
||||
self.create_menus()
|
||||
@@ -78,7 +100,7 @@ class MainWindow(QMainWindow):
|
||||
if fname:
|
||||
try:
|
||||
self.service = load_t42(fname)
|
||||
self.populate_tree()
|
||||
self.populate_list()
|
||||
QMessageBox.information(self, "Loaded", f"Loaded {len(self.service.pages)} pages.")
|
||||
except Exception as e:
|
||||
QMessageBox.critical(self, "Error", f"Failed to load file: {e}")
|
||||
@@ -92,34 +114,55 @@ class MainWindow(QMainWindow):
|
||||
except Exception as e:
|
||||
QMessageBox.critical(self, "Error", f"Failed to save file: {e}")
|
||||
|
||||
def populate_tree(self):
|
||||
self.tree.clear()
|
||||
def populate_list(self):
|
||||
self.page_list.clear()
|
||||
|
||||
# Group pages by Mag+PageNum
|
||||
# We want unique list items
|
||||
self.page_groups = {} # Key: (mag, page_num) -> List[Page]
|
||||
|
||||
# Group by Magazine
|
||||
mags = {}
|
||||
for p in self.service.pages:
|
||||
if p.magazine not in mags:
|
||||
mags[p.magazine] = QTreeWidgetItem([f"Magazine {p.magazine}"])
|
||||
self.tree.addTopLevelItem(mags[p.magazine])
|
||||
key = (p.magazine, p.page_number)
|
||||
if key not in self.page_groups:
|
||||
self.page_groups[key] = []
|
||||
self.page_groups[key].append(p)
|
||||
|
||||
# Format: PPP-SS (Page-Subcode)
|
||||
# Create Item
|
||||
# Subcode is complicated to display "nicely" without decoding,
|
||||
# let's just show hex or raw for now if not standard 0000.
|
||||
|
||||
label = f"{p.page_number:02d} (Sub: {p.sub_code:04X})"
|
||||
item = QTreeWidgetItem([label])
|
||||
item.setData(0, Qt.ItemDataRole.UserRole, p)
|
||||
mags[p.magazine].addChild(item)
|
||||
|
||||
self.tree.expandAll()
|
||||
# Sort keys
|
||||
sorted_keys = sorted(self.page_groups.keys())
|
||||
|
||||
for mag, pnum in sorted_keys:
|
||||
label = f"{mag}{pnum:02d}"
|
||||
item = QListWidgetItem(label)
|
||||
item.setData(Qt.ItemDataRole.UserRole, (mag, pnum))
|
||||
self.page_list.addItem(item)
|
||||
|
||||
def on_page_selected(self, item, column):
|
||||
page = item.data(0, Qt.ItemDataRole.UserRole)
|
||||
def on_page_selected(self, item):
|
||||
mag, pnum = item.data(Qt.ItemDataRole.UserRole)
|
||||
pages = self.page_groups.get((mag, pnum), [])
|
||||
|
||||
# Populate Subpage Combo
|
||||
self.subpage_combo.blockSignals(True)
|
||||
self.subpage_combo.clear()
|
||||
|
||||
for i, p in enumerate(pages):
|
||||
# Display format: Index or Subcode?
|
||||
# Subcode is often 0000. Index 1/N is clearer for editing.
|
||||
label = f"{i+1}/{len(pages)} (Sub {p.sub_code:04X})"
|
||||
self.subpage_combo.addItem(label, p)
|
||||
|
||||
self.subpage_combo.blockSignals(False)
|
||||
|
||||
if pages:
|
||||
self.subpage_combo.setCurrentIndex(0)
|
||||
# Trigger update (manual because blockSignals)
|
||||
self.on_subpage_changed(0)
|
||||
|
||||
def on_subpage_changed(self, index):
|
||||
if index < 0: return
|
||||
page = self.subpage_combo.itemData(index)
|
||||
if isinstance(page, Page):
|
||||
self.current_page = page
|
||||
self.canvas.set_page(page)
|
||||
# Also set window focus to canvas or handle key events?
|
||||
self.canvas.setFocus()
|
||||
|
||||
# Input Handling (Editor Logic)
|
||||
|
||||
Reference in New Issue
Block a user