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
|
||
}
|
||
|
||
} |