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:
+7
-10
@@ -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
@@ -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():
|
||||||
|
|||||||
@@ -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
@@ -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"],
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,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">
|
||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user