Files

105 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =======================================
# =============== 通用工具 ===============
# =======================================
import re
import os
from PySide2.QtGui import QClipboard
from PySide2.QtCore import QFileInfo
from PySide2.QtQml import QJSValue
from urllib.parse import unquote # 路径解码
from umi_log import logger
Clipboard = QClipboard() # 剪贴板
# 传入文件名检测是否含非法字符。没问题返回True
def allowedFileName(fn):
pattern = r'[\\/:*?"<>|]'
if re.search(pattern, fn):
return False # 转布尔值
else:
return True
# 复制文本到剪贴板
def copyText(text):
Clipboard.setText(text)
# QUrl列表 转 String列表
def QUrl2String(urls):
resList = []
for url in urls:
if url.isLocalFile():
u = unquote(url.toLocalFile()) # 解码路径
if QFileInfo(u).exists(): # 检查路径是否真的存在
resList.append(u)
return resList
# 初始化配置项字典数值,等同于 Configs.qml 的 function initConfigDict
# 主要是为了补充type和default
def initConfigDict(dic):
toDict = {}
def handleConfigItem(config, key): # 处理一个配置项
# 类型指定type
if not config["type"] == "":
if config["type"] == "file": # 文件选择
config["default"] = "" if not config["default"] is None else None
elif config["type"] == "var" and config["default"] is None: # 任意类型
config["default"] = ""
# 类型省略type
else:
if isinstance(config["default"], bool): # 布尔
config["type"] = "boolean"
elif "optionsList" in config: # 枚举
config["type"] = "enum"
if len(config["optionsList"]) == 0:
logger.error(f"处理配置项异常:{key}枚举列表为空。")
return
if config["default"] is None:
config["default"] = config["optionsList"][0][0]
elif isinstance(config["default"], str): # 文本
config["type"] = "text"
elif isinstance(config["default"], (int, float)): # 数字
config["type"] = "number"
elif "btnsList" in config: # 按钮组
config["type"] = "buttons"
return
else:
logger.error(f"未知类型的配置项:{key}")
return
def handleConfigGroup(group, prefix=""): # 处理一个配置组
for key in group:
config = group[key]
if not isinstance(config, dict):
continue
# 补充空白参数
if "type" not in config: # 类型
config["type"] = ""
if "default" not in config: # 默认值
config["default"] = None
if "advanced" not in config: # 是否为高级选项
config["advanced"] = False
# 记录完整key
fullKey = prefix + key
if config["type"] == "group": # 若是配置项组,递归遍历
handleConfigGroup(config, fullKey + ".") # 前缀加深一层
else: # 若是配置项
toDict[fullKey] = config
handleConfigItem(config, fullKey)
handleConfigGroup(dic)
return toDict
# 整理 argd 参数字典,将 float 恢复 int 类型,如 12.0 → 12
def argdIntConvert(argd):
for k, v in argd.items():
if isinstance(v, float) and v.is_integer():
argd[k] = int(v)