From eda16f01f162a9ab24b1e54cf1eddc3ef0515baa Mon Sep 17 00:00:00 2001 From: KenanZhu <3471685733@qq.com> Date: Tue, 3 Feb 2026 15:03:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(gui):=20chore(gui):=20=E5=AF=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=95=8C=E9=9D=A2=E7=B1=BB=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=8C=E5=B0=86=20ALSeatMapView=20?= =?UTF-8?q?=E6=8F=90=E5=8F=96=E5=88=B0=E5=8D=95=E7=8B=AC=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=20ALSeatMapWidget=20=E9=87=8D=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=20ALSeatMapSelectDialog=20:=20=E5=AF=B9?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E8=BF=9B=E8=A1=8C=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=EF=BC=8C=E4=BB=A5=E6=9B=B4=E8=B4=B4=E8=BF=91=E5=90=84?= =?UTF-8?q?=E8=87=AA=E5=8A=9F=E8=83=BD=EF=BC=8CALTimerTaskWidget=20?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E4=B8=BA=20ALTimerTaskManageWidget?= =?UTF-8?q?=EF=BC=9BALAddTimerTaskDialog=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E4=B8=BA=20ALTimerTaskAddDialog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 17 +- src/Main.py | 2 +- src/gui/ALAboutDialog.py | 3 +- src/gui/ALConfigWidget.py | 75 +++----- src/gui/ALMainWindow.py | 6 +- ...AutoLibraryResource.qrc => ALResource.qrc} | 0 src/gui/ALSeatMapSelectDialog.py | 177 ++++++++++++++++++ src/gui/ALSeatMapTable.py | 2 +- .../{ALSeatMapWidget.py => ALSeatMapView.py} | 166 +--------------- ...rTaskDialog.py => ALTimerTaskAddDialog.py} | 8 +- ...rTaskDialog.ui => ALTimerTaskAddDialog.ui} | 4 +- ...skWidget.py => ALTimerTaskManageWidget.py} | 85 +++++---- ...skWidget.ui => ALTimerTaskManageWidget.ui} | 6 +- src/gui/ALUserTreeWidget.py | 8 +- 14 files changed, 280 insertions(+), 279 deletions(-) rename src/gui/{AutoLibraryResource.qrc => ALResource.qrc} (100%) create mode 100644 src/gui/ALSeatMapSelectDialog.py rename src/gui/{ALSeatMapWidget.py => ALSeatMapView.py} (53%) rename src/gui/{ALAddTimerTaskDialog.py => ALTimerTaskAddDialog.py} (94%) rename src/gui/{ALAddTimerTaskDialog.ui => ALTimerTaskAddDialog.ui} (98%) rename src/gui/{ALTimerTaskWidget.py => ALTimerTaskManageWidget.py} (86%) rename src/gui/{ALTimerTaskWidget.ui => ALTimerTaskManageWidget.ui} (98%) diff --git a/.gitignore b/.gitignore index 76be2ea..81334f4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,16 +6,13 @@ __pycache__/ build/ dist/ -model/*.onnx -driver/*.exe +model/*.* +!model/*.md +driver/*.* +!driver/*.md src/gui/configs/*.json src/gui/translators/qtbase_zh_CN.qm -src/gui/AutoLibraryResources.py -src/gui/AutoLibraryResource.py -src/gui/Ui_ALMainWindow.py -src/gui/Ui_ALConfigWidget.py -src/gui/Ui_ALTimerTaskWidget.py -src/gui/Ui_ALAddTimerTaskDialog.py -src/gui/Ui_ALAboutDialog.py +src/gui/ALResource.py +src/gui/Ui_*.py -Main.spec +Main.spec \ No newline at end of file diff --git a/src/Main.py b/src/Main.py index 919d92a..c11a34c 100644 --- a/src/Main.py +++ b/src/Main.py @@ -13,7 +13,7 @@ from PySide6.QtCore import QTranslator from PySide6.QtWidgets import QApplication from gui.ALMainWindow import ALMainWindow -from gui import AutoLibraryResource +from gui import ALResource def main(): diff --git a/src/gui/ALAboutDialog.py b/src/gui/ALAboutDialog.py index 7fb1cfb..f91ed63 100644 --- a/src/gui/ALAboutDialog.py +++ b/src/gui/ALAboutDialog.py @@ -7,7 +7,6 @@ This software is provided "as is", without any warranty of any kind. You may use, modify, and distribute this file under the terms of the MIT License. See the LICENSE file for details. """ -import sys import platform from PySide6.QtGui import ( @@ -25,7 +24,7 @@ from gui.ALVersionInfo import ( ) from gui.Ui_ALAboutDialog import Ui_ALAboutDialog -from gui import AutoLibraryResource +from gui import ALResource class ALAboutDialog(QDialog, Ui_ALAboutDialog): diff --git a/src/gui/ALConfigWidget.py b/src/gui/ALConfigWidget.py index 2ca1cd2..8ee82d9 100644 --- a/src/gui/ALConfigWidget.py +++ b/src/gui/ALConfigWidget.py @@ -14,7 +14,7 @@ from PySide6.QtCore import ( Qt, Signal, Slot, QTime, QDate, QDir, QFileInfo ) from PySide6.QtWidgets import ( - QWidget, QLineEdit, QMessageBox, QFileDialog, + QDialog, QWidget, QLineEdit, QMessageBox, QFileDialog, QTreeWidgetItem, QMenu, QInputDialog ) from PySide6.QtGui import ( @@ -22,10 +22,9 @@ from PySide6.QtGui import ( ) from gui.Ui_ALConfigWidget import Ui_ALConfigWidget -from gui.ALSeatMapWidget import ALSeatMapWidget -from gui.ALSeatMapTable import seats_maps -from gui.ALUserTreeWidget import TreeItemType -from gui.ALUserTreeWidget import ALUserTreeWidget +from gui.ALSeatMapSelectDialog import ALSeatMapSelectDialog +from gui.ALSeatMapTable import ALSeatMapTable +from gui.ALUserTreeWidget import ALUserTreeWidget, ALUserTreeItemType from utils.ConfigReader import ConfigReader from utils.ConfigWriter import ConfigWriter @@ -47,7 +46,6 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): super().__init__(parent) self.__config_paths = config_paths self.__config_data = {"run": {}, "user": {}} - self.__seat_map_widget = None self.setupUi(self) self.modifyUi() @@ -625,12 +623,12 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): try: if "groups" in user_config_data: for group_config in user_config_data["groups"]: - group_item = QTreeWidgetItem(self.UserTreeWidget, TreeItemType.GROUP.value) + group_item = QTreeWidgetItem(self.UserTreeWidget, ALUserTreeItemType.GROUP.value) group_item.setText(0, group_config["name"]) group_item.setFlags(group_item.flags() | Qt.ItemIsEditable) group_item.setCheckState(1, Qt.Checked if group_config.get("enabled", True) else Qt.Unchecked) for user_config in group_config["users"]: - user_item = QTreeWidgetItem(group_item, TreeItemType.USER.value) + user_item = QTreeWidgetItem(group_item, ALUserTreeItemType.USER.value) user_item.setText(0, user_config["username"]) user_item.setText(1, "" if user_config.get("enabled", True) else "跳过") user_item.setData(0, Qt.UserRole, user_config) @@ -647,7 +645,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): ) -> QTreeWidgetItem: self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged) - group_item = QTreeWidgetItem(self.UserTreeWidget, TreeItemType.GROUP.value) + group_item = QTreeWidgetItem(self.UserTreeWidget, ALUserTreeItemType.GROUP.value) if not group_name: group_name = f"新分组-{self.UserTreeWidget.topLevelItemCount()}" group_item.setText(0, group_name) @@ -667,7 +665,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): current_item = self.UserTreeWidget.currentItem() if current_item is None: group_item = self.addGroup() - if group_item.type() == TreeItemType.USER.value: + if group_item.type() == ALUserTreeItemType.USER.value: group_item = group_item.parent() if group_item.checkState(1) == Qt.CheckState.Unchecked: return None @@ -701,7 +699,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): } } self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged) - user_item = QTreeWidgetItem(group_item, TreeItemType.USER.value) + user_item = QTreeWidgetItem(group_item, ALUserTreeItemType.USER.value) user_item.setText(0, new_user["username"]) user_item.setText(1, "") user_item.setData(0, Qt.UserRole, new_user) @@ -720,7 +718,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): if user_item is None: return - if user_item.type() != TreeItemType.USER.value: + if user_item.type() != ALUserTreeItemType.USER.value: return parent_item = user_item.parent() index = parent_item.indexOfChild(user_item) @@ -736,7 +734,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): if group_item is None: return - if group_item.type() != TreeItemType.GROUP.value: + if group_item.type() != ALUserTreeItemType.GROUP.value: return index = self.UserTreeWidget.indexOfTopLevelItem(group_item) self.UserTreeWidget.takeTopLevelItem(index) @@ -761,7 +759,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): if not ok or not new_name: return item.setText(0, new_name) - if item.type() == TreeItemType.GROUP.value: + if item.type() == ALUserTreeItemType.GROUP.value: item.setText(0, new_name) else: user = item.data(0, Qt.UserRole) @@ -792,20 +790,6 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): self.RoomComboBox.addItems(self.__floor_room_map[floor]) self.RoomComboBox.setCurrentIndex(0) - @Slot() - def onSeatMapWidgetClosed( - self, - selected_seats: list[str] - ): - - self.__seat_map_widget.seatMapWidgetClosed.disconnect(self.onSeatMapWidgetClosed) - self.__seat_map_widget.deleteLater() - self.__seat_map_widget = None - if len(selected_seats) == 0: - self.SeatIDEdit.clear() # no selected seat, we clear the edit - return - self.SeatIDEdit.setText(",".join(selected_seats)) - @Slot() def onSelectSeatsButtonClicked( self @@ -815,18 +799,19 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): room = self.RoomComboBox.currentText() floor_idx = self.__floor_rmap[floor] room_idx = self.__room_rmap[room] - if self.__seat_map_widget is None: - self.__seat_map_widget = ALSeatMapWidget( - self, - floor, - room, - seats_maps[floor_idx][room_idx] - ) - self.__seat_map_widget.seatMapWidgetClosed.connect(self.onSeatMapWidgetClosed) - self.__seat_map_widget.show() - self.__seat_map_widget.raise_() - self.__seat_map_widget.activateWindow() - self.__seat_map_widget.selectSeats(self.SeatIDEdit.text().split(",")) + dialog = ALSeatMapSelectDialog( + self, + floor, + room, + ALSeatMapTable[floor_idx][room_idx] + ) + dialog.selectSeats(self.SeatIDEdit.text().split(",")) + if dialog.exec() == QDialog.DialogCode.Accepted: + selected_seats = dialog.getSelectedSeats() + if len(selected_seats) == 0: + self.SeatIDEdit.clear() + return + self.SeatIDEdit.setText(",".join(dialog.getSelectedSeats())) @Slot() def onUserTreeWidgetCurrentItemChanged( @@ -838,7 +823,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): # cant effectively update the data of each user, due to the # possiblity of frequency edit. we just let the QListWidget # help us. - if previous and previous.type() == TreeItemType.USER.value: + if previous and previous.type() == ALUserTreeItemType.USER.value: user = self.collectUserFromUserInfoWidget() if user: self.UsernameEdit.textEdited.disconnect() @@ -849,7 +834,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): if current is None: self.initilizeUserInfoWidget() return - if current.type() == TreeItemType.USER.value: + if current.type() == ALUserTreeItemType.USER.value: user = current.data(0, Qt.UserRole) if user: self.setUserToWidget(user) @@ -868,7 +853,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): return if column != 1: return - if item.type() == TreeItemType.GROUP.value: + if item.type() == ALUserTreeItemType.GROUP.value: is_checked = item.checkState(1) == Qt.CheckState.Checked for i in range(item.childCount()): child = item.child(i) @@ -933,7 +918,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): menu = QMenu(self.UserTreeWidget) if current_item is None: self.showTreeMenu(menu) - elif current_item.type() == TreeItemType.GROUP.value: + elif current_item.type() == ALUserTreeItemType.GROUP.value: self.showGroupMenu(menu, current_item) else: self.showUserMenu(menu, current_item) @@ -1115,7 +1100,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget): ): current_item = self.UserTreeWidget.currentItem() - if current_item and current_item.type() == TreeItemType.USER.value: + if current_item and current_item.type() == ALUserTreeItemType.USER.value: self.UserTreeWidget.setCurrentItem(None) if self.saveConfigs( self.__config_paths["run"], diff --git a/src/gui/ALMainWindow.py b/src/gui/ALMainWindow.py index 604e817..ac17c1e 100644 --- a/src/gui/ALMainWindow.py +++ b/src/gui/ALMainWindow.py @@ -25,11 +25,11 @@ from base.MsgBase import MsgBase from gui.Ui_ALMainWindow import Ui_ALMainWindow from gui.ALConfigWidget import ALConfigWidget -from gui.ALTimerTaskWidget import ALTimerTaskWidget +from gui.ALTimerTaskManageWidget import ALTimerTaskManageWidget from gui.ALAboutDialog import ALAboutDialog from gui.ALMainWorkers import TimerTaskWorker, AutoLibWorker -from gui import AutoLibraryResource +from gui import ALResource class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow): @@ -77,7 +77,7 @@ class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow): self.AboutAction.triggered.connect(self.onAboutActionTriggered) # initialize timer task widget, but not show it - self.__alTimerTaskWidget = ALTimerTaskWidget(self, self.__config_paths["timer_task"]) + self.__alTimerTaskWidget = ALTimerTaskManageWidget(self, self.__config_paths["timer_task"]) self.timerTaskIsRunning.connect(self.__alTimerTaskWidget.onTimerTaskIsRunning) self.timerTaskIsExecuted.connect(self.__alTimerTaskWidget.onTimerTaskIsExecuted) self.timerTaskIsError.connect(self.__alTimerTaskWidget.onTimerTaskIsError) diff --git a/src/gui/AutoLibraryResource.qrc b/src/gui/ALResource.qrc similarity index 100% rename from src/gui/AutoLibraryResource.qrc rename to src/gui/ALResource.qrc diff --git a/src/gui/ALSeatMapSelectDialog.py b/src/gui/ALSeatMapSelectDialog.py new file mode 100644 index 0000000..ff31f0c --- /dev/null +++ b/src/gui/ALSeatMapSelectDialog.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) 2025 - 2026 KenanZhu. +All rights reserved. + +This software is provided "as is", without any warranty of any kind. +You may use, modify, and distribute this file under the terms of the MIT License. +See the LICENSE file for details. +""" +from PySide6.QtCore import ( + Qt, Slot, Signal +) +from PySide6.QtWidgets import ( + QDialog, QLabel, QHBoxLayout, QVBoxLayout, + QPushButton, +) +from PySide6.QtGui import ( + QCloseEvent +) +from gui.ALSeatMapView import ALSeatMapView + + +class ALSeatMapSelectDialog(QDialog): + + seatMapSelectDialogClosed = Signal(list) + + def __init__( + self, + parent: QDialog = None, + floor: str = "", + room: str = "", + seats_data: str = "" + ): + + super().__init__(parent) + self.__floor = floor + self.__room = room + self.__seats_data = seats_data + self.__confirmed = False + + self.setupUi() + self.connectSignals() + + + def setupUi( + self + ): + + self.setModal(True) + self.setMinimumSize(800, 600) + self.resize(800, 600) + self.setWindowTitle(f"选择楼层座位 - AutoLibrary") + + self.SeatMapWidgetMainLayout = QVBoxLayout(self) + self.SeatMapWidgetMainLayout.setContentsMargins(5, 5, 5, 5) + self.SeatMapWidgetMainLayout.setSpacing(5) + self.TitleLabel = QLabel(f"楼层座位分布图: {self.__floor}-{self.__room}") + self.TitleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.TitleLabel.setStyleSheet("font-size: 16px; font-weight: bold; margin: 10px;") + self.SeatMapWidgetMainLayout.addWidget(self.TitleLabel) + + self.SeatMapGraphicsView = ALSeatMapView(None, self.__seats_data) + self.SeatMapWidgetMainLayout.addWidget(self.SeatMapGraphicsView) + + self.TipsLabel = QLabel( + " 点击座位进行选择/取消选择, 最多选择1个座位 \n" + " [操作方法: Ctrl+鼠标滚轮缩放 | 滚轮/拖拽/方向键 移动]" + ) + self.TipsLabel.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.TipsLabel.setStyleSheet("color: #666; margin: 5px;") + self.SeatMapWidgetMainLayout.addWidget(self.TipsLabel) + + self.ConfirmButton = QPushButton("确认") + self.ConfirmButton.setFixedSize(80, 25) + self.ConfirmButton.setAutoDefault(True) + self.ConfirmButton.setDefault(True) + self.CancelButton = QPushButton("取消") + self.CancelButton.setFixedSize(80, 25) + self.SeatMapWidgetControlLayout = QHBoxLayout() + self.SeatMapWidgetControlLayout.setContentsMargins(0, 0, 0, 0) + self.SeatMapWidgetControlLayout.setSpacing(5) + self.SeatMapWidgetControlLayout.setAlignment(Qt.AlignmentFlag.AlignRight) + self.SeatMapWidgetControlLayout.addWidget(self.CancelButton) + self.SeatMapWidgetControlLayout.addWidget(self.ConfirmButton) + self.SeatMapWidgetMainLayout.addLayout(self.SeatMapWidgetControlLayout) + + + def connectSignals( + self + ): + + self.ConfirmButton.clicked.connect(self.onConfirmButtonClicked) + self.CancelButton.clicked.connect(self.onCancelButtonClicked) + + + def showEvent( + self, + event + ): + + result = super().showEvent(event) + + screen_rect = self.screen().geometry() + target_pos = self.parent().geometry().center() + target_pos.setX(target_pos.x() - self.width()//2) + target_pos.setY(target_pos.y() - self.height()//2) + if target_pos.x() < 0: + target_pos.setX(0) + if target_pos.x() + self.width() > screen_rect.width(): + target_pos.setX(screen_rect.width() - self.width()) + if target_pos.y() < 0: + target_pos.setY(0) + if target_pos.y() + self.height() > screen_rect.height(): + target_pos.setY(screen_rect.height() - self.height()) + self.move(target_pos) + + return result + + + def closeEvent( + self, + event: QCloseEvent + ): + + if not self.__confirmed: + self.clearSelections() + self.reject() + else: + self.accept() + self.seatMapSelectDialogClosed.emit(self.getSelectedSeats()) + super().closeEvent(event) + + + def selectSeat( + self, + seat_number: str + ): + + self.SeatMapGraphicsView.selectSeat(seat_number) + + + def selectSeats( + self, + seat_numbers: list[str] + ) -> bool: + + return self.SeatMapGraphicsView.selectSeats(seat_numbers) + + + def getSelectedSeats( + self + ) -> list[str]: + + return self.SeatMapGraphicsView.getSelectedSeats() + + + def clearSelections( + self + ): + + self.SeatMapGraphicsView.clearSelections() + + @Slot() + def onConfirmButtonClicked( + self + ): + + self.__confirmed = True + self.accept() + + @Slot() + def onCancelButtonClicked( + self + ): + + self.__confirmed = False + self.reject() diff --git a/src/gui/ALSeatMapTable.py b/src/gui/ALSeatMapTable.py index 9210351..baec33e 100644 --- a/src/gui/ALSeatMapTable.py +++ b/src/gui/ALSeatMapTable.py @@ -1,4 +1,4 @@ -seats_maps = { +ALSeatMapTable = { "2": { "1": """ ,,,,,,,,,,,039A,039B,,040A,040B,,041A,041B,,042A,042B,,043A,043B,,044A,044B,,,,,,,,, diff --git a/src/gui/ALSeatMapWidget.py b/src/gui/ALSeatMapView.py similarity index 53% rename from src/gui/ALSeatMapWidget.py rename to src/gui/ALSeatMapView.py index 7ea2b81..ce1f65b 100644 --- a/src/gui/ALSeatMapWidget.py +++ b/src/gui/ALSeatMapView.py @@ -8,15 +8,14 @@ You may use, modify, and distribute this file under the terms of the MIT License See the LICENSE file for details. """ from PySide6.QtCore import ( - Qt, Slot, Signal, QEvent + Qt, Slot, QEvent ) from PySide6.QtWidgets import ( - QFrame, QWidget, QLabel, QHBoxLayout, QVBoxLayout, - QGridLayout, QGraphicsView, QGraphicsScene, QGraphicsItem, - QPushButton, + QFrame, QWidget, + QGridLayout, QGraphicsView, QGraphicsScene, QGraphicsItem ) from PySide6.QtGui import ( - QPainter, QWheelEvent, QCloseEvent + QPainter, QWheelEvent ) from gui.ALSeatFrame import ALSeatFrame @@ -185,159 +184,4 @@ class ALSeatMapView(QGraphicsView): if len(self.__selected_seats) < 1: self.__selected_seats.append(seat_number) else: - self.__seat_frames[seat_number].toggleSelection() - - -class ALSeatMapWidget(QWidget): - - seatMapWidgetClosed = Signal(list) - - def __init__( - self, - parent: QWidget = None, - floor: str = "", - room: str = "", - seats_data: str = "" - ): - - super().__init__(parent) - self.__floor = floor - self.__room = room - self.__seats_data = seats_data - self.__confirmed = False - - self.setupUi() - self.connectSignals() - - - def setupUi( - self - ): - - self.setWindowFlags(Qt.WindowType.Window) - self.setWindowModality(Qt.WindowModality.ApplicationModal) - self.setMinimumSize(800, 600) - self.resize(800, 600) - self.setWindowTitle(f"选择楼层座位 - AutoLibrary") - - self.SeatMapWidgetMainLayout = QVBoxLayout(self) - self.SeatMapWidgetMainLayout.setContentsMargins(5, 5, 5, 5) - self.SeatMapWidgetMainLayout.setSpacing(5) - self.TitleLabel = QLabel(f"楼层座位分布图: {self.__floor}-{self.__room}") - self.TitleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.TitleLabel.setStyleSheet("font-size: 16px; font-weight: bold; margin: 10px;") - self.SeatMapWidgetMainLayout.addWidget(self.TitleLabel) - - self.SeatMapGraphicsView = ALSeatMapView(None, self.__seats_data) - self.SeatMapWidgetMainLayout.addWidget(self.SeatMapGraphicsView) - - self.TipsLabel = QLabel( - " 点击座位进行选择/取消选择, 最多选择1个座位 \n" - " [操作方法: Ctrl+鼠标滚轮缩放 | 滚轮/拖拽/方向键 移动]" - ) - self.TipsLabel.setAlignment(Qt.AlignmentFlag.AlignLeft) - self.TipsLabel.setStyleSheet("color: #666; margin: 5px;") - self.SeatMapWidgetMainLayout.addWidget(self.TipsLabel) - - self.ConfirmButton = QPushButton("确认") - self.ConfirmButton.setFixedSize(80, 25) - self.ConfirmButton.setAutoDefault(True) - self.ConfirmButton.setDefault(True) - self.CancelButton = QPushButton("取消") - self.CancelButton.setFixedSize(80, 25) - self.SeatMapWidgetControlLayout = QHBoxLayout() - self.SeatMapWidgetControlLayout.setContentsMargins(0, 0, 0, 0) - self.SeatMapWidgetControlLayout.setSpacing(5) - self.SeatMapWidgetControlLayout.setAlignment(Qt.AlignmentFlag.AlignRight) - self.SeatMapWidgetControlLayout.addWidget(self.CancelButton) - self.SeatMapWidgetControlLayout.addWidget(self.ConfirmButton) - self.SeatMapWidgetMainLayout.addLayout(self.SeatMapWidgetControlLayout) - - - def connectSignals( - self - ): - - self.ConfirmButton.clicked.connect(self.onConfirmButtonClicked) - self.CancelButton.clicked.connect(self.onCancelButtonClicked) - - - def showEvent( - self, - event - ): - - result = super().showEvent(event) - - screen_rect = self.screen().geometry() - target_pos = self.parent().geometry().center() - target_pos.setX(target_pos.x() - self.width()//2) - target_pos.setY(target_pos.y() - self.height()//2) - if target_pos.x() < 0: - target_pos.setX(0) - if target_pos.x() + self.width() > screen_rect.width(): - target_pos.setX(screen_rect.width() - self.width()) - if target_pos.y() < 0: - target_pos.setY(0) - if target_pos.y() + self.height() > screen_rect.height(): - target_pos.setY(screen_rect.height() - self.height()) - self.move(target_pos) - - return result - - - def closeEvent( - self, - event: QCloseEvent - ): - - if not self.__confirmed: - self.clearSelections() - self.seatMapWidgetClosed.emit(self.getSelectedSeats()) - super().closeEvent(event) - - - def selectSeat( - self, - seat_number: str - ): - - self.SeatMapGraphicsView.selectSeat(seat_number) - - - def selectSeats( - self, - seat_numbers: list[str] - ) -> bool: - - return self.SeatMapGraphicsView.selectSeats(seat_numbers) - - - def getSelectedSeats( - self - ) -> list[str]: - - return self.SeatMapGraphicsView.getSelectedSeats() - - - def clearSelections( - self - ): - - self.SeatMapGraphicsView.clearSelections() - - @Slot() - def onConfirmButtonClicked( - self - ): - - self.__confirmed = True - self.close() - - @Slot() - def onCancelButtonClicked( - self - ): - - self.__confirmed = False - self.close() \ No newline at end of file + self.__seat_frames[seat_number].toggleSelection() \ No newline at end of file diff --git a/src/gui/ALAddTimerTaskDialog.py b/src/gui/ALTimerTaskAddDialog.py similarity index 94% rename from src/gui/ALAddTimerTaskDialog.py rename to src/gui/ALTimerTaskAddDialog.py index 74df4dc..d182980 100644 --- a/src/gui/ALAddTimerTaskDialog.py +++ b/src/gui/ALTimerTaskAddDialog.py @@ -20,10 +20,10 @@ from PySide6.QtWidgets import ( QHBoxLayout, QGridLayout, QDateTimeEdit ) -from gui.Ui_ALAddTimerTaskDialog import Ui_ALAddTimerTaskDialog +from gui.Ui_ALTimerTaskAddDialog import Ui_ALTimerTaskAddDialog -class TimerTaskStatus(Enum): +class ALTimerTaskStatus(Enum): PENDING = "等待中" READY = "已就绪" @@ -33,7 +33,7 @@ class TimerTaskStatus(Enum): OUTDATED = "已过期" -class ALAddTimerTaskWidget(QDialog, Ui_ALAddTimerTaskDialog): +class ALTimerTaskAddDialog(QDialog, Ui_ALTimerTaskAddDialog): def __init__( self, @@ -128,7 +128,7 @@ class ALAddTimerTaskWidget(QDialog, Ui_ALAddTimerTaskDialog): "execute_time": execute_time, "silent": silent, "add_time": added_time, - "status": TimerTaskStatus.PENDING, + "status": ALTimerTaskStatus.PENDING, "executed": False } diff --git a/src/gui/ALAddTimerTaskDialog.ui b/src/gui/ALTimerTaskAddDialog.ui similarity index 98% rename from src/gui/ALAddTimerTaskDialog.ui rename to src/gui/ALTimerTaskAddDialog.ui index 3690f91..63a06a4 100644 --- a/src/gui/ALAddTimerTaskDialog.ui +++ b/src/gui/ALTimerTaskAddDialog.ui @@ -1,7 +1,7 @@ - ALAddTimerTaskDialog - + ALTimerTaskAddDialog + 0 diff --git a/src/gui/ALTimerTaskWidget.py b/src/gui/ALTimerTaskManageWidget.py similarity index 86% rename from src/gui/ALTimerTaskWidget.py rename to src/gui/ALTimerTaskManageWidget.py index c4a8da5..44b9b17 100644 --- a/src/gui/ALTimerTaskWidget.py +++ b/src/gui/ALTimerTaskManageWidget.py @@ -24,21 +24,14 @@ from PySide6.QtGui import ( QCloseEvent ) -from gui.Ui_ALTimerTaskWidget import Ui_ALTimerTaskWidget -from gui.ALAddTimerTaskDialog import ALAddTimerTaskWidget, TimerTaskStatus +from gui.Ui_ALTimerTaskManageWidget import Ui_ALTimerTaskManageWidget +from gui.ALTimerTaskAddDialog import ALTimerTaskAddDialog, ALTimerTaskStatus from utils.ConfigReader import ConfigReader from utils.ConfigWriter import ConfigWriter -class SortPolicy(Enum): - - BY_NAME = "按名称" - BY_ADD_TIME = "按添加时间" - BY_EXECUTE_TIME = "按执行时间" - - -class TimerTaskItemWidget(QWidget): +class ALTimerTaskItemWidget(QWidget): def __init__( self, @@ -79,22 +72,22 @@ class TimerTaskItemWidget(QWidget): self.ItemWidgetLayout.addStretch() match self.__timer_task["status"]: - case TimerTaskStatus.PENDING: + case ALTimerTaskStatus.PENDING: TaskStatusText = "等待中" TaskStatusColor = "#FF9800" - case TimerTaskStatus.READY: + case ALTimerTaskStatus.READY: TaskStatusText = "已就绪" TaskStatusColor = "#316BFF" - case TimerTaskStatus.RUNNING: + case ALTimerTaskStatus.RUNNING: TaskStatusText = "执行中" TaskStatusColor = "#2294FF" - case TimerTaskStatus.EXECUTED: + case ALTimerTaskStatus.EXECUTED: TaskStatusText = "已执行" TaskStatusColor = "#4CAF50" - case TimerTaskStatus.ERROR: + case ALTimerTaskStatus.ERROR: TaskStatusText = "执行失败" TaskStatusColor = "#DC0000" - case TimerTaskStatus.OUTDATED: + case ALTimerTaskStatus.OUTDATED: TaskStatusText = "已过期" TaskStatusColor = "#DC0000" TaskStatusLabel = QLabel(TaskStatusText) @@ -128,13 +121,19 @@ class TimerTaskItemWidget(QWidget): self.DeleteButton = QPushButton("删除") self.DeleteButton.setFixedSize(80, 25) self.ItemWidgetLayout.addWidget(self.DeleteButton) - if self.__timer_task["status"] == TimerTaskStatus.READY\ - or self.__timer_task["status"] == TimerTaskStatus.RUNNING: + if self.__timer_task["status"] == ALTimerTaskStatus.READY\ + or self.__timer_task["status"] == ALTimerTaskStatus.RUNNING: self.DeleteButton.setEnabled(False) self.setFixedHeight(55) -class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): +class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget): + + class SortPolicy(Enum): + + BY_NAME = "按名称" + BY_ADD_TIME = "按添加时间" + BY_EXECUTE_TIME = "按执行时间" timerTasksChanged = Signal() timerTaskIsReady = Signal(dict) @@ -150,7 +149,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): self.__timer_tasks = [] self.__check_timer = None - self.__sort_policy = SortPolicy.BY_EXECUTE_TIME + self.__sort_policy = self.SortPolicy.BY_EXECUTE_TIME self.__sort_order = Qt.SortOrder.AscendingOrder self.__timer_tasks_config_path = timer_tasks_config_path @@ -216,7 +215,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): for task in timer_tasks["timer_tasks"]: task["add_time"] = datetime.strptime(task["add_time"], "%Y-%m-%d %H:%M:%S") task["execute_time"] = datetime.strptime(task["execute_time"], "%Y-%m-%d %H:%M:%S") - task["status"] = TimerTaskStatus(task["status"]) + task["status"] = ALTimerTaskStatus(task["status"]) return timer_tasks["timer_tasks"] raise Exception("定时任务配置文件格式错误") except Exception as e: @@ -297,17 +296,17 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): order: Qt.SortOrder = Qt.SortOrder.AscendingOrder ): - if policy == SortPolicy.BY_NAME: + if policy == self.SortPolicy.BY_NAME: self.__timer_tasks.sort( key = lambda x: x["name"], reverse = order is Qt.SortOrder.DescendingOrder ) - elif policy == SortPolicy.BY_ADD_TIME: + elif policy == self.SortPolicy.BY_ADD_TIME: self.__timer_tasks.sort( key = lambda x: x["add_time"], reverse = order is Qt.SortOrder.DescendingOrder ) - elif policy == SortPolicy.BY_EXECUTE_TIME: + elif policy == self.SortPolicy.BY_EXECUTE_TIME: self.__timer_tasks.sort( key = lambda x: x["execute_time"], reverse = order is Qt.SortOrder.DescendingOrder @@ -324,15 +323,15 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): invalid = 0 total = len(self.__timer_tasks) for timer_task in self.__timer_tasks: - if timer_task["status"] == TimerTaskStatus.PENDING: + if timer_task["status"] == ALTimerTaskStatus.PENDING: pending += 1 - elif timer_task["status"] == TimerTaskStatus.READY\ - or timer_task["status"] == TimerTaskStatus.RUNNING: + elif timer_task["status"] == ALTimerTaskStatus.READY\ + or timer_task["status"] == ALTimerTaskStatus.RUNNING: in_queue += 1 - elif timer_task["status"] == TimerTaskStatus.EXECUTED: + elif timer_task["status"] == ALTimerTaskStatus.EXECUTED: executed += 1 - elif timer_task["status"] == TimerTaskStatus.ERROR\ - or timer_task["status"] == TimerTaskStatus.OUTDATED: + elif timer_task["status"] == ALTimerTaskStatus.ERROR\ + or timer_task["status"] == ALTimerTaskStatus.OUTDATED: invalid += 1 self.TotalTaskLabel.setText(f"总任务:{total}") self.PendingTaskLabel.setText(f"待执行:{pending}") @@ -350,7 +349,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): for timer_task in self.__timer_tasks: item = QListWidgetItem() item.setData(Qt.UserRole, timer_task) - widget = TimerTaskItemWidget(self, timer_task) + widget = ALTimerTaskItemWidget(self, timer_task) widget.DeleteButton.clicked.connect( lambda _, uuid = timer_task["task_uuid"]: self.deleteTask(uuid) ) @@ -363,7 +362,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): self ): - dialog = ALAddTimerTaskWidget(self) + dialog = ALTimerTaskAddDialog(self) if dialog.exec() == QDialog.DialogCode.Accepted: timer_task = dialog.getTimerTask() self.__timer_tasks.append(timer_task) @@ -398,8 +397,8 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): return in_queue_tasks = [ x for x in self.__timer_tasks - if x["status"] == TimerTaskStatus.READY - or x["status"] == TimerTaskStatus.RUNNING + if x["status"] == ALTimerTaskStatus.READY + or x["status"] == ALTimerTaskStatus.RUNNING ] in_queue_count = len(in_queue_tasks) if in_queue_count > 0: @@ -422,13 +421,13 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): for timer_task in self.__timer_tasks: if timer_task["execute_time"] > now: continue - if timer_task["status"] is not TimerTaskStatus.PENDING: + if timer_task["status"] is not ALTimerTaskStatus.PENDING: continue if timer_task["execute_time"] <= now + timedelta(seconds = -5): - timer_task["status"] = TimerTaskStatus.OUTDATED + timer_task["status"] = ALTimerTaskStatus.OUTDATED need_update = True else: - timer_task["status"] = TimerTaskStatus.READY + timer_task["status"] = ALTimerTaskStatus.READY self.timerTaskIsReady.emit(timer_task) need_update = True if need_update: @@ -441,9 +440,9 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): ): mapping = { - 0: SortPolicy.BY_NAME, - 1: SortPolicy.BY_ADD_TIME, - 2: SortPolicy.BY_EXECUTE_TIME + 0: self.SortPolicy.BY_NAME, + 1: self.SortPolicy.BY_ADD_TIME, + 2: self.SortPolicy.BY_EXECUTE_TIME } self.__sort_policy = mapping[policy] self.updateTimerTaskList() @@ -479,7 +478,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): for task in self.__timer_tasks: if task["task_uuid"] == timer_task["task_uuid"]: - task["status"] = TimerTaskStatus.RUNNING + task["status"] = ALTimerTaskStatus.RUNNING self.timerTasksChanged.emit() @@ -491,7 +490,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): for task in self.__timer_tasks: if task["task_uuid"] == timer_task["task_uuid"]: - task["status"] = TimerTaskStatus.EXECUTED + task["status"] = ALTimerTaskStatus.EXECUTED self.timerTasksChanged.emit() @Slot(dict) @@ -502,5 +501,5 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget): for task in self.__timer_tasks: if task["task_uuid"] == timer_task["task_uuid"]: - task["status"] = TimerTaskStatus.ERROR + task["status"] = ALTimerTaskStatus.ERROR self.timerTasksChanged.emit() diff --git a/src/gui/ALTimerTaskWidget.ui b/src/gui/ALTimerTaskManageWidget.ui similarity index 98% rename from src/gui/ALTimerTaskWidget.ui rename to src/gui/ALTimerTaskManageWidget.ui index 033d040..4ab632b 100644 --- a/src/gui/ALTimerTaskWidget.ui +++ b/src/gui/ALTimerTaskManageWidget.ui @@ -1,7 +1,7 @@ - ALTimerTaskWidget - + ALTimerTaskManageWidget + 0 @@ -23,7 +23,7 @@ - 定时任务 - AutoLibrary + 定时任务管理 - AutoLibrary diff --git a/src/gui/ALUserTreeWidget.py b/src/gui/ALUserTreeWidget.py index 150e397..ae562c0 100644 --- a/src/gui/ALUserTreeWidget.py +++ b/src/gui/ALUserTreeWidget.py @@ -21,7 +21,7 @@ from PySide6.QtGui import ( ) -class TreeItemType(Enum): +class ALUserTreeItemType(Enum): GROUP = 0 USER = 1 @@ -111,15 +111,15 @@ class ALUserTreeWidget(QTreeWidget): if source_item is None: event.ignore() return - if source_item.type() == TreeItemType.GROUP.value: + if source_item.type() == ALUserTreeItemType.GROUP.value: if target_item is not None: event.ignore() return - elif source_item.type() == TreeItemType.USER.value: + elif source_item.type() == ALUserTreeItemType.USER.value: if target_item is None: event.ignore() return - if target_item.type() != TreeItemType.GROUP.value: + if target_item.type() != ALUserTreeItemType.GROUP.value: event.ignore() return if target_item.checkState(1) == Qt.CheckState.Unchecked: