reorganize file structure

This commit is contained in:
Julian Freeman
2025-10-18 21:31:06 -04:00
parent 4933f233a1
commit 6b0f0130e3
7 changed files with 471 additions and 452 deletions

View File

@@ -0,0 +1,116 @@
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QAbstractItemView
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt
from qfluentwidgets import (
PushButton, TableView, FluentIcon as Fi,
)
from common.utils import SAFE_MAP_ICON, SAFE_MAP
# dict[str, str | int] 就是
# {
# "ID": "xxx",
# "NAME": "zzz",
# "SAFE": -2,
# "UPDATE_DATA": "aaa",
# "NOTES": ""
# }
class ExtensionsDataTable(QAbstractTableModel):
def __init__(self, ext_data: list[dict[str, str | int]], parent=None):
super().__init__(parent)
self.ext_data = ext_data or []
self.headers = ["ID", "名称", "安全性", "更新日期", "备注"]
self.col_map = {
0: "ID",
1: "NAME",
2: "SAFE",
3: "UPDATE_DATE",
4: "NOTES",
}
def rowCount(self, /, parent = ...):
return len(self.ext_data)
def columnCount(self, /, parent = ...):
return len(self.headers)
def headerData(self, section: int, orientation: Qt.Orientation, /, role: int = ...):
if orientation == Qt.Orientation.Horizontal:
if role == Qt.ItemDataRole.DisplayRole:
return self.headers[section]
return None
def data(self, index: QModelIndex, /, role: int = ...):
row = index.row()
col = index.column()
ext = self.ext_data[row]
col_val = ext[self.col_map[col]]
if role == Qt.ItemDataRole.DisplayRole:
if col == 2:
return SAFE_MAP[col_val]
elif col == 3:
return self.iso2custom(col_val)
else:
return col_val
if role == Qt.ItemDataRole.DecorationRole:
if col == 2:
return SAFE_MAP_ICON[col_val]
# 一行的每一个列都返回所有数据,这样不管双击一行的哪一个位置,都可以获取到所有数据
if role == Qt.ItemDataRole.UserRole:
return ext
return None
def update_data(self, ext_data: list[dict[str, str | int]]):
self.beginResetModel()
self.ext_data.clear()
self.ext_data.extend(ext_data)
self.endResetModel()
@staticmethod
def iso2custom(iso_time: str) -> str:
dt = datetime.fromisoformat(iso_time)
dt = dt.replace(tzinfo=timezone.utc)
dt = dt.astimezone(ZoneInfo("America/New_York"))
custom_format = "%Y-%m-%d %H:%M:%S"
return dt.strftime(custom_format)
class MainInterface(QWidget):
def __init__(self, ext_data: list[dict[str, str | int]] = None, parent=None):
super().__init__(parent)
self.setObjectName("main")
self.vly_m = QVBoxLayout()
self.setLayout(self.vly_m)
self.hly_top = QHBoxLayout()
self.pbn_refresh = PushButton(Fi.SYNC, "刷新", self)
self.pbn_add = PushButton(Fi.ADD, "添加", self)
self.pbn_delete = PushButton(Fi.DELETE, "删除", self)
self.hly_top.addWidget(self.pbn_refresh)
self.hly_top.addWidget(self.pbn_add)
self.hly_top.addWidget(self.pbn_delete)
self.hly_top.addStretch(1)
self.vly_m.addLayout(self.hly_top)
self.tbv_m = TableView(self)
self.ext_model = ExtensionsDataTable(ext_data, self)
self.tbv_m.setModel(self.ext_model)
self.tbv_m.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
self.tbv_m.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) # 整行选中
self.tbv_m.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) # 只允许单选
self.tbv_m.verticalHeader().hide()
self.tbv_m.setBorderVisible(True)
self.tbv_m.setBorderRadius(4)
self.tbv_m.horizontalHeader().setStretchLastSection(True)
self.tbv_m.setColumnWidth(0, 250)
self.tbv_m.setColumnWidth(1, 200)
self.tbv_m.setColumnWidth(3, 180)
self.vly_m.addWidget(self.tbv_m)