TG-PlatformPlus/taskListForm.py

150 lines
7.6 KiB
Python

import json
import re
from PyQt6 import *
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *
from ui.Ui_taskListForm import Ui_taskListForm
from taskModel.taskManager import taskManager
from instructionModel.instructionManager import instructionManager
from taskGroupModel.taskGroupManager import taskGroupManager
from taskInstructionModel.taskInstructionManager import taskInstructionManager
from taskModel.taskActuatorManager import taskActuatorManager
from logs import log
from common import NoWheelComboBox
from common import TaskProgressBar
from common import common
# class ProgressBarDelegate(QStyledItemDelegate):
# def paint(self, painter, option, index):
# if index.column() == 1: # 列索引为 1 的项添加进度条
# data = index.data(Qt.ItemDataRole.UserRole) # 从 UserRole 中获取进度条数据
# if data is not None and isinstance(data, dict):
# value = data.get('value', 0)
# maximum = data.get('maximum', 100)
# progressBar = QStyleOptionProgressBar()
# progressBar.rect = option.rect
# progressBar.minimum = 0
# progressBar.maximum = maximum
# progressBar.progress = value
# progressBar.textVisible = True
# progressBar.textAlignment = Qt.AlignmentFlag.AlignCenter
# QApplication.style().drawControl(QStyle.ControlElement.CE_ProgressBar, progressBar, painter)
# else:
# super().paint(painter, option, index)
class ProgressBarDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
if index.column() == 1: # 仅对第二列添加进度条
data = index.data(Qt.ItemDataRole.UserRole) # 获取进度条数据
if data is not None and isinstance(data, dict):
value = data.get('value', -9999)
maximum = data.get('maximum', -9999)
progress_rect = option.rect # 进度条的矩形边界
progress_width = int((value / maximum) * progress_rect.width()) # 计算进度条的宽度
progress_rect.adjust(2, 2, -2, -2)
# 绘制进度条背景
painter.fillRect(progress_rect, QColor("#F8FAFF"))
# 绘制实际数值文本
text = f"{value}/{maximum}"
text_rect = QRect(option.rect)
# text_rect.adjust(0, 0, -1, 0) # 调整文本矩形边界
# 修改字体和颜色
# font = QFont("Arial", 10, QFont.Weight.Bold) # 创建字体对象
# painter.setFont(font) # 设置字体
pen = painter.pen()
pen.setColor(Qt.GlobalColor.black) # 设置画笔颜色为红色
painter.setPen(pen)
# 绘制实际进度
progress_rect.setWidth(progress_width)
if value == -1 and maximum == -1:
return
if value >=0 and maximum >= 1 :
painter.fillRect(progress_rect, QColor("#007EFF"))
painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, text)
else:
super().paint(painter, option, index)
class QxStandardItem(QStandardItem):
def __init__(self, text=''):
super().__init__(text)
def updateProgress(self, taskId, value, maxValue):
obj = self.data(Qt.ItemDataRole.UserRole)
if obj is not None and isinstance(obj, dict):
if str(taskId) == str(obj.get('task_instruction_id')):
self.setData({'value': value, 'maximum': maxValue, 'task_instruction_id': obj.get('task_instruction_id'), 'name':obj.get('name')}, Qt.ItemDataRole.UserRole)
class TaskListForm(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_taskListForm()
self.ui.setupUi(self)
self.model = QStandardItemModel()
self.model.setHorizontalHeaderLabels(["任务","进度"])
self.rootItem = self.model.invisibleRootItem()
self.ui.treeView.setModel(self.model)
self.ui.treeView.setColumnWidth(0, 400)
taskActuatorManager.taskStart.connect(self.appendTask)
taskActuatorManager.taskStop.connect(self.clearTaskData)
delegate = ProgressBarDelegate()
self.ui.treeView.setItemDelegateForColumn(1, delegate) # 为列索引为 1 的项设置自定义委托
self.ui.treeView.expandAll()
def clearTaskData(self, taskId):
for row in range(self.model.rowCount()):
index = self.model.index(row, 1)
data = index.data(Qt.ItemDataRole.UserRole)
if data is not None and isinstance(data, dict):
if str(data.get('task_instruction_id')) == str(taskId):
self.model.removeRow(row)
break
def appendTask(self, taskId):
for row in range(self.model.rowCount()):
index = self.model.index(row, 1)
data = index.data(Qt.ItemDataRole.UserRole)
if data is not None and isinstance(data, dict):
if str(data.get('task_instruction_id')) == str(taskId):
print(f"TaskId {taskId} already exists, removing existing item...")
self.model.removeRow(row)
break
task = taskManager.getInfo(str(taskId))
if task:
name = task["name"]
item = QStandardItem(str(name))
progressItem = QxStandardItem()
progressItem.setData({'task_instruction_id': task["id"], 'name': name}, Qt.ItemDataRole.UserRole)
taskActuatorManager.updateDetails.connect(progressItem.updateProgress)
self.appendChildTask(item, str(taskId), str(taskId))
self.rootItem.appendRow([item, progressItem])
self.ui.treeView.expandAll()
def appendChildTask(self, parent, taskId, parentId):
taskInstructions = taskInstructionManager.getInfo(taskId)
if taskInstructions:
for taskInstruction in taskInstructions:
target_type = taskInstruction["target_type"]
task_instruction_id = str(taskInstruction["id"])
level = taskInstruction["level"]
if target_type == "task":
task = taskManager.getInfo(str(taskInstruction["target_id"]))
if task:
name = task["name"]
childItem = QStandardItem(str(name))
childProgressItem = QxStandardItem()
childProgressItem.setData({'task_instruction_id': parentId + task_instruction_id, 'name': name}, Qt.ItemDataRole.UserRole)
taskActuatorManager.updateDetails.connect(childProgressItem.updateProgress)
self.appendChildTask(childItem, str(taskInstruction["target_id"]), parentId + task_instruction_id)
parent.appendRow([childItem, childProgressItem])
elif target_type == "instruction":
instruction = instructionManager.getInfo(str(taskInstruction["target_id"]))
if instruction:
name = instruction["name"]
childItem = QStandardItem(str(name))
childProgressItem = QxStandardItem()
childProgressItem.setData({'task_instruction_id': parentId + task_instruction_id, 'name': name}, Qt.ItemDataRole.UserRole)
taskActuatorManager.updateDetails.connect(childProgressItem.updateProgress)
parent.appendRow([childItem, childProgressItem])