106 lines
2.9 KiB
QML
106 lines
2.9 KiB
QML
|
|
// ================================================
|
|||
|
|
// =============== 主题切换的逻辑管理 ===============
|
|||
|
|
// ================================================
|
|||
|
|
|
|||
|
|
import QtQuick 2.15
|
|||
|
|
import ThemeConnector 1.0
|
|||
|
|
|
|||
|
|
Item {
|
|||
|
|
// ==================== 【接口】 ====================
|
|||
|
|
|
|||
|
|
// 初始化
|
|||
|
|
function init() {
|
|||
|
|
loadAll() // 加载主题
|
|||
|
|
console.log("主题管理器初始化完毕!", this)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从配置文件中加载 theme.all
|
|||
|
|
function loadAll() {
|
|||
|
|
const tstr = tConn.loadThemeStr() // 文件读字符串
|
|||
|
|
let f = strToAll(tstr) // 字符串写入all
|
|||
|
|
if(!f) { // 写入失败,则初始化配置文件
|
|||
|
|
console.log("初始化主题配置文件")
|
|||
|
|
saveAll()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 将 theme.all写入配置文件
|
|||
|
|
function saveAll() {
|
|||
|
|
const tstr = allToStr()
|
|||
|
|
tConn.saveThemeStr(tstr)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 切换主题
|
|||
|
|
function switchTheme(th) {
|
|||
|
|
if(!theme.all.hasOwnProperty(th)) {
|
|||
|
|
console.warn("切换主题失败,theme.all 不存在主题", k)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
const target = theme.all[th]
|
|||
|
|
for(const k of theme.keys) {
|
|||
|
|
theme[k] = target[k]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取主题列表
|
|||
|
|
function getOptionsList() {
|
|||
|
|
let optList = []
|
|||
|
|
for(let k in theme.all) {
|
|||
|
|
optList.push([k, theme.all[k].themeTitle])
|
|||
|
|
}
|
|||
|
|
return optList
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// =========================================================
|
|||
|
|
|
|||
|
|
// 连接器
|
|||
|
|
ThemeConnector{id: tConn}
|
|||
|
|
|
|||
|
|
// 从json字符串加载主题配置,写入 theme.all 。返回是否成功
|
|||
|
|
function strToAll(tstr) {
|
|||
|
|
if(!tstr)
|
|||
|
|
return false
|
|||
|
|
try {
|
|||
|
|
// 加载并检查主题字典
|
|||
|
|
let all = JSON.parse(tstr)
|
|||
|
|
for(let k in all) {
|
|||
|
|
if(!checkThemeDict(all[k])) {
|
|||
|
|
console.warn("加载单个主题失败:", k)
|
|||
|
|
delete all[k]
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
// 覆盖加载名称
|
|||
|
|
if(theme.all.hasOwnProperty(k)) {
|
|||
|
|
all[k].themeTitle = theme.all[k].themeTitle
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(Object.keys(all).length === 0) {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
theme.all = all
|
|||
|
|
return true
|
|||
|
|
} catch (error) {
|
|||
|
|
console.warn("解析主题JSON字符串时出现异常:", error)
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 将 theme.all 转为json字符串
|
|||
|
|
function allToStr() {
|
|||
|
|
return JSON.stringify(theme.all, null, " ")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检测单个主题字典的合法性
|
|||
|
|
function checkThemeDict(td) {
|
|||
|
|
const tdKeys = Object.keys(td);
|
|||
|
|
if (tdKeys.length !== theme.keys.length) {
|
|||
|
|
return false // 长度不符
|
|||
|
|
}
|
|||
|
|
for (let k of theme.keys) {
|
|||
|
|
if (!tdKeys.includes(k))
|
|||
|
|
return false // 缺键
|
|||
|
|
}
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|