690 lines
36 KiB
Python
690 lines
36 KiB
Python
import json
|
||
import base64
|
||
import os
|
||
from PyQt6 import *
|
||
from PyQt6.QtCore import *
|
||
from PyQt6.QtGui import *
|
||
from PyQt6.QtWidgets import *
|
||
from ui.Ui_projectForm import Ui_projectForm
|
||
from projectModel.projectManager import projectManager
|
||
from insertProTaskDlg import InsertProTaskDlg
|
||
from userModel.userManager import userManager
|
||
from taskModel.taskManager import taskManager
|
||
from createProjectDlg import CreateProjectDlg
|
||
from instructionModel.instructionManager import instructionManager
|
||
from taskModel.taskActuatorManager import taskActuatorManager
|
||
from deviceModel.deviceManager import deviceManager
|
||
from devmodelModel.devModelManager import devModelManager
|
||
from taskInstructionModel.taskInstructionManager import taskInstructionManager
|
||
from taskModel.taskActuatorManager import taskActuatorManager
|
||
from config import config
|
||
from common import common
|
||
from common import NoWheelComboBox
|
||
from common import TaskProgressBar
|
||
from common import AlignDelegate
|
||
from logs import log
|
||
from influxDB import influxdb
|
||
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 ProgressBarDelegate(QStyledItemDelegate):
|
||
def paint(self, painter, option, index):
|
||
if index.column() == 5: # 仅对第二列添加进度条
|
||
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 ProjectForm(QWidget):
|
||
TASK = 0
|
||
VIRTUAL = 1
|
||
INSTRUCTION = 2
|
||
def __init__(self, parent=None):
|
||
super().__init__(parent)
|
||
self.ui = Ui_projectForm()
|
||
self.ui.setupUi(self)
|
||
self.settings = QSettings("OCE", "PlatFormPlus")
|
||
|
||
self.currentProjectIndex = self.settings.value("currentProjectIndex", defaultValue=0)
|
||
self.targetIds = []
|
||
self.taskModelBlockSignals = False
|
||
self.targetParams = {}
|
||
self.topWidget = None
|
||
self.supportedTypes = instructionManager.getSupportedType()
|
||
self.createProjectDlg = CreateProjectDlg()
|
||
self.insertTaskDlg = InsertProTaskDlg()
|
||
self.insertTaskDlg.accepted.connect(self.refreshTask)
|
||
self.taskModel = QStandardItemModel()
|
||
self.ui.tableViewTask.setModel(self.taskModel)
|
||
self.taskDetailModel = QStandardItemModel()
|
||
self.ui.tableViewTaskDetail.setModel(self.taskDetailModel)
|
||
self.taskModel.itemChanged.connect(self.taskChanged)
|
||
userManager.loginSignal.connect(self.loadProject)
|
||
self.ui.pbAdd.clicked.connect(self.addProject)
|
||
self.ui.pbDelete.clicked.connect(self.deleteProject)
|
||
self.ui.pbEdit.clicked.connect(self.editProject)
|
||
self.basePath = config.data["project"]["base_path"]
|
||
self.createProjectDlg.createFinished.connect(self.createProFinished)
|
||
self.createProjectDlg.editFinished.connect(self.editProFinished)
|
||
self.projectModel = QStandardItemModel()
|
||
self.propertyModel = QStandardItemModel()
|
||
self.proHistoryModel = QStandardItemModel()
|
||
self.fileSystemModel = QFileSystemModel()
|
||
self.ui.tableViewPro.setModel(self.projectModel)
|
||
self.ui.tableViewProperty.setModel(self.propertyModel)
|
||
self.ui.tableViewHistory.setModel(self.proHistoryModel)
|
||
self.fileSystemModel.setRootPath(self.basePath)
|
||
self.ui.pbInserTask.clicked.connect(self.insertTask)
|
||
self.ui.pbDeleteTask.clicked.connect(self.deleteTask)
|
||
self.ui.pbStartTask.clicked.connect(self.startTask)
|
||
self.ui.pbStopTask.clicked.connect(self.stopTask)
|
||
self.ui.pbAddProperty.clicked.connect(self.addProperty)
|
||
self.ui.pbDeleteProperty.clicked.connect(self.deleteProperty)
|
||
self.propertyModel.itemChanged.connect(self.updateProperty)
|
||
self.ui.tableViewPro.selectionModel().selectionChanged.connect(self.handleProSelection)
|
||
|
||
self.ui.tableViewTask.selectionModel().selectionChanged.connect(self.handleTaskSelection)
|
||
self.ui.treeViewFile.setModel(self.fileSystemModel)
|
||
self.ui.treeViewFile.doubleClicked.connect(self.handleFileOpen)
|
||
|
||
self.batchSetItemDelegate()
|
||
self.setSplitterStretchFactor()
|
||
taskActuatorManager.updateProgress.connect(self._onUpdateProgress)
|
||
# self.batchInstallEventFilter()
|
||
|
||
def batchSetItemDelegate(self):
|
||
self.ui.tableViewTask.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
||
self.ui.tableViewHistory.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
||
self.ui.tableViewPro.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
||
self.ui.tableViewProperty.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
||
self.ui.tableViewTask.setItemDelegate(AlignDelegate(self.ui.tableViewTask))
|
||
self.ui.tableViewTaskDetail.setItemDelegate(AlignDelegate(self.ui.tableViewTaskDetail))
|
||
self.ui.tableViewHistory.setItemDelegate(AlignDelegate(self.ui.tableViewHistory))
|
||
self.ui.tableViewProperty.setItemDelegate(AlignDelegate(self.ui.tableViewProperty))
|
||
self.ui.tableViewPro.setItemDelegate(AlignDelegate(self.ui.tableViewPro))
|
||
|
||
# def batchInstallEventFilter(self):
|
||
# self.ui.w1.resizeEvent = self.onResize
|
||
# self.ui.w2.resizeEvent = self.onResize
|
||
# self.ui.w3.resizeEvent = self.onResize
|
||
|
||
# def onResize(self, event):
|
||
# self.setAllColumnWidth()
|
||
def taskChanged(self):
|
||
if self.taskModelBlockSignals == True:
|
||
return
|
||
# 遍历self.taskModel中的每一行,获取每一行的任务ID和参数,并存储到self.targetParams字典中
|
||
for row in range(self.taskModel.rowCount()):
|
||
task_id_item = self.taskModel.item(row, 0)
|
||
param_item = self.taskModel.item(row, 4)
|
||
task_id = ""
|
||
if task_id_item:
|
||
task_id = task_id_item.text()
|
||
param = ""
|
||
if param_item:
|
||
param = param_item.text()
|
||
|
||
if task_id != "":
|
||
self.targetParams[task_id] = param
|
||
projectManager.saveProTask(self.targetIds, self.targetParams)
|
||
|
||
def refreshTask(self):
|
||
for target_id in self.insertTaskDlg.targetIds:
|
||
if target_id not in self.targetIds:
|
||
self.targetIds.append(target_id)
|
||
self.targetParams[target_id] = ""
|
||
projectManager.saveProTask(self.targetIds, self.targetParams)
|
||
self.loadTask()
|
||
|
||
def loadTask(self):
|
||
self.taskModel.clear()
|
||
self.taskDetailModel.clear()
|
||
tasks = taskManager.getInfos(self.targetIds)
|
||
self.taskModelBlockSignals = True
|
||
if len(tasks) > 0:
|
||
|
||
for task in tasks:
|
||
index = self.taskModel.rowCount()
|
||
task_id = str(task["id"])
|
||
param = ""
|
||
if self.targetParams:
|
||
param = task_id in self.targetParams and self.targetParams[task_id] or ""
|
||
progressItem = QxStandardItem()
|
||
progressItem.setData({'task_instruction_id': task["id"], 'name': task["name"]}, Qt.ItemDataRole.UserRole)
|
||
self.taskModel.setItem(index, 0, QStandardItem(str(task["id"])))
|
||
self.taskModel.setItem(index, 1, QStandardItem(task["name"]))
|
||
self.taskModel.setItem(index, 2, QStandardItem(str(task["loop"])))
|
||
self.taskModel.setItem(index, 3, QStandardItem(str(task["delay"])))
|
||
self.taskModel.setItem(index, 4, QStandardItem(param))
|
||
self.taskModel.setItem(index, 5, progressItem)
|
||
self.taskModel.setItem(index, 6, QStandardItem(str(task["group_id"])))
|
||
self.setUnEditableStyle(self.taskModel.item(index, 1))
|
||
self.setUnEditableStyle(self.taskModel.item(index, 2))
|
||
self.setUnEditableStyle(self.taskModel.item(index, 3))
|
||
self.setUnEditableStyle(self.taskModel.item(index, 5))
|
||
delegate = ProgressBarDelegate()
|
||
self.ui.tableViewTask.setItemDelegateForColumn(5, delegate)
|
||
self.taskModelBlockSignals = False
|
||
self.batchOperation()
|
||
|
||
def _onUpdateProgress(self, taskId, value, maxValue):
|
||
for row in range(self.taskModel.rowCount()):
|
||
item = self.taskModel.item(row, 5)
|
||
if item is not None:
|
||
obj = item.data(Qt.ItemDataRole.UserRole)
|
||
if obj is not None and isinstance(obj, dict):
|
||
if str(taskId) == str(obj.get('task_instruction_id')):
|
||
self.taskModelBlockSignals = True
|
||
item.setData({'value': value, 'maximum': maxValue, 'task_instruction_id': obj.get('task_instruction_id'), 'name': obj.get('name')}, Qt.ItemDataRole.UserRole)
|
||
self.taskModelBlockSignals = False
|
||
return
|
||
|
||
def insertTask(self):
|
||
self.insertTaskDlg.showDlg()
|
||
|
||
def deleteTask(self):
|
||
if len(self.ui.tableViewTask.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewTask.selectionModel().selectedRows()[0].row()
|
||
row_taskId_index = self.taskModel.index(row, 0, QModelIndex())
|
||
row_taskName_index = self.taskModel.index(row, 1, QModelIndex())
|
||
taskid = self.taskModel.data(row_taskId_index, Qt.ItemDataRole.DisplayRole)
|
||
taskName = self.taskModel.data(row_taskName_index, Qt.ItemDataRole.DisplayRole)
|
||
if self.topWidget == None:
|
||
self.topWidget = self.findTopLevelParent(self)
|
||
if self.topWidget != None:
|
||
if self.topWidget.removeDialog(taskName,"删除用例"):
|
||
self.taskDetailModel.clear()
|
||
self.taskModel.removeRow(row)
|
||
self.targetIds.remove(taskid)
|
||
self.targetParams.pop(taskid, None)
|
||
projectManager.saveProTask(self.targetIds, self.targetParams)
|
||
self.batchOperation()
|
||
|
||
def startTask(self):
|
||
for row in self.ui.tableViewTask.selectionModel().selectedRows():
|
||
row_index = self.taskModel.index(row.row(), 0, QModelIndex())
|
||
taskid = self.taskModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
||
params = taskid in self.targetParams and self.targetParams[taskid] or None
|
||
taskActuatorManager.start(taskid, params)
|
||
|
||
def stopTask(self):
|
||
for row in range(self.taskModel.rowCount()):
|
||
task_id_item = self.taskModel.item(row, 0)
|
||
taskid = task_id_item.text()
|
||
taskActuatorManager.stop(taskid)
|
||
|
||
#任务列表选中
|
||
def handleTaskSelection(self, index):
|
||
if len(self.ui.tableViewTask.selectionModel().selectedRows()) == 1:
|
||
self.refreshTaskDetail()
|
||
|
||
def refreshTaskDetail(self):
|
||
if len(self.ui.tableViewTask.selectionModel().selectedRows()) == 1:
|
||
row = self.ui.tableViewTask.selectionModel().selectedRows()[0].row()
|
||
row_index = self.taskModel.index(row, 0, QModelIndex())
|
||
taskid = self.taskModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
||
self.loadTaskDetail(taskid)
|
||
|
||
def setItemsEnable(self, enable):
|
||
if not enable:
|
||
self.ui.tableViewTask.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
|
||
else:
|
||
self.ui.tableViewTask.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
|
||
|
||
|
||
#加载任务详情
|
||
def loadTaskDetail(self, taskId):
|
||
self.setItemsEnable(False)
|
||
self.taskDetailModelBlockSignals = True
|
||
self.taskDetailModel.clear()
|
||
self.loadPageTaskDetail(taskId, 0, 50)
|
||
self.taskDetailModelBlockSignals = False
|
||
self.setItemsEnable(True)
|
||
self.batchOperation()
|
||
|
||
def loadPageTaskDetail(self, taskId, row, limit):
|
||
QCoreApplication.processEvents()
|
||
if taskId:
|
||
taskInstructions = taskInstructionManager.getPageInfo(taskId,row, limit)
|
||
if len(taskInstructions) > 0:
|
||
for taskInstruction in taskInstructions:
|
||
index = self.taskDetailModel.rowCount()
|
||
self.taskDetailModel.setItem(index, 0, QStandardItem(str(taskInstruction["id"])))
|
||
self.taskDetailModel.setItem(index, 1, QStandardItem(str(taskInstruction["task_id"])))
|
||
name = ""
|
||
type = ""
|
||
devicename = ""
|
||
dev_model_id = ""
|
||
devinterface = []
|
||
if taskInstruction["target_type"] == "instruction":
|
||
instruction = instructionManager.getInfo(str(taskInstruction["target_id"]))
|
||
if instruction:
|
||
name = instruction["name"]
|
||
type = instruction["type"]
|
||
if instruction["type"] is not None and instruction["type"] in self.supportedTypes:
|
||
type = self.supportedTypes[instruction["type"]]["name"]
|
||
device_id = taskInstruction["device_id"]
|
||
device = deviceManager.getInfo(device_id)
|
||
if device != None:
|
||
devicename = device["name"]
|
||
dev_model_id = device["dev_model_id"]
|
||
devinterface = device["interface"]
|
||
elif taskInstruction["target_type"] == "task":
|
||
task = taskManager.getInfo(taskInstruction["target_id"])
|
||
if task != None:
|
||
devicename = "任务"
|
||
name = task["name"]
|
||
|
||
self.taskDetailModel.setItem(index, 2, QStandardItem(devicename))
|
||
self.taskDetailModel.setItem(index, 3, QStandardItem(name))
|
||
self.taskDetailModel.setItem(index, 4, QStandardItem(type))
|
||
self.taskDetailModel.setItem(index, 5, QStandardItem(str(taskInstruction["delay"])))
|
||
self.taskDetailModel.setItem(index, 6, QStandardItem(str(taskInstruction["loop"])))
|
||
self.taskDetailModel.setItem(index, 7, QStandardItem(taskInstruction["target_param"]))
|
||
self.taskDetailModel.setItem(index, 8, QStandardItem(""))
|
||
self.taskDetailModel.setItem(index, 9, QStandardItem(str(taskInstruction["level"])))
|
||
self.setUnEditableStyle(self.taskDetailModel.item(index, 2))
|
||
self.setUnEditableStyle(self.taskDetailModel.item(index, 3))
|
||
self.setUnEditableStyle(self.taskDetailModel.item(index, 4))
|
||
|
||
devModel = devModelManager.getInfo(dev_model_id)
|
||
if devModel != None:
|
||
attr_json_dict = devModel["attr"]
|
||
devmodelInterfacetypes = {}
|
||
if "interfaceType" in attr_json_dict:
|
||
devmodelInterfacetypes = attr_json_dict["interfaceType"]
|
||
devInterfaceIndex = 0
|
||
if len(devmodelInterfacetypes) > 0:
|
||
cmb = NoWheelComboBox()
|
||
cmb.currentIndexChanged.connect(self.changeInterface)
|
||
for devmodelInterfacetype in devmodelInterfacetypes:
|
||
cmb.addItem(devmodelInterfacetype)
|
||
interface_index = "interface_index" in taskInstruction and taskInstruction["interface_index"] or 0
|
||
interface_index = interface_index != "" and interface_index or 0
|
||
if interface_index < len(devmodelInterfacetypes):
|
||
cmb.setCurrentIndex(interface_index)
|
||
self.taskDetailModel.setItem(index, 8, QStandardItem(str(interface_index)))
|
||
|
||
else:
|
||
cmb.setCurrentIndex(0)
|
||
self.taskDetailModel.setItem(index, 8, QStandardItem("0"))
|
||
self.ui.tableViewTaskDetail.setIndexWidget(self.taskDetailModel.index(index, 8), cmb)
|
||
self.batchOperation()
|
||
self.loadPageTaskDetail(taskId, row + limit,limit)
|
||
else:
|
||
return
|
||
# 切换接口
|
||
def changeInterface(self,index):
|
||
if len(self.ui.tableViewTaskDetail.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewTaskDetail.selectionModel().selectedRows()[0].row()
|
||
self.taskDetailModel.setItem(row, 8 , QStandardItem(str(index)))
|
||
def addProject(self):
|
||
self.createProjectDlg.showCreateDlg()
|
||
|
||
def setCurrentProject(self):
|
||
indexs = self.ui.tableViewPro.selectionModel().selectedRows()
|
||
if len(indexs) == 1:
|
||
row = indexs[0].row()
|
||
row_proId_index = self.projectModel.index(row, 0, QModelIndex())
|
||
proId = self.projectModel.data(row_proId_index)
|
||
projectManager.setCurrentProId(proId)
|
||
|
||
def handleFileOpen(self):
|
||
indexs = self.ui.treeViewFile.selectionModel().selectedRows()
|
||
if len(indexs) == 1:
|
||
os.startfile(self.fileSystemModel.filePath(indexs[0]))
|
||
|
||
def findTopLevelParent(self, widget):
|
||
parent = widget.parent()
|
||
while parent and not isinstance(parent, QMainWindow): # 顶层窗口是 QMainWindow
|
||
widget = parent
|
||
parent = widget.parent()
|
||
return parent
|
||
|
||
# 删除工程
|
||
def deleteProject(self):
|
||
indexs = self.ui.tableViewPro.selectionModel().selectedRows()
|
||
if len(indexs) == 1:
|
||
row = indexs[0].row()
|
||
row_proName_index = self.projectModel.index(row, 1, QModelIndex())
|
||
projectName = self.projectModel.data(row_proName_index, Qt.ItemDataRole.DisplayRole)
|
||
if self.topWidget == None:
|
||
self.topWidget = self.findTopLevelParent(self)
|
||
if self.topWidget != None:
|
||
if self.topWidget.removeDialog(projectName,"删除工程"):
|
||
row_index = self.projectModel.index(row, 0, QModelIndex())
|
||
proId = self.projectModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
||
if projectManager.delete(proId):
|
||
self.clearChildrenModel()
|
||
self.loadProject()
|
||
else:
|
||
QMessageBox.warning(self, '警告', '请选择要删除的工程', QMessageBox.StandardButton.Ok)
|
||
return
|
||
|
||
def clearChildrenModel(self):
|
||
self.propertyModel.clear()
|
||
self.proHistoryModel.clear()
|
||
|
||
def editProject(self):
|
||
if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row()
|
||
row_proId_index = self.projectModel.index(row, 0, QModelIndex())
|
||
pro_id = self.projectModel.data(row_proId_index, Qt.ItemDataRole.DisplayRole)
|
||
if pro_id != "":
|
||
self.createProjectDlg.showEditDlg(pro_id)
|
||
|
||
def refreshSelect(self):
|
||
selectedRows = self.ui.tableViewPro.selectionModel().selectedRows()
|
||
self.loadProject()
|
||
if len(selectedRows) < 1:
|
||
self.ui.tableViewPro.selectRow(0)
|
||
if len(selectedRows)== 1:
|
||
row = selectedRows[0].row()
|
||
self.ui.tableViewPro.selectRow(row)
|
||
|
||
def handleProSelection(self):
|
||
if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row()
|
||
row_index = self.projectModel.index(row, 0, QModelIndex())
|
||
proId = self.projectModel.data(row_index, Qt.ItemDataRole.DisplayRole)
|
||
self.loadProProperty(proId)
|
||
self.batchOperation()
|
||
|
||
# 添加属性
|
||
def addProperty(self):
|
||
if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1:
|
||
# 列表末位名称为空不允许创建
|
||
if self.propertyModel.rowCount() > 0:
|
||
lastIndex = self.propertyModel.rowCount() - 1
|
||
if self.propertyModel.item(lastIndex, 0).text().strip() == "":
|
||
self.ui.tableViewProperty.edit(self.propertyModel.index(lastIndex, 0))
|
||
return
|
||
index = self.propertyModel.rowCount()
|
||
self.propertyModel.appendRow([QStandardItem(), QStandardItem()])
|
||
self.ui.tableViewProperty.setCurrentIndex(self.propertyModel.index(index, 0) )
|
||
self.ui.tableViewProperty.edit(self.propertyModel.index(index, 0))
|
||
|
||
# 删除属性
|
||
def deleteProperty(self):
|
||
if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1:
|
||
if len(self.ui.tableViewProperty.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewProperty.selectionModel().selectedRows()[0].row()
|
||
#不删固定属性
|
||
if row > 3:
|
||
self.propertyModel.removeRow(row)
|
||
self.updateProperty()
|
||
|
||
# 更新属性
|
||
def updateProperty(self):
|
||
if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row()
|
||
row_id_index = self.projectModel.index(row, 0, QModelIndex())
|
||
proId = self.projectModel.data(row_id_index, Qt.ItemDataRole.DisplayRole)
|
||
#固定属性
|
||
remark = ""
|
||
operator = ""
|
||
createDate = ""
|
||
lastDate = ""
|
||
attr = {}
|
||
for row in range(self.propertyModel.rowCount()):
|
||
if self.propertyModel.item(row, 0).text() == "备注":
|
||
remark = self.propertyModel.item(row, 1).text()
|
||
elif self.propertyModel.item(row, 0).text() == "人员":
|
||
operator = self.propertyModel.item(row, 1).text()
|
||
elif self.propertyModel.item(row, 0).text() == "创建时间":
|
||
createDate = self.propertyModel.item(row, 1).text()
|
||
elif self.propertyModel.item(row, 0).text() == "上次打开时间":
|
||
lastDate = self.propertyModel.item(row, 1).text()
|
||
else:
|
||
attr[self.propertyModel.item(row, 0).text()] = self.propertyModel.item(row, 1).text()
|
||
param = {
|
||
"remark":remark,
|
||
"operator":operator,
|
||
"createDate":createDate,
|
||
"lastDate":lastDate,
|
||
"attr": attr
|
||
}
|
||
projectManager.update(proId, param)
|
||
|
||
#设置不可编辑样式
|
||
def setUnEditableStyle(self, item):
|
||
item.setEditable(False)
|
||
# item.setForeground(QColor(79, 79, 79))
|
||
# item.setBackground(QColor(240, 240, 240))
|
||
|
||
def loadProProperty(self, proId):
|
||
info = projectManager.getInfo(proId)
|
||
taskInfo = projectManager.getProTask(proId)
|
||
self.targetIds = "task" in taskInfo and taskInfo["task"] or []
|
||
self.targetParams = "params" in taskInfo and taskInfo["params"] or {}
|
||
self.loadTask()
|
||
info["history"] = projectManager.getCmdHistory(proId)
|
||
if info == None:
|
||
self.loadProject()
|
||
self.clearChildrenModel()
|
||
else:
|
||
#阻塞propertyModel信号
|
||
self.propertyModel.blockSignals(True)
|
||
self.propertyModel.clear()
|
||
self.propertyModel.setItem(0, 0, QStandardItem("备注"))
|
||
self.propertyModel.setItem(0, 1, QStandardItem(info["remark"]))
|
||
self.propertyModel.setItem(1, 0, QStandardItem("人员"))
|
||
self.propertyModel.setItem(1, 1, QStandardItem(info["operator"]))
|
||
self.propertyModel.setItem(2, 0, QStandardItem("创建时间"))
|
||
self.propertyModel.setItem(2, 1, QStandardItem(info["createDate"]))
|
||
self.propertyModel.setItem(3, 0, QStandardItem("上次打开时间"))
|
||
self.propertyModel.setItem(3, 1, QStandardItem(info["lastDate"]))
|
||
self.setUnEditableStyle(self.propertyModel.item(0, 0))
|
||
self.setUnEditableStyle(self.propertyModel.item(1, 0))
|
||
self.setUnEditableStyle(self.propertyModel.item(2, 0))
|
||
self.setUnEditableStyle(self.propertyModel.item(3, 0))
|
||
self.setUnEditableStyle(self.propertyModel.item(1, 1))
|
||
self.setUnEditableStyle(self.propertyModel.item(2, 1))
|
||
self.setUnEditableStyle(self.propertyModel.item(3, 1))
|
||
for key in info["attr"]:
|
||
self.propertyModel.appendRow([QStandardItem(key), QStandardItem(info["attr"][key])])
|
||
#解除propertyModel阻塞
|
||
self.propertyModel.blockSignals(False)
|
||
|
||
self.proHistoryModel.blockSignals(True)
|
||
self.proHistoryModel.clear()
|
||
for history in info["history"]:
|
||
strtype = ProjectForm.TASK == history["type"] and "任务" or (ProjectForm.VIRTUAL == history["type"] and "虚拟任务" or "指令")
|
||
self.proHistoryModel.appendRow([
|
||
QStandardItem(history["time"]),
|
||
QStandardItem(strtype),
|
||
QStandardItem(history["name"]),
|
||
QStandardItem(history["event"]),
|
||
QStandardItem(history["operator"])])
|
||
self.proHistoryModel.blockSignals(False)
|
||
self.ui.treeViewFile.setRootIndex(self.fileSystemModel.index(os.path.join(self.basePath, proId)))
|
||
|
||
def setSplitterStretchFactor(self):
|
||
self.ui.splitter.setStretchFactor(0, 30)
|
||
self.ui.splitter.setStretchFactor(1, 30)
|
||
self.ui.splitter.setStretchFactor(2, 40)
|
||
|
||
# def resizeEvent(self, event):
|
||
# # 在窗口或控件的尺寸发生变化时调用
|
||
# super().resizeEvent(event)
|
||
|
||
# 批量操作
|
||
def batchOperation(self):
|
||
self.setAllHorizontalHeaderLabels()
|
||
self.hideAllColumn()
|
||
self.setAllColumnWidth()
|
||
|
||
# 批量设置列宽
|
||
def setAllColumnWidth(self):
|
||
try:
|
||
if self.projectModel.rowCount() > 0:
|
||
self.ui.tableViewPro.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewPro.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Interactive)
|
||
|
||
if self.propertyModel.rowCount() > 0:
|
||
self.ui.tableViewProperty.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewProperty.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)
|
||
|
||
if self.proHistoryModel.rowCount() > 0:
|
||
self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(0,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.ResizeToContents)
|
||
self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.ResizeToContents)
|
||
self.ui.tableViewHistory.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.ResizeToContents)
|
||
|
||
if self.taskModel.rowCount() > 0:
|
||
self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(1,QHeaderView.ResizeMode.ResizeToContents)
|
||
self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTask.horizontalHeader().setSectionResizeMode(5,QHeaderView.ResizeMode.Interactive)
|
||
|
||
if self.taskDetailModel.rowCount() > 0:
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(2,QHeaderView.ResizeMode.ResizeToContents)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(3,QHeaderView.ResizeMode.ResizeToContents)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(4,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(5,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(6,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(7,QHeaderView.ResizeMode.Stretch)
|
||
self.ui.tableViewTaskDetail.horizontalHeader().setSectionResizeMode(8,QHeaderView.ResizeMode.Interactive)
|
||
except Exception as e:
|
||
print(e)
|
||
|
||
def save_column_widths(self):
|
||
settings = QSettings("TG", "projectFrom")
|
||
tables = [
|
||
self.ui.tableViewPro,
|
||
self.ui.tableViewProperty,
|
||
self.ui.tableViewHistory,
|
||
self.ui.tableViewTask,
|
||
self.ui.tableViewTaskDetail
|
||
]
|
||
|
||
for i, table in enumerate(tables):
|
||
for column in range(table.model().columnCount()):
|
||
width = table.columnWidth(column)
|
||
print(f"SAVE table_{i}_column_{column}_width: {width}")
|
||
settings.setValue(f"table_{i}_column_{column}_width", width)
|
||
|
||
def load_column_widths(self):
|
||
settings = QSettings("TG", "projectFrom")
|
||
tables = [
|
||
self.ui.tableViewPro,
|
||
self.ui.tableViewProperty,
|
||
self.ui.tableViewHistory,
|
||
self.ui.tableViewTask,
|
||
self.ui.tableViewTaskDetail
|
||
]
|
||
|
||
for i, table in enumerate(tables):
|
||
for column in range(table.model().columnCount()):
|
||
|
||
width = settings.value(f"table_{i}_column_{column}_width", type=int)
|
||
print(f"LOAD table_{i}_column_{column}_width:", width)
|
||
if width is not None:
|
||
print(f"LOAD table_{i}_column_{column}_width:", width)
|
||
table.setColumnWidth(column, width)
|
||
|
||
# 批量设置标题
|
||
def setAllHorizontalHeaderLabels(self):
|
||
self.projectModel.setHorizontalHeaderLabels(["ID"," 名称"," 活动"])
|
||
self.propertyModel.setHorizontalHeaderLabels([" 属性", " 值"])
|
||
self.proHistoryModel.setHorizontalHeaderLabels([" 时间", " 类型", " 名称", " 事件", " 人员"])
|
||
self.taskModel.setHorizontalHeaderLabels(["ID"," 名称", " 循环次数", " 间隔时间(ms)", " 参数", "进度","组ID"])
|
||
self.taskDetailModel.setHorizontalHeaderLabels(["ID","任务ID"," 设备"," 名称", " 类型", " 间隔时间(ms)", " 循环次数", " 参数", "端口", "序号"])
|
||
# 隐藏指定列
|
||
def hideAllColumn(self):
|
||
self.ui.tableViewPro.setColumnHidden(0, True)
|
||
self.ui.tableViewPro.setColumnHidden(3, True)
|
||
self.ui.tableViewTask.setColumnHidden(0, True)
|
||
self.ui.tableViewTask.setColumnHidden(6, True)
|
||
self.ui.tableViewTaskDetail.setColumnHidden(0, True)
|
||
self.ui.tableViewTaskDetail.setColumnHidden(1, True)
|
||
self.ui.tableViewTaskDetail.setColumnHidden(9, True)
|
||
|
||
def proCheckedChanged(self):
|
||
checked = self.sender().isChecked()
|
||
if checked:
|
||
index = self.ui.tableViewPro.currentIndex()
|
||
if index.isValid():
|
||
proId = ""
|
||
self.currentProjectIndex = index.row()
|
||
self.settings.setValue("currentProjectIndex", self.currentProjectIndex)
|
||
proId = self.projectModel.item(index.row(), 0).text()
|
||
proName = self.projectModel.item(index.row(), 1).text()
|
||
projectManager.setCurrentProId(proId)
|
||
influxdb.create(proName)
|
||
|
||
def editProFinished(self, proname):
|
||
if len(self.ui.tableViewPro.selectionModel().selectedRows())== 1:
|
||
row = self.ui.tableViewPro.selectionModel().selectedRows()[0].row()
|
||
proId = self.projectModel.item(row, 0).text()
|
||
self.projectModel.setItem(row, 1, QStandardItem(proname))
|
||
projectManager.updateProId(proId)
|
||
if self.projectModel.rowCount() > 0:
|
||
self.ui.tableViewPro.selectRow(row)
|
||
|
||
def createProFinished(self):
|
||
self.loadProject()
|
||
if self.projectModel.rowCount() > 0:
|
||
self.ui.tableViewPro.selectRow(self.projectModel.rowCount()-1)
|
||
|
||
def loadProject(self):
|
||
try:
|
||
self.projectModel.clear()
|
||
infos = projectManager.getInfo("all")
|
||
if len(infos) == 0:
|
||
projectManager.setCurrentProId(common.emputyProId)
|
||
return
|
||
for info in infos:
|
||
index = self.projectModel.rowCount()
|
||
self.projectModel.setItem(index, 0, QStandardItem(infos[info]["id"]))
|
||
self.projectModel.setItem(index, 1, QStandardItem(infos[info]["name"]))
|
||
radio = QRadioButton()
|
||
radio.setStyleSheet("QRadioButton::indicator {"
|
||
" subcontrol-origin: padding;"
|
||
" subcontrol-position: center;"
|
||
"}")
|
||
radio.toggled.connect(self.proCheckedChanged)
|
||
self.projectModel.setItem(index, 2 , QStandardItem())
|
||
if index == self.currentProjectIndex:
|
||
self.ui.tableViewPro.selectRow(index)
|
||
radio.setChecked(True)
|
||
projectManager.setCurrentProId(infos[info]["id"])
|
||
else:
|
||
radio.setChecked(False)
|
||
self.ui.tableViewPro.setIndexWidget(self.projectModel.index(index, 2), radio)
|
||
|
||
self.batchOperation()
|
||
except Exception as e:
|
||
log.error(e) |