mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-17 23:13:03 +08:00
refactor(gui): 统一 Qt 控件变量命名风格为 PascalCase
将所有 self.xxx 形式的 Qt 控件属性名以及 Qt 对象局部变量由 snake_case 重命名为 PascalCase,提升代码可读性和一致性。涉及 14 个文件,涵盖: - AutoScript 编排/编辑对话框子模块 - 配置/主窗口/用户树/座位图等核心界面组件 - 定时任务管理相关界面 - 状态标签/浏览器驱动下载对话框 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+237
-237
@@ -74,54 +74,54 @@ class ALScriptHighlighter(QSyntaxHighlighter):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self._rules = []
|
self._rules = []
|
||||||
|
|
||||||
keywordFmt = QTextCharFormat()
|
KeywordFmt = QTextCharFormat()
|
||||||
keywordFmt.setForeground(QColor("#569CD6"))
|
KeywordFmt.setForeground(QColor("#569CD6"))
|
||||||
keywordFmt.setFontWeight(QFont.Weight.Bold)
|
KeywordFmt.setFontWeight(QFont.Weight.Bold)
|
||||||
for kw in [
|
for kw in [
|
||||||
"if", "elseif", "else", "end", "then",
|
"if", "elseif", "else", "end", "then",
|
||||||
"and", "or", "not",
|
"and", "or", "not",
|
||||||
"local", "function", "return", "nil",
|
"local", "function", "return", "nil",
|
||||||
]:
|
]:
|
||||||
self._rules.append((r"\b" + kw + r"\b", keywordFmt))
|
self._rules.append((r"\b" + kw + r"\b", KeywordFmt))
|
||||||
boolFmt = QTextCharFormat()
|
BoolFmt = QTextCharFormat()
|
||||||
boolFmt.setForeground(QColor("#4FC1FF"))
|
BoolFmt.setForeground(QColor("#4FC1FF"))
|
||||||
boolFmt.setFontWeight(QFont.Weight.Bold)
|
BoolFmt.setFontWeight(QFont.Weight.Bold)
|
||||||
self._rules.append((r"\btrue\b", boolFmt))
|
self._rules.append((r"\btrue\b", BoolFmt))
|
||||||
self._rules.append((r"\bfalse\b", boolFmt))
|
self._rules.append((r"\bfalse\b", BoolFmt))
|
||||||
cmpFmt = QTextCharFormat()
|
CmpFmt = QTextCharFormat()
|
||||||
cmpFmt.setForeground(QColor("#C586C0"))
|
CmpFmt.setForeground(QColor("#C586C0"))
|
||||||
cmpFmt.setFontWeight(QFont.Weight.Normal)
|
CmpFmt.setFontWeight(QFont.Weight.Normal)
|
||||||
for op in [r"==", r"~=", r">=", r"<=", r">", r"<"]:
|
for op in [r"==", r"~=", r">=", r"<=", r">", r"<"]:
|
||||||
self._rules.append((op, cmpFmt))
|
self._rules.append((op, CmpFmt))
|
||||||
arithFmt = QTextCharFormat()
|
ArithFmt = QTextCharFormat()
|
||||||
arithFmt.setForeground(QColor("#C586C0"))
|
ArithFmt.setForeground(QColor("#C586C0"))
|
||||||
arithFmt.setFontWeight(QFont.Weight.Normal)
|
ArithFmt.setFontWeight(QFont.Weight.Normal)
|
||||||
for op in [r"\+", r"-", r"\*", r"/", r"\.\."]:
|
for op in [r"\+", r"-", r"\*", r"/", r"\.\."]:
|
||||||
self._rules.append((op, arithFmt))
|
self._rules.append((op, ArithFmt))
|
||||||
funcFmt = QTextCharFormat()
|
FuncFmt = QTextCharFormat()
|
||||||
funcFmt.setForeground(QColor("#DCDCAA"))
|
FuncFmt.setForeground(QColor("#DCDCAA"))
|
||||||
funcFmt.setFontWeight(QFont.Weight.Normal)
|
FuncFmt.setFontWeight(QFont.Weight.Normal)
|
||||||
for fn in [ "time", "date", "datenow", "timenow", "dateadd", "timeadd"]:
|
for fn in [ "time", "date", "datenow", "timenow", "dateadd", "timeadd"]:
|
||||||
self._rules.append((r"\b" + fn + r"\b", funcFmt))
|
self._rules.append((r"\b" + fn + r"\b", FuncFmt))
|
||||||
varFmt = QTextCharFormat()
|
VarFmt = QTextCharFormat()
|
||||||
varFmt.setForeground(QColor("#9CDCFE"))
|
VarFmt.setForeground(QColor("#9CDCFE"))
|
||||||
varFmt.setFontWeight(QFont.Weight.Normal)
|
VarFmt.setFontWeight(QFont.Weight.Normal)
|
||||||
var_names = [name for _, (name, _) in createAllVariablesTable().items()]
|
var_names = [name for _, (name, _) in createAllVariablesTable().items()]
|
||||||
for var in var_names:
|
for var in var_names:
|
||||||
self._rules.append((r"\b" + var + r"\b", varFmt))
|
self._rules.append((r"\b" + var + r"\b", VarFmt))
|
||||||
strFmt = QTextCharFormat()
|
StrFmt = QTextCharFormat()
|
||||||
strFmt.setForeground(QColor("#CE9178"))
|
StrFmt.setForeground(QColor("#CE9178"))
|
||||||
strFmt.setFontWeight(QFont.Weight.Normal)
|
StrFmt.setFontWeight(QFont.Weight.Normal)
|
||||||
self._rules.append((r'"[^"]*"', strFmt))
|
self._rules.append((r'"[^"]*"', StrFmt))
|
||||||
self._rules.append((r"'[^']*'", strFmt))
|
self._rules.append((r"'[^']*'", StrFmt))
|
||||||
numFmt = QTextCharFormat()
|
NumFmt = QTextCharFormat()
|
||||||
numFmt.setForeground(QColor("#B5CEA8"))
|
NumFmt.setForeground(QColor("#B5CEA8"))
|
||||||
numFmt.setFontWeight(QFont.Weight.Normal)
|
NumFmt.setFontWeight(QFont.Weight.Normal)
|
||||||
self._rules.append((r"\b\d+(?:\.\d+)?\b", numFmt))
|
self._rules.append((r"\b\d+(?:\.\d+)?\b", NumFmt))
|
||||||
commentFmt = QTextCharFormat()
|
CommentFmt = QTextCharFormat()
|
||||||
commentFmt.setForeground(QColor("#6A9955"))
|
CommentFmt.setForeground(QColor("#6A9955"))
|
||||||
commentFmt.setFontItalic(True)
|
CommentFmt.setFontItalic(True)
|
||||||
self._rules.append((r"--[^\n]*", commentFmt))
|
self._rules.append((r"--[^\n]*", CommentFmt))
|
||||||
|
|
||||||
def highlightBlock(
|
def highlightBlock(
|
||||||
self,
|
self,
|
||||||
@@ -147,22 +147,22 @@ class _DebugResultDialog(QDialog):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.setWindowTitle("调试运行结果 - AutoLibrary")
|
self.setWindowTitle("调试运行结果 - AutoLibrary")
|
||||||
self.setMinimumSize(600, 200)
|
self.setMinimumSize(600, 200)
|
||||||
layout = QVBoxLayout(self)
|
DbgLayout = QVBoxLayout(self)
|
||||||
table = QTableWidget(len(changes), 3)
|
DbgTable = QTableWidget(len(changes), 3)
|
||||||
table.setHorizontalHeaderLabels(["目标变量", "原始数据", "运行后数据"])
|
DbgTable.setHorizontalHeaderLabels(["目标变量", "原始数据", "运行后数据"])
|
||||||
table.horizontalHeader().setStretchLastSection(True)
|
DbgTable.horizontalHeader().setStretchLastSection(True)
|
||||||
table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
DbgTable.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
||||||
table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
|
DbgTable.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
|
||||||
for row, (display_name, name, var_type, before_val, after_val) in enumerate(changes):
|
for row, (display_name, name, var_type, before_val, after_val) in enumerate(changes):
|
||||||
label = f"{display_name}: {name}({var_type})"
|
label = f"{display_name}: {name}({var_type})"
|
||||||
table.setItem(row, 0, QTableWidgetItem(label))
|
DbgTable.setItem(row, 0, QTableWidgetItem(label))
|
||||||
table.setItem(row, 1, QTableWidgetItem(str(before_val)))
|
DbgTable.setItem(row, 1, QTableWidgetItem(str(before_val)))
|
||||||
table.setItem(row, 2, QTableWidgetItem(str(after_val)))
|
DbgTable.setItem(row, 2, QTableWidgetItem(str(after_val)))
|
||||||
layout.addWidget(table)
|
DbgLayout.addWidget(DbgTable)
|
||||||
btnBox = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok)
|
DbgBtnBox = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok)
|
||||||
btnBox.button(QDialogButtonBox.StandardButton.Ok).setText("确定")
|
DbgBtnBox.button(QDialogButtonBox.StandardButton.Ok).setText("确定")
|
||||||
btnBox.accepted.connect(self.accept)
|
DbgBtnBox.accepted.connect(self.accept)
|
||||||
layout.addWidget(btnBox)
|
DbgLayout.addWidget(DbgBtnBox)
|
||||||
|
|
||||||
|
|
||||||
class _TabToSpacesEditor(QPlainTextEdit):
|
class _TabToSpacesEditor(QPlainTextEdit):
|
||||||
@@ -193,9 +193,9 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
|
|
||||||
self.setupUi()
|
self.setupUi()
|
||||||
self.connectSignals()
|
self.connectSignals()
|
||||||
self.textEdit.setPlainText(script)
|
self.TextEdit.setPlainText(script)
|
||||||
self._highlighter = ALScriptHighlighter(
|
self._Highlighter = ALScriptHighlighter(
|
||||||
self.textEdit.document()
|
self.TextEdit.document()
|
||||||
)
|
)
|
||||||
if mockData:
|
if mockData:
|
||||||
self.setMockData(mockData)
|
self.setMockData(mockData)
|
||||||
@@ -206,80 +206,80 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
|
|
||||||
self.setWindowTitle("AutoScript 编辑 - AutoLibrary")
|
self.setWindowTitle("AutoScript 编辑 - AutoLibrary")
|
||||||
self.setMinimumSize(660, 600)
|
self.setMinimumSize(660, 600)
|
||||||
layout = QVBoxLayout(self)
|
Layout = QVBoxLayout(self)
|
||||||
layout.setSpacing(3)
|
Layout.setSpacing(3)
|
||||||
layout.setContentsMargins(3, 3, 3, 3)
|
Layout.setContentsMargins(3, 3, 3, 3)
|
||||||
toolbarLayout = QHBoxLayout()
|
ToolbarLayout = QHBoxLayout()
|
||||||
self.zoomInBtn = QPushButton("+")
|
self.ZoomInBtn = QPushButton("+")
|
||||||
self.zoomInBtn.setFixedSize(25, 25)
|
self.ZoomInBtn.setFixedSize(25, 25)
|
||||||
self.zoomOutBtn = QPushButton("-")
|
self.ZoomOutBtn = QPushButton("-")
|
||||||
self.zoomOutBtn.setFixedSize(25, 25)
|
self.ZoomOutBtn.setFixedSize(25, 25)
|
||||||
self.zoomResetBtn = QPushButton("")
|
self.ZoomResetBtn = QPushButton("")
|
||||||
self.zoomResetBtn.setIcon(QIcon(":/res/icons/Reset.svg"))
|
self.ZoomResetBtn.setIcon(QIcon(":/res/icons/Reset.svg"))
|
||||||
self.zoomResetBtn.setIconSize(QSize(20, 20))
|
self.ZoomResetBtn.setIconSize(QSize(20, 20))
|
||||||
self.zoomResetBtn.setFixedSize(25, 25)
|
self.ZoomResetBtn.setFixedSize(25, 25)
|
||||||
self.zoomResetBtn.setToolTip("重置缩放")
|
self.ZoomResetBtn.setToolTip("重置缩放")
|
||||||
self.zoomLabel = QLabel(f"{self._fontSize}px")
|
self.ZoomLabel = QLabel(f"{self._fontSize}px")
|
||||||
self.zoomLabel.setFixedHeight(25)
|
self.ZoomLabel.setFixedHeight(25)
|
||||||
self.orchBtn = QPushButton("编排")
|
self.OrchBtn = QPushButton("编排")
|
||||||
self.orchBtn.setFixedHeight(25)
|
self.OrchBtn.setFixedHeight(25)
|
||||||
self.orchBtn.setToolTip("可视化生成 AutoScript 代码并插入到光标位置")
|
self.OrchBtn.setToolTip("可视化生成 AutoScript 代码并插入到光标位置")
|
||||||
toolbarLayout.addWidget(self.orchBtn)
|
ToolbarLayout.addWidget(self.OrchBtn)
|
||||||
self.debugBtn = QPushButton("▶ 调试运行")
|
self.DebugBtn = QPushButton("▶ 调试运行")
|
||||||
self.debugBtn.setFixedHeight(25)
|
self.DebugBtn.setFixedHeight(25)
|
||||||
self.debugBtn.setToolTip("使用右侧模拟数据执行脚本,查看目标变量变化")
|
self.DebugBtn.setToolTip("使用右侧模拟数据执行脚本,查看目标变量变化")
|
||||||
toolbarLayout.addWidget(self.debugBtn)
|
ToolbarLayout.addWidget(self.DebugBtn)
|
||||||
sep = QFrame()
|
Sep = QFrame()
|
||||||
sep.setFrameShape(QFrame.Shape.VLine)
|
Sep.setFrameShape(QFrame.Shape.VLine)
|
||||||
sep.setFrameShadow(QFrame.Shadow.Sunken)
|
Sep.setFrameShadow(QFrame.Shadow.Sunken)
|
||||||
sep.setFixedWidth(1)
|
Sep.setFixedWidth(1)
|
||||||
toolbarLayout.addWidget(sep)
|
ToolbarLayout.addWidget(Sep)
|
||||||
toolbarLayout.addWidget(self.zoomInBtn)
|
ToolbarLayout.addWidget(self.ZoomInBtn)
|
||||||
toolbarLayout.addWidget(self.zoomOutBtn)
|
ToolbarLayout.addWidget(self.ZoomOutBtn)
|
||||||
toolbarLayout.addWidget(self.zoomResetBtn)
|
ToolbarLayout.addWidget(self.ZoomResetBtn)
|
||||||
toolbarLayout.addWidget(self.zoomLabel)
|
ToolbarLayout.addWidget(self.ZoomLabel)
|
||||||
toolbarLayout.addStretch()
|
ToolbarLayout.addStretch()
|
||||||
self.copyBtn = QPushButton("")
|
self.CopyBtn = QPushButton("")
|
||||||
self.copyBtn.setIcon(QIcon(":/res/icons/Copy.svg"))
|
self.CopyBtn.setIcon(QIcon(":/res/icons/Copy.svg"))
|
||||||
self.copyBtn.setIconSize(QSize(20, 20))
|
self.CopyBtn.setIconSize(QSize(20, 20))
|
||||||
self.copyBtn.setFixedSize(25, 25)
|
self.CopyBtn.setFixedSize(25, 25)
|
||||||
self.copyBtn.setToolTip("复制脚本")
|
self.CopyBtn.setToolTip("复制脚本")
|
||||||
toolbarLayout.addWidget(self.copyBtn)
|
ToolbarLayout.addWidget(self.CopyBtn)
|
||||||
layout.addLayout(toolbarLayout)
|
Layout.addLayout(ToolbarLayout)
|
||||||
self.textEdit = _TabToSpacesEditor(self)
|
self.TextEdit = _TabToSpacesEditor(self)
|
||||||
self.textEdit.setTabStopDistance(40)
|
self.TextEdit.setTabStopDistance(40)
|
||||||
self.textEdit.setLineWrapMode(
|
self.TextEdit.setLineWrapMode(
|
||||||
QPlainTextEdit.LineWrapMode.NoWrap
|
QPlainTextEdit.LineWrapMode.NoWrap
|
||||||
)
|
)
|
||||||
self.textEdit.setStyleSheet(
|
self.TextEdit.setStyleSheet(
|
||||||
"QPlainTextEdit {"
|
"QPlainTextEdit {"
|
||||||
" font-family: 'Courier New', 'Consolas', monospace;"
|
" font-family: 'Courier New', 'Consolas', monospace;"
|
||||||
f" font-size: {self._fontSize}px;"
|
f" font-size: {self._fontSize}px;"
|
||||||
"}"
|
"}"
|
||||||
)
|
)
|
||||||
layout.addWidget(self.textEdit)
|
Layout.addWidget(self.TextEdit)
|
||||||
self.createButtonPanel(layout)
|
self.createButtonPanel(Layout)
|
||||||
self.btnBox = QDialogButtonBox(
|
self.BtnBox = QDialogButtonBox(
|
||||||
QDialogButtonBox.StandardButton.Ok |
|
QDialogButtonBox.StandardButton.Ok |
|
||||||
QDialogButtonBox.StandardButton.Cancel
|
QDialogButtonBox.StandardButton.Cancel
|
||||||
)
|
)
|
||||||
self.btnBox.button(QDialogButtonBox.StandardButton.Ok).setText("确定")
|
self.BtnBox.button(QDialogButtonBox.StandardButton.Ok).setText("确定")
|
||||||
self.btnBox.button(QDialogButtonBox.StandardButton.Cancel).setText("取消")
|
self.BtnBox.button(QDialogButtonBox.StandardButton.Cancel).setText("取消")
|
||||||
layout.addWidget(self.btnBox)
|
Layout.addWidget(self.BtnBox)
|
||||||
|
|
||||||
def createButtonPanel(
|
def createButtonPanel(
|
||||||
self,
|
self,
|
||||||
parent_layout
|
ParentLayout
|
||||||
):
|
):
|
||||||
|
|
||||||
splitter = QSplitter(Qt.Orientation.Horizontal)
|
Splitter = QSplitter(Qt.Orientation.Horizontal)
|
||||||
tabWidget = QTabWidget()
|
TabWidget = QTabWidget()
|
||||||
tabWidget.setMaximumHeight(150)
|
TabWidget.setMaximumHeight(150)
|
||||||
basicWidget = QWidget()
|
BasicWidget = QWidget()
|
||||||
basicLayout = QGridLayout(basicWidget)
|
BasicLayout = QGridLayout(BasicWidget)
|
||||||
basicLayout.setSpacing(4)
|
BasicLayout.setSpacing(4)
|
||||||
basicLayout.setContentsMargins(4, 4, 4, 4)
|
BasicLayout.setContentsMargins(4, 4, 4, 4)
|
||||||
basicLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
BasicLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
||||||
controlButtons = [
|
controlButtons = [
|
||||||
("如果 (if...)", "if then\n \nend"),
|
("如果 (if...)", "if then\n \nend"),
|
||||||
("再如果 (elseif...)", "elseif then\n "),
|
("再如果 (elseif...)", "elseif then\n "),
|
||||||
@@ -287,22 +287,22 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
("结束 (end)", "end"),
|
("结束 (end)", "end"),
|
||||||
("跳过 (pass)", "-- pass"),
|
("跳过 (pass)", "-- pass"),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(basicLayout, controlButtons, 0, 0, 3)
|
self.addButtonsToGrid(BasicLayout, controlButtons, 0, 0, 3)
|
||||||
assignButtons = [
|
assignButtons = [
|
||||||
("赋值 (=)", " = "),
|
("赋值 (=)", " = "),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(basicLayout, assignButtons, 1, 2, 3)
|
self.addButtonsToGrid(BasicLayout, assignButtons, 1, 2, 3)
|
||||||
tabWidget.addTab(basicWidget, "基本语法")
|
TabWidget.addTab(BasicWidget, "基本语法")
|
||||||
operatorWidget = QWidget()
|
OperatorWidget = QWidget()
|
||||||
operatorLayout = QGridLayout(operatorWidget)
|
OperatorLayout = QGridLayout(OperatorWidget)
|
||||||
operatorLayout.setSpacing(4)
|
OperatorLayout.setSpacing(4)
|
||||||
operatorLayout.setContentsMargins(4, 4, 4, 4)
|
OperatorLayout.setContentsMargins(4, 4, 4, 4)
|
||||||
operatorLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
OperatorLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
||||||
arithmeticButtons = [
|
arithmeticButtons = [
|
||||||
("加 (+)", " + "),
|
("加 (+)", " + "),
|
||||||
("减 (-)", " - "),
|
("减 (-)", " - "),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(operatorLayout, arithmeticButtons, 0, 0, 3)
|
self.addButtonsToGrid(OperatorLayout, arithmeticButtons, 0, 0, 3)
|
||||||
compareButtons = [
|
compareButtons = [
|
||||||
("等于 (==)", " == "),
|
("等于 (==)", " == "),
|
||||||
("不等于 (~=)", " ~= "),
|
("不等于 (~=)", " ~= "),
|
||||||
@@ -311,50 +311,50 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
("大于等于 (>=)", " >= "),
|
("大于等于 (>=)", " >= "),
|
||||||
("小于等于 (<=)", " <= "),
|
("小于等于 (<=)", " <= "),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(operatorLayout, compareButtons, 1, 0, 3)
|
self.addButtonsToGrid(OperatorLayout, compareButtons, 1, 0, 3)
|
||||||
logic_buttons = [
|
logic_buttons = [
|
||||||
("且 (and)", " and "),
|
("且 (and)", " and "),
|
||||||
("或 (or)", " or "),
|
("或 (or)", " or "),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(operatorLayout, logic_buttons, 2, 0, 3)
|
self.addButtonsToGrid(OperatorLayout, logic_buttons, 2, 0, 3)
|
||||||
tabWidget.addTab(operatorWidget, "运算符")
|
TabWidget.addTab(OperatorWidget, "运算符")
|
||||||
literalWidget = QWidget()
|
LiteralWidget = QWidget()
|
||||||
literalLayout = QGridLayout(literalWidget)
|
LiteralLayout = QGridLayout(LiteralWidget)
|
||||||
literalLayout.setSpacing(4)
|
LiteralLayout.setSpacing(4)
|
||||||
literalLayout.setContentsMargins(4, 4, 4, 4)
|
LiteralLayout.setContentsMargins(4, 4, 4, 4)
|
||||||
literalLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
LiteralLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
||||||
bool_buttons = [
|
bool_buttons = [
|
||||||
("真 (true)", "true"),
|
("真 (true)", "true"),
|
||||||
("假 (false)", "false"),
|
("假 (false)", "false"),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(literalLayout, bool_buttons, 0, 0, 3)
|
self.addButtonsToGrid(LiteralLayout, bool_buttons, 0, 0, 3)
|
||||||
dateTimeButtons = [
|
dateTimeButtons = [
|
||||||
("日期", 'date(2026, 1, 1)'),
|
("日期", 'date(2026, 1, 1)'),
|
||||||
("时间", 'time(0, 0)'),
|
("时间", 'time(0, 0)'),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(literalLayout, dateTimeButtons, 1, 0, 3)
|
self.addButtonsToGrid(LiteralLayout, dateTimeButtons, 1, 0, 3)
|
||||||
hintButtons = [
|
hintButtons = [
|
||||||
("字符串", '"请输入文本"'),
|
("字符串", '"请输入文本"'),
|
||||||
("数字", "123"),
|
("数字", "123"),
|
||||||
("注释", "-- 请输入注释"),
|
("注释", "-- 请输入注释"),
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(literalLayout, hintButtons, 2, 0, 3)
|
self.addButtonsToGrid(LiteralLayout, hintButtons, 2, 0, 3)
|
||||||
tabWidget.addTab(literalWidget, "字面量")
|
TabWidget.addTab(LiteralWidget, "字面量")
|
||||||
varWidget = QWidget()
|
VarWidget = QWidget()
|
||||||
varLayout = QGridLayout(varWidget)
|
VarLayout = QGridLayout(VarWidget)
|
||||||
varLayout.setSpacing(4)
|
VarLayout.setSpacing(4)
|
||||||
varLayout.setContentsMargins(4, 4, 4, 4)
|
VarLayout.setContentsMargins(4, 4, 4, 4)
|
||||||
varLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
VarLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
||||||
varButtons = [
|
varButtons = [
|
||||||
(display_name, name) for display_name, (name, _) in createAllVariablesTable().items()
|
(display_name, name) for display_name, (name, _) in createAllVariablesTable().items()
|
||||||
]
|
]
|
||||||
self.addButtonsToGrid(varLayout, varButtons, 0, 0, 3)
|
self.addButtonsToGrid(VarLayout, varButtons, 0, 0, 3)
|
||||||
tabWidget.addTab(varWidget, "变量")
|
TabWidget.addTab(VarWidget, "变量")
|
||||||
funcWidget = QWidget()
|
FuncWidget = QWidget()
|
||||||
funcLayout = QGridLayout(funcWidget)
|
FuncLayout = QGridLayout(FuncWidget)
|
||||||
funcLayout.setSpacing(4)
|
FuncLayout.setSpacing(4)
|
||||||
funcLayout.setContentsMargins(4, 4, 4, 4)
|
FuncLayout.setContentsMargins(4, 4, 4, 4)
|
||||||
funcLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
FuncLayout.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
||||||
funcButtons = [
|
funcButtons = [
|
||||||
("datenow()", "datenow()", "返回当前日期的 Unix 时间戳"),
|
("datenow()", "datenow()", "返回当前日期的 Unix 时间戳"),
|
||||||
("timenow()", "timenow()", "返回当前时间在一天中的分钟数"),
|
("timenow()", "timenow()", "返回当前时间在一天中的分钟数"),
|
||||||
@@ -362,22 +362,22 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
("timeadd(time, n)", "timeadd(, )", "时间偏移: timeadd(分钟数, 分钟数)"),
|
("timeadd(time, n)", "timeadd(, )", "时间偏移: timeadd(分钟数, 分钟数)"),
|
||||||
]
|
]
|
||||||
for i, (text, template, tooltip) in enumerate(funcButtons):
|
for i, (text, template, tooltip) in enumerate(funcButtons):
|
||||||
btn = QPushButton(text)
|
Btn = QPushButton(text)
|
||||||
btn.setProperty("template", template)
|
Btn.setProperty("template", template)
|
||||||
btn.clicked.connect(self.insertTemplate)
|
Btn.clicked.connect(self.insertTemplate)
|
||||||
btn.setFixedWidth(100)
|
Btn.setFixedWidth(100)
|
||||||
btn.setFixedHeight(25)
|
Btn.setFixedHeight(25)
|
||||||
btn.setToolTip(tooltip)
|
Btn.setToolTip(tooltip)
|
||||||
funcLayout.addWidget(btn, i // 2, i % 2)
|
FuncLayout.addWidget(Btn, i // 2, i % 2)
|
||||||
tabWidget.addTab(funcWidget, "工具函数")
|
TabWidget.addTab(FuncWidget, "工具函数")
|
||||||
mockPanel = self.createMockPanel()
|
MockPanel = self.createMockPanel()
|
||||||
mockPanel.setMinimumWidth(260)
|
MockPanel.setMinimumWidth(260)
|
||||||
splitter.addWidget(tabWidget)
|
Splitter.addWidget(TabWidget)
|
||||||
splitter.addWidget(mockPanel)
|
Splitter.addWidget(MockPanel)
|
||||||
splitter.setStretchFactor(0, 1)
|
Splitter.setStretchFactor(0, 1)
|
||||||
splitter.setStretchFactor(1, 1)
|
Splitter.setStretchFactor(1, 1)
|
||||||
splitter.setSizes([530, 530])
|
Splitter.setSizes([530, 530])
|
||||||
parent_layout.addWidget(splitter)
|
ParentLayout.addWidget(Splitter)
|
||||||
|
|
||||||
def addButtonsToGrid(
|
def addButtonsToGrid(
|
||||||
self,
|
self,
|
||||||
@@ -392,13 +392,13 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
row = start_row
|
row = start_row
|
||||||
|
|
||||||
for btn_text, template in buttons:
|
for btn_text, template in buttons:
|
||||||
btn = QPushButton(btn_text)
|
Btn = QPushButton(btn_text)
|
||||||
btn.setProperty("template", template)
|
Btn.setProperty("template", template)
|
||||||
btn.clicked.connect(self.insertTemplate)
|
Btn.clicked.connect(self.insertTemplate)
|
||||||
btn.setFixedWidth(100)
|
Btn.setFixedWidth(100)
|
||||||
btn.setFixedHeight(25)
|
Btn.setFixedHeight(25)
|
||||||
btn.setToolTip(f"插入: {template}")
|
Btn.setToolTip(f"插入: {template}")
|
||||||
grid_layout.addWidget(btn, row, col)
|
grid_layout.addWidget(Btn, row, col)
|
||||||
col += 1
|
col += 1
|
||||||
if col >= start_col + max_columns:
|
if col >= start_col + max_columns:
|
||||||
col = start_col
|
col = start_col
|
||||||
@@ -408,10 +408,10 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
self
|
self
|
||||||
) -> QGroupBox:
|
) -> QGroupBox:
|
||||||
|
|
||||||
group = QGroupBox("模拟目标数据")
|
Group = QGroupBox("模拟目标数据")
|
||||||
form = QFormLayout(group)
|
Form = QFormLayout(Group)
|
||||||
form.setSpacing(4)
|
Form.setSpacing(4)
|
||||||
form.setContentsMargins(5, 10, 5, 5)
|
Form.setContentsMargins(5, 10, 5, 5)
|
||||||
self._mockWidgets = {}
|
self._mockWidgets = {}
|
||||||
mockData = createMockTargetData()
|
mockData = createMockTargetData()
|
||||||
for name, var_type, key_path, display_name in createTargetVarDefs():
|
for name, var_type, key_path, display_name in createTargetVarDefs():
|
||||||
@@ -419,11 +419,11 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
for key in key_path:
|
for key in key_path:
|
||||||
d = d[key]
|
d = d[key]
|
||||||
default = d
|
default = d
|
||||||
widget = self.makeMockInput(var_type, default)
|
Widget = self.makeMockInput(var_type, default)
|
||||||
label = QLabel(f"{display_name}: {name}({var_type})")
|
Label = QLabel(f"{display_name}: {name}({var_type})")
|
||||||
form.addRow(label, widget)
|
Form.addRow(Label, Widget)
|
||||||
self._mockWidgets[name] = (widget, var_type, key_path)
|
self._mockWidgets[name] = (Widget, var_type, key_path)
|
||||||
return group
|
return Group
|
||||||
|
|
||||||
def makeMockInput(
|
def makeMockInput(
|
||||||
self,
|
self,
|
||||||
@@ -432,41 +432,41 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
) -> QWidget:
|
) -> QWidget:
|
||||||
|
|
||||||
if var_type == "String":
|
if var_type == "String":
|
||||||
w = QLineEdit()
|
W = QLineEdit()
|
||||||
w.setText(str(default))
|
W.setText(str(default))
|
||||||
return w
|
return W
|
||||||
if var_type == "Boolean":
|
if var_type == "Boolean":
|
||||||
w = QComboBox()
|
W = QComboBox()
|
||||||
w.addItems(["是", "否"])
|
W.addItems(["是", "否"])
|
||||||
w.setCurrentIndex(0 if default else 1)
|
W.setCurrentIndex(0 if default else 1)
|
||||||
return w
|
return W
|
||||||
if var_type == "Date":
|
if var_type == "Date":
|
||||||
w = QDateEdit()
|
W = QDateEdit()
|
||||||
w.setCalendarPopup(True)
|
W.setCalendarPopup(True)
|
||||||
w.setDisplayFormat("yyyy-MM-dd")
|
W.setDisplayFormat("yyyy-MM-dd")
|
||||||
w.setDate(QDate.fromString(str(default), "yyyy-MM-dd"))
|
W.setDate(QDate.fromString(str(default), "yyyy-MM-dd"))
|
||||||
return w
|
return W
|
||||||
if var_type == "Time":
|
if var_type == "Time":
|
||||||
w = QTimeEdit()
|
W = QTimeEdit()
|
||||||
w.setDisplayFormat("HH:mm")
|
W.setDisplayFormat("HH:mm")
|
||||||
w.setTime(QTime.fromString(str(default), "HH:mm"))
|
W.setTime(QTime.fromString(str(default), "HH:mm"))
|
||||||
return w
|
return W
|
||||||
if var_type == "Int":
|
if var_type == "Int":
|
||||||
w = QSpinBox()
|
W = QSpinBox()
|
||||||
w.setMinimum(-999999)
|
W.setMinimum(-999999)
|
||||||
w.setMaximum(999999)
|
W.setMaximum(999999)
|
||||||
w.setValue(int(default) if default else 0)
|
W.setValue(int(default) if default else 0)
|
||||||
return w
|
return W
|
||||||
if var_type == "Float":
|
if var_type == "Float":
|
||||||
w = QDoubleSpinBox()
|
W = QDoubleSpinBox()
|
||||||
w.setMinimum(-999999.0)
|
W.setMinimum(-999999.0)
|
||||||
w.setMaximum(999999.0)
|
W.setMaximum(999999.0)
|
||||||
w.setDecimals(2)
|
W.setDecimals(2)
|
||||||
w.setValue(float(default) if default else 0.0)
|
W.setValue(float(default) if default else 0.0)
|
||||||
return w
|
return W
|
||||||
w = QLineEdit()
|
W = QLineEdit()
|
||||||
w.setText(str(default))
|
W.setText(str(default))
|
||||||
return w
|
return W
|
||||||
|
|
||||||
def getMockData(
|
def getMockData(
|
||||||
self
|
self
|
||||||
@@ -541,45 +541,45 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.btnBox.accepted.connect(self.accept)
|
self.BtnBox.accepted.connect(self.accept)
|
||||||
self.btnBox.rejected.connect(self.reject)
|
self.BtnBox.rejected.connect(self.reject)
|
||||||
self.orchBtn.clicked.connect(self.onOpenOrchDialog)
|
self.OrchBtn.clicked.connect(self.onOpenOrchDialog)
|
||||||
self.debugBtn.clicked.connect(self.onDebugRun)
|
self.DebugBtn.clicked.connect(self.onDebugRun)
|
||||||
self.zoomInBtn.clicked.connect(self.onZoomIn)
|
self.ZoomInBtn.clicked.connect(self.onZoomIn)
|
||||||
self.zoomOutBtn.clicked.connect(self.onZoomOut)
|
self.ZoomOutBtn.clicked.connect(self.onZoomOut)
|
||||||
self.zoomResetBtn.clicked.connect(self.onZoomReset)
|
self.ZoomResetBtn.clicked.connect(self.onZoomReset)
|
||||||
self.copyBtn.clicked.connect(self.onCopy)
|
self.CopyBtn.clicked.connect(self.onCopy)
|
||||||
|
|
||||||
def getScript(
|
def getScript(
|
||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
return self.textEdit.toPlainText()
|
return self.TextEdit.toPlainText()
|
||||||
|
|
||||||
def updateFontSize(
|
def updateFontSize(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.textEdit.setStyleSheet(
|
self.TextEdit.setStyleSheet(
|
||||||
"QPlainTextEdit {"
|
"QPlainTextEdit {"
|
||||||
" font-family: 'Courier New', 'Consolas', monospace;"
|
" font-family: 'Courier New', 'Consolas', monospace;"
|
||||||
f" font-size: {self._fontSize}px;"
|
f" font-size: {self._fontSize}px;"
|
||||||
"}"
|
"}"
|
||||||
)
|
)
|
||||||
self.zoomLabel.setText(f"{self._fontSize}px")
|
self.ZoomLabel.setText(f"{self._fontSize}px")
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def insertTemplate(
|
def insertTemplate(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
btn = self.sender()
|
Btn = self.sender()
|
||||||
if not isinstance(btn, QPushButton):
|
if not isinstance(Btn, QPushButton):
|
||||||
return
|
return
|
||||||
template = btn.property("template")
|
template = Btn.property("template")
|
||||||
if not template:
|
if not template:
|
||||||
return
|
return
|
||||||
cursor = self.textEdit.textCursor()
|
cursor = self.TextEdit.textCursor()
|
||||||
cursor.insertText(template)
|
cursor.insertText(template)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
@@ -611,11 +611,11 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
clipboard = QApplication.clipboard()
|
Clipboard = QApplication.clipboard()
|
||||||
clipboard.setText(self.textEdit.toPlainText())
|
Clipboard.setText(self.TextEdit.toPlainText())
|
||||||
self.copyBtn.setEnabled(False)
|
self.CopyBtn.setEnabled(False)
|
||||||
QTimer.singleShot(2000, lambda: (
|
QTimer.singleShot(2000, lambda: (
|
||||||
self.copyBtn.setEnabled(True)
|
self.CopyBtn.setEnabled(True)
|
||||||
))
|
))
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
@@ -624,20 +624,20 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
):
|
):
|
||||||
|
|
||||||
from gui.ALAutoScriptOrchDialog import ALAutoScriptOrchDialog
|
from gui.ALAutoScriptOrchDialog import ALAutoScriptOrchDialog
|
||||||
dlg = ALAutoScriptOrchDialog(self)
|
Dlg = ALAutoScriptOrchDialog(self)
|
||||||
if dlg.exec() == QDialog.DialogCode.Accepted:
|
if Dlg.exec() == QDialog.DialogCode.Accepted:
|
||||||
script = dlg.getScript()
|
script = Dlg.getScript()
|
||||||
if script:
|
if script:
|
||||||
cursor = self.textEdit.textCursor()
|
cursor = self.TextEdit.textCursor()
|
||||||
cursor.insertText(script)
|
cursor.insertText(script)
|
||||||
dlg.deleteLater()
|
Dlg.deleteLater()
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onDebugRun(
|
def onDebugRun(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
script = self.textEdit.toPlainText().strip()
|
script = self.TextEdit.toPlainText().strip()
|
||||||
if not script:
|
if not script:
|
||||||
QMessageBox.warning(self, "提示", "脚本内容为空。")
|
QMessageBox.warning(self, "提示", "脚本内容为空。")
|
||||||
return
|
return
|
||||||
@@ -664,6 +664,6 @@ class ALAutoScriptEditDialog(QDialog):
|
|||||||
if not changes:
|
if not changes:
|
||||||
QMessageBox.information(self, "调试运行", "目标变量未发生变化。")
|
QMessageBox.information(self, "调试运行", "目标变量未发生变化。")
|
||||||
return
|
return
|
||||||
dlg = _DebugResultDialog(changes, self)
|
Dlg = _DebugResultDialog(changes, self)
|
||||||
dlg.exec()
|
Dlg.exec()
|
||||||
dlg.deleteLater()
|
Dlg.deleteLater()
|
||||||
|
|||||||
@@ -57,81 +57,81 @@ class ConditionalBlock(QGroupBox):
|
|||||||
"margin-top: 5px; padding-top: 5px; }"
|
"margin-top: 5px; padding-top: 5px; }"
|
||||||
)
|
)
|
||||||
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
|
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
|
||||||
mainLayout = QVBoxLayout(self)
|
MainLayout = QVBoxLayout(self)
|
||||||
mainLayout.setSpacing(6)
|
MainLayout.setSpacing(6)
|
||||||
mainLayout.setContentsMargins(8, 8, 8, 8)
|
MainLayout.setContentsMargins(8, 8, 8, 8)
|
||||||
headerLayout = QHBoxLayout()
|
HeaderLayout = QHBoxLayout()
|
||||||
headerLayout.setSpacing(8)
|
HeaderLayout.setSpacing(8)
|
||||||
self.typeCombo = QComboBox(self)
|
self.TypeCombo = QComboBox(self)
|
||||||
self.typeCombo.addItem("IF", "IF")
|
self.TypeCombo.addItem("IF", "IF")
|
||||||
self.typeCombo.addItem("ELSE IF", "ELSE IF")
|
self.TypeCombo.addItem("ELSE IF", "ELSE IF")
|
||||||
self.typeCombo.addItem("ELSE", "ELSE")
|
self.TypeCombo.addItem("ELSE", "ELSE")
|
||||||
self.typeCombo.setFixedHeight(25)
|
self.TypeCombo.setFixedHeight(25)
|
||||||
if self.blockIndex == 0:
|
if self.blockIndex == 0:
|
||||||
self.typeCombo.setEnabled(False)
|
self.TypeCombo.setEnabled(False)
|
||||||
headerLayout.addWidget(QLabel("类型:", self))
|
HeaderLayout.addWidget(QLabel("类型:", self))
|
||||||
headerLayout.addWidget(self.typeCombo)
|
HeaderLayout.addWidget(self.TypeCombo)
|
||||||
headerLayout.addStretch()
|
HeaderLayout.addStretch()
|
||||||
self.deleteBlockBtn = QPushButton("删除此块", self)
|
self.DeleteBlockBtn = QPushButton("删除此块", self)
|
||||||
self.deleteBlockBtn.setStyleSheet("color: red;")
|
self.DeleteBlockBtn.setStyleSheet("color: red;")
|
||||||
self.deleteBlockBtn.setFixedHeight(25)
|
self.DeleteBlockBtn.setFixedHeight(25)
|
||||||
headerLayout.addWidget(self.deleteBlockBtn)
|
HeaderLayout.addWidget(self.DeleteBlockBtn)
|
||||||
mainLayout.addLayout(headerLayout)
|
MainLayout.addLayout(HeaderLayout)
|
||||||
self.conditionWidget = QWidget(self)
|
self.ConditionWidget = QWidget(self)
|
||||||
self.conditionWidget.setSizePolicy(
|
self.ConditionWidget.setSizePolicy(
|
||||||
QSizePolicy.Preferred, QSizePolicy.Preferred
|
QSizePolicy.Preferred, QSizePolicy.Preferred
|
||||||
)
|
)
|
||||||
condLayout = QVBoxLayout(self.conditionWidget)
|
CondLayout = QVBoxLayout(self.ConditionWidget)
|
||||||
condLayout.setContentsMargins(4, 4, 4, 4)
|
CondLayout.setContentsMargins(4, 4, 4, 4)
|
||||||
condLayout.setSpacing(6)
|
CondLayout.setSpacing(6)
|
||||||
self.condRowsLayout = QVBoxLayout()
|
self.CondRowsLayout = QVBoxLayout()
|
||||||
self.condRowsLayout.setSpacing(4)
|
self.CondRowsLayout.setSpacing(4)
|
||||||
condLayout.addLayout(self.condRowsLayout)
|
CondLayout.addLayout(self.CondRowsLayout)
|
||||||
self.addCondBtn = QPushButton("+ 添加条件", self.conditionWidget)
|
self.AddCondBtn = QPushButton("+ 添加条件", self.ConditionWidget)
|
||||||
self.addCondBtn.setFixedHeight(25)
|
self.AddCondBtn.setFixedHeight(25)
|
||||||
condLayout.addWidget(self.addCondBtn)
|
CondLayout.addWidget(self.AddCondBtn)
|
||||||
mainLayout.addWidget(self.conditionWidget)
|
MainLayout.addWidget(self.ConditionWidget)
|
||||||
self.actionLabel = QLabel("执行步骤:", self)
|
self.ActionLabel = QLabel("执行步骤:", self)
|
||||||
self.actionLabel.setFixedHeight(25)
|
self.ActionLabel.setFixedHeight(25)
|
||||||
mainLayout.addWidget(self.actionLabel)
|
MainLayout.addWidget(self.ActionLabel)
|
||||||
self.actionsLayout = QVBoxLayout()
|
self.ActionsLayout = QVBoxLayout()
|
||||||
self.actionsLayout.setSpacing(4)
|
self.ActionsLayout.setSpacing(4)
|
||||||
mainLayout.addLayout(self.actionsLayout)
|
MainLayout.addLayout(self.ActionsLayout)
|
||||||
self.addActionBtn = QPushButton("+ 添加执行步骤", self)
|
self.AddActionBtn = QPushButton("+ 添加执行步骤", self)
|
||||||
self.addActionBtn.setFixedHeight(25)
|
self.AddActionBtn.setFixedHeight(25)
|
||||||
mainLayout.addWidget(self.addActionBtn)
|
MainLayout.addWidget(self.AddActionBtn)
|
||||||
self.setUpdatesEnabled(True)
|
self.setUpdatesEnabled(True)
|
||||||
|
|
||||||
def connectSignals(
|
def connectSignals(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.typeCombo.currentIndexChanged.connect(self.onTypeChanged)
|
self.TypeCombo.currentIndexChanged.connect(self.onTypeChanged)
|
||||||
self.addCondBtn.clicked.connect(self.addConditionRow)
|
self.AddCondBtn.clicked.connect(self.addConditionRow)
|
||||||
self.addActionBtn.clicked.connect(self.addActionStep)
|
self.AddActionBtn.clicked.connect(self.addActionStep)
|
||||||
|
|
||||||
def addInitialConditionRow(
|
def addInitialConditionRow(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
row = ConditionRowFrame(
|
Row = ConditionRowFrame(
|
||||||
self._varMgr, self.blockIndex,
|
self._varMgr, self.blockIndex,
|
||||||
isFirst=True, parent=self
|
isFirst=True, parent=self
|
||||||
)
|
)
|
||||||
self._conditionRows.append(row)
|
self._conditionRows.append(Row)
|
||||||
self.condRowsLayout.addWidget(row)
|
self.CondRowsLayout.addWidget(Row)
|
||||||
|
|
||||||
def addConditionRow(
|
def addConditionRow(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
row = ConditionRowFrame(
|
Row = ConditionRowFrame(
|
||||||
self._varMgr, self.blockIndex,
|
self._varMgr, self.blockIndex,
|
||||||
isFirst=False, parent=self
|
isFirst=False, parent=self
|
||||||
)
|
)
|
||||||
row.deleteBtn.clicked.connect(lambda: self.removeConditionRow(row))
|
Row.DeleteBtn.clicked.connect(lambda: self.removeConditionRow(Row))
|
||||||
self._conditionRows.append(row)
|
self._conditionRows.append(Row)
|
||||||
self.condRowsLayout.addWidget(row)
|
self.CondRowsLayout.addWidget(Row)
|
||||||
|
|
||||||
def removeConditionRow(
|
def removeConditionRow(
|
||||||
self,
|
self,
|
||||||
@@ -140,7 +140,7 @@ class ConditionalBlock(QGroupBox):
|
|||||||
|
|
||||||
if row in self._conditionRows and len(self._conditionRows) > 1:
|
if row in self._conditionRows and len(self._conditionRows) > 1:
|
||||||
self._conditionRows.remove(row)
|
self._conditionRows.remove(row)
|
||||||
self.condRowsLayout.removeWidget(row)
|
self.CondRowsLayout.removeWidget(row)
|
||||||
row.hide()
|
row.hide()
|
||||||
row.deleteLater()
|
row.deleteLater()
|
||||||
|
|
||||||
@@ -148,10 +148,10 @@ class ConditionalBlock(QGroupBox):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
step = ActionStepFrame(self._varMgr, self.blockIndex, parent=self)
|
Step = ActionStepFrame(self._varMgr, self.blockIndex, parent=self)
|
||||||
step.deleteBtn.clicked.connect(lambda: self.removeActionStep(step))
|
Step.DeleteBtn.clicked.connect(lambda: self.removeActionStep(Step))
|
||||||
self._actionWidgets.append(step)
|
self._actionWidgets.append(Step)
|
||||||
self.actionsLayout.addWidget(step)
|
self.ActionsLayout.addWidget(Step)
|
||||||
|
|
||||||
def removeActionStep(
|
def removeActionStep(
|
||||||
self,
|
self,
|
||||||
@@ -160,7 +160,7 @@ class ConditionalBlock(QGroupBox):
|
|||||||
|
|
||||||
if step in self._actionWidgets:
|
if step in self._actionWidgets:
|
||||||
self._actionWidgets.remove(step)
|
self._actionWidgets.remove(step)
|
||||||
self.actionsLayout.removeWidget(step)
|
self.ActionsLayout.removeWidget(step)
|
||||||
step.hide()
|
step.hide()
|
||||||
step.deleteLater()
|
step.deleteLater()
|
||||||
|
|
||||||
@@ -168,7 +168,7 @@ class ConditionalBlock(QGroupBox):
|
|||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
return self.typeCombo.currentData()
|
return self.TypeCombo.currentData()
|
||||||
|
|
||||||
def getConditionRows(
|
def getConditionRows(
|
||||||
self
|
self
|
||||||
@@ -239,18 +239,18 @@ class ConditionalBlock(QGroupBox):
|
|||||||
prevType: str | None
|
prevType: str | None
|
||||||
):
|
):
|
||||||
|
|
||||||
model = self.typeCombo.model()
|
model = self.TypeCombo.model()
|
||||||
if model is None:
|
if model is None:
|
||||||
return
|
return
|
||||||
for data in ("ELSE IF", "ELSE"):
|
for data in ("ELSE IF", "ELSE"):
|
||||||
idx = self.typeCombo.findData(data)
|
idx = self.TypeCombo.findData(data)
|
||||||
if idx < 0:
|
if idx < 0:
|
||||||
continue
|
continue
|
||||||
item = model.item(idx)
|
item = model.item(idx)
|
||||||
shouldEnable = prevType != "ELSE"
|
shouldEnable = prevType != "ELSE"
|
||||||
item.setEnabled(shouldEnable)
|
item.setEnabled(shouldEnable)
|
||||||
if prevType == "ELSE" and self.typeCombo.currentData() in ("ELSE IF", "ELSE"):
|
if prevType == "ELSE" and self.TypeCombo.currentData() in ("ELSE IF", "ELSE"):
|
||||||
self.typeCombo.setCurrentIndex(0)
|
self.TypeCombo.setCurrentIndex(0)
|
||||||
|
|
||||||
@Slot(int)
|
@Slot(int)
|
||||||
def onTypeChanged(
|
def onTypeChanged(
|
||||||
@@ -258,8 +258,8 @@ class ConditionalBlock(QGroupBox):
|
|||||||
_idx
|
_idx
|
||||||
):
|
):
|
||||||
|
|
||||||
isCond = self.typeCombo.currentData() in ("IF", "ELSE IF")
|
isCond = self.TypeCombo.currentData() in ("IF", "ELSE IF")
|
||||||
self.conditionWidget.setVisible(isCond)
|
self.ConditionWidget.setVisible(isCond)
|
||||||
self.actionLabel.setText(
|
self.ActionLabel.setText(
|
||||||
"执行步骤:" if isCond else "ELSE 执行步骤:"
|
"执行步骤:" if isCond else "ELSE 执行步骤:"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class ALAutoScriptOrchDialog(QDialog):
|
|||||||
self.setupUi()
|
self.setupUi()
|
||||||
self.connectSignals()
|
self.connectSignals()
|
||||||
self.addBlock()
|
self.addBlock()
|
||||||
self.scrollLayout.addStretch()
|
self.ScrollLayout.addStretch()
|
||||||
|
|
||||||
def setupUi(
|
def setupUi(
|
||||||
self
|
self
|
||||||
@@ -49,33 +49,33 @@ class ALAutoScriptOrchDialog(QDialog):
|
|||||||
self.setWindowTitle("AutoScript 指令编排 - AutoLibrary")
|
self.setWindowTitle("AutoScript 指令编排 - AutoLibrary")
|
||||||
self.setMinimumSize(640, 600)
|
self.setMinimumSize(640, 600)
|
||||||
self.setModal(True)
|
self.setModal(True)
|
||||||
mainLayout = QVBoxLayout(self)
|
MainLayout = QVBoxLayout(self)
|
||||||
scroll = QScrollArea()
|
Scroll = QScrollArea()
|
||||||
scroll.setWidgetResizable(True)
|
Scroll.setWidgetResizable(True)
|
||||||
scroll.setFrameShape(QFrame.NoFrame)
|
Scroll.setFrameShape(QFrame.NoFrame)
|
||||||
scrollContent = QWidget()
|
ScrollContent = QWidget()
|
||||||
self.scrollLayout = QVBoxLayout(scrollContent)
|
self.ScrollLayout = QVBoxLayout(ScrollContent)
|
||||||
self.scrollLayout.setSpacing(5)
|
self.ScrollLayout.setSpacing(5)
|
||||||
scroll.setWidget(scrollContent)
|
Scroll.setWidget(ScrollContent)
|
||||||
mainLayout.addWidget(scroll)
|
MainLayout.addWidget(Scroll)
|
||||||
self.addBlockBtn = QPushButton("+ 添加判断块")
|
self.AddBlockBtn = QPushButton("+ 添加判断块")
|
||||||
self.addBlockBtn.setFixedHeight(25)
|
self.AddBlockBtn.setFixedHeight(25)
|
||||||
mainLayout.addWidget(self.addBlockBtn)
|
MainLayout.addWidget(self.AddBlockBtn)
|
||||||
self.btnBox = QDialogButtonBox(
|
self.BtnBox = QDialogButtonBox(
|
||||||
QDialogButtonBox.StandardButton.Ok |
|
QDialogButtonBox.StandardButton.Ok |
|
||||||
QDialogButtonBox.StandardButton.Cancel
|
QDialogButtonBox.StandardButton.Cancel
|
||||||
)
|
)
|
||||||
self.btnBox.button(QDialogButtonBox.StandardButton.Ok).setText("确定")
|
self.BtnBox.button(QDialogButtonBox.StandardButton.Ok).setText("确定")
|
||||||
self.btnBox.button(QDialogButtonBox.StandardButton.Cancel).setText("取消")
|
self.BtnBox.button(QDialogButtonBox.StandardButton.Cancel).setText("取消")
|
||||||
mainLayout.addWidget(self.btnBox)
|
MainLayout.addWidget(self.BtnBox)
|
||||||
|
|
||||||
def connectSignals(
|
def connectSignals(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.btnBox.accepted.connect(self.onAccept)
|
self.BtnBox.accepted.connect(self.onAccept)
|
||||||
self.btnBox.rejected.connect(self.reject)
|
self.BtnBox.rejected.connect(self.reject)
|
||||||
self.addBlockBtn.clicked.connect(self.addBlock)
|
self.AddBlockBtn.clicked.connect(self.addBlock)
|
||||||
|
|
||||||
def updateBlockTypeRestrictions(
|
def updateBlockTypeRestrictions(
|
||||||
self
|
self
|
||||||
@@ -90,24 +90,24 @@ class ALAutoScriptOrchDialog(QDialog):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
block = ConditionalBlock(
|
Block = ConditionalBlock(
|
||||||
len(self._blocks), self._varMgr, parent=self
|
len(self._blocks), self._varMgr, parent=self
|
||||||
)
|
)
|
||||||
block.deleteBlockBtn.clicked.connect(lambda: self.removeBlock(block))
|
Block.DeleteBlockBtn.clicked.connect(lambda: self.removeBlock(Block))
|
||||||
block.typeCombo.currentIndexChanged.connect(self.updateBlockTypeRestrictions)
|
Block.TypeCombo.currentIndexChanged.connect(self.updateBlockTypeRestrictions)
|
||||||
block.addActionStep()
|
Block.addActionStep()
|
||||||
self._blocks.append(block)
|
self._blocks.append(Block)
|
||||||
self.updateBlockTypeRestrictions()
|
self.updateBlockTypeRestrictions()
|
||||||
if self.scrollLayout.count() > 0:
|
if self.ScrollLayout.count() > 0:
|
||||||
lastItem = self.scrollLayout.itemAt(
|
lastItem = self.ScrollLayout.itemAt(
|
||||||
self.scrollLayout.count() - 1
|
self.ScrollLayout.count() - 1
|
||||||
)
|
)
|
||||||
if lastItem and lastItem.spacerItem():
|
if lastItem and lastItem.spacerItem():
|
||||||
self.scrollLayout.insertWidget(
|
self.ScrollLayout.insertWidget(
|
||||||
self.scrollLayout.count() - 1, block
|
self.ScrollLayout.count() - 1, Block
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
self.scrollLayout.addWidget(block)
|
self.ScrollLayout.addWidget(Block)
|
||||||
|
|
||||||
def removeBlock(
|
def removeBlock(
|
||||||
self,
|
self,
|
||||||
@@ -119,16 +119,16 @@ class ALAutoScriptOrchDialog(QDialog):
|
|||||||
return
|
return
|
||||||
if block in self._blocks:
|
if block in self._blocks:
|
||||||
self._blocks.remove(block)
|
self._blocks.remove(block)
|
||||||
self.scrollLayout.removeWidget(block)
|
self.ScrollLayout.removeWidget(block)
|
||||||
block.hide()
|
block.hide()
|
||||||
block.deleteLater()
|
block.deleteLater()
|
||||||
for i, blk in enumerate(self._blocks):
|
for i, blk in enumerate(self._blocks):
|
||||||
blk.blockIndex = i
|
blk.blockIndex = i
|
||||||
if i == 0:
|
if i == 0:
|
||||||
blk.typeCombo.setEnabled(False)
|
blk.TypeCombo.setEnabled(False)
|
||||||
blk.typeCombo.setCurrentIndex(0)
|
blk.TypeCombo.setCurrentIndex(0)
|
||||||
else:
|
else:
|
||||||
blk.typeCombo.setEnabled(True)
|
blk.TypeCombo.setEnabled(True)
|
||||||
blk.refreshVarCombos()
|
blk.refreshVarCombos()
|
||||||
self.updateBlockTypeRestrictions()
|
self.updateBlockTypeRestrictions()
|
||||||
|
|
||||||
|
|||||||
@@ -110,39 +110,39 @@ class _DateInputContainer(QWidget):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
layout = QHBoxLayout(self)
|
Layout = QHBoxLayout(self)
|
||||||
layout.setContentsMargins(0, 0, 0, 0)
|
Layout.setContentsMargins(0, 0, 0, 0)
|
||||||
layout.setSpacing(4)
|
Layout.setSpacing(4)
|
||||||
self._modeCombo = QComboBox(self)
|
self._ModeCombo = QComboBox(self)
|
||||||
self._modeCombo.addItem("相对日期", "relative")
|
self._ModeCombo.addItem("相对日期", "relative")
|
||||||
self._modeCombo.addItem("绝对日期", "absolute")
|
self._ModeCombo.addItem("绝对日期", "absolute")
|
||||||
self._modeCombo.setFixedHeight(25)
|
self._ModeCombo.setFixedHeight(25)
|
||||||
self._stack = QStackedWidget(self)
|
self._Stack = QStackedWidget(self)
|
||||||
self._relCombo = QComboBox(self)
|
self._RelCombo = QComboBox(self)
|
||||||
for display, data in DATE_OPTIONS:
|
for display, data in DATE_OPTIONS:
|
||||||
self._relCombo.addItem(display, data)
|
self._RelCombo.addItem(display, data)
|
||||||
self._relCombo.setFixedHeight(25)
|
self._RelCombo.setFixedHeight(25)
|
||||||
self._stack.addWidget(self._relCombo)
|
self._Stack.addWidget(self._RelCombo)
|
||||||
self._dateEdit = QDateEdit(self)
|
self._DateEdit = QDateEdit(self)
|
||||||
self._dateEdit.setDisplayFormat("yyyy-MM-dd")
|
self._DateEdit.setDisplayFormat("yyyy-MM-dd")
|
||||||
self._dateEdit.setCalendarPopup(True)
|
self._DateEdit.setCalendarPopup(True)
|
||||||
self._dateEdit.setFixedHeight(25)
|
self._DateEdit.setFixedHeight(25)
|
||||||
self._stack.addWidget(self._dateEdit)
|
self._Stack.addWidget(self._DateEdit)
|
||||||
self._modeCombo.currentIndexChanged.connect(
|
self._ModeCombo.currentIndexChanged.connect(
|
||||||
lambda i: self._stack.setCurrentIndex(i)
|
lambda i: self._Stack.setCurrentIndex(i)
|
||||||
)
|
)
|
||||||
layout.addWidget(self._modeCombo)
|
Layout.addWidget(self._ModeCombo)
|
||||||
layout.addWidget(self._stack)
|
Layout.addWidget(self._Stack)
|
||||||
layout.addStretch()
|
Layout.addStretch()
|
||||||
|
|
||||||
def getValue(
|
def getValue(
|
||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
mode = self._modeCombo.currentData()
|
mode = self._ModeCombo.currentData()
|
||||||
if mode == "relative":
|
if mode == "relative":
|
||||||
return self._relCombo.currentText()
|
return self._RelCombo.currentText()
|
||||||
return self._dateEdit.date().toString("yyyy-MM-dd")
|
return self._DateEdit.date().toString("yyyy-MM-dd")
|
||||||
|
|
||||||
|
|
||||||
class _TimeInputContainer(QWidget):
|
class _TimeInputContainer(QWidget):
|
||||||
@@ -153,19 +153,19 @@ class _TimeInputContainer(QWidget):
|
|||||||
):
|
):
|
||||||
|
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self._timeEdit = QTimeEdit(self)
|
self._TimeEdit = QTimeEdit(self)
|
||||||
self._timeEdit.setDisplayFormat("HH:mm")
|
self._TimeEdit.setDisplayFormat("HH:mm")
|
||||||
self._timeEdit.setFixedHeight(25)
|
self._TimeEdit.setFixedHeight(25)
|
||||||
|
|
||||||
layout = QHBoxLayout(self)
|
Layout = QHBoxLayout(self)
|
||||||
layout.setContentsMargins(0, 0, 0, 0)
|
Layout.setContentsMargins(0, 0, 0, 0)
|
||||||
layout.addWidget(self._timeEdit)
|
Layout.addWidget(self._TimeEdit)
|
||||||
|
|
||||||
def getValue(
|
def getValue(
|
||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
return self._timeEdit.time().toString("HH:mm")
|
return self._TimeEdit.time().toString("HH:mm")
|
||||||
|
|
||||||
|
|
||||||
class _DateOffsetContainer(QWidget):
|
class _DateOffsetContainer(QWidget):
|
||||||
@@ -176,20 +176,20 @@ class _DateOffsetContainer(QWidget):
|
|||||||
):
|
):
|
||||||
|
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self._spinBox = QSpinBox(self)
|
self._SpinBox = QSpinBox(self)
|
||||||
self._spinBox.setRange(0, 99999)
|
self._SpinBox.setRange(0, 99999)
|
||||||
self._spinBox.setFixedHeight(25)
|
self._SpinBox.setFixedHeight(25)
|
||||||
self._unitCombo = QComboBox(self)
|
self._UnitCombo = QComboBox(self)
|
||||||
for display, data in DATE_OFFSET_OPTIONS:
|
for display, data in DATE_OFFSET_OPTIONS:
|
||||||
self._unitCombo.addItem(display, data)
|
self._UnitCombo.addItem(display, data)
|
||||||
self._unitCombo.setFixedHeight(25)
|
self._UnitCombo.setFixedHeight(25)
|
||||||
|
|
||||||
layout = QHBoxLayout(self)
|
Layout = QHBoxLayout(self)
|
||||||
layout.setContentsMargins(0, 0, 0, 0)
|
Layout.setContentsMargins(0, 0, 0, 0)
|
||||||
layout.setSpacing(4)
|
Layout.setSpacing(4)
|
||||||
layout.addWidget(self._spinBox)
|
Layout.addWidget(self._SpinBox)
|
||||||
layout.addWidget(self._unitCombo)
|
Layout.addWidget(self._UnitCombo)
|
||||||
layout.addStretch()
|
Layout.addStretch()
|
||||||
|
|
||||||
def getValue(
|
def getValue(
|
||||||
self
|
self
|
||||||
@@ -201,8 +201,8 @@ class _DateOffsetContainer(QWidget):
|
|||||||
self
|
self
|
||||||
) -> int:
|
) -> int:
|
||||||
|
|
||||||
val = self._spinBox.value()
|
val = self._SpinBox.value()
|
||||||
unit = self._unitCombo.currentData()
|
unit = self._UnitCombo.currentData()
|
||||||
if unit == "weeks":
|
if unit == "weeks":
|
||||||
return val*7
|
return val*7
|
||||||
if unit == "months":
|
if unit == "months":
|
||||||
@@ -220,14 +220,14 @@ class _TimeOffsetContainer(QWidget):
|
|||||||
):
|
):
|
||||||
|
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self._spinBox = QSpinBox(self)
|
self._SpinBox = QSpinBox(self)
|
||||||
self._spinBox.setRange(0, 99999)
|
self._SpinBox.setRange(0, 99999)
|
||||||
self._spinBox.setSuffix(" 小时")
|
self._SpinBox.setSuffix(" 小时")
|
||||||
self._spinBox.setFixedHeight(25)
|
self._SpinBox.setFixedHeight(25)
|
||||||
|
|
||||||
layout = QHBoxLayout(self)
|
Layout = QHBoxLayout(self)
|
||||||
layout.setContentsMargins(0, 0, 0, 0)
|
Layout.setContentsMargins(0, 0, 0, 0)
|
||||||
layout.addWidget(self._spinBox)
|
Layout.addWidget(self._SpinBox)
|
||||||
|
|
||||||
def getValue(
|
def getValue(
|
||||||
self
|
self
|
||||||
@@ -239,7 +239,7 @@ class _TimeOffsetContainer(QWidget):
|
|||||||
self
|
self
|
||||||
) -> int:
|
) -> int:
|
||||||
|
|
||||||
return self._spinBox.value()
|
return self._SpinBox.value()
|
||||||
|
|
||||||
|
|
||||||
class VariableManager(QObject):
|
class VariableManager(QObject):
|
||||||
@@ -364,11 +364,11 @@ def makeVarRefCombo(
|
|||||||
parent: QWidget = None
|
parent: QWidget = None
|
||||||
) -> QComboBox:
|
) -> QComboBox:
|
||||||
|
|
||||||
cb = QComboBox(parent)
|
Cb = QComboBox(parent)
|
||||||
cb.setFixedHeight(25)
|
Cb.setFixedHeight(25)
|
||||||
cb.setMinimumWidth(120)
|
Cb.setMinimumWidth(120)
|
||||||
cb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
Cb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
||||||
return cb
|
return Cb
|
||||||
|
|
||||||
def makeComboWidget(
|
def makeComboWidget(
|
||||||
items,
|
items,
|
||||||
@@ -376,12 +376,12 @@ def makeComboWidget(
|
|||||||
parent: QWidget = None
|
parent: QWidget = None
|
||||||
) -> QComboBox:
|
) -> QComboBox:
|
||||||
|
|
||||||
cb = QComboBox(parent)
|
Cb = QComboBox(parent)
|
||||||
for display, data in items:
|
for display, data in items:
|
||||||
cb.addItem(display, data)
|
Cb.addItem(display, data)
|
||||||
cb.setFixedHeight(25)
|
Cb.setFixedHeight(25)
|
||||||
cb.setMinimumWidth(min_width)
|
Cb.setMinimumWidth(min_width)
|
||||||
return cb
|
return Cb
|
||||||
|
|
||||||
def makeLabel(
|
def makeLabel(
|
||||||
text: str,
|
text: str,
|
||||||
@@ -389,11 +389,11 @@ def makeLabel(
|
|||||||
width: int = None
|
width: int = None
|
||||||
) -> QLabel:
|
) -> QLabel:
|
||||||
|
|
||||||
lbl = QLabel(text, parent)
|
Lbl = QLabel(text, parent)
|
||||||
lbl.setFixedHeight(25)
|
Lbl.setFixedHeight(25)
|
||||||
if width:
|
if width:
|
||||||
lbl.setFixedWidth(width)
|
Lbl.setFixedWidth(width)
|
||||||
return lbl
|
return Lbl
|
||||||
|
|
||||||
def getValueFromWidget(
|
def getValueFromWidget(
|
||||||
w: QWidget
|
w: QWidget
|
||||||
|
|||||||
@@ -66,42 +66,42 @@ class ConditionRowFrame(QFrame):
|
|||||||
self.setFrameShape(QFrame.StyledPanel)
|
self.setFrameShape(QFrame.StyledPanel)
|
||||||
self.setFrameShadow(QFrame.Raised)
|
self.setFrameShadow(QFrame.Raised)
|
||||||
self.setFixedHeight(32)
|
self.setFixedHeight(32)
|
||||||
layout = QHBoxLayout(self)
|
Layout = QHBoxLayout(self)
|
||||||
layout.setContentsMargins(2, 2, 2, 2)
|
Layout.setContentsMargins(2, 2, 2, 2)
|
||||||
layout.setSpacing(4)
|
Layout.setSpacing(4)
|
||||||
if self._isFirst:
|
if self._isFirst:
|
||||||
self.logicCombo = None
|
self.LogicCombo = None
|
||||||
else:
|
else:
|
||||||
self.logicCombo = makeComboWidget(LOGIC_OPTIONS, min_width=110, parent=self)
|
self.LogicCombo = makeComboWidget(LOGIC_OPTIONS, min_width=110, parent=self)
|
||||||
layout.addWidget(self.logicCombo)
|
Layout.addWidget(self.LogicCombo)
|
||||||
self.leftVarCombo = QComboBox(self)
|
self.LeftVarCombo = QComboBox(self)
|
||||||
self.leftVarCombo.setFixedHeight(25)
|
self.LeftVarCombo.setFixedHeight(25)
|
||||||
self.leftVarCombo.setMinimumWidth(120)
|
self.LeftVarCombo.setMinimumWidth(120)
|
||||||
self.leftVarCombo.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
self.LeftVarCombo.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
||||||
self.populateLeftVarCombo()
|
self.populateLeftVarCombo()
|
||||||
layout.addWidget(self.leftVarCombo)
|
Layout.addWidget(self.LeftVarCombo)
|
||||||
self.opCombo = makeComboWidget(COMPARE_OPTIONS, min_width=80, parent=self)
|
self.OpCombo = makeComboWidget(COMPARE_OPTIONS, min_width=80, parent=self)
|
||||||
layout.addWidget(self.opCombo)
|
Layout.addWidget(self.OpCombo)
|
||||||
self._compTypeCombo = makeComboWidget([
|
self._CompTypeCombo = makeComboWidget([
|
||||||
("特定值", "literal"),
|
("特定值", "literal"),
|
||||||
("变量", "variable"),
|
("变量", "variable"),
|
||||||
], min_width=70, parent=self)
|
], min_width=70, parent=self)
|
||||||
layout.addWidget(self._compTypeCombo)
|
Layout.addWidget(self._CompTypeCombo)
|
||||||
self.rhsStack = QStackedWidget(self)
|
self.RhsStack = QStackedWidget(self)
|
||||||
self.rhsStack.setFixedHeight(25)
|
self.RhsStack.setFixedHeight(25)
|
||||||
self.initLiteralStack()
|
self.initLiteralStack()
|
||||||
self.rhsVarCombo = makeVarRefCombo(self)
|
self.RhsVarCombo = makeVarRefCombo(self)
|
||||||
self.rhsStack.addWidget(self.rhsVarCombo)
|
self.RhsStack.addWidget(self.RhsVarCombo)
|
||||||
self.rhsStack.setCurrentIndex(0)
|
self.RhsStack.setCurrentIndex(0)
|
||||||
layout.addWidget(self.rhsStack)
|
Layout.addWidget(self.RhsStack)
|
||||||
if not self._isFirst:
|
if not self._isFirst:
|
||||||
self.deleteBtn = QPushButton("×", self)
|
self.DeleteBtn = QPushButton("×", self)
|
||||||
self.deleteBtn.setFixedSize(25, 25)
|
self.DeleteBtn.setFixedSize(25, 25)
|
||||||
self.deleteBtn.setStyleSheet("color: red; font-weight: bold;")
|
self.DeleteBtn.setStyleSheet("color: red; font-weight: bold;")
|
||||||
layout.addWidget(self.deleteBtn)
|
Layout.addWidget(self.DeleteBtn)
|
||||||
else:
|
else:
|
||||||
self.deleteBtn = None
|
self.DeleteBtn = None
|
||||||
layout.addStretch()
|
Layout.addStretch()
|
||||||
self.setUpdatesEnabled(True)
|
self.setUpdatesEnabled(True)
|
||||||
|
|
||||||
def populateLeftVarCombo(
|
def populateLeftVarCombo(
|
||||||
@@ -111,53 +111,53 @@ class ConditionRowFrame(QFrame):
|
|||||||
wasBool = self._isBoolMode
|
wasBool = self._isBoolMode
|
||||||
boolName = None
|
boolName = None
|
||||||
if wasBool:
|
if wasBool:
|
||||||
data = self.leftVarCombo.currentData()
|
data = self.LeftVarCombo.currentData()
|
||||||
if data:
|
if data:
|
||||||
boolName = data[0]
|
boolName = data[0]
|
||||||
self._varMgr.populateCombo(self.leftVarCombo)
|
self._varMgr.populateCombo(self.LeftVarCombo)
|
||||||
# Append boolean literal sentinels at the end
|
# Append boolean literal sentinels at the end
|
||||||
self.leftVarCombo.insertSeparator(self.leftVarCombo.count())
|
self.LeftVarCombo.insertSeparator(self.LeftVarCombo.count())
|
||||||
self.leftVarCombo.addItem("true", ("true", "Boolean"))
|
self.LeftVarCombo.addItem("true", ("true", "Boolean"))
|
||||||
self.leftVarCombo.addItem("false", ("false", "Boolean"))
|
self.LeftVarCombo.addItem("false", ("false", "Boolean"))
|
||||||
if wasBool and boolName:
|
if wasBool and boolName:
|
||||||
for ci in range(self.leftVarCombo.count()):
|
for ci in range(self.LeftVarCombo.count()):
|
||||||
d = self.leftVarCombo.itemData(ci)
|
d = self.LeftVarCombo.itemData(ci)
|
||||||
if d and d[0] == boolName:
|
if d and d[0] == boolName:
|
||||||
self.leftVarCombo.setCurrentIndex(ci)
|
self.LeftVarCombo.setCurrentIndex(ci)
|
||||||
break
|
break
|
||||||
|
|
||||||
def populateRHSVarCombo(
|
def populateRHSVarCombo(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self._varMgr.populateCombo(self.rhsVarCombo)
|
self._varMgr.populateCombo(self.RhsVarCombo)
|
||||||
|
|
||||||
def initLiteralStack(
|
def initLiteralStack(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.literalStack = QStackedWidget(self)
|
self.LiteralStack = QStackedWidget(self)
|
||||||
self.literalStack.setFixedHeight(25)
|
self.LiteralStack.setFixedHeight(25)
|
||||||
self._literalWidgets = {}
|
self._literalWidgets = {}
|
||||||
for vt in getTypeOrder():
|
for vt in getTypeOrder():
|
||||||
w = makeValueWidget(vt, self.literalStack)
|
W = makeValueWidget(vt, self.LiteralStack)
|
||||||
self._literalWidgets[vt] = w
|
self._literalWidgets[vt] = W
|
||||||
self.literalStack.addWidget(w)
|
self.LiteralStack.addWidget(W)
|
||||||
self.literalStack.setCurrentWidget(self._literalWidgets.get("String"))
|
self.LiteralStack.setCurrentWidget(self._literalWidgets.get("String"))
|
||||||
self.rhsStack.addWidget(self.literalStack)
|
self.RhsStack.addWidget(self.LiteralStack)
|
||||||
|
|
||||||
def connectSignals(
|
def connectSignals(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.leftVarCombo.currentIndexChanged.connect(self.onLeftVarChanged)
|
self.LeftVarCombo.currentIndexChanged.connect(self.onLeftVarChanged)
|
||||||
self._compTypeCombo.currentIndexChanged.connect(self.onCompTypeChanged)
|
self._CompTypeCombo.currentIndexChanged.connect(self.onCompTypeChanged)
|
||||||
|
|
||||||
def getLogic(
|
def getLogic(
|
||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
return self.logicCombo.currentData() if self.logicCombo else ""
|
return self.LogicCombo.currentData() if self.LogicCombo else ""
|
||||||
|
|
||||||
def updateRHSLiteralWidget(
|
def updateRHSLiteralWidget(
|
||||||
self,
|
self,
|
||||||
@@ -166,13 +166,13 @@ class ConditionRowFrame(QFrame):
|
|||||||
|
|
||||||
if vartype not in self._literalWidgets:
|
if vartype not in self._literalWidgets:
|
||||||
vartype = "String"
|
vartype = "String"
|
||||||
self.literalStack.setCurrentWidget(self._literalWidgets[vartype])
|
self.LiteralStack.setCurrentWidget(self._literalWidgets[vartype])
|
||||||
|
|
||||||
def toScript(
|
def toScript(
|
||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
data = self.leftVarCombo.currentData()
|
data = self.LeftVarCombo.currentData()
|
||||||
if self._isBoolMode and data:
|
if self._isBoolMode and data:
|
||||||
return data[0]
|
return data[0]
|
||||||
if not data:
|
if not data:
|
||||||
@@ -183,12 +183,12 @@ class ConditionRowFrame(QFrame):
|
|||||||
name = "datenow()"
|
name = "datenow()"
|
||||||
elif name == "CURRENT_TIME":
|
elif name == "CURRENT_TIME":
|
||||||
name = "timenow()"
|
name = "timenow()"
|
||||||
opSym = self.opCombo.currentData()
|
opSym = self.OpCombo.currentData()
|
||||||
if self._rawRhsExpr:
|
if self._rawRhsExpr:
|
||||||
return f"{name} {opSym} {self._rawRhsExpr}"
|
return f"{name} {opSym} {self._rawRhsExpr}"
|
||||||
isVarRef = (self._compTypeCombo.currentData() == "variable")
|
isVarRef = (self._CompTypeCombo.currentData() == "variable")
|
||||||
if isVarRef:
|
if isVarRef:
|
||||||
rd = self.rhsVarCombo.currentData()
|
rd = self.RhsVarCombo.currentData()
|
||||||
if rd:
|
if rd:
|
||||||
rhsName = rd[0]
|
rhsName = rd[0]
|
||||||
if rhsName == "CURRENT_DATE":
|
if rhsName == "CURRENT_DATE":
|
||||||
@@ -196,7 +196,7 @@ class ConditionRowFrame(QFrame):
|
|||||||
elif rhsName == "CURRENT_TIME":
|
elif rhsName == "CURRENT_TIME":
|
||||||
rhsName = "timenow()"
|
rhsName = "timenow()"
|
||||||
return f"{name} {opSym} {rhsName}"
|
return f"{name} {opSym} {rhsName}"
|
||||||
rhsText = self.rhsVarCombo.currentText().strip()
|
rhsText = self.RhsVarCombo.currentText().strip()
|
||||||
if rhsText:
|
if rhsText:
|
||||||
return f"{name} {opSym} {rhsText}"
|
return f"{name} {opSym} {rhsText}"
|
||||||
return ""
|
return ""
|
||||||
@@ -223,15 +223,15 @@ class ConditionRowFrame(QFrame):
|
|||||||
self._rawRhsExpr = ""
|
self._rawRhsExpr = ""
|
||||||
if idx < 0:
|
if idx < 0:
|
||||||
return
|
return
|
||||||
data = self.leftVarCombo.itemData(idx)
|
data = self.LeftVarCombo.itemData(idx)
|
||||||
if not data:
|
if not data:
|
||||||
return
|
return
|
||||||
name, vartype = data
|
name, vartype = data
|
||||||
isBool = name in ("true", "false")
|
isBool = name in ("true", "false")
|
||||||
self._isBoolMode = isBool
|
self._isBoolMode = isBool
|
||||||
self.opCombo.setVisible(not isBool)
|
self.OpCombo.setVisible(not isBool)
|
||||||
self._compTypeCombo.setVisible(not isBool)
|
self._CompTypeCombo.setVisible(not isBool)
|
||||||
self.rhsStack.setVisible(not isBool)
|
self.RhsStack.setVisible(not isBool)
|
||||||
if not isBool:
|
if not isBool:
|
||||||
self.updateRHSLiteralWidget(vartype)
|
self.updateRHSLiteralWidget(vartype)
|
||||||
|
|
||||||
@@ -242,8 +242,8 @@ class ConditionRowFrame(QFrame):
|
|||||||
):
|
):
|
||||||
|
|
||||||
self._rawRhsExpr = ""
|
self._rawRhsExpr = ""
|
||||||
isVar = (self._compTypeCombo.currentData() == "variable")
|
isVar = (self._CompTypeCombo.currentData() == "variable")
|
||||||
self.rhsStack.setCurrentIndex(1 if isVar else 0)
|
self.RhsStack.setCurrentIndex(1 if isVar else 0)
|
||||||
if isVar:
|
if isVar:
|
||||||
self.populateRHSVarCombo()
|
self.populateRHSVarCombo()
|
||||||
|
|
||||||
@@ -273,52 +273,52 @@ class ActionStepFrame(QFrame):
|
|||||||
self.setFrameShape(QFrame.StyledPanel)
|
self.setFrameShape(QFrame.StyledPanel)
|
||||||
self.setFrameShadow(QFrame.Raised)
|
self.setFrameShadow(QFrame.Raised)
|
||||||
self.setFixedHeight(35)
|
self.setFixedHeight(35)
|
||||||
layout = QHBoxLayout(self)
|
Layout = QHBoxLayout(self)
|
||||||
layout.setContentsMargins(2, 2, 2, 2)
|
Layout.setContentsMargins(2, 2, 2, 2)
|
||||||
layout.setSpacing(4)
|
Layout.setSpacing(4)
|
||||||
self.opTypeCombo = makeComboWidget(ACTION_OPTIONS, min_width=70, parent=self)
|
self.OpTypeCombo = makeComboWidget(ACTION_OPTIONS, min_width=70, parent=self)
|
||||||
layout.addWidget(self.opTypeCombo)
|
Layout.addWidget(self.OpTypeCombo)
|
||||||
layout.addWidget(makeLabel("设置", self))
|
Layout.addWidget(makeLabel("设置", self))
|
||||||
self.targetCombo = QComboBox(self)
|
self.TargetCombo = QComboBox(self)
|
||||||
self.targetCombo.setFixedHeight(25)
|
self.TargetCombo.setFixedHeight(25)
|
||||||
self.targetCombo.setMinimumWidth(120)
|
self.TargetCombo.setMinimumWidth(120)
|
||||||
self.populateTargetCombo()
|
self.populateTargetCombo()
|
||||||
layout.addWidget(self.targetCombo)
|
Layout.addWidget(self.TargetCombo)
|
||||||
layout.addWidget(makeLabel("为", self))
|
Layout.addWidget(makeLabel("为", self))
|
||||||
self.valueSrcCombo = makeComboWidget([
|
self.ValueSrcCombo = makeComboWidget([
|
||||||
("特定值", "literal"),
|
("特定值", "literal"),
|
||||||
("变量", "variable"),
|
("变量", "variable"),
|
||||||
], min_width=70, parent=self)
|
], min_width=70, parent=self)
|
||||||
layout.addWidget(self.valueSrcCombo)
|
Layout.addWidget(self.ValueSrcCombo)
|
||||||
self.valueStack = QStackedWidget(self)
|
self.ValueStack = QStackedWidget(self)
|
||||||
self.valueStack.setFixedHeight(25)
|
self.ValueStack.setFixedHeight(25)
|
||||||
self.initValueStacks()
|
self.initValueStacks()
|
||||||
layout.addWidget(self.valueStack)
|
Layout.addWidget(self.ValueStack)
|
||||||
self.existingVarCombo = makeVarRefCombo(self)
|
self.ExistingVarCombo = makeVarRefCombo(self)
|
||||||
self.existingVarCombo.setVisible(False)
|
self.ExistingVarCombo.setVisible(False)
|
||||||
layout.addWidget(self.existingVarCombo)
|
Layout.addWidget(self.ExistingVarCombo)
|
||||||
self.deleteBtn = QPushButton("×", self)
|
self.DeleteBtn = QPushButton("×", self)
|
||||||
self.deleteBtn.setFixedSize(25, 25)
|
self.DeleteBtn.setFixedSize(25, 25)
|
||||||
self.deleteBtn.setStyleSheet("color: red; font-weight: bold;")
|
self.DeleteBtn.setStyleSheet("color: red; font-weight: bold;")
|
||||||
layout.addWidget(self.deleteBtn)
|
Layout.addWidget(self.DeleteBtn)
|
||||||
self.setUpdatesEnabled(True)
|
self.setUpdatesEnabled(True)
|
||||||
|
|
||||||
def populateTargetCombo(
|
def populateTargetCombo(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.targetCombo.blockSignals(True)
|
self.TargetCombo.blockSignals(True)
|
||||||
self.targetCombo.clear()
|
self.TargetCombo.clear()
|
||||||
for p in getPresetVars():
|
for p in getPresetVars():
|
||||||
if p["name"] in ("CURRENT_TIME", "CURRENT_DATE"):
|
if p["name"] in ("CURRENT_TIME", "CURRENT_DATE"):
|
||||||
continue
|
continue
|
||||||
info = self._varMgr.getInfoByName(p["name"])
|
info = self._varMgr.getInfoByName(p["name"])
|
||||||
if info:
|
if info:
|
||||||
self.targetCombo.addItem(
|
self.TargetCombo.addItem(
|
||||||
info["display"],
|
info["display"],
|
||||||
(info["name"], info["type"])
|
(info["name"], info["type"])
|
||||||
)
|
)
|
||||||
self.targetCombo.blockSignals(False)
|
self.TargetCombo.blockSignals(False)
|
||||||
|
|
||||||
def initValueStacks(
|
def initValueStacks(
|
||||||
self
|
self
|
||||||
@@ -327,45 +327,45 @@ class ActionStepFrame(QFrame):
|
|||||||
self._literalWidgets = {}
|
self._literalWidgets = {}
|
||||||
self._offsetWidgets = {}
|
self._offsetWidgets = {}
|
||||||
for vt in getTypeOrder():
|
for vt in getTypeOrder():
|
||||||
self._literalWidgets[vt] = makeValueWidget(vt, self.valueStack)
|
self._literalWidgets[vt] = makeValueWidget(vt, self.ValueStack)
|
||||||
self.valueStack.addWidget(self._literalWidgets[vt])
|
self.ValueStack.addWidget(self._literalWidgets[vt])
|
||||||
if getArithType(vt):
|
if getArithType(vt):
|
||||||
self._offsetWidgets[vt] = makeOffsetWidget(vt, self.valueStack)
|
self._offsetWidgets[vt] = makeOffsetWidget(vt, self.ValueStack)
|
||||||
self.valueStack.addWidget(self._offsetWidgets[vt])
|
self.ValueStack.addWidget(self._offsetWidgets[vt])
|
||||||
else:
|
else:
|
||||||
lbl = QLabel("(不支持该操作)", self.valueStack)
|
Lbl = QLabel("(不支持该操作)", self.ValueStack)
|
||||||
lbl.setFixedHeight(25)
|
Lbl.setFixedHeight(25)
|
||||||
self._offsetWidgets[vt] = lbl
|
self._offsetWidgets[vt] = Lbl
|
||||||
self.valueStack.addWidget(lbl)
|
self.ValueStack.addWidget(Lbl)
|
||||||
|
|
||||||
def connectSignals(
|
def connectSignals(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.opTypeCombo.currentIndexChanged.connect(self.onOpTypeChanged)
|
self.OpTypeCombo.currentIndexChanged.connect(self.onOpTypeChanged)
|
||||||
self.targetCombo.currentIndexChanged.connect(self.onTargetChanged)
|
self.TargetCombo.currentIndexChanged.connect(self.onTargetChanged)
|
||||||
self.valueSrcCombo.currentIndexChanged.connect(self.onValueSrcChanged)
|
self.ValueSrcCombo.currentIndexChanged.connect(self.onValueSrcChanged)
|
||||||
|
|
||||||
def getTargetName(
|
def getTargetName(
|
||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
data = self.targetCombo.currentData()
|
data = self.TargetCombo.currentData()
|
||||||
return data[0] if data else ""
|
return data[0] if data else ""
|
||||||
|
|
||||||
def updateValueWidget(
|
def updateValueWidget(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
op = self.opTypeCombo.currentData()
|
op = self.OpTypeCombo.currentData()
|
||||||
isArith = (op in ("add", "sub"))
|
isArith = (op in ("add", "sub"))
|
||||||
actualType = self._currentTargetType
|
actualType = self._currentTargetType
|
||||||
if isArith and actualType in self._offsetWidgets:
|
if isArith and actualType in self._offsetWidgets:
|
||||||
self.valueStack.setCurrentWidget(self._offsetWidgets[actualType])
|
self.ValueStack.setCurrentWidget(self._offsetWidgets[actualType])
|
||||||
elif actualType in self._literalWidgets:
|
elif actualType in self._literalWidgets:
|
||||||
self.valueStack.setCurrentWidget(self._literalWidgets[actualType])
|
self.ValueStack.setCurrentWidget(self._literalWidgets[actualType])
|
||||||
else:
|
else:
|
||||||
self.valueStack.setCurrentWidget(self._literalWidgets.get("String"))
|
self.ValueStack.setCurrentWidget(self._literalWidgets.get("String"))
|
||||||
|
|
||||||
def toScript(
|
def toScript(
|
||||||
self
|
self
|
||||||
@@ -375,7 +375,7 @@ class ActionStepFrame(QFrame):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
target = self.getTargetName()
|
target = self.getTargetName()
|
||||||
op = self.opTypeCombo.currentData()
|
op = self.OpTypeCombo.currentData()
|
||||||
if op == "pass":
|
if op == "pass":
|
||||||
return " -- pass"
|
return " -- pass"
|
||||||
if not target:
|
if not target:
|
||||||
@@ -386,19 +386,19 @@ class ActionStepFrame(QFrame):
|
|||||||
encoded = encodeValueStr(rawVal, vartype)
|
encoded = encodeValueStr(rawVal, vartype)
|
||||||
return f" {target} = {encoded}"
|
return f" {target} = {encoded}"
|
||||||
elif op == "add":
|
elif op == "add":
|
||||||
if vartype == "Date" and hasattr(self.valueStack.currentWidget(), "getOffsetDays"):
|
if vartype == "Date" and hasattr(self.ValueStack.currentWidget(), "getOffsetDays"):
|
||||||
days = self.valueStack.currentWidget().getOffsetDays()
|
days = self.ValueStack.currentWidget().getOffsetDays()
|
||||||
return f" {target} = dateadd({target}, {days})"
|
return f" {target} = dateadd({target}, {days})"
|
||||||
if vartype == "Time" and hasattr(self.valueStack.currentWidget(), "getOffsetHours"):
|
if vartype == "Time" and hasattr(self.ValueStack.currentWidget(), "getOffsetHours"):
|
||||||
hours = self.valueStack.currentWidget().getOffsetHours()
|
hours = self.ValueStack.currentWidget().getOffsetHours()
|
||||||
return f" {target} = timeadd({target}, {hours})"
|
return f" {target} = timeadd({target}, {hours})"
|
||||||
return f" {target} = {target} + {rawVal}"
|
return f" {target} = {target} + {rawVal}"
|
||||||
elif op == "sub":
|
elif op == "sub":
|
||||||
if vartype == "Date" and hasattr(self.valueStack.currentWidget(), "getOffsetDays"):
|
if vartype == "Date" and hasattr(self.ValueStack.currentWidget(), "getOffsetDays"):
|
||||||
days = self.valueStack.currentWidget().getOffsetDays()
|
days = self.ValueStack.currentWidget().getOffsetDays()
|
||||||
return f" {target} = dateadd({target}, -{days})"
|
return f" {target} = dateadd({target}, -{days})"
|
||||||
if vartype == "Time" and hasattr(self.valueStack.currentWidget(), "getOffsetHours"):
|
if vartype == "Time" and hasattr(self.ValueStack.currentWidget(), "getOffsetHours"):
|
||||||
hours = self.valueStack.currentWidget().getOffsetHours()
|
hours = self.ValueStack.currentWidget().getOffsetHours()
|
||||||
return f" {target} = timeadd({target}, -{hours})"
|
return f" {target} = timeadd({target}, -{hours})"
|
||||||
return f" {target} = {target} - {rawVal}"
|
return f" {target} = {target} - {rawVal}"
|
||||||
return ""
|
return ""
|
||||||
@@ -407,10 +407,10 @@ class ActionStepFrame(QFrame):
|
|||||||
self
|
self
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
if self.valueSrcCombo.currentData() == "variable":
|
if self.ValueSrcCombo.currentData() == "variable":
|
||||||
data = self.existingVarCombo.currentData()
|
data = self.ExistingVarCombo.currentData()
|
||||||
return data[0] if data else ""
|
return data[0] if data else ""
|
||||||
w = self.valueStack.currentWidget()
|
w = self.ValueStack.currentWidget()
|
||||||
if w:
|
if w:
|
||||||
return getValueFromWidget(w)
|
return getValueFromWidget(w)
|
||||||
return ""
|
return ""
|
||||||
@@ -419,15 +419,15 @@ class ActionStepFrame(QFrame):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
currentData = self.targetCombo.currentData()
|
currentData = self.TargetCombo.currentData()
|
||||||
self.populateTargetCombo()
|
self.populateTargetCombo()
|
||||||
if currentData:
|
if currentData:
|
||||||
for i in range(self.targetCombo.count()):
|
for i in range(self.TargetCombo.count()):
|
||||||
d = self.targetCombo.itemData(i)
|
d = self.TargetCombo.itemData(i)
|
||||||
if d and d[0] == currentData[0]:
|
if d and d[0] == currentData[0]:
|
||||||
self.targetCombo.setCurrentIndex(i)
|
self.TargetCombo.setCurrentIndex(i)
|
||||||
break
|
break
|
||||||
self._varMgr.populateCombo(self.existingVarCombo)
|
self._varMgr.populateCombo(self.ExistingVarCombo)
|
||||||
|
|
||||||
@Slot(int)
|
@Slot(int)
|
||||||
def onTargetChanged(
|
def onTargetChanged(
|
||||||
@@ -437,13 +437,13 @@ class ActionStepFrame(QFrame):
|
|||||||
|
|
||||||
if idx < 0:
|
if idx < 0:
|
||||||
return
|
return
|
||||||
data = self.targetCombo.itemData(idx)
|
data = self.TargetCombo.itemData(idx)
|
||||||
if not data:
|
if not data:
|
||||||
return
|
return
|
||||||
_, vartype = data
|
_, vartype = data
|
||||||
self._currentTargetType = vartype
|
self._currentTargetType = vartype
|
||||||
self.updateValueWidget()
|
self.updateValueWidget()
|
||||||
self.onValueSrcChanged(self.valueSrcCombo.currentIndex())
|
self.onValueSrcChanged(self.ValueSrcCombo.currentIndex())
|
||||||
|
|
||||||
@Slot(int)
|
@Slot(int)
|
||||||
def onOpTypeChanged(
|
def onOpTypeChanged(
|
||||||
@@ -459,10 +459,10 @@ class ActionStepFrame(QFrame):
|
|||||||
idx
|
idx
|
||||||
):
|
):
|
||||||
|
|
||||||
isVar = (self.valueSrcCombo.currentData() == "variable")
|
isVar = (self.ValueSrcCombo.currentData() == "variable")
|
||||||
self.valueStack.setVisible(not isVar)
|
self.ValueStack.setVisible(not isVar)
|
||||||
self.existingVarCombo.setVisible(isVar)
|
self.ExistingVarCombo.setVisible(isVar)
|
||||||
if isVar:
|
if isVar:
|
||||||
self._varMgr.populateCombo(self.existingVarCombo)
|
self._varMgr.populateCombo(self.ExistingVarCombo)
|
||||||
else:
|
else:
|
||||||
self.updateValueWidget()
|
self.updateValueWidget()
|
||||||
|
|||||||
+100
-100
@@ -386,18 +386,18 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
|
|
||||||
user_config = self.defaultUserConfig()
|
user_config = self.defaultUserConfig()
|
||||||
for i in range(self.UserTreeWidget.topLevelItemCount()):
|
for i in range(self.UserTreeWidget.topLevelItemCount()):
|
||||||
group_item = self.UserTreeWidget.topLevelItem(i)
|
GroupItem = self.UserTreeWidget.topLevelItem(i)
|
||||||
group_config = {
|
group_config = {
|
||||||
"name": group_item.text(0),
|
"name": GroupItem.text(0),
|
||||||
"enabled": group_item.checkState(1) == Qt.CheckState.Checked,
|
"enabled": GroupItem.checkState(1) == Qt.CheckState.Checked,
|
||||||
"users": []
|
"users": []
|
||||||
}
|
}
|
||||||
for j in range(group_item.childCount()):
|
for j in range(GroupItem.childCount()):
|
||||||
user_item = group_item.child(j)
|
UserItem = GroupItem.child(j)
|
||||||
user = user_item.data(0, Qt.UserRole)
|
user = UserItem.data(0, Qt.UserRole)
|
||||||
if not user:
|
if not user:
|
||||||
continue
|
continue
|
||||||
user["enabled"] = user_item.checkState(1) == Qt.CheckState.Checked
|
user["enabled"] = UserItem.checkState(1) == Qt.CheckState.Checked
|
||||||
group_config["users"].append(user)
|
group_config["users"].append(user)
|
||||||
user_config["groups"].append(group_config)
|
user_config["groups"].append(group_config)
|
||||||
return user_config
|
return user_config
|
||||||
@@ -453,18 +453,18 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
try:
|
try:
|
||||||
if "groups" in users:
|
if "groups" in users:
|
||||||
for group_config in users["groups"]:
|
for group_config in users["groups"]:
|
||||||
group_item = QTreeWidgetItem(self.UserTreeWidget, ALUserTreeItemType.GROUP.value)
|
GroupItem = QTreeWidgetItem(self.UserTreeWidget, ALUserTreeItemType.GROUP.value)
|
||||||
group_item.setText(0, group_config["name"])
|
GroupItem.setText(0, group_config["name"])
|
||||||
group_item.setFlags(group_item.flags() | Qt.ItemIsEditable)
|
GroupItem.setFlags(GroupItem.flags() | Qt.ItemIsEditable)
|
||||||
group_item.setCheckState(1, Qt.Checked if group_config.get("enabled", True) else Qt.Unchecked)
|
GroupItem.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, ALUserTreeItemType.USER.value)
|
UserItem = QTreeWidgetItem(GroupItem, ALUserTreeItemType.USER.value)
|
||||||
user_item.setText(0, user_config["username"])
|
UserItem.setText(0, user_config["username"])
|
||||||
user_item.setText(1, "" if user_config.get("enabled", True) else "跳过")
|
UserItem.setText(1, "" if user_config.get("enabled", True) else "跳过")
|
||||||
user_item.setData(0, Qt.UserRole, user_config)
|
UserItem.setData(0, Qt.UserRole, user_config)
|
||||||
user_item.setCheckState(1, Qt.Checked if user_config.get("enabled", True) else Qt.Unchecked)
|
UserItem.setCheckState(1, Qt.Checked if user_config.get("enabled", True) else Qt.Unchecked)
|
||||||
user_item.setDisabled(not group_config.get("enabled", True))
|
UserItem.setDisabled(not group_config.get("enabled", True))
|
||||||
group_item.setExpanded(True)
|
GroupItem.setExpanded(True)
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
QMessageBox.warning(
|
QMessageBox.warning(
|
||||||
self,
|
self,
|
||||||
@@ -638,43 +638,43 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
) -> QTreeWidgetItem:
|
) -> QTreeWidgetItem:
|
||||||
|
|
||||||
self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged)
|
self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged)
|
||||||
group_item = QTreeWidgetItem(self.UserTreeWidget, ALUserTreeItemType.GROUP.value)
|
GroupItem = 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)
|
GroupItem.setText(0, group_name)
|
||||||
group_item.setFlags(group_item.flags() | Qt.ItemIsEditable)
|
GroupItem.setFlags(GroupItem.flags() | Qt.ItemIsEditable)
|
||||||
group_item.setCheckState(1, Qt.Checked)
|
GroupItem.setCheckState(1, Qt.Checked)
|
||||||
self.UserTreeWidget.setCurrentItem(group_item)
|
self.UserTreeWidget.setCurrentItem(GroupItem)
|
||||||
self.UserTreeWidget.itemChanged.connect(self.onUserTreeWidgetItemChanged)
|
self.UserTreeWidget.itemChanged.connect(self.onUserTreeWidgetItemChanged)
|
||||||
return group_item
|
return GroupItem
|
||||||
|
|
||||||
def delGroup(
|
def delGroup(
|
||||||
self,
|
self,
|
||||||
group_item: QTreeWidgetItem = None
|
GroupItem: QTreeWidgetItem = None
|
||||||
):
|
):
|
||||||
|
|
||||||
if group_item is None:
|
if GroupItem is None:
|
||||||
return
|
return
|
||||||
if group_item.type() != ALUserTreeItemType.GROUP.value:
|
if GroupItem.type() != ALUserTreeItemType.GROUP.value:
|
||||||
return
|
return
|
||||||
index = self.UserTreeWidget.indexOfTopLevelItem(group_item)
|
index = self.UserTreeWidget.indexOfTopLevelItem(GroupItem)
|
||||||
self.UserTreeWidget.takeTopLevelItem(index)
|
self.UserTreeWidget.takeTopLevelItem(index)
|
||||||
|
|
||||||
def addUser(
|
def addUser(
|
||||||
self,
|
self,
|
||||||
group_item: QTreeWidgetItem = None
|
GroupItem: QTreeWidgetItem = None
|
||||||
) -> QTreeWidgetItem:
|
) -> QTreeWidgetItem:
|
||||||
|
|
||||||
if group_item is None:
|
if GroupItem is None:
|
||||||
current_item = self.UserTreeWidget.currentItem()
|
CurrentItem = self.UserTreeWidget.currentItem()
|
||||||
if current_item is None:
|
if CurrentItem is None:
|
||||||
group_item = self.addGroup()
|
GroupItem = self.addGroup()
|
||||||
if group_item.type() == ALUserTreeItemType.USER.value:
|
if GroupItem.type() == ALUserTreeItemType.USER.value:
|
||||||
group_item = group_item.parent()
|
GroupItem = GroupItem.parent()
|
||||||
if group_item.checkState(1) == Qt.CheckState.Unchecked:
|
if GroupItem.checkState(1) == Qt.CheckState.Unchecked:
|
||||||
return None
|
return None
|
||||||
new_user = {
|
new_user = {
|
||||||
"username": f"新用户-{group_item.childCount()}",
|
"username": f"新用户-{GroupItem.childCount()}",
|
||||||
"password": "000000",
|
"password": "000000",
|
||||||
"enabled": True,
|
"enabled": True,
|
||||||
"reserve_info": {
|
"reserve_info": {
|
||||||
@@ -703,30 +703,30 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged)
|
self.UserTreeWidget.itemChanged.disconnect(self.onUserTreeWidgetItemChanged)
|
||||||
user_item = QTreeWidgetItem(group_item, ALUserTreeItemType.USER.value)
|
UserItem = QTreeWidgetItem(GroupItem, ALUserTreeItemType.USER.value)
|
||||||
user_item.setText(0, new_user["username"])
|
UserItem.setText(0, new_user["username"])
|
||||||
user_item.setText(1, "")
|
UserItem.setText(1, "")
|
||||||
user_item.setData(0, Qt.UserRole, new_user)
|
UserItem.setData(0, Qt.UserRole, new_user)
|
||||||
user_item.setCheckState(1, Qt.CheckState.Checked)
|
UserItem.setCheckState(1, Qt.CheckState.Checked)
|
||||||
group_item.setExpanded(True)
|
GroupItem.setExpanded(True)
|
||||||
self.UserTreeWidget.setCurrentItem(user_item)
|
self.UserTreeWidget.setCurrentItem(UserItem)
|
||||||
self.setUserToWidget(new_user)
|
self.setUserToWidget(new_user)
|
||||||
self.UserTreeWidget.itemChanged.connect(self.onUserTreeWidgetItemChanged)
|
self.UserTreeWidget.itemChanged.connect(self.onUserTreeWidgetItemChanged)
|
||||||
return user_item
|
return UserItem
|
||||||
|
|
||||||
def delUser(
|
def delUser(
|
||||||
self,
|
self,
|
||||||
user_item: QTreeWidgetItem = None
|
UserItem: QTreeWidgetItem = None
|
||||||
):
|
):
|
||||||
|
|
||||||
if user_item is None:
|
if UserItem is None:
|
||||||
return
|
return
|
||||||
if user_item.type() != ALUserTreeItemType.USER.value:
|
if UserItem.type() != ALUserTreeItemType.USER.value:
|
||||||
return
|
return
|
||||||
parent_item = user_item.parent()
|
ParentItem = UserItem.parent()
|
||||||
index = parent_item.indexOfChild(user_item)
|
index = ParentItem.indexOfChild(UserItem)
|
||||||
parent_item.takeChild(index)
|
ParentItem.takeChild(index)
|
||||||
if parent_item.childCount() == 0:
|
if ParentItem.childCount() == 0:
|
||||||
self.UserTreeWidget.setCurrentItem(None)
|
self.UserTreeWidget.setCurrentItem(None)
|
||||||
|
|
||||||
def renameItem(
|
def renameItem(
|
||||||
@@ -787,19 +787,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]
|
||||||
dialog = ALSeatMapSelectDialog(
|
Dialog = ALSeatMapSelectDialog(
|
||||||
self,
|
self,
|
||||||
floor,
|
floor,
|
||||||
room,
|
room,
|
||||||
ALSeatMapTable[floor_idx][room_idx]
|
ALSeatMapTable[floor_idx][room_idx]
|
||||||
)
|
)
|
||||||
dialog.selectSeats(self.SeatIDEdit.text().split(","))
|
Dialog.selectSeats(self.SeatIDEdit.text().split(","))
|
||||||
if dialog.exec() == QDialog.DialogCode.Accepted:
|
if Dialog.exec() == QDialog.DialogCode.Accepted:
|
||||||
selected_seats = dialog.getSelectedSeats()
|
selected_seats = Dialog.getSelectedSeats()
|
||||||
if len(selected_seats) == 0:
|
if len(selected_seats) == 0:
|
||||||
self.SeatIDEdit.clear()
|
self.SeatIDEdit.clear()
|
||||||
return
|
return
|
||||||
self.SeatIDEdit.setText(",".join(dialog.getSelectedSeats()))
|
self.SeatIDEdit.setText(",".join(Dialog.getSelectedSeats()))
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onUserTreeWidgetCurrentItemChanged(
|
def onUserTreeWidgetCurrentItemChanged(
|
||||||
@@ -844,10 +844,10 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
if item.type() == ALUserTreeItemType.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)
|
||||||
if self.UserTreeWidget.currentItem() == child:
|
if self.UserTreeWidget.currentItem() == Child:
|
||||||
self.UserTreeWidget.setCurrentItem(item)
|
self.UserTreeWidget.setCurrentItem(item)
|
||||||
child.setDisabled(not is_checked)
|
Child.setDisabled(not is_checked)
|
||||||
else:
|
else:
|
||||||
is_checked = item.checkState(1) == Qt.CheckState.Checked
|
is_checked = item.checkState(1) == Qt.CheckState.Checked
|
||||||
item.setText(1, "" if is_checked else "跳过")
|
item.setText(1, "" if is_checked else "跳过")
|
||||||
@@ -857,41 +857,41 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
menu: QMenu
|
menu: QMenu
|
||||||
):
|
):
|
||||||
|
|
||||||
add_group_action = QAction("添加分组", menu)
|
AddGroupAction = QAction("添加分组", menu)
|
||||||
add_group_action.triggered.connect(self.addGroup)
|
AddGroupAction.triggered.connect(self.addGroup)
|
||||||
menu.addAction(add_group_action)
|
menu.addAction(AddGroupAction)
|
||||||
|
|
||||||
def showGroupMenu(
|
def showGroupMenu(
|
||||||
self,
|
self,
|
||||||
menu: QMenu,
|
menu: QMenu,
|
||||||
group_item: QTreeWidgetItem = None
|
GroupItem: QTreeWidgetItem = None
|
||||||
):
|
):
|
||||||
|
|
||||||
add_user_action = QAction("添加用户", menu)
|
AddUserAction = QAction("添加用户", menu)
|
||||||
rename_group_action = QAction("重命名分组", menu)
|
RenameGroupAction = QAction("重命名分组", menu)
|
||||||
del_group_action = QAction("删除分组", menu)
|
DelGroupAction = QAction("删除分组", menu)
|
||||||
add_user_action.triggered.connect(lambda: self.addUser(group_item))
|
AddUserAction.triggered.connect(lambda: self.addUser(GroupItem))
|
||||||
rename_group_action.triggered.connect(lambda: self.renameItem(group_item))
|
RenameGroupAction.triggered.connect(lambda: self.renameItem(GroupItem))
|
||||||
del_group_action.triggered.connect(lambda: self.delGroup(group_item))
|
DelGroupAction.triggered.connect(lambda: self.delGroup(GroupItem))
|
||||||
menu.addAction(add_user_action)
|
menu.addAction(AddUserAction)
|
||||||
menu.addSeparator()
|
menu.addSeparator()
|
||||||
menu.addAction(rename_group_action)
|
menu.addAction(RenameGroupAction)
|
||||||
menu.addAction(del_group_action)
|
menu.addAction(DelGroupAction)
|
||||||
if group_item.checkState(1) == Qt.CheckState.Unchecked:
|
if GroupItem.checkState(1) == Qt.CheckState.Unchecked:
|
||||||
add_user_action.setEnabled(False)
|
AddUserAction.setEnabled(False)
|
||||||
|
|
||||||
def showUserMenu(
|
def showUserMenu(
|
||||||
self,
|
self,
|
||||||
menu: QMenu,
|
menu: QMenu,
|
||||||
user_item: QTreeWidgetItem = None
|
UserItem: QTreeWidgetItem = None
|
||||||
):
|
):
|
||||||
|
|
||||||
rename_user_action = QAction("重命名用户", menu)
|
RenameUserAction = QAction("重命名用户", menu)
|
||||||
del_user_action = QAction("删除用户", menu)
|
DelUserAction = QAction("删除用户", menu)
|
||||||
rename_user_action.triggered.connect(lambda: self.renameItem(user_item))
|
RenameUserAction.triggered.connect(lambda: self.renameItem(UserItem))
|
||||||
del_user_action.triggered.connect(lambda: self.delUser(user_item))
|
DelUserAction.triggered.connect(lambda: self.delUser(UserItem))
|
||||||
menu.addAction(rename_user_action)
|
menu.addAction(RenameUserAction)
|
||||||
menu.addAction(del_user_action)
|
menu.addAction(DelUserAction)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onUserTreeWidgetContextMenu(
|
def onUserTreeWidgetContextMenu(
|
||||||
@@ -899,31 +899,31 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
pos
|
pos
|
||||||
):
|
):
|
||||||
|
|
||||||
current_item = self.UserTreeWidget.itemAt(pos)
|
CurrentItem = self.UserTreeWidget.itemAt(pos)
|
||||||
menu = QMenu(self.UserTreeWidget)
|
Menu = QMenu(self.UserTreeWidget)
|
||||||
if current_item is None:
|
if CurrentItem is None:
|
||||||
self.showTreeMenu(menu)
|
self.showTreeMenu(Menu)
|
||||||
elif current_item.type() == ALUserTreeItemType.GROUP.value:
|
elif CurrentItem.type() == ALUserTreeItemType.GROUP.value:
|
||||||
self.showGroupMenu(menu, current_item)
|
self.showGroupMenu(Menu, CurrentItem)
|
||||||
else:
|
else:
|
||||||
self.showUserMenu(menu, current_item)
|
self.showUserMenu(Menu, CurrentItem)
|
||||||
menu.exec_(self.UserTreeWidget.mapToGlobal(pos))
|
Menu.exec_(self.UserTreeWidget.mapToGlobal(pos))
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onAddUserButtonClicked(
|
def onAddUserButtonClicked(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
current_item = self.UserTreeWidget.currentItem()
|
CurrentItem = self.UserTreeWidget.currentItem()
|
||||||
self.addUser(current_item)
|
self.addUser(CurrentItem)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onDelUserButtonClicked(
|
def onDelUserButtonClicked(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
current_item = self.UserTreeWidget.currentItem()
|
CurrentItem = self.UserTreeWidget.currentItem()
|
||||||
self.delUser(current_item)
|
self.delUser(CurrentItem)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onBrowseBrowserDriverButtonClicked(
|
def onBrowseBrowserDriverButtonClicked(
|
||||||
@@ -944,10 +944,10 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
dialog = ALWebDriverDownloadDialog(self)
|
Dialog = ALWebDriverDownloadDialog(self)
|
||||||
dialog.show()
|
Dialog.show()
|
||||||
dialog.exec_()
|
Dialog.exec_()
|
||||||
selected_driver_info = dialog.getSelectedDriverInfo()
|
selected_driver_info = Dialog.getSelectedDriverInfo()
|
||||||
if selected_driver_info and selected_driver_info.driver_path:
|
if selected_driver_info and selected_driver_info.driver_path:
|
||||||
self.BrowserTypeComboBox.setCurrentText(selected_driver_info.driver_type.value)
|
self.BrowserTypeComboBox.setCurrentText(selected_driver_info.driver_type.value)
|
||||||
self.BrowseBrowserDriverEdit.setText(QDir.toNativeSeparators(str(selected_driver_info.driver_path)))
|
self.BrowseBrowserDriverEdit.setText(QDir.toNativeSeparators(str(selected_driver_info.driver_path)))
|
||||||
@@ -1133,8 +1133,8 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
current_item = self.UserTreeWidget.currentItem()
|
CurrentItem = self.UserTreeWidget.currentItem()
|
||||||
if current_item and current_item.type() == ALUserTreeItemType.USER.value:
|
if CurrentItem and CurrentItem.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"],
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.icon = QIcon(":/res/icons/AutoLibrary_Logo_64.svg")
|
self.Icon = QIcon(":/res/icons/AutoLibrary_Logo_64.svg")
|
||||||
self.setWindowIcon(self.icon)
|
self.setWindowIcon(self.Icon)
|
||||||
self.MessageIOTextEdit.setFont(QFont("Courier New", 10))
|
self.MessageIOTextEdit.setFont(QFont("Courier New", 10))
|
||||||
self.ManualAction.triggered.connect(self.onManualActionTriggered)
|
self.ManualAction.triggered.connect(self.onManualActionTriggered)
|
||||||
self.AboutAction.triggered.connect(self.onAboutActionTriggered)
|
self.AboutAction.triggered.connect(self.onAboutActionTriggered)
|
||||||
@@ -106,15 +106,15 @@ class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
about_dialog = ALAboutDialog(self)
|
AboutDialog = ALAboutDialog(self)
|
||||||
about_dialog.exec()
|
AboutDialog.exec()
|
||||||
|
|
||||||
def onManualActionTriggered(
|
def onManualActionTriggered(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
url = QUrl("https://www.autolibrary.kenanzhu.com/manuals")
|
Url = QUrl("https://www.autolibrary.kenanzhu.com/manuals")
|
||||||
QDesktopServices.openUrl(url)
|
QDesktopServices.openUrl(Url)
|
||||||
|
|
||||||
def setupTray(
|
def setupTray(
|
||||||
self
|
self
|
||||||
@@ -123,7 +123,7 @@ class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow):
|
|||||||
if not QSystemTrayIcon.isSystemTrayAvailable():
|
if not QSystemTrayIcon.isSystemTrayAvailable():
|
||||||
self._showTrace("操作系统不支持系统托盘功能, 无法创建系统托盘图标", self.TraceLevel.WARNING)
|
self._showTrace("操作系统不支持系统托盘功能, 无法创建系统托盘图标", self.TraceLevel.WARNING)
|
||||||
return
|
return
|
||||||
self.TrayIcon = QSystemTrayIcon(self.icon, self)
|
self.TrayIcon = QSystemTrayIcon(self.Icon, self)
|
||||||
self.TrayIcon.setToolTip("AutoLibrary")
|
self.TrayIcon.setToolTip("AutoLibrary")
|
||||||
|
|
||||||
self.TrayMenu = QMenu()
|
self.TrayMenu = QMenu()
|
||||||
|
|||||||
@@ -103,15 +103,15 @@ class ALSeatMapView(QGraphicsView):
|
|||||||
seats_number = [seat.strip() for seat in row.split(",")]
|
seats_number = [seat.strip() for seat in row.split(",")]
|
||||||
for seat_number in seats_number:
|
for seat_number in seats_number:
|
||||||
if seat_number:
|
if seat_number:
|
||||||
seat_widget = ALSeatFrame(seat_number)
|
SeatWidget = ALSeatFrame(seat_number)
|
||||||
seat_widget.clicked.connect(self.onSeatClicked)
|
SeatWidget.clicked.connect(self.onSeatClicked)
|
||||||
self.SeatsContainerLayout.addWidget(seat_widget, row_idx, col_idx)
|
self.SeatsContainerLayout.addWidget(SeatWidget, row_idx, col_idx)
|
||||||
self.__seat_frames[seat_number] = seat_widget
|
self.__seat_frames[seat_number] = SeatWidget
|
||||||
else:
|
else:
|
||||||
spacer = QFrame()
|
Spacer = QFrame()
|
||||||
spacer.setFixedSize(20, 30)
|
Spacer.setFixedSize(20, 30)
|
||||||
spacer.setStyleSheet("background-color: transparent; border: none;")
|
Spacer.setStyleSheet("background-color: transparent; border: none;")
|
||||||
self.SeatsContainerLayout.addWidget(spacer, row_idx, col_idx)
|
self.SeatsContainerLayout.addWidget(Spacer, row_idx, col_idx)
|
||||||
col_idx += 1
|
col_idx += 1
|
||||||
self.SeatsContainerLayout.setSpacing(20)
|
self.SeatsContainerLayout.setSpacing(20)
|
||||||
self.SeatsContainerLayout.setContentsMargins(20, 20, 20, 20)
|
self.SeatsContainerLayout.setContentsMargins(20, 20, 20, 20)
|
||||||
|
|||||||
+67
-68
@@ -56,7 +56,6 @@ class ALStatusLabel(QLabel):
|
|||||||
|
|
||||||
self.setFixedSize(36, 36)
|
self.setFixedSize(36, 36)
|
||||||
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
|
|
||||||
self.RunningAnimation = QPropertyAnimation(self, b"iconAngle")
|
self.RunningAnimation = QPropertyAnimation(self, b"iconAngle")
|
||||||
self.RunningAnimation.setDuration(1000)
|
self.RunningAnimation.setDuration(1000)
|
||||||
self.RunningAnimation.setStartValue(0)
|
self.RunningAnimation.setStartValue(0)
|
||||||
@@ -119,35 +118,35 @@ class ALStatusLabel(QLabel):
|
|||||||
event
|
event
|
||||||
):
|
):
|
||||||
|
|
||||||
painter = QPainter(self)
|
Painter = QPainter(self)
|
||||||
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
|
Painter.setRenderHint(QPainter.RenderHint.Antialiasing)
|
||||||
center_x = self.width()/2
|
center_x = self.width()/2
|
||||||
center_y = self.height()/2
|
center_y = self.height()/2
|
||||||
radius = min(center_x, center_y) - 3
|
radius = min(center_x, center_y) - 3
|
||||||
match self.__status:
|
match self.__status:
|
||||||
case self.Status.WAITING:
|
case self.Status.WAITING:
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(2)
|
Pen.setWidth(2)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
pen.setColor(QColor("#969696")) # grey
|
Pen.setColor(QColor("#969696")) # grey
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
painter.drawEllipse(
|
Painter.drawEllipse(
|
||||||
int(center_x - radius),
|
int(center_x - radius),
|
||||||
int(center_y - radius),
|
int(center_y - radius),
|
||||||
int(radius*2),
|
int(radius*2),
|
||||||
int(radius*2)
|
int(radius*2)
|
||||||
)
|
)
|
||||||
case self.Status.RUNNING:
|
case self.Status.RUNNING:
|
||||||
gradient = QConicalGradient(center_x, center_y, self.__icon_angle)
|
Gradient = QConicalGradient(center_x, center_y, self.__icon_angle)
|
||||||
gradient.setColorAt(0.0, QColor("#2294FF" if self.isDarkMode() else "#0094FF"))
|
Gradient.setColorAt(0.0, QColor("#2294FF" if self.isDarkMode() else "#0094FF"))
|
||||||
gradient.setColorAt(1.0, QColor("#2294FF00"))
|
Gradient.setColorAt(1.0, QColor("#2294FF00"))
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(3)
|
Pen.setWidth(3)
|
||||||
pen.setBrush(gradient)
|
Pen.setBrush(Gradient)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
painter.drawEllipse(
|
Painter.drawEllipse(
|
||||||
int(center_x - radius),
|
int(center_x - radius),
|
||||||
int(center_y - radius),
|
int(center_y - radius),
|
||||||
int(radius*2),
|
int(radius*2),
|
||||||
@@ -155,102 +154,102 @@ class ALStatusLabel(QLabel):
|
|||||||
)
|
)
|
||||||
case self.Status.SUCCESS:
|
case self.Status.SUCCESS:
|
||||||
# draw the success green circle
|
# draw the success green circle
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(2)
|
Pen.setWidth(2)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
pen.setColor(QColor("#4CAF50" if self.isDarkMode() else "#00AF50")) # green
|
Pen.setColor(QColor("#4CAF50" if self.isDarkMode() else "#00AF50")) # green
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
painter.drawEllipse(
|
Painter.drawEllipse(
|
||||||
int(center_x - radius),
|
int(center_x - radius),
|
||||||
int(center_y - radius),
|
int(center_y - radius),
|
||||||
int(radius*2),
|
int(radius*2),
|
||||||
int(radius*2)
|
int(radius*2)
|
||||||
)
|
)
|
||||||
# draw the success check mark '✓'
|
# draw the success check mark '✓'
|
||||||
painter.setPen(Qt.PenStyle.SolidLine)
|
Painter.setPen(Qt.PenStyle.SolidLine)
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(3)
|
Pen.setWidth(3)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
# white when dark mode, black when light mode
|
# white when dark mode, black when light mode
|
||||||
pen.setColor(self.getMarkColor())
|
Pen.setColor(self.getMarkColor())
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
mark_size = radius/2
|
mark_size = radius/2
|
||||||
mark_path = [
|
mark_path = [
|
||||||
(center_x - mark_size, center_y),
|
(center_x - mark_size, center_y),
|
||||||
(center_x - mark_size/3, center_y + mark_size/2),
|
(center_x - mark_size/3, center_y + mark_size/2),
|
||||||
(center_x + mark_size, center_y - mark_size/2)
|
(center_x + mark_size, center_y - mark_size/2)
|
||||||
]
|
]
|
||||||
painter.drawLine(
|
Painter.drawLine(
|
||||||
int(mark_path[0][0]),int(mark_path[0][1]),
|
int(mark_path[0][0]),int(mark_path[0][1]),
|
||||||
int(mark_path[1][0]),int(mark_path[1][1])
|
int(mark_path[1][0]),int(mark_path[1][1])
|
||||||
)
|
)
|
||||||
painter.drawLine(
|
Painter.drawLine(
|
||||||
int(mark_path[1][0]),int(mark_path[1][1]),
|
int(mark_path[1][0]),int(mark_path[1][1]),
|
||||||
int(mark_path[2][0]),int(mark_path[2][1])
|
int(mark_path[2][0]),int(mark_path[2][1])
|
||||||
)
|
)
|
||||||
case self.Status.WARNING:
|
case self.Status.WARNING:
|
||||||
# draw the warning orange circle
|
# draw the warning orange circle
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(2)
|
Pen.setWidth(2)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
pen.setColor(QColor("#FF9800")) # orange
|
Pen.setColor(QColor("#FF9800")) # orange
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
painter.drawEllipse(
|
Painter.drawEllipse(
|
||||||
int(center_x - radius),
|
int(center_x - radius),
|
||||||
int(center_y - radius),
|
int(center_y - radius),
|
||||||
int(radius*2),
|
int(radius*2),
|
||||||
int(radius*2)
|
int(radius*2)
|
||||||
)
|
)
|
||||||
# draw the warning exclamation mark '!'
|
# draw the warning exclamation mark '!'
|
||||||
painter.setPen(Qt.PenStyle.SolidLine)
|
Painter.setPen(Qt.PenStyle.SolidLine)
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(3)
|
Pen.setWidth(3)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
# white when dark mode, black when light mode
|
# white when dark mode, black when light mode
|
||||||
pen.setColor(self.getMarkColor())
|
Pen.setColor(self.getMarkColor())
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
painter.drawLine(
|
Painter.drawLine(
|
||||||
int(center_x), int(center_y - radius/2),
|
int(center_x), int(center_y - radius/2),
|
||||||
int(center_x), int(center_y + radius/6)
|
int(center_x), int(center_y + radius/6)
|
||||||
)
|
)
|
||||||
painter.drawPoint(
|
Painter.drawPoint(
|
||||||
int(center_x), int(center_y + radius/2)
|
int(center_x), int(center_y + radius/2)
|
||||||
)
|
)
|
||||||
case self.Status.FAILURE:
|
case self.Status.FAILURE:
|
||||||
# draw the failure red circle
|
# draw the failure red circle
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(2)
|
Pen.setWidth(2)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
pen.setColor(QColor("#DC0000")) # red
|
Pen.setColor(QColor("#DC0000")) # red
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
painter.drawEllipse(
|
Painter.drawEllipse(
|
||||||
int(center_x - radius),
|
int(center_x - radius),
|
||||||
int(center_y - radius),
|
int(center_y - radius),
|
||||||
int(radius*2),
|
int(radius*2),
|
||||||
int(radius*2)
|
int(radius*2)
|
||||||
)
|
)
|
||||||
# draw the failure cross mark '✗'
|
# draw the failure cross mark '✗'
|
||||||
painter.setPen(Qt.PenStyle.SolidLine)
|
Painter.setPen(Qt.PenStyle.SolidLine)
|
||||||
pen = painter.pen()
|
Pen = Painter.pen()
|
||||||
pen.setWidth(3)
|
Pen.setWidth(3)
|
||||||
pen.setBrush(Qt.BrushStyle.NoBrush)
|
Pen.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
Pen.setCapStyle(Qt.PenCapStyle.RoundCap)
|
||||||
# white when dark mode, black when light mode
|
# white when dark mode, black when light mode
|
||||||
pen.setColor(self.getMarkColor())
|
Pen.setColor(self.getMarkColor())
|
||||||
painter.setPen(pen)
|
Painter.setPen(Pen)
|
||||||
mark_size = radius/3
|
mark_size = radius/3
|
||||||
painter.drawLine(
|
Painter.drawLine(
|
||||||
int(center_x - mark_size), int(center_y - mark_size),
|
int(center_x - mark_size), int(center_y - mark_size),
|
||||||
int(center_x + mark_size), int(center_y + mark_size)
|
int(center_x + mark_size), int(center_y + mark_size)
|
||||||
)
|
)
|
||||||
painter.drawLine(
|
Painter.drawLine(
|
||||||
int(center_x + mark_size), int(center_y - mark_size),
|
int(center_x + mark_size), int(center_y - mark_size),
|
||||||
int(center_x - mark_size), int(center_y + mark_size)
|
int(center_x - mark_size), int(center_y + mark_size)
|
||||||
)
|
)
|
||||||
painter.end()
|
Painter.end()
|
||||||
super().paintEvent(event)
|
super().paintEvent(event)
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ class ALTimerTaskAddDialog(QDialog, Ui_ALTimerTaskAddDialog):
|
|||||||
self.SpecificDateTimeEdit.setDateTime(QDateTime.currentDateTime().addSecs(60))
|
self.SpecificDateTimeEdit.setDateTime(QDateTime.currentDateTime().addSecs(60))
|
||||||
self.SpecificTimerLayout.addWidget(self.SpecificDateTimeEdit)
|
self.SpecificTimerLayout.addWidget(self.SpecificDateTimeEdit)
|
||||||
self.TimerConfigLayout.addWidget(self.SpecificTimerWidget)
|
self.TimerConfigLayout.addWidget(self.SpecificTimerWidget)
|
||||||
|
|
||||||
self.RelativeTimerWidget = QWidget()
|
self.RelativeTimerWidget = QWidget()
|
||||||
self.RelativeTimerLayout = QHBoxLayout(self.RelativeTimerWidget)
|
self.RelativeTimerLayout = QHBoxLayout(self.RelativeTimerWidget)
|
||||||
self.RelativeTimerLayout.setContentsMargins(0, 0, 0, 0)
|
self.RelativeTimerLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
@@ -108,17 +107,16 @@ class ALTimerTaskAddDialog(QDialog, Ui_ALTimerTaskAddDialog):
|
|||||||
self.RelativeTimerLayout.addWidget(self.RelativeSecondSpinBox)
|
self.RelativeTimerLayout.addWidget(self.RelativeSecondSpinBox)
|
||||||
self.TimerConfigLayout.addWidget(self.RelativeTimerWidget)
|
self.TimerConfigLayout.addWidget(self.RelativeTimerWidget)
|
||||||
self.RelativeTimerWidget.setVisible(False)
|
self.RelativeTimerWidget.setVisible(False)
|
||||||
|
|
||||||
self.AutoScriptGroupBox = QGroupBox("AutoScript 指令")
|
self.AutoScriptGroupBox = QGroupBox("AutoScript 指令")
|
||||||
self.AutoScriptLayout = QVBoxLayout(self.AutoScriptGroupBox)
|
self.AutoScriptLayout = QVBoxLayout(self.AutoScriptGroupBox)
|
||||||
self.AutoScriptLayout.setContentsMargins(3, 3, 3, 3)
|
self.AutoScriptLayout.setContentsMargins(3, 3, 3, 3)
|
||||||
self.AutoScriptLayout.setSpacing(3)
|
self.AutoScriptLayout.setSpacing(3)
|
||||||
autoScriptBtnLayout = QHBoxLayout()
|
AutoScriptBtnLayout = QHBoxLayout()
|
||||||
self.AutoScriptEditButton = QPushButton("编辑")
|
self.AutoScriptEditButton = QPushButton("编辑")
|
||||||
self.AutoScriptEditButton.setMinimumHeight(25)
|
self.AutoScriptEditButton.setMinimumHeight(25)
|
||||||
self.AutoScriptEditButton.setFixedWidth(80)
|
self.AutoScriptEditButton.setFixedWidth(80)
|
||||||
autoScriptBtnLayout.addWidget(self.AutoScriptEditButton)
|
AutoScriptBtnLayout.addWidget(self.AutoScriptEditButton)
|
||||||
autoScriptBtnLayout.addStretch()
|
AutoScriptBtnLayout.addStretch()
|
||||||
self.AutoScriptHelpButton = QPushButton("?")
|
self.AutoScriptHelpButton = QPushButton("?")
|
||||||
self.AutoScriptHelpButton.setFixedSize(20, 20)
|
self.AutoScriptHelpButton.setFixedSize(20, 20)
|
||||||
self.AutoScriptHelpButton.setToolTip(
|
self.AutoScriptHelpButton.setToolTip(
|
||||||
@@ -132,12 +130,12 @@ class ALTimerTaskAddDialog(QDialog, Ui_ALTimerTaskAddDialog):
|
|||||||
"font-weight: bold; color: #555; }"
|
"font-weight: bold; color: #555; }"
|
||||||
"QPushButton:hover { background-color: #E0E0E0; }"
|
"QPushButton:hover { background-color: #E0E0E0; }"
|
||||||
)
|
)
|
||||||
autoScriptBtnLayout.addWidget(self.AutoScriptHelpButton)
|
AutoScriptBtnLayout.addWidget(self.AutoScriptHelpButton)
|
||||||
self.AutoScriptStatusLabel = QLabel("未设置")
|
self.AutoScriptStatusLabel = QLabel("未设置")
|
||||||
self.AutoScriptStatusLabel.setStyleSheet("color: #969696;")
|
self.AutoScriptStatusLabel.setStyleSheet("color: #969696;")
|
||||||
self.AutoScriptStatusLabel.setFixedHeight(25)
|
self.AutoScriptStatusLabel.setFixedHeight(25)
|
||||||
autoScriptBtnLayout.addWidget(self.AutoScriptStatusLabel)
|
AutoScriptBtnLayout.addWidget(self.AutoScriptStatusLabel)
|
||||||
self.AutoScriptLayout.addLayout(autoScriptBtnLayout)
|
self.AutoScriptLayout.addLayout(AutoScriptBtnLayout)
|
||||||
self.ALAddTimerTaskLayout.insertWidget(
|
self.ALAddTimerTaskLayout.insertWidget(
|
||||||
self.ALAddTimerTaskLayout.indexOf(self.TaskConfigGroupBox) + 1,
|
self.ALAddTimerTaskLayout.indexOf(self.TaskConfigGroupBox) + 1,
|
||||||
self.AutoScriptGroupBox
|
self.AutoScriptGroupBox
|
||||||
@@ -305,18 +303,18 @@ class ALTimerTaskAddDialog(QDialog, Ui_ALTimerTaskAddDialog):
|
|||||||
@Slot()
|
@Slot()
|
||||||
def onPreviewAutoScript(self):
|
def onPreviewAutoScript(self):
|
||||||
from gui.ALAutoScriptEditDialog import ALAutoScriptEditDialog
|
from gui.ALAutoScriptEditDialog import ALAutoScriptEditDialog
|
||||||
dlg = ALAutoScriptEditDialog(self, self.__auto_script, self.__mock_target_data)
|
Dlg = ALAutoScriptEditDialog(self, self.__auto_script, self.__mock_target_data)
|
||||||
if dlg.exec() == QDialog.DialogCode.Accepted:
|
if Dlg.exec() == QDialog.DialogCode.Accepted:
|
||||||
script = dlg.getScript()
|
script = Dlg.getScript()
|
||||||
self.__auto_script = script
|
self.__auto_script = script
|
||||||
self.__mock_target_data = dlg.getMockData()
|
self.__mock_target_data = Dlg.getMockData()
|
||||||
if script:
|
if script:
|
||||||
self.AutoScriptStatusLabel.setText("已设置")
|
self.AutoScriptStatusLabel.setText("已设置")
|
||||||
self.AutoScriptStatusLabel.setStyleSheet("color: #4CAF50;")
|
self.AutoScriptStatusLabel.setStyleSheet("color: #4CAF50;")
|
||||||
else:
|
else:
|
||||||
self.AutoScriptStatusLabel.setText("未设置")
|
self.AutoScriptStatusLabel.setText("未设置")
|
||||||
self.AutoScriptStatusLabel.setStyleSheet("color: #969696;")
|
self.AutoScriptStatusLabel.setStyleSheet("color: #969696;")
|
||||||
dlg.deleteLater()
|
Dlg.deleteLater()
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def onAutoScriptHelp(
|
def onAutoScriptHelp(
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ class ALTimerTaskHistoryDialog(QDialog):
|
|||||||
self.setWindowTitle("定时任务执行历史 - AutoLibrary")
|
self.setWindowTitle("定时任务执行历史 - AutoLibrary")
|
||||||
self.setMinimumSize(300, 300)
|
self.setMinimumSize(300, 300)
|
||||||
self.setMaximumSize(500, 400)
|
self.setMaximumSize(500, 400)
|
||||||
|
|
||||||
MainLayout = QVBoxLayout(self)
|
MainLayout = QVBoxLayout(self)
|
||||||
InfoLayout = QGridLayout()
|
InfoLayout = QGridLayout()
|
||||||
TaskNameLabel = QLabel(f"任务: {self.__task_data.get('name', '未命名')}")
|
TaskNameLabel = QLabel(f"任务: {self.__task_data.get('name', '未命名')}")
|
||||||
@@ -51,7 +50,6 @@ class ALTimerTaskHistoryDialog(QDialog):
|
|||||||
TaskUUIDLabel.setStyleSheet("color: #969696; font-size: 11px;")
|
TaskUUIDLabel.setStyleSheet("color: #969696; font-size: 11px;")
|
||||||
InfoLayout.addWidget(TaskUUIDLabel, 1, 0)
|
InfoLayout.addWidget(TaskUUIDLabel, 1, 0)
|
||||||
InfoLayout.setColumnStretch(0, 1)
|
InfoLayout.setColumnStretch(0, 1)
|
||||||
|
|
||||||
if self.__task_data.get("repeat", False):
|
if self.__task_data.get("repeat", False):
|
||||||
RepeatLabel = QLabel("可重复性任务")
|
RepeatLabel = QLabel("可重复性任务")
|
||||||
RepeatLabel.setStyleSheet("color: #2294FF; font-size: 12px;")
|
RepeatLabel.setStyleSheet("color: #2294FF; font-size: 12px;")
|
||||||
@@ -68,7 +66,6 @@ class ALTimerTaskHistoryDialog(QDialog):
|
|||||||
self.HistoryTableWidget.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
|
self.HistoryTableWidget.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
|
||||||
self.loadHistory()
|
self.loadHistory()
|
||||||
MainLayout.addWidget(self.HistoryTableWidget)
|
MainLayout.addWidget(self.HistoryTableWidget)
|
||||||
|
|
||||||
ButtonLayout = QHBoxLayout()
|
ButtonLayout = QHBoxLayout()
|
||||||
ButtonLayout.addStretch()
|
ButtonLayout.addStretch()
|
||||||
self.CloseButton = QPushButton("关闭")
|
self.CloseButton = QPushButton("关闭")
|
||||||
|
|||||||
@@ -173,20 +173,20 @@ class ALTimerTaskItemWidget(QWidget):
|
|||||||
pos
|
pos
|
||||||
):
|
):
|
||||||
|
|
||||||
menu = QMenu(self)
|
Menu = QMenu(self)
|
||||||
edit_action = QAction("编辑", self)
|
EditAction = QAction("编辑", self)
|
||||||
edit_action.triggered.connect(
|
EditAction.triggered.connect(
|
||||||
lambda: self.editRequested.emit(self.__timer_task)
|
lambda: self.editRequested.emit(self.__timer_task)
|
||||||
)
|
)
|
||||||
menu.addAction(edit_action)
|
Menu.addAction(EditAction)
|
||||||
if self.__timer_task["status"] != ALTimerTaskStatus.RUNNING\
|
if self.__timer_task["status"] != ALTimerTaskStatus.RUNNING\
|
||||||
and self.__timer_task["status"] != ALTimerTaskStatus.READY:
|
and self.__timer_task["status"] != ALTimerTaskStatus.READY:
|
||||||
delete_action = QAction("删除", self)
|
DeleteAction = QAction("删除", self)
|
||||||
delete_action.triggered.connect(
|
DeleteAction.triggered.connect(
|
||||||
lambda: self.__manage_widget.deleteTask(self.__timer_task)
|
lambda: self.__manage_widget.deleteTask(self.__timer_task)
|
||||||
)
|
)
|
||||||
menu.addAction(delete_action)
|
Menu.addAction(DeleteAction)
|
||||||
menu.exec(self.mapToGlobal(pos))
|
Menu.exec(self.mapToGlobal(pos))
|
||||||
|
|
||||||
|
|
||||||
class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
||||||
@@ -209,7 +209,7 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.__cfg_mgr: ConfigProvider = ConfigManager.instance()
|
self.__cfg_mgr: ConfigProvider = ConfigManager.instance()
|
||||||
self.__timer_tasks = []
|
self.__timer_tasks = []
|
||||||
self.__check_timer = None
|
self.__CheckTimer = None
|
||||||
self.__sort_policy = self.SortPolicy.BY_EXECUTE_TIME
|
self.__sort_policy = self.SortPolicy.BY_EXECUTE_TIME
|
||||||
self.__sort_order = Qt.SortOrder.AscendingOrder
|
self.__sort_order = Qt.SortOrder.AscendingOrder
|
||||||
|
|
||||||
@@ -233,9 +233,9 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
self.__check_timer = QTimer(self)
|
self.__CheckTimer = QTimer(self)
|
||||||
self.__check_timer.timeout.connect(self.checkTasks)
|
self.__CheckTimer.timeout.connect(self.checkTasks)
|
||||||
self.__check_timer.start(500)
|
self.__CheckTimer.start(500)
|
||||||
|
|
||||||
def initializeTimerTasks(
|
def initializeTimerTasks(
|
||||||
self
|
self
|
||||||
@@ -386,28 +386,28 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
self.TimerTasksListWidget.clear()
|
self.TimerTasksListWidget.clear()
|
||||||
self.sortTimerTasks(self.__sort_policy, self.__sort_order)
|
self.sortTimerTasks(self.__sort_policy, self.__sort_order)
|
||||||
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 = ALTimerTaskItemWidget(self, timer_task)
|
Widget = ALTimerTaskItemWidget(self, timer_task)
|
||||||
widget.DeleteButton.clicked.connect(
|
Widget.DeleteButton.clicked.connect(
|
||||||
lambda _, task = timer_task: self.deleteTask(task)
|
lambda _, task = timer_task: self.deleteTask(task)
|
||||||
)
|
)
|
||||||
if timer_task.get("repeat", False) and hasattr(widget, "HistoryButton"):
|
if timer_task.get("repeat", False) and hasattr(Widget, "HistoryButton"):
|
||||||
widget.HistoryButton.clicked.connect(
|
Widget.HistoryButton.clicked.connect(
|
||||||
lambda _, task = timer_task: self.showTaskHistory(task)
|
lambda _, task = timer_task: self.showTaskHistory(task)
|
||||||
)
|
)
|
||||||
widget.editRequested.connect(self.editTask)
|
Widget.editRequested.connect(self.editTask)
|
||||||
item.setSizeHint(widget.size())
|
Item.setSizeHint(Widget.size())
|
||||||
self.TimerTasksListWidget.addItem(item)
|
self.TimerTasksListWidget.addItem(Item)
|
||||||
self.TimerTasksListWidget.setItemWidget(item, widget)
|
self.TimerTasksListWidget.setItemWidget(Item, Widget)
|
||||||
|
|
||||||
def addTask(
|
def addTask(
|
||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
dialog = ALTimerTaskAddDialog(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)
|
||||||
self.timerTasksChanged.emit()
|
self.timerTasksChanged.emit()
|
||||||
|
|
||||||
@@ -416,9 +416,9 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
timer_task: dict
|
timer_task: dict
|
||||||
):
|
):
|
||||||
|
|
||||||
dialog = ALTimerTaskAddDialog(self, timer_task)
|
Dialog = ALTimerTaskAddDialog(self, timer_task)
|
||||||
if dialog.exec() == QDialog.DialogCode.Accepted:
|
if Dialog.exec() == QDialog.DialogCode.Accepted:
|
||||||
updated = dialog.getTimerTask()
|
updated = Dialog.getTimerTask()
|
||||||
for i, task in enumerate(self.__timer_tasks):
|
for i, task in enumerate(self.__timer_tasks):
|
||||||
if task["uuid"] == updated["uuid"]:
|
if task["uuid"] == updated["uuid"]:
|
||||||
self.__timer_tasks[i] = updated
|
self.__timer_tasks[i] = updated
|
||||||
@@ -449,19 +449,19 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
):
|
):
|
||||||
|
|
||||||
if timer_task["repeat"]: # when delete a repeat task
|
if timer_task["repeat"]: # when delete a repeat task
|
||||||
msgbox = QMessageBox(self)
|
MsgBox = QMessageBox(self)
|
||||||
msgbox.setIcon(QMessageBox.Icon.Question)
|
MsgBox.setIcon(QMessageBox.Icon.Question)
|
||||||
msgbox.setWindowTitle("警告 - AutoLibrary")
|
MsgBox.setWindowTitle("警告 - AutoLibrary")
|
||||||
msgbox.setStandardButtons(
|
MsgBox.setStandardButtons(
|
||||||
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
|
||||||
)
|
)
|
||||||
msgbox.setText("删除可重复性任务将同时删除所有已执行的记录 !\n是否继续 ?")
|
MsgBox.setText("删除可重复性任务将同时删除所有已执行的记录 !\n是否继续 ?")
|
||||||
msgbox.setDetailedText(
|
MsgBox.setDetailedText(
|
||||||
"以下可重复性任务将被删除:\n"\
|
"以下可重复性任务将被删除:\n"\
|
||||||
"\n"
|
"\n"
|
||||||
f"{self.getTimerTaskDetailMessage(timer_task)}"
|
f"{self.getTimerTaskDetailMessage(timer_task)}"
|
||||||
)
|
)
|
||||||
result = msgbox.exec()
|
result = MsgBox.exec()
|
||||||
if result != QMessageBox.StandardButton.Yes:
|
if result != QMessageBox.StandardButton.Yes:
|
||||||
return
|
return
|
||||||
task_uuid = timer_task["uuid"]
|
task_uuid = timer_task["uuid"]
|
||||||
@@ -506,13 +506,13 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
]
|
]
|
||||||
repeat_tasks_count = len(repeat_tasks)
|
repeat_tasks_count = len(repeat_tasks)
|
||||||
if repeat_tasks_count > 0:
|
if repeat_tasks_count > 0:
|
||||||
msgbox = QMessageBox(self)
|
MsgBox = QMessageBox(self)
|
||||||
msgbox.setIcon(QMessageBox.Icon.Question)
|
MsgBox.setIcon(QMessageBox.Icon.Question)
|
||||||
msgbox.setWindowTitle("警告 - AutoLibrary")
|
MsgBox.setWindowTitle("警告 - AutoLibrary")
|
||||||
msgbox.setStandardButtons(
|
MsgBox.setStandardButtons(
|
||||||
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
|
||||||
)
|
)
|
||||||
msgbox.setText(
|
MsgBox.setText(
|
||||||
f"存在 {repeat_tasks_count} 个可重复性任务,\n"
|
f"存在 {repeat_tasks_count} 个可重复性任务,\n"
|
||||||
"删除可重复性任务将同时删除所有已执行的记录 !\n"
|
"删除可重复性任务将同时删除所有已执行的记录 !\n"
|
||||||
"是否继续 ?"
|
"是否继续 ?"
|
||||||
@@ -520,12 +520,12 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
delete_msgs = [
|
delete_msgs = [
|
||||||
self.getTimerTaskDetailMessage(x) for x in repeat_tasks
|
self.getTimerTaskDetailMessage(x) for x in repeat_tasks
|
||||||
]
|
]
|
||||||
msgbox.setDetailedText(
|
MsgBox.setDetailedText(
|
||||||
"以下可重复性任务将被删除:\n"\
|
"以下可重复性任务将被删除:\n"\
|
||||||
"\n"
|
"\n"
|
||||||
f"{"\n\n".join(delete_msgs)}"
|
f"{"\n\n".join(delete_msgs)}"
|
||||||
)
|
)
|
||||||
result = msgbox.exec()
|
result = MsgBox.exec()
|
||||||
if result != QMessageBox.StandardButton.Yes:
|
if result != QMessageBox.StandardButton.Yes:
|
||||||
return
|
return
|
||||||
# clear all tasks
|
# clear all tasks
|
||||||
@@ -537,8 +537,8 @@ class ALTimerTaskManageWidget(QWidget, Ui_ALTimerTaskManageWidget):
|
|||||||
task: dict
|
task: dict
|
||||||
):
|
):
|
||||||
|
|
||||||
dialog = ALTimerTaskHistoryDialog(self, task)
|
Dialog = ALTimerTaskHistoryDialog(self, task)
|
||||||
if dialog.exec() == QDialog.DialogCode.Accepted:
|
if Dialog.exec() == QDialog.DialogCode.Accepted:
|
||||||
self.timerTasksChanged.emit()
|
self.timerTasksChanged.emit()
|
||||||
|
|
||||||
def checkTasks(
|
def checkTasks(
|
||||||
|
|||||||
+15
-15
@@ -51,9 +51,9 @@ class ALUserTreeWidget(QTreeWidget):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
__qtreewidgetitem = QTreeWidgetItem()
|
__QTreeWidgetItem = QTreeWidgetItem()
|
||||||
__qtreewidgetitem.setText(0, u"\u5206\u7ec4/\u7528\u6237");
|
__QTreeWidgetItem.setText(0, u"\u5206\u7ec4/\u7528\u6237");
|
||||||
self.setHeaderItem(__qtreewidgetitem)
|
self.setHeaderItem(__QTreeWidgetItem)
|
||||||
self.setObjectName(u"UserTreeWidget")
|
self.setObjectName(u"UserTreeWidget")
|
||||||
self.setMinimumSize(QSize(230, 0))
|
self.setMinimumSize(QSize(230, 0))
|
||||||
self.setMaximumSize(QSize(250, 16777215))
|
self.setMaximumSize(QSize(250, 16777215))
|
||||||
@@ -81,8 +81,8 @@ class ALUserTreeWidget(QTreeWidget):
|
|||||||
self
|
self
|
||||||
):
|
):
|
||||||
|
|
||||||
___qtreewidgetitem = self.headerItem()
|
___QTreeWidgetItem = self.headerItem()
|
||||||
___qtreewidgetitem.setText(1, QCoreApplication.translate("ALConfigWidget", u"\u72b6\u6001", None));
|
___QTreeWidgetItem.setText(1, QCoreApplication.translate("ALConfigWidget", u"\u72b6\u6001", None));
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def isDragPositionValid(
|
def isDragPositionValid(
|
||||||
@@ -109,27 +109,27 @@ class ALUserTreeWidget(QTreeWidget):
|
|||||||
|
|
||||||
super().dragMoveEvent(event)
|
super().dragMoveEvent(event)
|
||||||
|
|
||||||
source_item = self.currentItem()
|
SourceItem = self.currentItem()
|
||||||
target_item = self.itemAt(event.position().toPoint())
|
TargetItem = self.itemAt(event.position().toPoint())
|
||||||
if source_item is None:
|
if SourceItem is None:
|
||||||
event.ignore()
|
event.ignore()
|
||||||
return
|
return
|
||||||
if source_item.type() == ALUserTreeItemType.GROUP.value:
|
if SourceItem.type() == ALUserTreeItemType.GROUP.value:
|
||||||
if target_item is not None:
|
if TargetItem is not None:
|
||||||
event.ignore()
|
event.ignore()
|
||||||
return
|
return
|
||||||
elif source_item.type() == ALUserTreeItemType.USER.value:
|
elif SourceItem.type() == ALUserTreeItemType.USER.value:
|
||||||
if target_item is None:
|
if TargetItem is None:
|
||||||
event.ignore()
|
event.ignore()
|
||||||
return
|
return
|
||||||
if target_item.type() != ALUserTreeItemType.GROUP.value:
|
if TargetItem.type() != ALUserTreeItemType.GROUP.value:
|
||||||
event.ignore()
|
event.ignore()
|
||||||
return
|
return
|
||||||
if target_item.checkState(1) == Qt.CheckState.Unchecked:
|
if TargetItem.checkState(1) == Qt.CheckState.Unchecked:
|
||||||
event.ignore()
|
event.ignore()
|
||||||
return
|
return
|
||||||
if not self.isDragPositionValid(
|
if not self.isDragPositionValid(
|
||||||
self.visualItemRect(target_item),
|
self.visualItemRect(TargetItem),
|
||||||
event.position().toPoint()
|
event.position().toPoint()
|
||||||
):
|
):
|
||||||
event.ignore()
|
event.ignore()
|
||||||
|
|||||||
@@ -182,14 +182,11 @@ class ALWebDriverDownloadDialog(QDialog):
|
|||||||
self.setMaximumHeight(240)
|
self.setMaximumHeight(240)
|
||||||
self.setMinimumHeight(240)
|
self.setMinimumHeight(240)
|
||||||
self.setWindowTitle("浏览器驱动下载 - AutoLibrary")
|
self.setWindowTitle("浏览器驱动下载 - AutoLibrary")
|
||||||
|
|
||||||
self.MainLayout = QVBoxLayout(self)
|
self.MainLayout = QVBoxLayout(self)
|
||||||
self.MainLayout.setContentsMargins(5, 5, 5, 5)
|
self.MainLayout.setContentsMargins(5, 5, 5, 5)
|
||||||
self.MainLayout.setSpacing(5)
|
self.MainLayout.setSpacing(5)
|
||||||
|
|
||||||
self.BrowserCountLabel = QLabel("检测到 0 个可用浏览器:")
|
self.BrowserCountLabel = QLabel("检测到 0 个可用浏览器:")
|
||||||
self.MainLayout.addWidget(self.BrowserCountLabel)
|
self.MainLayout.addWidget(self.BrowserCountLabel)
|
||||||
|
|
||||||
self.DriverInfoLayout = QHBoxLayout()
|
self.DriverInfoLayout = QHBoxLayout()
|
||||||
self.DriverInfoLayout.setSpacing(5)
|
self.DriverInfoLayout.setSpacing(5)
|
||||||
self.DriverComboBox = QComboBox()
|
self.DriverComboBox = QComboBox()
|
||||||
@@ -198,7 +195,6 @@ class ALWebDriverDownloadDialog(QDialog):
|
|||||||
self.StatusLabel.setFixedSize(32, 32)
|
self.StatusLabel.setFixedSize(32, 32)
|
||||||
self.DriverInfoLayout.addWidget(self.StatusLabel)
|
self.DriverInfoLayout.addWidget(self.StatusLabel)
|
||||||
self.MainLayout.addLayout(self.DriverInfoLayout)
|
self.MainLayout.addLayout(self.DriverInfoLayout)
|
||||||
|
|
||||||
self.DetailLayout = QVBoxLayout()
|
self.DetailLayout = QVBoxLayout()
|
||||||
self.DetailLayout.setSpacing(5)
|
self.DetailLayout.setSpacing(5)
|
||||||
self.DetailLayout.setContentsMargins(5, 5, 5, 5)
|
self.DetailLayout.setContentsMargins(5, 5, 5, 5)
|
||||||
@@ -211,7 +207,6 @@ class ALWebDriverDownloadDialog(QDialog):
|
|||||||
self.PathLabel.setText("路径:未安装")
|
self.PathLabel.setText("路径:未安装")
|
||||||
self.DetailLayout.addWidget(self.PathLabel)
|
self.DetailLayout.addWidget(self.PathLabel)
|
||||||
self.MainLayout.addLayout(self.DetailLayout)
|
self.MainLayout.addLayout(self.DetailLayout)
|
||||||
|
|
||||||
self.Line = QFrame()
|
self.Line = QFrame()
|
||||||
self.Line.setFrameShape(QFrame.Shape.HLine)
|
self.Line.setFrameShape(QFrame.Shape.HLine)
|
||||||
self.Line.setFrameShadow(QFrame.Shadow.Sunken)
|
self.Line.setFrameShadow(QFrame.Shadow.Sunken)
|
||||||
@@ -237,7 +232,6 @@ class ALWebDriverDownloadDialog(QDialog):
|
|||||||
self.ConfirmButton = QPushButton("确认")
|
self.ConfirmButton = QPushButton("确认")
|
||||||
self.ConfirmButton.setFixedSize(80, 25)
|
self.ConfirmButton.setFixedSize(80, 25)
|
||||||
self.ConfirmButton.setEnabled(False)
|
self.ConfirmButton.setEnabled(False)
|
||||||
|
|
||||||
self.ControlLayout.addWidget(self.RefreshButton)
|
self.ControlLayout.addWidget(self.RefreshButton)
|
||||||
self.ControlLayout.addWidget(self.DownloadButton)
|
self.ControlLayout.addWidget(self.DownloadButton)
|
||||||
self.ControlLayout.addWidget(self.DeleteButton)
|
self.ControlLayout.addWidget(self.DeleteButton)
|
||||||
|
|||||||
Reference in New Issue
Block a user