313 lines
10 KiB
Python
313 lines
10 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
图标和颜色配置管理器
|
|
负责管理应用和项目的图标、颜色配置
|
|
"""
|
|
import os
|
|
from typing import Dict, Optional
|
|
|
|
|
|
class IconConfigManager:
|
|
"""图标和颜色配置管理器"""
|
|
|
|
def __init__(self, config_data: Dict, get_icons_dir_func):
|
|
"""
|
|
初始化图标配置管理器
|
|
|
|
Args:
|
|
config_data: 配置数据字典的引用
|
|
get_icons_dir_func: 获取图标目录的函数
|
|
"""
|
|
self.config_data = config_data
|
|
self._get_icons_dir = get_icons_dir_func
|
|
|
|
# ==================== 应用图标管理 ====================
|
|
|
|
def get_app_icon(self, app_path: str) -> str:
|
|
"""
|
|
获取应用图标路径
|
|
|
|
如果配置中保存的是相对路径(只有文件名),则自动拼接 icons 目录
|
|
|
|
Args:
|
|
app_path: 应用路径
|
|
|
|
Returns:
|
|
图标的完整路径,如果不存在则返回空字符串
|
|
"""
|
|
icon_value = self.config_data.get("app_icons", {}).get(app_path, "")
|
|
|
|
if not icon_value:
|
|
return ""
|
|
|
|
# 如果是绝对路径且存在,直接返回
|
|
if os.path.isabs(icon_value) and os.path.exists(icon_value):
|
|
return icon_value
|
|
|
|
# 如果是相对路径(只有文件名),拼接 icons 目录
|
|
if not os.path.isabs(icon_value):
|
|
icons_dir = self._get_icons_dir()
|
|
full_path = os.path.join(icons_dir, icon_value)
|
|
if os.path.exists(full_path):
|
|
return full_path
|
|
|
|
# 如果都不存在,返回原值(可能是旧的绝对路径)
|
|
return icon_value
|
|
|
|
def set_app_icon(self, app_path: str, icon_path: str) -> bool:
|
|
"""
|
|
设置应用图标路径
|
|
|
|
如果图标在 icons 目录下,只保存文件名(相对路径)
|
|
否则保存完整路径
|
|
|
|
Args:
|
|
app_path: 应用路径
|
|
icon_path: 图标路径
|
|
|
|
Returns:
|
|
是否设置成功
|
|
"""
|
|
if "app_icons" not in self.config_data:
|
|
self.config_data["app_icons"] = {}
|
|
|
|
# 获取 icons 目录
|
|
icons_dir = self._get_icons_dir()
|
|
|
|
# 如果图标在 icons 目录下,只保存文件名
|
|
try:
|
|
# 标准化路径以便比较
|
|
icon_path_normalized = os.path.normpath(icon_path)
|
|
icons_dir_normalized = os.path.normpath(icons_dir)
|
|
|
|
# 检查是否在 icons 目录下
|
|
if icon_path_normalized.startswith(icons_dir_normalized):
|
|
# 只保存文件名
|
|
icon_filename = os.path.basename(icon_path)
|
|
self.config_data["app_icons"][app_path] = icon_filename
|
|
print(f"[OK] Saved icon as relative path: {icon_filename}")
|
|
else:
|
|
# 保存完整路径
|
|
self.config_data["app_icons"][app_path] = icon_path
|
|
print(f"[OK] Saved icon as absolute path: {icon_path}")
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"[WARNING] Error processing icon path: {e}")
|
|
# 出错时保存完整路径
|
|
self.config_data["app_icons"][app_path] = icon_path
|
|
return False
|
|
|
|
def remove_app_icon(self, app_path: str) -> bool:
|
|
"""
|
|
移除应用图标设置
|
|
|
|
Args:
|
|
app_path: 应用路径
|
|
|
|
Returns:
|
|
是否移除成功
|
|
"""
|
|
if app_path in self.config_data.get("app_icons", {}):
|
|
del self.config_data["app_icons"][app_path]
|
|
return True
|
|
return False
|
|
|
|
# ==================== 项目图标管理 ====================
|
|
|
|
def get_project_icon(self, project_name: str) -> str:
|
|
"""
|
|
获取项目图标路径
|
|
|
|
如果配置中保存的是相对路径(只有文件名),则自动拼接 icons 目录
|
|
|
|
Args:
|
|
project_name: 项目名称
|
|
|
|
Returns:
|
|
图标的完整路径,如果不存在则返回空字符串
|
|
"""
|
|
# 从项目配置中获取图标路径
|
|
projects = self.config_data.get("projects", {})
|
|
project_config = projects.get(project_name, {})
|
|
icon_value = project_config.get("icon", "")
|
|
|
|
if not icon_value:
|
|
return ""
|
|
|
|
# 如果是绝对路径且存在,直接返回
|
|
if os.path.isabs(icon_value) and os.path.exists(icon_value):
|
|
return icon_value
|
|
|
|
# 如果是相对路径(只有文件名),拼接 icons 目录
|
|
if not os.path.isabs(icon_value):
|
|
icons_dir = self._get_icons_dir()
|
|
full_path = os.path.join(icons_dir, icon_value)
|
|
if os.path.exists(full_path):
|
|
return full_path
|
|
|
|
# 如果都不存在,返回原值(可能是旧的绝对路径)
|
|
return icon_value
|
|
|
|
def set_project_icon(self, project_name: str, icon_path: str) -> bool:
|
|
"""
|
|
设置项目图标路径
|
|
|
|
如果图标在 icons 目录下,只保存文件名(相对路径)
|
|
否则保存完整路径
|
|
|
|
Args:
|
|
project_name: 项目名称
|
|
icon_path: 图标路径
|
|
|
|
Returns:
|
|
是否设置成功
|
|
"""
|
|
# 确保projects配置存在
|
|
if "projects" not in self.config_data:
|
|
self.config_data["projects"] = {}
|
|
|
|
# 确保项目配置存在
|
|
if project_name not in self.config_data["projects"]:
|
|
self.config_data["projects"][project_name] = {
|
|
"apps": [],
|
|
"icon": "",
|
|
"color": ""
|
|
}
|
|
|
|
# 获取 icons 目录
|
|
icons_dir = self._get_icons_dir()
|
|
|
|
# 如果图标在 icons 目录下,只保存文件名
|
|
try:
|
|
# 标准化路径以便比较
|
|
icon_path_normalized = os.path.normpath(icon_path)
|
|
icons_dir_normalized = os.path.normpath(icons_dir)
|
|
|
|
# 检查是否在 icons 目录下
|
|
if icon_path_normalized.startswith(icons_dir_normalized):
|
|
# 只保存文件名
|
|
icon_filename = os.path.basename(icon_path)
|
|
self.config_data["projects"][project_name]["icon"] = icon_filename
|
|
print(f"[OK] Saved project icon as relative path: {icon_filename}")
|
|
else:
|
|
# 保存完整路径
|
|
self.config_data["projects"][project_name]["icon"] = icon_path
|
|
print(f"[OK] Saved project icon as absolute path: {icon_path}")
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"[WARNING] Error processing project icon path: {e}")
|
|
# 出错时保存完整路径
|
|
self.config_data["projects"][project_name]["icon"] = icon_path
|
|
return False
|
|
|
|
def remove_project_icon(self, project_name: str) -> bool:
|
|
"""
|
|
移除项目图标设置
|
|
|
|
Args:
|
|
project_name: 项目名称
|
|
|
|
Returns:
|
|
是否移除成功
|
|
"""
|
|
projects = self.config_data.get("projects", {})
|
|
if project_name in projects and "icon" in projects[project_name]:
|
|
projects[project_name]["icon"] = ""
|
|
return True
|
|
return False
|
|
|
|
# ==================== 应用颜色管理 ====================
|
|
|
|
def get_app_color(self, app_path: str) -> str:
|
|
"""
|
|
获取应用按钮颜色
|
|
|
|
Args:
|
|
app_path: 应用路径
|
|
|
|
Returns:
|
|
颜色值(十六进制),如果未设置则返回空字符串
|
|
"""
|
|
return self.config_data.get("app_colors", {}).get(app_path, "")
|
|
|
|
def set_app_color(self, app_path: str, color: str) -> bool:
|
|
"""
|
|
设置应用按钮颜色
|
|
|
|
Args:
|
|
app_path: 应用路径
|
|
color: 颜色值(十六进制)
|
|
|
|
Returns:
|
|
是否设置成功
|
|
"""
|
|
if "app_colors" not in self.config_data:
|
|
self.config_data["app_colors"] = {}
|
|
|
|
self.config_data["app_colors"][app_path] = color
|
|
return True
|
|
|
|
def remove_app_color(self, app_path: str) -> bool:
|
|
"""
|
|
移除应用按钮颜色设置
|
|
|
|
Args:
|
|
app_path: 应用路径
|
|
|
|
Returns:
|
|
是否移除成功
|
|
"""
|
|
if app_path in self.config_data.get("app_colors", {}):
|
|
del self.config_data["app_colors"][app_path]
|
|
return True
|
|
return False
|
|
|
|
# ==================== 项目颜色管理 ====================
|
|
|
|
def get_project_color(self, project_name: str) -> str:
|
|
"""
|
|
获取项目背景颜色
|
|
|
|
Args:
|
|
project_name: 项目名称
|
|
|
|
Returns:
|
|
颜色值(十六进制),默认为 #2b4c6f
|
|
"""
|
|
return self.config_data.get("project_colors", {}).get(project_name, "#2b4c6f")
|
|
|
|
def set_project_color(self, project_name: str, color: str) -> bool:
|
|
"""
|
|
设置项目背景颜色
|
|
|
|
Args:
|
|
project_name: 项目名称
|
|
color: 颜色值(十六进制)
|
|
|
|
Returns:
|
|
是否设置成功
|
|
"""
|
|
if "project_colors" not in self.config_data:
|
|
self.config_data["project_colors"] = {}
|
|
|
|
self.config_data["project_colors"][project_name] = color
|
|
return True
|
|
|
|
def remove_project_color(self, project_name: str) -> bool:
|
|
"""
|
|
移除项目背景颜色设置
|
|
|
|
Args:
|
|
project_name: 项目名称
|
|
|
|
Returns:
|
|
是否移除成功
|
|
"""
|
|
if project_name in self.config_data.get("project_colors", {}):
|
|
del self.config_data["project_colors"][project_name]
|
|
return True
|
|
return False
|