Files
NexusLauncher/config/icon_config.py
2025-11-23 20:41:50 +08:00

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