diff --git a/.github/workflows/build-mac.yml b/.github/workflows/build-mac.yml index 63c64379953406cda444c4f740fe22db2a8575a3..6cf2794f19960c53c7ffebcd9aab7cccada574e7 100644 --- a/.github/workflows/build-mac.yml +++ b/.github/workflows/build-mac.yml @@ -119,14 +119,11 @@ jobs: - name: Create DMG run: | - # 创建临时目录结构 mkdir -p dist/dmg/ColorCard.app/Contents/MacOS mkdir -p dist/dmg/ColorCard.app/Contents/Resources - # 复制可执行文件 cp dist/ColorCard dist/dmg/ColorCard.app/Contents/MacOS/ - # 创建 Info.plist cat > dist/dmg/ColorCard.app/Contents/Info.plist << EOF @@ -152,22 +149,18 @@ jobs: EOF - # 创建 DMG - hdiutil create -volname "ColorCard" -srcfolder dist/dmg -ov -format UDZO dist/ColorCard-${{ steps.version.outputs.version }}-macOS.dmg + hdiutil create -volname "ColorCard" -srcfolder dist/dmg -ov -format UDZO dist/Color_Card_${{ steps.version.outputs.version }}_mac.dmg - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ColorCard-macOS - path: | - dist/ColorCard-*.dmg - dist/ColorCard + path: dist/Color_Card_*_mac.dmg - name: Upload Release Asset if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: - files: | - dist/ColorCard-*.dmg + files: dist/Color_Card_*_mac.dmg env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index bb21727e99703641bf5ab931bc2c6240e1d22f7d..5be2d4008eeb9f194c40581c9bf39e64f3082dab 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -2,7 +2,7 @@ name: Deploy GitHub Pages on: push: - branches: [ main, master, Dev ] + branches: [ master] workflow_dispatch: permissions: diff --git a/.gitignore b/.gitignore index fc80f5fe3c6f28af8bb79755426752daa996cb86..685c1451fb46834c29e20902e806705f994743fa 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,8 @@ website/Thumbs.db 文档/著作权登记计划.md /宣传图 文档/1.4.0 更新内容.txt +文档/更新内容.txt +生成源代码文档.py +生成源代码文档_v2.py +/著作权材料 +文档/文档鉴别材料准备计划.md diff --git a/core/histogram_service.py b/core/histogram_service.py index e88cb092d1027f730b64c164975c2bef3a2f9c30..7aa99d5d54daafae2ade2dbd834288ffceb9f666 100644 --- a/core/histogram_service.py +++ b/core/histogram_service.py @@ -192,19 +192,29 @@ class HistogramService(QObject): self._rgb_calculator: Optional[HistogramCalculator] = None self._hue_calculator: Optional[HistogramCalculator] = None self._pending_image: Optional[QImage] = None - self._delay_timer: Optional[QTimer] = None self._use_cache = use_cache self._current_image_key: str = "" self._colorspace_info: Optional[ColorSpaceInfo] = None self._gamma: float = 2.2 + + self._luminance_delay_timer: Optional[QTimer] = None + self._rgb_delay_timer: Optional[QTimer] = None + self._hue_delay_timer: Optional[QTimer] = None + + self._pending_cleanup: List[HistogramCalculator] = [] + self._cleanup_timer: Optional[QTimer] = None def __del__(self): """析构函数:确保所有线程在对象销毁前停止""" self.cancel_all() - # 等待所有线程完全结束 + + for calculator in self._pending_cleanup: + if calculator.isRunning(): + calculator.wait() + for calculator in [self._luminance_calculator, self._rgb_calculator, self._hue_calculator]: if calculator is not None and calculator.isRunning(): - calculator.wait(1000) # 等待最多1秒 + calculator.wait() def set_colorspace_info(self, colorspace_info: Optional[ColorSpaceInfo]) -> None: """设置色彩空间信息 @@ -266,13 +276,12 @@ class HistogramService(QObject): self.luminance_histogram_ready.emit(cached) return - # 使用延迟计算 - if self._delay_timer is None: - self._delay_timer = QTimer(self) - self._delay_timer.setSingleShot(True) - self._delay_timer.timeout.connect(self._start_luminance_calculation) + if self._luminance_delay_timer is None: + self._luminance_delay_timer = QTimer(self) + self._luminance_delay_timer.setSingleShot(True) + self._luminance_delay_timer.timeout.connect(self._start_luminance_calculation) - self._delay_timer.start(delay_ms) + self._luminance_delay_timer.start(delay_ms) def _start_luminance_calculation(self) -> None: """开始明度直方图计算""" @@ -333,13 +342,12 @@ class HistogramService(QObject): self.rgb_histogram_ready.emit(cached[0], cached[1], cached[2]) return - # 使用延迟计算 - if self._delay_timer is None: - self._delay_timer = QTimer(self) - self._delay_timer.setSingleShot(True) - self._delay_timer.timeout.connect(self._start_rgb_calculation) + if self._rgb_delay_timer is None: + self._rgb_delay_timer = QTimer(self) + self._rgb_delay_timer.setSingleShot(True) + self._rgb_delay_timer.timeout.connect(self._start_rgb_calculation) - self._delay_timer.start(delay_ms) + self._rgb_delay_timer.start(delay_ms) def _start_rgb_calculation(self) -> None: """开始RGB直方图计算""" @@ -401,13 +409,12 @@ class HistogramService(QObject): self.hue_histogram_ready.emit(cached) return - # 使用延迟计算 - if self._delay_timer is None: - self._delay_timer = QTimer(self) - self._delay_timer.setSingleShot(True) - self._delay_timer.timeout.connect(self._start_hue_calculation) + if self._hue_delay_timer is None: + self._hue_delay_timer = QTimer(self) + self._hue_delay_timer.setSingleShot(True) + self._hue_delay_timer.timeout.connect(self._start_hue_calculation) - self._delay_timer.start(delay_ms) + self._hue_delay_timer.start(delay_ms) def _start_hue_calculation(self) -> None: """开始色相直方图计算""" @@ -446,7 +453,7 @@ class HistogramService(QObject): self._hue_calculator = None def _safe_stop_calculator(self, calculator: Optional[HistogramCalculator]) -> None: - """安全地停止计算器线程(不使用terminate()) + """安全地停止计算器线程(不阻塞等待) Args: calculator: 要停止的计算器线程 @@ -454,25 +461,41 @@ class HistogramService(QObject): if calculator is None: return - # 断开所有信号连接,防止回调触发 try: calculator.finished.disconnect() - except (TypeError, RuntimeError) as e: - logger.debug(f"断开finished信号时出错: {e}") + except (TypeError, RuntimeError): + pass try: calculator.error.disconnect() - except (TypeError, RuntimeError) as e: - logger.debug(f"断开error信号时出错: {e}") + except (TypeError, RuntimeError): + pass - # 请求取消 calculator.cancel() - # 等待线程结束(增加等待时间到500ms) if calculator.isRunning(): - calculator.wait(500) - - # 注意:如果线程仍在运行,让它在后台自然结束 - # 不要强制终止,下次创建新计算器时会替换旧实例 + self._pending_cleanup.append(calculator) + self._start_cleanup_timer() + + def _start_cleanup_timer(self) -> None: + """启动清理定时器""" + if self._cleanup_timer is None: + self._cleanup_timer = QTimer(self) + self._cleanup_timer.timeout.connect(self._cleanup_pending_threads) + + if not self._cleanup_timer.isActive(): + self._cleanup_timer.start(500) + + def _cleanup_pending_threads(self) -> None: + """清理已结束的线程""" + still_running = [] + for calculator in self._pending_cleanup: + if calculator.isRunning(): + still_running.append(calculator) + + self._pending_cleanup = still_running + + if not self._pending_cleanup: + self._cleanup_timer.stop() def _cancel_luminance_calculator(self) -> None: """取消明度直方图计算""" @@ -491,11 +514,13 @@ class HistogramService(QObject): def cancel_all(self) -> None: """取消所有计算""" - # 先停止延迟计时器,防止新的计算开始 - if self._delay_timer is not None and self._delay_timer.isActive(): - self._delay_timer.stop() + if self._luminance_delay_timer is not None and self._luminance_delay_timer.isActive(): + self._luminance_delay_timer.stop() + if self._rgb_delay_timer is not None and self._rgb_delay_timer.isActive(): + self._rgb_delay_timer.stop() + if self._hue_delay_timer is not None and self._hue_delay_timer.isActive(): + self._hue_delay_timer.stop() - # 取消所有进行中的计算 self._cancel_luminance_calculator() self._cancel_rgb_calculator() self._cancel_hue_calculator() diff --git a/core/logger.py b/core/logger.py index cf6468a5feac5ad45c57f6729d08853b60633f54..73d8dc2bb59683ba39907cba86b1b741f50dedf4 100644 --- a/core/logger.py +++ b/core/logger.py @@ -1,9 +1,9 @@ # 标准库导入 import logging -import logging.handlers import sys import time from contextlib import contextmanager +from datetime import datetime, timedelta from pathlib import Path from typing import Any, Dict, Optional @@ -13,15 +13,14 @@ class LoggerManager: CONFIG_DIR_NAME: str = ".color_card" LOG_DIR_NAME: str = "logs" - LOG_FILE_NAME: str = "color_card.log" - MAX_BYTES: int = 10 * 1024 * 1024 - BACKUP_COUNT: int = 7 + LOG_RETENTION_DAYS: int = 30 def __init__(self) -> None: """初始化日志管理器""" self._log_dir: Path = self._get_log_dir() self._logger: Optional[logging.Logger] = None self._initialized: bool = False + self._current_log_file: Optional[Path] = None def _get_log_dir(self) -> Path: """获取日志目录路径 @@ -37,6 +36,30 @@ class LoggerManager: """确保日志目录存在""" self._log_dir.mkdir(parents=True, exist_ok=True) + def _generate_log_filename(self) -> str: + """生成日志文件名 + + Returns: + str: 日志文件名,格式为 Color Card_版本号_YYYYMMDD_HHMMSS.log + """ + from version import version_manager + version = version_manager.get_version() + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + return f"Color Card_{version}_{timestamp}.log" + + def _cleanup_old_logs(self) -> None: + """清理过期的日志文件""" + cutoff_time = datetime.now() - timedelta(days=self.LOG_RETENTION_DAYS) + for log_file in self._log_dir.glob("Color Card_*.log"): + if log_file == self._current_log_file: + continue + try: + file_mtime = datetime.fromtimestamp(log_file.stat().st_mtime) + if file_mtime < cutoff_time: + log_file.unlink() + except OSError: + pass + def initialize(self, level: int = logging.INFO) -> None: """初始化日志系统 @@ -53,11 +76,10 @@ class LoggerManager: self._logger.handlers.clear() - log_path = self._log_dir / self.LOG_FILE_NAME - file_handler = logging.handlers.RotatingFileHandler( - log_path, - maxBytes=self.MAX_BYTES, - backupCount=self.BACKUP_COUNT, + log_filename = self._generate_log_filename() + self._current_log_file = self._log_dir / log_filename + file_handler = logging.FileHandler( + self._current_log_file, encoding="utf-8" ) file_handler.setLevel(level) @@ -78,6 +100,8 @@ class LoggerManager: self._initialized = True self._logger.info("日志系统初始化完成") + self._cleanup_old_logs() + def get_logger(self, name: str) -> logging.Logger: """获取模块级日志记录器 @@ -97,7 +121,7 @@ class LoggerManager: Returns: Path: 日志文件路径 """ - return self._log_dir / self.LOG_FILE_NAME + return self._current_log_file or self._log_dir def get_log_dir(self) -> Path: """获取日志目录路径 diff --git a/core/luminance_service.py b/core/luminance_service.py index 2d2cfb6cc47fc052c49d3cd8e88525ed1ec4e3b4..2ebcb169cb869cfb1e0e64f90935406c3e1c45f0 100644 --- a/core/luminance_service.py +++ b/core/luminance_service.py @@ -8,7 +8,7 @@ UI层通过LuminanceService调用业务功能,实现UI与业务逻辑分离。 from typing import Dict, List, Optional, Tuple, Any # 第三方库导入 -from PySide6.QtCore import QObject, QThread, Signal, Qt +from PySide6.QtCore import QObject, QThread, Signal, Qt, QTimer from PySide6.QtGui import QColor, QImage, QPainter, QPixmap # 项目模块导入 @@ -174,12 +174,19 @@ class LuminanceService(QObject): """ super().__init__(parent) self._calculator: Optional[LuminanceCalculator] = None + + self._pending_cleanup: List[LuminanceCalculator] = [] + self._cleanup_timer: Optional[QTimer] = None def __del__(self): """析构函数:确保线程在对象销毁前停止""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() - self._calculator.wait(1000) # 等待最多1秒 + self._calculator.wait() + + for calculator in self._pending_cleanup: + if calculator.isRunning(): + calculator.wait() def calculate_luminance_zones(self, image: QImage) -> None: """开始计算明度Zone分布 @@ -190,9 +197,20 @@ class LuminanceService(QObject): Args: image: QImage 对象 """ - # 取消之前的计算 if self._calculator is not None and self._calculator.isRunning(): + try: + self._calculator.calculation_finished.disconnect() + except (TypeError, RuntimeError): + pass + try: + self._calculator.calculation_error.disconnect() + except (TypeError, RuntimeError): + pass + self._calculator.cancel() + if self._calculator.isRunning(): + self._pending_cleanup.append(self._calculator) + self._start_cleanup_timer() self._calculator = None self.calculation_started.emit() @@ -214,6 +232,31 @@ class LuminanceService(QObject): """取消当前计算任务""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() + if self._calculator.isRunning(): + self._pending_cleanup.append(self._calculator) + self._start_cleanup_timer() + self._calculator = None + + def _start_cleanup_timer(self) -> None: + """启动清理定时器""" + if self._cleanup_timer is None: + self._cleanup_timer = QTimer(self) + self._cleanup_timer.timeout.connect(self._cleanup_pending_threads) + + if not self._cleanup_timer.isActive(): + self._cleanup_timer.start(500) + + def _cleanup_pending_threads(self) -> None: + """清理已结束的线程""" + still_running = [] + for calculator in self._pending_cleanup: + if calculator.isRunning(): + still_running.append(calculator) + + self._pending_cleanup = still_running + + if not self._pending_cleanup: + self._cleanup_timer.stop() def get_zone_at_position(self, image: QImage, x: int, y: int) -> str: """获取指定位置的Zone编号 @@ -352,7 +395,3 @@ class LuminanceService(QObject): if self._calculator is not None: self._calculator.deleteLater() self._calculator = None - - -# 导入Qt常量 -from PySide6.QtCore import Qt diff --git a/dialogs/edit_palette.py b/dialogs/edit_palette.py index 1f1ed4c7023c4292249389b7129464b7f3c2459c..ef8e8dd58cf71ee688fc7027c39004320fa5b012 100644 --- a/dialogs/edit_palette.py +++ b/dialogs/edit_palette.py @@ -299,7 +299,7 @@ class EditPaletteDialog(QDialog): # 添加颜色按钮 self.add_color_button = PushButton(FluentIcon.ADD, tr('dialogs.edit_palette.add_color')) self.add_color_button.setFixedHeight(32) - self.add_color_button.clicked.connect(self._on_add_color) + self.add_color_button.clicked.connect(lambda: self._on_add_color()) layout.addWidget(self.add_color_button) # 按钮区域 @@ -324,15 +324,20 @@ class EditPaletteDialog(QDialog): self.name_input.setFocus() self.name_input.selectAll() - # 添加第一个颜色输入行 - self._on_add_color() + # 添加第一个颜色输入行(不滚动) + self._on_add_color(scroll_to_bottom=False) - def _on_add_color(self): - """添加颜色输入行""" + def _on_add_color(self, scroll_to_bottom: bool = True): + """添加颜色输入行 + + Args: + scroll_to_bottom: 是否滚动到底部(默认True,初始化时传False) + """ row = ColorInputRow(len(self._color_rows), self.colors_container) self._color_rows.append(row) self.colors_layout.addWidget(row) - self._scroll_to_bottom() + if scroll_to_bottom: + self._scroll_to_bottom() def _scroll_to_bottom(self): """滚动到颜色列表底部""" diff --git a/docs/changelog.json b/docs/changelog.json index e9a542abae51cda660a14997573d46c11f74f1ca..8534c3d93cef6aed1607f6d30b6b49c7b76d3a78 100644 --- a/docs/changelog.json +++ b/docs/changelog.json @@ -1,156 +1,273 @@ { "versions": [ + { + "version": "v1.4.1", + "date": "2026-03-02", + "changes": [ + { + "category": "问题修复", + "items": [ + "修复面板切换时线程崩溃问题", + "修复编辑配色对话框初始化时自动滚动到末尾的问题", + "修复明度直方图拖动时区域指示不匹配的问题" + ] + }, + { + "category": "界面优化", + "items": [ + "统一明度遮罩颜色并优化颜色方案" + ] + }, + { + "category": "功能优化", + "items": [ + "日志系统支持每次启动创建新文件", + "优化Mac构建流程输出文件命名" + ] + } + ] + }, { "version": "v1.4.0", "date": "2026-03-01", "changes": [ - "取色卡 v1.4 更新日志", - "新增功能", - "渐变提取", - "新增渐变提取功能,支持RGB/HSB/LAB三种颜色空间的渐变插值", - "官网入口", - "新增项目官网和关于对话框官网按钮", - "版本管理", - "版本比较支持预发布版本号识别", - "日志系统", - "新增日志系统,支持问题排查、行为追踪、性能监控", - "问题修复", - "修复配色源显示逻辑,使用name字段替代中文name_zh字段", - "修复多线程和延迟加载导致的闪退问题,提升稳定性", - "修复配色管理面板编辑后页码重置问题", - "界面优化", - "更换程序 Logo", - "缩小配色管理分组下拉框宽度", - "优化主窗口启动位置为屏幕居中显示", - "优化多语言显示,精简法语和俄语翻译", - "编辑配色对话框打开默认自动滚动到底部", - "性能提升", - "优化SVG智能映射逻辑,新增覆盖检测功能", - "将直方图分区从8个改为9个,优化明度分析精度", - "内容调整", - "删除配色源名称中的「主题」和「配色」后缀", - "丰富配色预览内置SVG模板" + { + "category": "新增功能", + "items": [ + { + "title": "渐变提取", + "desc": "新增渐变提取功能,支持RGB/HSB/LAB三种颜色空间的渐变插值" + }, + { + "title": "官网入口", + "desc": "新增项目官网和关于对话框官网按钮" + }, + { + "title": "版本管理", + "desc": "版本比较支持预发布版本号识别" + }, + { + "title": "日志系统", + "desc": "新增日志系统,支持问题排查、行为追踪、性能监控" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复配色源显示逻辑,使用name字段替代中文name_zh字段", + "修复多线程和延迟加载导致的闪退问题,提升稳定性", + "修复配色管理面板编辑后页码重置问题" + ] + }, + { + "category": "界面优化", + "items": [ + "更换程序 Logo", + "缩小配色管理分组下拉框宽度", + "优化主窗口启动位置为屏幕居中显示", + "优化多语言显示,精简法语和俄语翻译", + "编辑配色对话框打开默认自动滚动到底部" + ] + }, + { + "category": "逻辑优化", + "items": [ + "优化SVG智能映射逻辑,新增覆盖检测功能", + "将直方图分区从8个改为9个,优化明度分析精度" + ] + }, + { + "category": "内容调整", + "items": [ + "删除配色源名称中的「主题」和「配色」后缀", + "丰富配色预览内置SVG模板" + ] + } ] }, { "version": "v1.3.0 Beta", "date": "2026-02-22", "changes": [ - "取色卡 v1.3.0 Beta 更新日志", - "新增功能", - "多语言支持", - "新增多语言切换功能,支持简体中文、繁體中文、English、日本語、Français、Русский 六种语言", - "在设置界面即可切换语言,实时生效", - "色彩分析增强", - "新增图片色彩空间识别与Gamma校正支持,提升颜色提取准确性", - "采样点数量上限提升至6个,可同时提取更多颜色", - "配色预览面板", - "配色预览功能全面重构,统一使用SVG格式模板", - "新增大量场景示例", - "新增色彩管理面板分组功能,便于浏览和管理配色方案", - "问题修复", - "修复色轮采样点无法到达圆周的问题,现在采样点可以正确移动到色轮边缘", - "修复RYB模式配色关系不正确的问题,配色生成结果更加准确", - "界面优化", - "调整色轮色相起始位置至12点钟方向,更符合设计习惯", - "调整主窗口最小宽度和默认宽度,优化界面布局", - "内置色彩分批加载时添加加载中过渡标识,提升加载体验", - "直方图组件添加加载中提示,大图片加载时反馈更清晰", - "优化直方图自适应缩放模式显示逻辑", - "性能提升", - "实现配色计算和直方图计算缓存机制,重复操作响应更快", - "优化直方图计算服务,缩短延迟计算时间,大图片加载性能显著提升", - "实现业务服务延迟加载,减少应用启动时间", - "实现图片内存管理和线程安全优化,运行更稳定", - "许可证完善", - "添加PyInstaller许可证到项目许可证文档,完善开源合规性" + { + "category": "新增功能", + "items": [ + { + "title": "多语言支持", + "desc": "新增多语言切换功能,支持简体中文、繁體中文、English、日本語、Français、Русский 六种语言,在设置界面即可切换语言,实时生效" + }, + { + "title": "色彩分析增强", + "desc": "新增图片色彩空间识别与Gamma校正支持,提升颜色提取准确性,采样点数量上限提升至6个,可同时提取更多颜色" + }, + { + "title": "配色预览面板", + "desc": "配色预览功能全面重构,统一使用SVG格式模板,新增大量场景示例,新增色彩管理面板分组功能,便于浏览和管理配色方案" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复色轮采样点无法到达圆周的问题,现在采样点可以正确移动到色轮边缘", + "修复RYB模式配色关系不正确的问题,配色生成结果更加准确" + ] + }, + { + "category": "界面优化", + "items": [ + "调整色轮色相起始位置至12点钟方向,更符合设计习惯", + "调整主窗口最小宽度和默认宽度,优化界面布局", + "内置色彩分批加载时添加加载中过渡标识,提升加载体验", + "直方图组件添加加载中提示,大图片加载时反馈更清晰", + "优化直方图自适应缩放模式显示逻辑" + ] + }, + { + "category": "性能提升", + "items": [ + "实现配色计算和直方图计算缓存机制,重复操作响应更快", + "优化直方图计算服务,缩短延迟计算时间,大图片加载性能显著提升", + "实现业务服务延迟加载,减少应用启动时间", + "实现图片内存管理和线程安全优化,运行更稳定" + ] + }, + { + "category": "许可证完善", + "items": [ + "添加PyInstaller许可证到项目许可证文档,完善开源合规性" + ] + } ] }, { "version": "v1.2.0", "date": "2026-02-15", "changes": [ - "取色卡 v1.2 更新日志", - "新增功能", - "色彩分析增强", - "新增色彩提取页面高饱和度/高明度区域显示功能,支持自定义阈值配置", - "RGB直方图添加通道切换按钮,支持点击按钮切换显示单通道或全通道", - "在色环周围显示色相名称标签,色彩识别更直观", - "色盲模拟预览", - "新增色盲模拟预览功能,支持多种色盲类型模拟", - "对比度检查", - "新增对比度检查功能,确保色彩组合的可读性", - "配色预览面板", - "新增配色预览面板,支持10种场景的预览", - "支持导入SVG文件预览", - "右键菜单可删除颜色和复制HEX值", - "内置色彩面板", - "新增内置色彩面板,集成大量开源配色方案", - "包含 Open Color、Nice Color Palettes、Tailwind CSS Colors 等知名配色库", - "支持配色随机模式、收藏到配色管理面板、预览功能", - "配色管理增强", - "为色卡收藏面板添加16进制颜色值编辑功能", - "新增编辑配色对话框,支持添加和编辑配色", - "启动体验优化", - "添加启动画面并优化启动时机", - "问题修复", - "修复增加色彩提取采样点数后新色卡信息不更新的问题", - "修复全屏按钮窗口状态保存与最大化混淆的问题", - "修复Win10深色模式适配问题", - "修复明度提取界面图片加载时Zone标签框未隐藏的问题", - "修复HSB色轮明度计算问题并优化配色方案随机算法", - "修复色块边框主题切换适配问题", - "修复HSB色轮在窗口调整和明度调整时的闪烁问题", - "修正所有文件中的版权和官网信息", - "修复 Logo 路径硬编码导致打包后无法显示的问题", - "移除明度面板导入图片时标题栏文件名显示", - "界面优化", - "移除收藏页面操作按钮的Tooltip", - "缩小配色生成卡片中16进制输入框与操作按钮的间距", - "调整主窗口大小", - "为图标增加圆角裁切", - "优化图标和交互体验,禁用原生右键菜单", - "性能提升", - "优化应用启动速度:色轮缓存和配色方案颜色延迟生成", - "代码重构", - "将色卡收藏面板重命名为配色管理,将配色方案面板重命名为配色生成", - "统一配色管理导入导出JSON格式", - "新增编辑配色对话框" + { + "category": "新增功能", + "items": [ + { + "title": "色彩分析增强", + "desc": "新增色彩提取页面高饱和度/高明度区域显示功能,支持自定义阈值配置,RGB直方图添加通道切换按钮,支持点击按钮切换显示单通道或全通道,在色环周围显示色相名称标签,色彩识别更直观" + }, + { + "title": "色盲模拟预览", + "desc": "新增色盲模拟预览功能,支持多种色盲类型模拟" + }, + { + "title": "对比度检查", + "desc": "新增对比度检查功能,确保色彩组合的可读性" + }, + { + "title": "配色预览面板", + "desc": "新增配色预览面板,支持10种场景的预览,支持导入SVG文件预览,右键菜单可删除颜色和复制HEX值" + }, + { + "title": "内置色彩面板", + "desc": "新增内置色彩面板,集成大量开源配色方案,包含 Open Color、Nice Color Palettes、Tailwind CSS Colors 等知名配色库,支持配色随机模式、收藏到配色管理面板、预览功能" + }, + { + "title": "配色管理增强", + "desc": "为色卡收藏面板添加16进制颜色值编辑功能,新增编辑配色对话框,支持添加和编辑配色" + }, + { + "title": "启动体验优化", + "desc": "添加启动画面并优化启动时机" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复增加色彩提取采样点数后新色卡信息不更新的问题", + "修复全屏按钮窗口状态保存与最大化混淆的问题", + "修复Win10深色模式适配问题", + "修复明度提取界面图片加载时Zone标签框未隐藏的问题", + "修复HSB色轮明度计算问题并优化配色方案随机算法", + "修复色块边框主题切换适配问题", + "修复HSB色轮在窗口调整和明度调整时的闪烁问题", + "修正所有文件中的版权和官网信息", + "修复 Logo 路径硬编码导致打包后无法显示的问题", + "移除明度面板导入图片时标题栏文件名显示" + ] + }, + { + "category": "界面优化", + "items": [ + "移除收藏页面操作按钮的Tooltip", + "缩小配色生成卡片中16进制输入框与操作按钮的间距", + "调整主窗口大小", + "为图标增加圆角裁切", + "优化图标和交互体验,禁用原生右键菜单" + ] + }, + { + "category": "性能提升", + "items": [ + "优化应用启动速度:色轮缓存和配色方案颜色延迟生成" + ] + }, + { + "category": "代码重构", + "items": [ + "将色卡收藏面板重命名为配色管理,将配色方案面板重命名为配色生成", + "统一配色管理导入导出JSON格式", + "新增编辑配色对话框" + ] + } ] }, { "version": "v1.1.0", "date": "2026-02-08", "changes": [ - "取色卡 v1.1 更新日志", - "新增功能", - "智能配色方案", - "新增配色方案功能,支持 RGB/RYB 两种色彩逻辑", - "提供 5 种专业配色算法:同色系、邻近色、互补色、分离补色、双补色", - "色卡收藏功能", - "支持色彩提取、配色方案面板的配色收藏", - "支持收藏管理,可批量导入导出", - "图片分析增强", - "集成 MMCQ 算法,自动提取图片主色调", - "直方图新增自适应缩放,支持线性和平方根两种模式切换", - "明度区域采用 Adobe 标准命名:黑色/阴影/中间调/高光/白色", - "界面体验升级", - "新增深色/浅色主题切换,优化文本对比度", - "标题栏新增全屏按钮,支持 F11 快捷键", - "重构导入图片,分阶段加载有明确的视觉反馈", - "支持拖拽图片直接导入", - "问题修复", - "修复色彩提取和明度提取面板布局重叠问题", - "修复明度直方图蓝色指示框松开后不消失的问题", - "优化异常报错过滤,减少干扰提示", - "界面优化", - "统一图片显示器、直方图、色环背景色为深灰色", - "设置界面内容重新分类,更清晰易用", - "16进制颜色值开关显示中文开/关", - "新增界面布局规范,防止组件重叠", - "性能提升", - "使用 NumPy 向量化优化明度直方图计算,响应更快", - "代码重构:统一颜色管理,消除硬编码" + { + "category": "新增功能", + "items": [ + { + "title": "智能配色方案", + "desc": "新增配色方案功能,支持 RGB/RYB 两种色彩逻辑,提供 5 种专业配色算法:同色系、邻近色、互补色、分离补色、双补色" + }, + { + "title": "色卡收藏功能", + "desc": "支持色彩提取、配色方案面板的配色收藏,支持收藏管理,可批量导入导出" + }, + { + "title": "图片分析增强", + "desc": "集成 MMCQ 算法,自动提取图片主色调,直方图新增自适应缩放,支持线性和平方根两种模式切换,明度区域采用 Adobe 标准命名:黑色/阴影/中间调/高光/白色" + }, + { + "title": "界面体验升级", + "desc": "新增深色/浅色主题切换,优化文本对比度,标题栏新增全屏按钮,支持 F11 快捷键,重构导入图片,分阶段加载有明确的视觉反馈,支持拖拽图片直接导入" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复色彩提取和明度提取面板布局重叠问题", + "修复明度直方图蓝色指示框松开后不消失的问题", + "优化异常报错过滤,减少干扰提示" + ] + }, + { + "category": "界面优化", + "items": [ + "统一图片显示器、直方图、色环背景色为深灰色", + "设置界面内容重新分类,更清晰易用", + "16进制颜色值开关显示中文开/关", + "新增界面布局规范,防止组件重叠" + ] + }, + { + "category": "性能提升", + "items": [ + "使用 NumPy 向量化优化明度直方图计算,响应更快", + "代码重构:统一颜色管理,消除硬编码" + ] + } ] } ] diff --git a/docs/index.html b/docs/index.html index ee70906f36786bc54b631290d0eaa5465dc5b1f5..86aea0c58d7331537344246614083acbd446648b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1454,31 +1454,55 @@ if (!response.ok) throw new Error('Failed to fetch'); const data = await response.json(); const versions = data.versions; - + if (versions.length === 0) { container.innerHTML = '