Update
This commit is contained in:
312
config/icon_config.py
Normal file
312
config/icon_config.py
Normal file
@@ -0,0 +1,312 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user