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

Compare commits

...

3 Commits

Author SHA1 Message Date
KenanZhu bb63ee6f03 refactor(gui): 统一 Qt 控件变量命名风格为 PascalCase
将所有 self.xxx 形式的 Qt 控件属性名以及 Qt 对象局部变量由 snake_case
重命名为 PascalCase,提升代码可读性和一致性。涉及 14 个文件,涵盖:
- AutoScript 编排/编辑对话框子模块
- 配置/主窗口/用户树/座位图等核心界面组件
- 定时任务管理相关界面
- 状态标签/浏览器驱动下载对话框

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 19:35:03 +08:00
KenanZhu 3ebebe015f refactor(gui): 重构关于对话框,改用 QTabWidget 分页展示信息与许可证
将原本的单页文本浏览器替换为 TabWidget,分"关于"和"许可证"两个标签页。
同时优化了信息排版和样式,新增 Selenium 版本展示,移除了 UI 文件中的旧控件。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 19:34:36 +08:00
KenanZhu 02b3a62868 chore(autoscript): 添加模块版本号 v1.0.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 16:54:14 +08:00
17 changed files with 863 additions and 871 deletions
+1
View File
@@ -9,6 +9,7 @@ See the LICENSE file for details.
""" """
from .ASEngine import ASEngine from .ASEngine import ASEngine
__version__ = "1.0.0" # autoscript version
_TARGET_VAR_DEFS = [ _TARGET_VAR_DEFS = [
("USERNAME", "String", ["username"], "用户名"), ("USERNAME", "String", ["username"], "用户名"),
+81 -31
View File
@@ -16,11 +16,16 @@ from PySide6.QtCore import (
from PySide6.QtGui import QIcon from PySide6.QtGui import QIcon
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QApplication, QApplication,
QDialog QDialog,
QTabWidget,
QTextBrowser
) )
from gui.ALVersionInfo import ( from gui.ALVersionInfo import (
AL_VERSION, AL_COMMIT_SHA, AL_COMMIT_DATE, AL_BUILD_DATE AL_VERSION,
AL_COMMIT_SHA,
AL_COMMIT_DATE,
AL_BUILD_DATE
) )
from gui.resources.ui.Ui_ALAboutDialog import Ui_ALAboutDialog from gui.resources.ui.Ui_ALAboutDialog import Ui_ALAboutDialog
from gui.resources import ALResource from gui.resources import ALResource
@@ -43,12 +48,23 @@ class ALAboutDialog(QDialog, Ui_ALAboutDialog):
): ):
self.LogoIconLabel.setPixmap(QIcon(":/res/icons/AutoLibrary_Logo_64.svg").pixmap(48, 48)) self.LogoIconLabel.setPixmap(QIcon(":/res/icons/AutoLibrary_Logo_64.svg").pixmap(48, 48))
info_text = self.generateAboutText() self.TabWidget = QTabWidget()
self.AboutInfoBrowser.setHtml(info_text) self.TabWidget.setDocumentMode(True)
browser_font = self.AboutInfoBrowser.font() AboutBrowser = QTextBrowser()
browser_font.setFamily("Courier New") AboutBrowser.setHtml(self.generateAboutText())
self.AboutInfoBrowser.setFont(browser_font) AboutBrowser.setOpenExternalLinks(True)
self.AboutInfoBrowser.setTextInteractionFlags(Qt.TextBrowserInteraction) AboutBrowser.setLineWrapMode(QTextBrowser.LineWrapMode.NoWrap)
AboutBrowser.setTextInteractionFlags(Qt.TextBrowserInteraction)
BrowserFont = AboutBrowser.font()
BrowserFont.setFamilies(["Courier New", "Consolas", "Menlo", "DejaVu Sans Mono", "monospace"])
AboutBrowser.setFont(BrowserFont)
self.TabWidget.addTab(AboutBrowser, "关于")
LicenseBrowser = QTextBrowser()
LicenseBrowser.setHtml(self.generateLicenseText())
LicenseBrowser.setOpenExternalLinks(True)
LicenseBrowser.setTextInteractionFlags(Qt.TextBrowserInteraction)
self.TabWidget.addTab(LicenseBrowser, "许可证")
self.AboutInfoLayout.addWidget(self.TabWidget)
def connectSignals( def connectSignals(
self self
@@ -61,33 +77,57 @@ class ALAboutDialog(QDialog, Ui_ALAboutDialog):
) -> str: ) -> str:
os_info = self.getOSInfo() os_info = self.getOSInfo()
run_on = f"{os_info['system']} {os_info['version']} {os_info['architecture']}"
selenium_ver = self.getSeleniumVersion()
about_text = f""" about_text = f"""
<h4>Version Information:</h4> <b style="font-size:14px;">VERSION: {AL_VERSION}</b><br>
Version: {AL_VERSION}<br>
Commit SHA: {AL_COMMIT_SHA}<br> Commit SHA: {AL_COMMIT_SHA}<br>
Commit date: {AL_COMMIT_DATE}<br> Commit date: {AL_COMMIT_DATE}<br>
Build date: {AL_BUILD_DATE}<br> Build date: {AL_BUILD_DATE}<br>
Python version: {platform.python_version()}<br> <br>
Qt version: {self.getQtVersion()}<br> <b style="font-size:14px;">SYSTEM INFORMATION</b><br>
Running on: {run_on}<br>
<h4>System Information:</h4>
Processor: {platform.processor()}<br> Processor: {platform.processor()}<br>
Operating system: {os_info['system']}<br> <br>
System version: {os_info['version']}<br> <b style="font-size:14px;">DEPENDENCIES</b><br>
System architecture: {os_info['architecture']}<br> Python: {platform.python_version()}<br>
Qt(PySide6): {self.getQtVersion()}<br>
<h4>Project Information:</h4> Selenium: {selenium_ver}<br>
License: MIT License<br> <br>
Project repository: <a href="https://www.github.com/KenanZhu/AutoLibrary" style="text-decoration: none;">https://www.github.com/KenanZhu/AutoLibrary</a><br> <b style="font-size:14px;">PROJECT INFORMATION</b><br>
Project website: <a href="https://www.autolibrary.kenanzhu.com" style="text-decoration: none;">https://www.autolibrary.kenanzhu.com</a><br> Website: <a href="https://www.autolibrary.kenanzhu.com" style="text-decoration:none;">https://www.autolibrary.kenanzhu.com</a><br>
Repository: <a href="https://www.github.com/KenanZhu/AutoLibrary" style="text-decoration:none;">https://www.github.com/KenanZhu/AutoLibrary</a><br>
<h4>Author Information:</h4> <br>
Developer: KenanZhu<br> <b style="font-size:14px;">AUTHOR</b><br>
Contact: nanoki_zh@163.com<br> Developer/Maintainer: KenanZhu<br>
GitHub: <a href="https://www.github.com/KenanZhu" style="text-decoration: none;">https://www.github.com/KenanZhu</a><br> Contact: <a href="mailto:nanoki_zh@163.com">nanoki_zh@163.com</a><br>
GitHub: <a href="https://www.github.com/KenanZhu" style="text-decoration:none;">https://www.github.com/KenanZhu</a><br>
""" """
return about_text return about_text
def generateLicenseText(
self
) -> str:
return """
<b>MIT License</b>
<p>Copyright &copy; 2025 - 2026 KenanZhu</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.</p>"""
def getOSInfo( def getOSInfo(
self self
): ):
@@ -129,13 +169,23 @@ GitHub: <a href="https://www.github.com/KenanZhu" style="text-decoration: none;"
except: except:
return "Unknown" return "Unknown"
def getSeleniumVersion(
self
):
try:
import selenium
return selenium.__version__
except Exception:
return "Unknown"
def copyAboutInfo( def copyAboutInfo(
self self
): ):
about_text = self.AboutInfoBrowser.toPlainText() about_text = self.TabWidget.currentWidget().toPlainText()
clipboard = QApplication.clipboard() Clipboard = QApplication.clipboard()
clipboard.setText(about_text) Clipboard.setText(about_text)
original_text = self.CopyButton.text() original_text = self.CopyButton.text()
self.CopyButton.setText("已复制") self.CopyButton.setText("已复制")
QTimer.singleShot(2000, lambda: self.CopyButton.setText(original_text)) QTimer.singleShot(2000, lambda: self.CopyButton.setText(original_text))
+237 -237
View File
@@ -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()
+64 -64
View File
@@ -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 执行步骤:"
) )
+35 -35
View File
@@ -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()
+68 -68
View File
@@ -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
+124 -124
View File
@@ -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
View File
@@ -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"],
+7 -7
View File
@@ -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()
+8 -8
View File
@@ -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
View File
@@ -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)
+11 -13
View File
@@ -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(
-3
View File
@@ -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("关闭")
+44 -44
View File
@@ -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
View File
@@ -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()
-6
View File
@@ -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)
+1 -48
View File
@@ -19,7 +19,7 @@
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>800</width> <width>800</width>
<height>400</height> <height>600</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -103,53 +103,6 @@
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<item>
<widget class="QFrame" name="AboutInfoSpaceFrame">
<property name="minimumSize">
<size>
<width>56</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>56</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="AboutInfoBrowser">
<property name="frameShadow">
<enum>QFrame::Shadow::Plain</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
</property>
<property name="lineWrapMode">
<enum>QTextEdit::LineWrapMode::NoWrap</enum>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="openLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>