#!/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