1
1
mirror of https://github.com/KenanZhu/AutoLibrary.git synced 2026-06-17 23:13:03 +08:00

refactor(gui): chore(gui): 对部分界面类进行重构,将 ALSeatMapView 提取到单独文件,将 ALSeatMapWidget 重替换为 ALSeatMapSelectDialog

: 对文件名进行重命名,以更贴近各自功能,ALTimerTaskWidget 重命名为 ALTimerTaskManageWidget;ALAddTimerTaskDialog 重命名为 ALTimerTaskAddDialog
This commit is contained in:
2026-02-03 15:03:33 +08:00
parent 22f806bfb0
commit eda16f01f1
14 changed files with 280 additions and 279 deletions
+7 -10
View File
@@ -6,16 +6,13 @@
__pycache__/ __pycache__/
build/ build/
dist/ dist/
model/*.onnx model/*.*
driver/*.exe !model/*.md
driver/*.*
!driver/*.md
src/gui/configs/*.json src/gui/configs/*.json
src/gui/translators/qtbase_zh_CN.qm src/gui/translators/qtbase_zh_CN.qm
src/gui/AutoLibraryResources.py src/gui/ALResource.py
src/gui/AutoLibraryResource.py src/gui/Ui_*.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
Main.spec Main.spec
+1 -1
View File
@@ -13,7 +13,7 @@ from PySide6.QtCore import QTranslator
from PySide6.QtWidgets import QApplication from PySide6.QtWidgets import QApplication
from gui.ALMainWindow import ALMainWindow from gui.ALMainWindow import ALMainWindow
from gui import AutoLibraryResource from gui import ALResource
def main(): def main():
+1 -2
View File
@@ -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. You may use, modify, and distribute this file under the terms of the MIT License.
See the LICENSE file for details. See the LICENSE file for details.
""" """
import sys
import platform import platform
from PySide6.QtGui import ( from PySide6.QtGui import (
@@ -25,7 +24,7 @@ from gui.ALVersionInfo import (
) )
from gui.Ui_ALAboutDialog import Ui_ALAboutDialog from gui.Ui_ALAboutDialog import Ui_ALAboutDialog
from gui import AutoLibraryResource from gui import ALResource
class ALAboutDialog(QDialog, Ui_ALAboutDialog): class ALAboutDialog(QDialog, Ui_ALAboutDialog):
+30 -45
View File
@@ -14,7 +14,7 @@ from PySide6.QtCore import (
Qt, Signal, Slot, QTime, QDate, QDir, QFileInfo Qt, Signal, Slot, QTime, QDate, QDir, QFileInfo
) )
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QWidget, QLineEdit, QMessageBox, QFileDialog, QDialog, QWidget, QLineEdit, QMessageBox, QFileDialog,
QTreeWidgetItem, QMenu, QInputDialog QTreeWidgetItem, QMenu, QInputDialog
) )
from PySide6.QtGui import ( from PySide6.QtGui import (
@@ -22,10 +22,9 @@ from PySide6.QtGui import (
) )
from gui.Ui_ALConfigWidget import Ui_ALConfigWidget from gui.Ui_ALConfigWidget import Ui_ALConfigWidget
from gui.ALSeatMapWidget import ALSeatMapWidget from gui.ALSeatMapSelectDialog import ALSeatMapSelectDialog
from gui.ALSeatMapTable import seats_maps from gui.ALSeatMapTable import ALSeatMapTable
from gui.ALUserTreeWidget import TreeItemType from gui.ALUserTreeWidget import ALUserTreeWidget, ALUserTreeItemType
from gui.ALUserTreeWidget import ALUserTreeWidget
from utils.ConfigReader import ConfigReader from utils.ConfigReader import ConfigReader
from utils.ConfigWriter import ConfigWriter from utils.ConfigWriter import ConfigWriter
@@ -47,7 +46,6 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
super().__init__(parent) super().__init__(parent)
self.__config_paths = config_paths self.__config_paths = config_paths
self.__config_data = {"run": {}, "user": {}} self.__config_data = {"run": {}, "user": {}}
self.__seat_map_widget = None
self.setupUi(self) self.setupUi(self)
self.modifyUi() self.modifyUi()
@@ -625,12 +623,12 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
try: try:
if "groups" in user_config_data: if "groups" in user_config_data:
for group_config in user_config_data["groups"]: 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.setText(0, group_config["name"])
group_item.setFlags(group_item.flags() | Qt.ItemIsEditable) group_item.setFlags(group_item.flags() | Qt.ItemIsEditable)
group_item.setCheckState(1, Qt.Checked if group_config.get("enabled", True) else Qt.Unchecked) group_item.setCheckState(1, Qt.Checked if group_config.get("enabled", True) else Qt.Unchecked)
for user_config in group_config["users"]: 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(0, user_config["username"])
user_item.setText(1, "" if user_config.get("enabled", True) else "跳过") user_item.setText(1, "" if user_config.get("enabled", True) else "跳过")
user_item.setData(0, Qt.UserRole, user_config) user_item.setData(0, Qt.UserRole, user_config)
@@ -647,7 +645,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
) -> QTreeWidgetItem: ) -> QTreeWidgetItem:
self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged) 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: if not group_name:
group_name = f"新分组-{self.UserTreeWidget.topLevelItemCount()}" group_name = f"新分组-{self.UserTreeWidget.topLevelItemCount()}"
group_item.setText(0, group_name) group_item.setText(0, group_name)
@@ -667,7 +665,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
current_item = self.UserTreeWidget.currentItem() current_item = self.UserTreeWidget.currentItem()
if current_item is None: if current_item is None:
group_item = self.addGroup() group_item = self.addGroup()
if group_item.type() == TreeItemType.USER.value: if group_item.type() == ALUserTreeItemType.USER.value:
group_item = group_item.parent() group_item = group_item.parent()
if group_item.checkState(1) == Qt.CheckState.Unchecked: if group_item.checkState(1) == Qt.CheckState.Unchecked:
return None return None
@@ -701,7 +699,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
} }
} }
self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged) 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(0, new_user["username"])
user_item.setText(1, "") user_item.setText(1, "")
user_item.setData(0, Qt.UserRole, new_user) user_item.setData(0, Qt.UserRole, new_user)
@@ -720,7 +718,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
if user_item is None: if user_item is None:
return return
if user_item.type() != TreeItemType.USER.value: if user_item.type() != ALUserTreeItemType.USER.value:
return return
parent_item = user_item.parent() parent_item = user_item.parent()
index = parent_item.indexOfChild(user_item) index = parent_item.indexOfChild(user_item)
@@ -736,7 +734,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
if group_item is None: if group_item is None:
return return
if group_item.type() != TreeItemType.GROUP.value: if group_item.type() != ALUserTreeItemType.GROUP.value:
return return
index = self.UserTreeWidget.indexOfTopLevelItem(group_item) index = self.UserTreeWidget.indexOfTopLevelItem(group_item)
self.UserTreeWidget.takeTopLevelItem(index) self.UserTreeWidget.takeTopLevelItem(index)
@@ -761,7 +759,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
if not ok or not new_name: if not ok or not new_name:
return return
item.setText(0, new_name) item.setText(0, new_name)
if item.type() == TreeItemType.GROUP.value: if item.type() == ALUserTreeItemType.GROUP.value:
item.setText(0, new_name) item.setText(0, new_name)
else: else:
user = item.data(0, Qt.UserRole) 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.addItems(self.__floor_room_map[floor])
self.RoomComboBox.setCurrentIndex(0) 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() @Slot()
def onSelectSeatsButtonClicked( def onSelectSeatsButtonClicked(
self self
@@ -815,18 +799,19 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
room = self.RoomComboBox.currentText() room = self.RoomComboBox.currentText()
floor_idx = self.__floor_rmap[floor] floor_idx = self.__floor_rmap[floor]
room_idx = self.__room_rmap[room] room_idx = self.__room_rmap[room]
if self.__seat_map_widget is None: dialog = ALSeatMapSelectDialog(
self.__seat_map_widget = ALSeatMapWidget( self,
self, floor,
floor, room,
room, ALSeatMapTable[floor_idx][room_idx]
seats_maps[floor_idx][room_idx] )
) dialog.selectSeats(self.SeatIDEdit.text().split(","))
self.__seat_map_widget.seatMapWidgetClosed.connect(self.onSeatMapWidgetClosed) if dialog.exec() == QDialog.DialogCode.Accepted:
self.__seat_map_widget.show() selected_seats = dialog.getSelectedSeats()
self.__seat_map_widget.raise_() if len(selected_seats) == 0:
self.__seat_map_widget.activateWindow() self.SeatIDEdit.clear()
self.__seat_map_widget.selectSeats(self.SeatIDEdit.text().split(",")) return
self.SeatIDEdit.setText(",".join(dialog.getSelectedSeats()))
@Slot() @Slot()
def onUserTreeWidgetCurrentItemChanged( def onUserTreeWidgetCurrentItemChanged(
@@ -838,7 +823,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
# cant effectively update the data of each user, due to the # cant effectively update the data of each user, due to the
# possiblity of frequency edit. we just let the QListWidget # possiblity of frequency edit. we just let the QListWidget
# help us. # help us.
if previous and previous.type() == TreeItemType.USER.value: if previous and previous.type() == ALUserTreeItemType.USER.value:
user = self.collectUserFromUserInfoWidget() user = self.collectUserFromUserInfoWidget()
if user: if user:
self.UsernameEdit.textEdited.disconnect() self.UsernameEdit.textEdited.disconnect()
@@ -849,7 +834,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
if current is None: if current is None:
self.initilizeUserInfoWidget() self.initilizeUserInfoWidget()
return return
if current.type() == TreeItemType.USER.value: if current.type() == ALUserTreeItemType.USER.value:
user = current.data(0, Qt.UserRole) user = current.data(0, Qt.UserRole)
if user: if user:
self.setUserToWidget(user) self.setUserToWidget(user)
@@ -868,7 +853,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
return return
if column != 1: if column != 1:
return return
if item.type() == TreeItemType.GROUP.value: if item.type() == ALUserTreeItemType.GROUP.value:
is_checked = item.checkState(1) == Qt.CheckState.Checked is_checked = item.checkState(1) == Qt.CheckState.Checked
for i in range(item.childCount()): for i in range(item.childCount()):
child = item.child(i) child = item.child(i)
@@ -933,7 +918,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
menu = QMenu(self.UserTreeWidget) menu = QMenu(self.UserTreeWidget)
if current_item is None: if current_item is None:
self.showTreeMenu(menu) self.showTreeMenu(menu)
elif current_item.type() == TreeItemType.GROUP.value: elif current_item.type() == ALUserTreeItemType.GROUP.value:
self.showGroupMenu(menu, current_item) self.showGroupMenu(menu, current_item)
else: else:
self.showUserMenu(menu, current_item) self.showUserMenu(menu, current_item)
@@ -1115,7 +1100,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
): ):
current_item = self.UserTreeWidget.currentItem() 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) self.UserTreeWidget.setCurrentItem(None)
if self.saveConfigs( if self.saveConfigs(
self.__config_paths["run"], self.__config_paths["run"],
+3 -3
View File
@@ -25,11 +25,11 @@ from base.MsgBase import MsgBase
from gui.Ui_ALMainWindow import Ui_ALMainWindow from gui.Ui_ALMainWindow import Ui_ALMainWindow
from gui.ALConfigWidget import ALConfigWidget from gui.ALConfigWidget import ALConfigWidget
from gui.ALTimerTaskWidget import ALTimerTaskWidget from gui.ALTimerTaskManageWidget import ALTimerTaskManageWidget
from gui.ALAboutDialog import ALAboutDialog from gui.ALAboutDialog import ALAboutDialog
from gui.ALMainWorkers import TimerTaskWorker, AutoLibWorker from gui.ALMainWorkers import TimerTaskWorker, AutoLibWorker
from gui import AutoLibraryResource from gui import ALResource
class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow): class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow):
@@ -77,7 +77,7 @@ class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow):
self.AboutAction.triggered.connect(self.onAboutActionTriggered) self.AboutAction.triggered.connect(self.onAboutActionTriggered)
# initialize timer task widget, but not show it # 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.timerTaskIsRunning.connect(self.__alTimerTaskWidget.onTimerTaskIsRunning)
self.timerTaskIsExecuted.connect(self.__alTimerTaskWidget.onTimerTaskIsExecuted) self.timerTaskIsExecuted.connect(self.__alTimerTaskWidget.onTimerTaskIsExecuted)
self.timerTaskIsError.connect(self.__alTimerTaskWidget.onTimerTaskIsError) self.timerTaskIsError.connect(self.__alTimerTaskWidget.onTimerTaskIsError)
+177
View File
@@ -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()
+1 -1
View File
@@ -1,4 +1,4 @@
seats_maps = { ALSeatMapTable = {
"2": { "2": {
"1": """ "1": """
,,,,,,,,,,,039A,039B,,040A,040B,,041A,041B,,042A,042B,,043A,043B,,044A,044B,,,,,,,,, ,,,,,,,,,,,039A,039B,,040A,040B,,041A,041B,,042A,042B,,043A,043B,,044A,044B,,,,,,,,,
@@ -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. See the LICENSE file for details.
""" """
from PySide6.QtCore import ( from PySide6.QtCore import (
Qt, Slot, Signal, QEvent Qt, Slot, QEvent
) )
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QFrame, QWidget, QLabel, QHBoxLayout, QVBoxLayout, QFrame, QWidget,
QGridLayout, QGraphicsView, QGraphicsScene, QGraphicsItem, QGridLayout, QGraphicsView, QGraphicsScene, QGraphicsItem
QPushButton,
) )
from PySide6.QtGui import ( from PySide6.QtGui import (
QPainter, QWheelEvent, QCloseEvent QPainter, QWheelEvent
) )
from gui.ALSeatFrame import ALSeatFrame from gui.ALSeatFrame import ALSeatFrame
@@ -185,159 +184,4 @@ class ALSeatMapView(QGraphicsView):
if len(self.__selected_seats) < 1: if len(self.__selected_seats) < 1:
self.__selected_seats.append(seat_number) self.__selected_seats.append(seat_number)
else: else:
self.__seat_frames[seat_number].toggleSelection() 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()
@@ -20,10 +20,10 @@ from PySide6.QtWidgets import (
QHBoxLayout, QGridLayout, QDateTimeEdit QHBoxLayout, QGridLayout, QDateTimeEdit
) )
from gui.Ui_ALAddTimerTaskDialog import Ui_ALAddTimerTaskDialog from gui.Ui_ALTimerTaskAddDialog import Ui_ALTimerTaskAddDialog
class TimerTaskStatus(Enum): class ALTimerTaskStatus(Enum):
PENDING = "等待中" PENDING = "等待中"
READY = "已就绪" READY = "已就绪"
@@ -33,7 +33,7 @@ class TimerTaskStatus(Enum):
OUTDATED = "已过期" OUTDATED = "已过期"
class ALAddTimerTaskWidget(QDialog, Ui_ALAddTimerTaskDialog): class ALTimerTaskAddDialog(QDialog, Ui_ALTimerTaskAddDialog):
def __init__( def __init__(
self, self,
@@ -128,7 +128,7 @@ class ALAddTimerTaskWidget(QDialog, Ui_ALAddTimerTaskDialog):
"execute_time": execute_time, "execute_time": execute_time,
"silent": silent, "silent": silent,
"add_time": added_time, "add_time": added_time,
"status": TimerTaskStatus.PENDING, "status": ALTimerTaskStatus.PENDING,
"executed": False "executed": False
} }
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ALAddTimerTaskDialog</class> <class>ALTimerTaskAddDialog</class>
<widget class="QDialog" name="ALAddTimerTaskDialog"> <widget class="QDialog" name="ALTimerTaskAddDialog">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@@ -24,21 +24,14 @@ from PySide6.QtGui import (
QCloseEvent QCloseEvent
) )
from gui.Ui_ALTimerTaskWidget import Ui_ALTimerTaskWidget from gui.Ui_ALTimerTaskManageWidget import Ui_ALTimerTaskManageWidget
from gui.ALAddTimerTaskDialog import ALAddTimerTaskWidget, TimerTaskStatus from gui.ALTimerTaskAddDialog import ALTimerTaskAddDialog, ALTimerTaskStatus
from utils.ConfigReader import ConfigReader from utils.ConfigReader import ConfigReader
from utils.ConfigWriter import ConfigWriter from utils.ConfigWriter import ConfigWriter
class SortPolicy(Enum): class ALTimerTaskItemWidget(QWidget):
BY_NAME = "按名称"
BY_ADD_TIME = "按添加时间"
BY_EXECUTE_TIME = "按执行时间"
class TimerTaskItemWidget(QWidget):
def __init__( def __init__(
self, self,
@@ -79,22 +72,22 @@ class TimerTaskItemWidget(QWidget):
self.ItemWidgetLayout.addStretch() self.ItemWidgetLayout.addStretch()
match self.__timer_task["status"]: match self.__timer_task["status"]:
case TimerTaskStatus.PENDING: case ALTimerTaskStatus.PENDING:
TaskStatusText = "等待中" TaskStatusText = "等待中"
TaskStatusColor = "#FF9800" TaskStatusColor = "#FF9800"
case TimerTaskStatus.READY: case ALTimerTaskStatus.READY:
TaskStatusText = "已就绪" TaskStatusText = "已就绪"
TaskStatusColor = "#316BFF" TaskStatusColor = "#316BFF"
case TimerTaskStatus.RUNNING: case ALTimerTaskStatus.RUNNING:
TaskStatusText = "执行中" TaskStatusText = "执行中"
TaskStatusColor = "#2294FF" TaskStatusColor = "#2294FF"
case TimerTaskStatus.EXECUTED: case ALTimerTaskStatus.EXECUTED:
TaskStatusText = "已执行" TaskStatusText = "已执行"
TaskStatusColor = "#4CAF50" TaskStatusColor = "#4CAF50"
case TimerTaskStatus.ERROR: case ALTimerTaskStatus.ERROR:
TaskStatusText = "执行失败" TaskStatusText = "执行失败"
TaskStatusColor = "#DC0000" TaskStatusColor = "#DC0000"
case TimerTaskStatus.OUTDATED: case ALTimerTaskStatus.OUTDATED:
TaskStatusText = "已过期" TaskStatusText = "已过期"
TaskStatusColor = "#DC0000" TaskStatusColor = "#DC0000"
TaskStatusLabel = QLabel(TaskStatusText) TaskStatusLabel = QLabel(TaskStatusText)
@@ -128,13 +121,19 @@ class TimerTaskItemWidget(QWidget):
self.DeleteButton = QPushButton("删除") self.DeleteButton = QPushButton("删除")
self.DeleteButton.setFixedSize(80, 25) self.DeleteButton.setFixedSize(80, 25)
self.ItemWidgetLayout.addWidget(self.DeleteButton) self.ItemWidgetLayout.addWidget(self.DeleteButton)
if self.__timer_task["status"] == TimerTaskStatus.READY\ if self.__timer_task["status"] == ALTimerTaskStatus.READY\
or self.__timer_task["status"] == TimerTaskStatus.RUNNING: or self.__timer_task["status"] == ALTimerTaskStatus.RUNNING:
self.DeleteButton.setEnabled(False) self.DeleteButton.setEnabled(False)
self.setFixedHeight(55) 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() timerTasksChanged = Signal()
timerTaskIsReady = Signal(dict) timerTaskIsReady = Signal(dict)
@@ -150,7 +149,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
self.__timer_tasks = [] self.__timer_tasks = []
self.__check_timer = None 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.__sort_order = Qt.SortOrder.AscendingOrder
self.__timer_tasks_config_path = timer_tasks_config_path 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"]: for task in timer_tasks["timer_tasks"]:
task["add_time"] = datetime.strptime(task["add_time"], "%Y-%m-%d %H:%M:%S") 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["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"] return timer_tasks["timer_tasks"]
raise Exception("定时任务配置文件格式错误") raise Exception("定时任务配置文件格式错误")
except Exception as e: except Exception as e:
@@ -297,17 +296,17 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
order: Qt.SortOrder = Qt.SortOrder.AscendingOrder order: Qt.SortOrder = Qt.SortOrder.AscendingOrder
): ):
if policy == SortPolicy.BY_NAME: if policy == self.SortPolicy.BY_NAME:
self.__timer_tasks.sort( self.__timer_tasks.sort(
key = lambda x: x["name"], key = lambda x: x["name"],
reverse = order is Qt.SortOrder.DescendingOrder reverse = order is Qt.SortOrder.DescendingOrder
) )
elif policy == SortPolicy.BY_ADD_TIME: elif policy == self.SortPolicy.BY_ADD_TIME:
self.__timer_tasks.sort( self.__timer_tasks.sort(
key = lambda x: x["add_time"], key = lambda x: x["add_time"],
reverse = order is Qt.SortOrder.DescendingOrder reverse = order is Qt.SortOrder.DescendingOrder
) )
elif policy == SortPolicy.BY_EXECUTE_TIME: elif policy == self.SortPolicy.BY_EXECUTE_TIME:
self.__timer_tasks.sort( self.__timer_tasks.sort(
key = lambda x: x["execute_time"], key = lambda x: x["execute_time"],
reverse = order is Qt.SortOrder.DescendingOrder reverse = order is Qt.SortOrder.DescendingOrder
@@ -324,15 +323,15 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
invalid = 0 invalid = 0
total = len(self.__timer_tasks) total = len(self.__timer_tasks)
for timer_task in self.__timer_tasks: for timer_task in self.__timer_tasks:
if timer_task["status"] == TimerTaskStatus.PENDING: if timer_task["status"] == ALTimerTaskStatus.PENDING:
pending += 1 pending += 1
elif timer_task["status"] == TimerTaskStatus.READY\ elif timer_task["status"] == ALTimerTaskStatus.READY\
or timer_task["status"] == TimerTaskStatus.RUNNING: or timer_task["status"] == ALTimerTaskStatus.RUNNING:
in_queue += 1 in_queue += 1
elif timer_task["status"] == TimerTaskStatus.EXECUTED: elif timer_task["status"] == ALTimerTaskStatus.EXECUTED:
executed += 1 executed += 1
elif timer_task["status"] == TimerTaskStatus.ERROR\ elif timer_task["status"] == ALTimerTaskStatus.ERROR\
or timer_task["status"] == TimerTaskStatus.OUTDATED: or timer_task["status"] == ALTimerTaskStatus.OUTDATED:
invalid += 1 invalid += 1
self.TotalTaskLabel.setText(f"总任务:{total}") self.TotalTaskLabel.setText(f"总任务:{total}")
self.PendingTaskLabel.setText(f"待执行:{pending}") self.PendingTaskLabel.setText(f"待执行:{pending}")
@@ -350,7 +349,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
for timer_task in self.__timer_tasks: for timer_task in self.__timer_tasks:
item = QListWidgetItem() item = QListWidgetItem()
item.setData(Qt.UserRole, timer_task) item.setData(Qt.UserRole, timer_task)
widget = TimerTaskItemWidget(self, timer_task) widget = ALTimerTaskItemWidget(self, timer_task)
widget.DeleteButton.clicked.connect( widget.DeleteButton.clicked.connect(
lambda _, uuid = timer_task["task_uuid"]: self.deleteTask(uuid) lambda _, uuid = timer_task["task_uuid"]: self.deleteTask(uuid)
) )
@@ -363,7 +362,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
self self
): ):
dialog = ALAddTimerTaskWidget(self) dialog = ALTimerTaskAddDialog(self)
if dialog.exec() == QDialog.DialogCode.Accepted: if dialog.exec() == QDialog.DialogCode.Accepted:
timer_task = dialog.getTimerTask() timer_task = dialog.getTimerTask()
self.__timer_tasks.append(timer_task) self.__timer_tasks.append(timer_task)
@@ -398,8 +397,8 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
return return
in_queue_tasks = [ in_queue_tasks = [
x for x in self.__timer_tasks x for x in self.__timer_tasks
if x["status"] == TimerTaskStatus.READY if x["status"] == ALTimerTaskStatus.READY
or x["status"] == TimerTaskStatus.RUNNING or x["status"] == ALTimerTaskStatus.RUNNING
] ]
in_queue_count = len(in_queue_tasks) in_queue_count = len(in_queue_tasks)
if in_queue_count > 0: if in_queue_count > 0:
@@ -422,13 +421,13 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
for timer_task in self.__timer_tasks: for timer_task in self.__timer_tasks:
if timer_task["execute_time"] > now: if timer_task["execute_time"] > now:
continue continue
if timer_task["status"] is not TimerTaskStatus.PENDING: if timer_task["status"] is not ALTimerTaskStatus.PENDING:
continue continue
if timer_task["execute_time"] <= now + timedelta(seconds = -5): if timer_task["execute_time"] <= now + timedelta(seconds = -5):
timer_task["status"] = TimerTaskStatus.OUTDATED timer_task["status"] = ALTimerTaskStatus.OUTDATED
need_update = True need_update = True
else: else:
timer_task["status"] = TimerTaskStatus.READY timer_task["status"] = ALTimerTaskStatus.READY
self.timerTaskIsReady.emit(timer_task) self.timerTaskIsReady.emit(timer_task)
need_update = True need_update = True
if need_update: if need_update:
@@ -441,9 +440,9 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
): ):
mapping = { mapping = {
0: SortPolicy.BY_NAME, 0: self.SortPolicy.BY_NAME,
1: SortPolicy.BY_ADD_TIME, 1: self.SortPolicy.BY_ADD_TIME,
2: SortPolicy.BY_EXECUTE_TIME 2: self.SortPolicy.BY_EXECUTE_TIME
} }
self.__sort_policy = mapping[policy] self.__sort_policy = mapping[policy]
self.updateTimerTaskList() self.updateTimerTaskList()
@@ -479,7 +478,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
for task in self.__timer_tasks: for task in self.__timer_tasks:
if task["task_uuid"] == timer_task["task_uuid"]: if task["task_uuid"] == timer_task["task_uuid"]:
task["status"] = TimerTaskStatus.RUNNING task["status"] = ALTimerTaskStatus.RUNNING
self.timerTasksChanged.emit() self.timerTasksChanged.emit()
@@ -491,7 +490,7 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
for task in self.__timer_tasks: for task in self.__timer_tasks:
if task["task_uuid"] == timer_task["task_uuid"]: if task["task_uuid"] == timer_task["task_uuid"]:
task["status"] = TimerTaskStatus.EXECUTED task["status"] = ALTimerTaskStatus.EXECUTED
self.timerTasksChanged.emit() self.timerTasksChanged.emit()
@Slot(dict) @Slot(dict)
@@ -502,5 +501,5 @@ class ALTimerTaskWidget(QWidget, Ui_ALTimerTaskWidget):
for task in self.__timer_tasks: for task in self.__timer_tasks:
if task["task_uuid"] == timer_task["task_uuid"]: if task["task_uuid"] == timer_task["task_uuid"]:
task["status"] = TimerTaskStatus.ERROR task["status"] = ALTimerTaskStatus.ERROR
self.timerTasksChanged.emit() self.timerTasksChanged.emit()
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>ALTimerTaskWidget</class> <class>ALTimerTaskManageWidget</class>
<widget class="QWidget" name="ALTimerTaskWidget"> <widget class="QWidget" name="ALTimerTaskManageWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>定时任务 - AutoLibrary</string> <string>定时任务管理 - AutoLibrary</string>
</property> </property>
<layout class="QVBoxLayout" name="ALTimerTaskWidgetLayout"> <layout class="QVBoxLayout" name="ALTimerTaskWidgetLayout">
<property name="spacing"> <property name="spacing">
+4 -4
View File
@@ -21,7 +21,7 @@ from PySide6.QtGui import (
) )
class TreeItemType(Enum): class ALUserTreeItemType(Enum):
GROUP = 0 GROUP = 0
USER = 1 USER = 1
@@ -111,15 +111,15 @@ class ALUserTreeWidget(QTreeWidget):
if source_item is None: if source_item is None:
event.ignore() event.ignore()
return return
if source_item.type() == TreeItemType.GROUP.value: if source_item.type() == ALUserTreeItemType.GROUP.value:
if target_item is not None: if target_item is not None:
event.ignore() event.ignore()
return return
elif source_item.type() == TreeItemType.USER.value: elif source_item.type() == ALUserTreeItemType.USER.value:
if target_item is None: if target_item is None:
event.ignore() event.ignore()
return return
if target_item.type() != TreeItemType.GROUP.value: if target_item.type() != ALUserTreeItemType.GROUP.value:
event.ignore() event.ignore()
return return
if target_item.checkState(1) == Qt.CheckState.Unchecked: if target_item.checkState(1) == Qt.CheckState.Unchecked: