From 22a42c40e02595d094353a77d44c23c18103d748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Sun, 1 Mar 2026 20:55:48 +0800 Subject: [PATCH 01/16] =?UTF-8?q?[=E6=96=87=E6=A1=A3]=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=AE=98=E7=BD=91=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.json | 2 +- website/public/changelog.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.json b/docs/changelog.json index e9a542a..b1c612a 100644 --- a/docs/changelog.json +++ b/docs/changelog.json @@ -24,7 +24,7 @@ "优化主窗口启动位置为屏幕居中显示", "优化多语言显示,精简法语和俄语翻译", "编辑配色对话框打开默认自动滚动到底部", - "性能提升", + "逻辑优化", "优化SVG智能映射逻辑,新增覆盖检测功能", "将直方图分区从8个改为9个,优化明度分析精度", "内容调整", diff --git a/website/public/changelog.json b/website/public/changelog.json index 81ba880..4b4f3a2 100644 --- a/website/public/changelog.json +++ b/website/public/changelog.json @@ -24,7 +24,7 @@ "优化主窗口启动位置为屏幕居中显示", "优化多语言显示,精简法语和俄语翻译", "编辑配色对话框打开默认自动滚动到底部", - "性能提升", + "逻辑优化", "优化SVG智能映射逻辑,新增覆盖检测功能", "将直方图分区从8个改为9个,优化明度分析精度", "内容调整", -- Gitee From 801650bc277c7c3781759a55e4d570cd77906e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Sun, 1 Mar 2026 22:20:07 +0800 Subject: [PATCH 02/16] =?UTF-8?q?[=E4=BF=AE=E5=A4=8D]=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=88=87=E6=8D=A2=E6=97=B6=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 HistogramService 线程等待超时后直接置空引用导致崩溃的问题 - 为三种直方图计算(明度/RGB/色相)添加独立的延迟计时器,避免计算冲突 - 修改 _safe_stop_calculator 方法,确保线程完全停止后再返回 - 修复 LuminanceService 线程停止逻辑,等待线程结束后再置空引用 - 修改服务类析构函数使用无限等待确保线程安全退出 --- core/histogram_service.py | 61 +++++++++++++++++++-------------------- core/luminance_service.py | 9 ++++-- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/core/histogram_service.py b/core/histogram_service.py index e88cb09..7e89cb2 100644 --- a/core/histogram_service.py +++ b/core/histogram_service.py @@ -192,19 +192,21 @@ 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 def __del__(self): """析构函数:确保所有线程在对象销毁前停止""" self.cancel_all() - # 等待所有线程完全结束 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 +268,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 +334,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 +401,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: """开始色相直方图计算""" @@ -454,7 +453,6 @@ class HistogramService(QObject): if calculator is None: return - # 断开所有信号连接,防止回调触发 try: calculator.finished.disconnect() except (TypeError, RuntimeError) as e: @@ -464,15 +462,12 @@ class HistogramService(QObject): except (TypeError, RuntimeError) as e: logger.debug(f"断开error信号时出错: {e}") - # 请求取消 calculator.cancel() - # 等待线程结束(增加等待时间到500ms) if calculator.isRunning(): - calculator.wait(500) - - # 注意:如果线程仍在运行,让它在后台自然结束 - # 不要强制终止,下次创建新计算器时会替换旧实例 + if not calculator.wait(2000): + logger.warning("线程等待超时,继续等待直到线程结束") + calculator.wait() def _cancel_luminance_calculator(self) -> None: """取消明度直方图计算""" @@ -491,11 +486,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/luminance_service.py b/core/luminance_service.py index 2d2cfb6..33d47f6 100644 --- a/core/luminance_service.py +++ b/core/luminance_service.py @@ -179,7 +179,7 @@ class LuminanceService(QObject): """析构函数:确保线程在对象销毁前停止""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() - self._calculator.wait(1000) # 等待最多1秒 + self._calculator.wait() def calculate_luminance_zones(self, image: QImage) -> None: """开始计算明度Zone分布 @@ -190,9 +190,11 @@ class LuminanceService(QObject): Args: image: QImage 对象 """ - # 取消之前的计算 if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() + if not self._calculator.wait(2000): + logger.warning("明度计算线程等待超时,继续等待直到线程结束") + self._calculator.wait() self._calculator = None self.calculation_started.emit() @@ -214,6 +216,9 @@ class LuminanceService(QObject): """取消当前计算任务""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() + if not self._calculator.wait(2000): + logger.warning("取消计算时线程等待超时,继续等待直到线程结束") + self._calculator.wait() def get_zone_at_position(self, image: QImage, x: int, y: int) -> str: """获取指定位置的Zone编号 -- Gitee From b47122121e28ca290c9d65bcf80585fb74bbebf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 13:10:17 +0800 Subject: [PATCH 03/16] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=85=8D=E8=89=B2=E5=AF=B9=E8=AF=9D=E6=A1=86?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E8=87=AA=E5=8A=A8=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E5=88=B0=E6=9C=AB=E5=B0=BE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 _on_add_color() 方法添加 scroll_to_bottom 参数控制是否滚动 - 初始化调用时传入 scroll_to_bottom=False 避免自动滚动 - 修复按钮信号连接使用 lambda 包装避免 clicked 信号的 checked 参数干扰 --- .gitignore | 4 ++++ dialogs/edit_palette.py | 17 +++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index fc80f5f..61c7259 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,7 @@ website/Thumbs.db 文档/著作权登记计划.md /宣传图 文档/1.4.0 更新内容.txt +文档/文档鉴别材料准备计划.md +生成源代码文档.py +生成源代码文档_v2.py +/著作权材料 diff --git a/dialogs/edit_palette.py b/dialogs/edit_palette.py index 1f1ed4c..ef8e8dd 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): """滚动到颜色列表底部""" -- Gitee From cddf7f8ec29fd6f8b6fde596f63aa7acca728622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 13:27:35 +0800 Subject: [PATCH 04/16] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=88=87=E6=8D=A2=E5=93=8D=E5=BA=94=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E9=87=87=E7=94=A8=E7=BA=BF=E7=A8=8B=E5=BB=B6?= =?UTF-8?q?=E8=BF=9F=E6=B8=85=E7=90=86=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 HistogramService 和 LuminanceService 采用延迟清理策略,避免阻塞UI线程 - 新增 _pending_cleanup 列表存储待清理的线程引用 - 新增 _cleanup_timer 定时器定期检查并清理已结束的线程 - 修改 _safe_stop_calculator 方法不再阻塞等待线程结束 - 删除 luminance_service.py 末尾冗余的 Qt 导入 --- core/histogram_service.py | 44 ++++++++++++++++++++++++------ core/luminance_service.py | 56 +++++++++++++++++++++++++++++++-------- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/core/histogram_service.py b/core/histogram_service.py index 7e89cb2..7aa99d5 100644 --- a/core/histogram_service.py +++ b/core/histogram_service.py @@ -200,10 +200,18 @@ class HistogramService(QObject): 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() @@ -445,7 +453,7 @@ class HistogramService(QObject): self._hue_calculator = None def _safe_stop_calculator(self, calculator: Optional[HistogramCalculator]) -> None: - """安全地停止计算器线程(不使用terminate()) + """安全地停止计算器线程(不阻塞等待) Args: calculator: 要停止的计算器线程 @@ -455,19 +463,39 @@ class HistogramService(QObject): 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() if calculator.isRunning(): - if not calculator.wait(2000): - logger.warning("线程等待超时,继续等待直到线程结束") - calculator.wait() + 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: """取消明度直方图计算""" diff --git a/core/luminance_service.py b/core/luminance_service.py index 33d47f6..2ebcb16 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() + + for calculator in self._pending_cleanup: + if calculator.isRunning(): + calculator.wait() def calculate_luminance_zones(self, image: QImage) -> None: """开始计算明度Zone分布 @@ -191,10 +198,19 @@ class LuminanceService(QObject): 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 not self._calculator.wait(2000): - logger.warning("明度计算线程等待超时,继续等待直到线程结束") - self._calculator.wait() + if self._calculator.isRunning(): + self._pending_cleanup.append(self._calculator) + self._start_cleanup_timer() self._calculator = None self.calculation_started.emit() @@ -216,9 +232,31 @@ class LuminanceService(QObject): """取消当前计算任务""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() - if not self._calculator.wait(2000): - logger.warning("取消计算时线程等待超时,继续等待直到线程结束") - self._calculator.wait() + 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编号 @@ -357,7 +395,3 @@ class LuminanceService(QObject): if self._calculator is not None: self._calculator.deleteLater() self._calculator = None - - -# 导入Qt常量 -from PySide6.QtCore import Qt -- Gitee From d2c1c10cb10341b6c9d237f72ccd46fc479d8d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 13:44:20 +0800 Subject: [PATCH 05/16] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=94=AF=E6=8C=81=E6=AF=8F=E6=AC=A1=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=88=9B=E5=BB=BA=E6=96=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/logger.py | 44 ++++++++++++++----- ...00\345\217\221\350\247\204\350\214\203.md" | 14 +++--- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/core/logger.py b/core/logger.py index cf6468a..73d8dc2 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/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" "b/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" index 960bca8..0162962 100644 --- "a/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" +++ "b/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" @@ -2245,15 +2245,16 @@ class MyInterface(QWidget): **存储位置:** - 日志存储在配置目录下的 `logs/` 子目录 -- 路径:`~/.color_card/logs/color_card.log` +- 路径:`~/.color_card/logs/` **文件命名:** -- 当前日志:`color_card.log` -- 历史日志:`color_card.log.1`, `color_card.log.2` 等 +- 格式:`Color Card_版本号_YYYYMMDD_HHMMSS.log` +- 示例:`Color Card_1.4.0_20260302_143025.log` +- 每次启动应用创建一个新的日志文件 -**轮转策略:** -- 按大小轮转:单个日志文件最大 10MB -- 保留数量:保留最近 7 个备份文件 +**清理策略:** +- 保留天数:保留最近 30 天的日志文件 +- 启动时自动清理过期日志 ### 17.3 日志级别定义 @@ -2855,6 +2856,7 @@ def _get_about_text(self): |版本 |日期 |变更内容 | |:---:|:---:|:---:| +|3.36 |2026-03-02 |优化日志系统:每次启动创建新日志文件,文件名格式为 `Color Card_版本号_YYYYMMDD_HHMMSS.log`;移除按大小轮转策略,改为按启动创建新文件;新增日志清理策略,自动清理30天前的日志文件;更新第17.2节日志配置说明 | |3.35 |2026-02-28 |日志系统第二阶段:核心模块日志接入(color_service.py、image_service.py、config.py);用户操作日志接入(color_extract.py、canvases.py);添加性能日志记录(extract_dominant_colors、load_image) | |3.34 |2026-02-28 |新增日志系统:创建 `core/logger.py` 模块,包含 `LoggerManager`、`get_logger`、`log_user_action`、`log_performance`;日志存储在 `~/.color_card/logs/` 目录,支持文件轮转(最大10MB,保留7个备份);在 `main.py` 中集成日志初始化和全局异常捕获;更新项目结构和开发规范(新增第17章日志系统规范) | |3.33 |2026-02-28 |P3多线程优化修复:优化 `HistogramCalculator` 和 `ProgressiveImageLoader` 的 `cancel()` 方法移除 `wait()` 调用;为所有线程类和服务类添加线程安全文档注释;创建 `tests/` 测试目录,包含 19 个多线程测试用例;创建 `pytest.ini` 配置文件和 `tests/requirements-dev.txt` 开发依赖文件;新增第20章测试规范;更新章节编号(原第20章开源许可证管理规范改为第21章,原第21章附录改为第22章) | -- Gitee From 68a4b2b578f564dd32de16609c2ea083f8d9f176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 13:46:18 +0800 Subject: [PATCH 06/16] Update .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 61c7259..c8c3025 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,8 @@ website/Thumbs.db 生成源代码文档.py 生成源代码文档_v2.py /著作权材料 +/著作权材料 +文档/文档鉴别材料准备计划.md +生成源代码文档_v2.py +生成源代码文档.py +生成源代码文档_v2.py -- Gitee From bf625900a3ed078a3231b3b6241dcce35a8205a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 13:52:15 +0800 Subject: [PATCH 07/16] =?UTF-8?q?[=E5=86=85=E5=AE=B9=E8=B0=83=E6=95=B4]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- version.py | 2 +- version.txt | 2 +- version_info.txt | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/version.py b/version.py index 09a926f..37f392a 100644 --- a/version.py +++ b/version.py @@ -9,7 +9,7 @@ class VersionManager: # 版本号组件 self.major: int = 1 self.minor: int = 4 - self.patch: int = 0 + self.patch: int = 1 self.build: int = 0 self.prerelease: str = "" diff --git a/version.txt b/version.txt index e21e727..13175fd 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.4.0 \ No newline at end of file +1.4.1 \ No newline at end of file diff --git a/version_info.txt b/version_info.txt index e4ed43c..ac1688f 100644 --- a/version_info.txt +++ b/version_info.txt @@ -1,7 +1,7 @@ VSVersionInfo( ffi=FixedFileInfo( - filevers=(2026,3,1,1), - prodvers=(1,4,0,0), + filevers=(2026,3,2,1), + prodvers=(1,4,1,0), mask=0x3f, flags=0x0, OS=0x4, @@ -17,12 +17,12 @@ VSVersionInfo( [ StringStruct(u'CompanyName', u'浮晓 HXiao Studio'), StringStruct(u'FileDescription', u'取色卡 - Color Card'), - StringStruct(u'FileVersion', u'1.4.0'), + StringStruct(u'FileVersion', u'1.4.1'), StringStruct(u'InternalName', u'Color_Card'), StringStruct(u'LegalCopyright', u'© 2026 浮晓 HXiao Studio'), StringStruct(u'OriginalFilename', u'Color_Card.exe'), StringStruct(u'ProductName', u'取色卡'), - StringStruct(u'ProductVersion', u'1.4.0'), + StringStruct(u'ProductVersion', u'1.4.1'), StringStruct(u'Comments', u'一站式的图片的图片分析和配色工具') ] ) -- Gitee From 1ce7622314afb00229fd94773bc7e8d2ac938f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 14:25:05 +0800 Subject: [PATCH 08/16] =?UTF-8?q?[=E4=BF=AE=E5=A4=8D]=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=98=8E=E5=BA=A6=E7=9B=B4=E6=96=B9=E5=9B=BE=E6=8B=96=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E5=8C=BA=E5=9F=9F=E6=8C=87=E7=A4=BA=E4=B8=8D=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 问题:Zone "8-9" 被错误地绘制到 Zone 7 的位置 - 原因:get_zone_bounds 使用 int() 向下取整导致信息丢失,反推计算时产生累积误差 - 解决:直接从 Zone 字符串解析索引,避免通过 get_zone_bounds 反推计算 --- ui/histograms.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/histograms.py b/ui/histograms.py index e4c822f..d703329 100644 --- a/ui/histograms.py +++ b/ui/histograms.py @@ -6,7 +6,7 @@ from PySide6.QtGui import QColor, QFont, QLinearGradient, QPainter, QPen, QMouse from PySide6.QtWidgets import QWidget # 项目模块导入 -from core import get_zone_bounds, HistogramService, ZONE_WIDTH +from core import HistogramService, ZONE_WIDTH from utils import tr from utils.theme_colors import ( get_histogram_background_color, get_histogram_grid_color, get_histogram_axis_color, @@ -445,8 +445,9 @@ class LuminanceHistogramWidget(BaseHistogram): zone_width = width / 9.0 for zone in self._highlight_zones: - min_lum, max_lum = get_zone_bounds(zone) - zone_index = int(min_lum / ZONE_WIDTH) + # 直接从 Zone 字符串解析索引,避免浮点数精度问题 + # Zone 格式为 "0-1", "1-2", ..., "8-9" + zone_index = int(zone.split('-')[0]) # 计算区域位置 start_x = int(x + zone_index * zone_width) -- Gitee From b356b1d023d8aae9e49b2ab149b6647b5f6fb934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 14:28:59 +0800 Subject: [PATCH 09/16] Update .gitignore --- .gitignore | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.gitignore b/.gitignore index c8c3025..fc80f5f 100644 --- a/.gitignore +++ b/.gitignore @@ -75,12 +75,3 @@ website/Thumbs.db 文档/著作权登记计划.md /宣传图 文档/1.4.0 更新内容.txt -文档/文档鉴别材料准备计划.md -生成源代码文档.py -生成源代码文档_v2.py -/著作权材料 -/著作权材料 -文档/文档鉴别材料准备计划.md -生成源代码文档_v2.py -生成源代码文档.py -生成源代码文档_v2.py -- Gitee From 8841db9d2c8b323430ebb3d3e055bd3f95511bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 15:26:17 +0800 Subject: [PATCH 10/16] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=98=8E=E5=BA=A6=E9=81=AE=E7=BD=A9=E9=A2=9C=E8=89=B2=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A2=9C=E8=89=B2=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 get_zone_mask_colors() 函数,按Zone类型统一遮罩颜色 - 新增 get_zone_label_bg_color() 和 get_zone_label_text_color() 函数管理标注颜色 - 新增 get_zone_info_text_colors() 函数管理信息提示文字颜色 - 将黑色区域遮罩改为深蓝色,白色区域遮罩改为深黄色 - 更新 canvases.py 导入语句和颜色使用方式 - 移除硬编码颜色,统一使用主题颜色函数 --- .gitignore | 5 ++++ ui/canvases.py | 19 ++++++------ utils/theme_colors.py | 67 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index fc80f5f..b4b1095 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,8 @@ website/Thumbs.db 文档/著作权登记计划.md /宣传图 文档/1.4.0 更新内容.txt +文档/文档鉴别材料准备计划.md +生成源代码文档.py +著作权材料/源代码文档/源代码_前30页.txt +/著作权材料 +生成源代码文档_v2.py diff --git a/ui/canvases.py b/ui/canvases.py index 9fe23fc..0152296 100644 --- a/ui/canvases.py +++ b/ui/canvases.py @@ -15,10 +15,12 @@ from utils import tr from .color_picker import ColorPicker from .zoom_viewer import ZoomViewer from utils.theme_colors import ( - get_canvas_background_color, get_canvas_empty_text_color, get_picker_colors, + get_canvas_background_color, get_canvas_empty_text_color, get_tooltip_bg_color, get_high_saturation_highlight_color, get_high_brightness_highlight_color, - get_high_saturation_border_color, get_high_brightness_border_color + get_high_saturation_border_color, get_high_brightness_border_color, + get_zone_mask_colors, get_zone_label_bg_color, get_zone_label_text_color, + get_zone_info_text_colors ) @@ -1217,8 +1219,8 @@ class LuminanceCanvas(BaseCanvas): self._highlighted_zone: int = -1 # 当前高亮显示的Zone (-1表示无) self._zone_highlight_pixmap: Optional[QPixmap] = None # 高亮遮罩缓存 - # Zone高亮颜色配置 (Zone 0-7) - Adobe标准映射 - self._zone_highlight_colors: List[QColor] = get_picker_colors() + # Zone高亮颜色配置 (Zone 0-8) - 按类型统一颜色 + self._zone_highlight_colors: List[QColor] = get_zone_mask_colors() # 明度服务 self._luminance_service = None @@ -1395,11 +1397,11 @@ class LuminanceCanvas(BaseCanvas): # 绘制深色填充方框 painter.setPen(Qt.PenStyle.NoPen) - painter.setBrush(QColor(40, 40, 40, 200)) + painter.setBrush(get_zone_label_bg_color()) painter.drawRect(box_x, box_y, box_width, box_height) # 绘制白色文字 - painter.setPen(QColor(255, 255, 255)) + painter.setPen(get_zone_label_text_color()) text_x = box_x + (box_width - text_width) // 2 text_y = box_y + (box_height - text_height) // 2 painter.drawText(text_x, text_y + text_height - 2, zone) @@ -1532,8 +1534,9 @@ class LuminanceCanvas(BaseCanvas): text = f"{label} ({name}) | 亮度: {lum_range}" - # 获取文字颜色 - text_color = self._zone_highlight_colors[self._highlighted_zone] + # 获取文字颜色(使用与遮罩类型对应的颜色) + info_text_colors = get_zone_info_text_colors() + text_color = info_text_colors[self._highlighted_zone] # 使用通用方法绘制信息框 self._draw_info_box(painter, text, text_color, display_rect) diff --git a/utils/theme_colors.py b/utils/theme_colors.py index fa003a3..50d7137 100644 --- a/utils/theme_colors.py +++ b/utils/theme_colors.py @@ -284,3 +284,70 @@ def get_high_brightness_highlight_color(): def get_high_brightness_border_color(): """获取高明度区域边框颜色""" return QColor(0, 200, 255, 150) + + +# ========== Zone遮罩颜色(按类型统一)========== +def get_zone_mask_colors(): + """获取Zone遮罩颜色列表(按类型统一颜色) + + 颜色方案: + - 黑色: 深灰色半透明 + - 阴影: 蓝色半透明 + - 中间调: 绿色半透明 + - 高光: 黄色半透明 + - 白色: 白色半透明 + """ + # 黑色 - 深蓝色 + blacks_color = QColor(0, 80, 160, 140) + # 阴影 - 蓝色 + shadows_color = QColor(0, 120, 255, 100) + # 中间调 - 绿色 + midtones_color = QColor(0, 200, 100, 100) + # 高光 - 黄色 + highlights_color = QColor(255, 200, 0, 100) + # 白色 - 深黄色 + whites_color = QColor(200, 160, 0, 140) + + return [ + blacks_color, # Zone 0: 黑色 + shadows_color, # Zone 1: 阴影 + shadows_color, # Zone 2: 阴影 + midtones_color, # Zone 3: 中间调 + midtones_color, # Zone 4: 中间调 + midtones_color, # Zone 5: 中间调 + highlights_color, # Zone 6: 高光 + highlights_color, # Zone 7: 高光 + whites_color, # Zone 8: 白色 + ] + + +def get_zone_label_bg_color(): + """获取Zone标注框背景颜色 - 统一使用深色""" + return QColor(40, 40, 40, 200) + + +def get_zone_label_text_color(): + """获取Zone标注框文字颜色 - 统一使用白色""" + return QColor(255, 255, 255) + + +def get_zone_info_text_colors(): + """获取Zone信息提示文字颜色列表(与遮罩颜色对应)""" + # 与 get_zone_mask_colors() 对应,但使用不透明颜色 + blacks_color = QColor(100, 180, 255) # 黑色区域用蓝色文字 + shadows_color = QColor(100, 180, 255) # 阴影区域用蓝色 + midtones_color = QColor(100, 255, 150) # 中间调用绿色 + highlights_color = QColor(255, 220, 100) # 高光用黄色 + whites_color = QColor(255, 200, 50) # 白色区域用深黄色 + + return [ + blacks_color, # Zone 0 + shadows_color, # Zone 1 + shadows_color, # Zone 2 + midtones_color, # Zone 3 + midtones_color, # Zone 4 + midtones_color, # Zone 5 + highlights_color, # Zone 6 + highlights_color, # Zone 7 + whites_color, # Zone 8 + ] -- Gitee From ffbfd41c2cf7991292b33b182f163f0dd8c7dd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 16:22:21 +0800 Subject: [PATCH 11/16] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?Mac=E6=9E=84=E5=BB=BA=E6=B5=81=E7=A8=8B=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DMG文件名改为Color_Card_版本号_mac.dmg格式 - 简化artifact上传,仅包含DMG文件 - 移除构建脚本中的中文注释 --- .github/workflows/build-mac.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-mac.yml b/.github/workflows/build-mac.yml index 63c6437..6cf2794 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 }} -- Gitee From 3dc7a71564b973b2f3b853ac30fc8e27114b5574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 16:29:02 +0800 Subject: [PATCH 12/16] Update .gitignore --- .gitignore | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b4b1095..30630bf 100644 --- a/.gitignore +++ b/.gitignore @@ -75,8 +75,4 @@ website/Thumbs.db 文档/著作权登记计划.md /宣传图 文档/1.4.0 更新内容.txt -文档/文档鉴别材料准备计划.md -生成源代码文档.py -著作权材料/源代码文档/源代码_前30页.txt -/著作权材料 -生成源代码文档_v2.py +文档/更新内容.txt -- Gitee From 976880173bdf3e454320378ba0d0bcfc3e589610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 16:46:32 +0800 Subject: [PATCH 13/16] =?UTF-8?q?[=E6=96=87=E6=A1=A3]=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=86=E7=B1=BB=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\217\221\350\247\204\350\214\203.md" | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git "a/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" "b/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" index 0162962..37d9465 100644 --- "a/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" +++ "b/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" @@ -1880,16 +1880,27 @@ def _clear_color_cards(self): ### 13.2 分类规范 +**分类说明:** + +以下分类为常用示例,可根据实际更新内容灵活调整分类名称,无需严格对应。只需保持格式正确(`## Emoji 分类名称`)即可。 + | 分类 | Emoji | 说明 | 示例 | |:---:|:---:|:---:|:---| | 新增功能 | ✨ | 新功能、新特性 | 新增色盲模拟预览功能 | | 问题修复 | 🔧 | Bug修复 | 修复全屏按钮窗口状态保存问题 | | 界面优化 | 🎨 | UI样式、布局调整 | 优化图标和交互体验 | | 性能提升 | ⚡ | 性能优化 | 优化应用启动速度 | +| 功能优化 | ⚡ | 功能层面改进 | 日志系统支持每次启动创建新文件 | | 代码重构 | 🏗️ | 代码结构调整 | 重命名配色管理相关类 | | 文档更新 | 📝 | 文档修改 | 修正版权和官网信息 | | 内容调整 | 📋 | 内容修改 | 为图标增加圆角裁切 | +**灵活调整示例:** + +- 若某版本只有修复和优化,可只保留"问题修复"和"界面优化"两个分类 +- 若有特殊类型的更新,可新增分类,如"构建优化"、"兼容性改进"等 +- 分类名称应简洁明了,便于用户理解 + ### 13.3 内容组织原则 **功能模块分组:** @@ -2856,11 +2867,10 @@ def _get_about_text(self): |版本 |日期 |变更内容 | |:---:|:---:|:---:| -|3.36 |2026-03-02 |优化日志系统:每次启动创建新日志文件,文件名格式为 `Color Card_版本号_YYYYMMDD_HHMMSS.log`;移除按大小轮转策略,改为按启动创建新文件;新增日志清理策略,自动清理30天前的日志文件;更新第17.2节日志配置说明 | -|3.35 |2026-02-28 |日志系统第二阶段:核心模块日志接入(color_service.py、image_service.py、config.py);用户操作日志接入(color_extract.py、canvases.py);添加性能日志记录(extract_dominant_colors、load_image) | -|3.34 |2026-02-28 |新增日志系统:创建 `core/logger.py` 模块,包含 `LoggerManager`、`get_logger`、`log_user_action`、`log_performance`;日志存储在 `~/.color_card/logs/` 目录,支持文件轮转(最大10MB,保留7个备份);在 `main.py` 中集成日志初始化和全局异常捕获;更新项目结构和开发规范(新增第17章日志系统规范) | +|3.35 |2026-03-02 |优化更新日志分类规范:新增分类说明,明确分类可灵活调整;新增"功能优化"分类;添加灵活调整示例说明 | +|3.34 |2026-02-28 |新增日志系统,更新项目结构和开发规范(新增第17章日志系统规范) | |3.33 |2026-02-28 |P3多线程优化修复:优化 `HistogramCalculator` 和 `ProgressiveImageLoader` 的 `cancel()` 方法移除 `wait()` 调用;为所有线程类和服务类添加线程安全文档注释;创建 `tests/` 测试目录,包含 19 个多线程测试用例;创建 `pytest.ini` 配置文件和 `tests/requirements-dev.txt` 开发依赖文件;新增第20章测试规范;更新章节编号(原第20章开源许可证管理规范改为第21章,原第21章附录改为第22章) | -|3.32 |2026-02-27 |重构明度分析Zone分区:将直方图分区从8个改为9个(Zone 0-8),使用 `ZONE_WIDTH = 255/9 ≈ 28.33` 计算Zone边界;更新Zone标签命名(黑色×1、阴影×2、中间调×3、高光×2、白色×1);修改 `core/color.py`、`ui/histograms.py`、`ui/canvases.py`、`core/luminance_service.py` 中的Zone计算逻辑;更新开发规范第6.3节Zone分区规范;更新README.md明度分析描述 | +|3.32 |2026-02-27 |重构明度分析Zone分区:将直方图分区从8个改为9个(Zone 0-8),更新开发规范第6.3节Zone分区规范| |3.31 |2026-02-26 |优化SVG智能映射逻辑:新增覆盖检测功能,检测被完全覆盖的元素并跳过映射;简化配色分配逻辑,所有元素按面积平等处理;根据面积最大元素的覆盖率决定是否添加背景矩形(<90%添加,>=90%不添加);更新第9.7.3节智能映射规则说明 | |3.30 |2026-02-26 |新增渐变提取功能:创建 `core/gradient.py` 模块实现三种颜色空间(RGB/HSB/LAB)的渐变插值算法;创建 `ui/gradient_extract.py` 模块实现渐变提取界面(GradientExtractInterface、GradientCardPanel、GradientPreviewWidget);支持起始/结束颜色选择、中间色数量控制、渐变预览、随机生成、收藏功能;收藏时先打开编辑配色对话框;更新项目结构、开发规范和语言包 | |3.29 |2026-02-24 |新增项目官网:创建 `docs/` 和 `website/` 目录,添加官网页面(功能特性、界面预览、配色方案、更新日志、下载),支持 GitHub Pages 自动部署;新增第15章项目官网维护规范;更新 README.md 添加官网链接;更新关于对话框添加官网按钮 | @@ -2897,7 +2907,7 @@ def _get_about_text(self): |2.20 |2026-02-11 |完善配色预览场景功能:新增 brand(品牌)、poster(海报)、pattern(图案)、magazine(杂志排版)四个配置化场景;所有场景完全配置化,从 `scenes.json` 加载;清理 `ui/preview_widgets.py` 中的硬编码文本,UI/Web 场景文本支持通过配置自定义;删除废弃的 `MobileUIPreview` 和 `WebPreview` 类,统一使用 `ConfigurablePreviewScene`;更新开发规范文档(第8章场景类型规范) | |2.19 |2026-02-11 |新增SVG智能配色映射功能:创建 `core/svg_color_mapper.py` 核心模块,实现 SVG 解析、元素分类、智能配色映射;支持智能配色映射模式;支持 CSS 类样式解析(Illustrator 导出的 SVG 常用格式);基于元素面积的智能配色映射算法;检测 SVG 是否有背景元素,为透明背景自动添加背景矩形;更新 `SVGPreviewWidget` 支持新的配色映射功能;更新项目结构和开发规范 | |2.18 |2026-02-10 |新增场景配置化功能:创建 `preview_scenes/` 目录和 `scenes.json` 配置文件;新增 `SceneConfigManager` 场景配置管理器,支持场景的导入导出;新增 `BasePreviewScene` 场景基类和 `PreviewSceneFactory` 场景工厂;实现 `MobileUIPreview` 手机UI预览和 `WebPreview` 网页预览组件;更新 `PreviewSceneSelector` 从配置动态加载场景列表;所有场景支持导入导出配置;更新项目结构和开发规范(第8章) | -|2.17 |2026-02-10 |重命名"配色方案"为"配色生成","色彩管理"为"配色管理":将 `scheme_widgets.py` 重命名为 `generation_widgets.py`,类名 `SchemeColorInfoCard` 改为 `GenerationColorInfoCard`,`SchemeColorPanel` 改为 `GenerationColorPanel`;将 `color_management_widgets.py` 重命名为 `palette_management_widgets.py`,类名 `ColorManagementSchemeCard` 改为 `PaletteManagementCard`,`ColorManagementSchemeList` 改为 `PaletteManagementList`;更新所有相关引用、导航栏显示和文档 | +|2.17 |2026-02-10 |重命名"配色方案"为"配色生成","色彩管理"为"配色管理"更新所有相关引用、导航栏显示和文档 | |2.16 |2026-02-10 |新增配色预览功能:创建 ui/preview_widgets.py 配色预览组件模块,包含可拖拽颜色圆点、插画预览、排版预览等组件;新增 ColorPreviewInterface 界面,支持从配色管理页面跳转预览配色在不同场景下的应用效果 | |2.15 |2026-02-09 |优化应用启动速度:色轮缓存和配色生成颜色改用延迟生成,避免阻塞启动;新增应用启动优化策略规范(7.3节) | |2.14 |2026-02-09 |重命名"色卡收藏"面板为"色彩管理":将 `favorite_widgets.py` 重命名为 `color_management_widgets.py`,类名 `FavoritesInterface` 改为 `ColorManagementInterface`,更新所有相关引用和导航栏显示 | -- Gitee From 63542a10be3a60bdf341b6bdc3b12e484c645cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 16:48:32 +0800 Subject: [PATCH 14/16] Update .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 30630bf..685c145 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,7 @@ website/Thumbs.db /宣传图 文档/1.4.0 更新内容.txt 文档/更新内容.txt +生成源代码文档.py +生成源代码文档_v2.py +/著作权材料 +文档/文档鉴别材料准备计划.md -- Gitee From 94fe2a8e493f7b2f0b6a9da4ebdef49e53360cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 17:03:37 +0800 Subject: [PATCH 15/16] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20v1.4.1=20=E7=89=88=E6=9C=AC=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构 changelog.json 为嵌套结构,明确分类和子项层级关系 - 添加 v1.4.1 版本更新日志(2026-03-02) - 优化网站更新日志渲染逻辑,适配新的嵌套数据结构 - 改进更新日志显示样式,区分主分类、子标题和详细描述 --- docs/changelog.json | 375 ++++++++++++++++++++++------------ docs/index.html | 48 +++-- website/index.html | 48 +++-- website/public/changelog.json | 375 ++++++++++++++++++++++------------ 4 files changed, 564 insertions(+), 282 deletions(-) diff --git a/docs/changelog.json b/docs/changelog.json index b1c612a..8534c3d 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 ee70906..86aea0c 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 = '
暂无更新记录
'; return; } - + container.innerHTML = versions.map(v => { const date = new Date(v.date).toLocaleDateString('zh-CN'); - // Support both array and string format for changes - let changesHtml; - if (Array.isArray(v.changes)) { - changesHtml = v.changes.map(c => `
  • ${c}
  • `).join(''); - } else { - // String format: split by newline and format - changesHtml = v.changes.split('\n').filter(line => line.trim()).map(c => `
  • ${c.trim()}
  • `).join(''); - } + + // 生成HTML + const changesHtml = v.changes.map(cat => { + const itemsHtml = cat.items.map(item => { + if (typeof item === 'string') { + // 普通描述项 + return `
  • ${item}
  • `; + } else if (item.title && item.desc) { + // 有子标题的项 + return ` +
  • +
    ${item.title}
    +
    ${item.desc}
    +
  • + `; + } + return ''; + }).join(''); + + return ` +
    +

    + + ${cat.category} +

    +
      + ${itemsHtml} +
    +
    + `; + }).join(''); + return `

    ${v.version}

    ${date}
    -
      +
      ${changesHtml} -
    +
    `; }).join(''); diff --git a/website/index.html b/website/index.html index ee70906..86aea0c 100644 --- a/website/index.html +++ b/website/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 = '
    暂无更新记录
    '; return; } - + container.innerHTML = versions.map(v => { const date = new Date(v.date).toLocaleDateString('zh-CN'); - // Support both array and string format for changes - let changesHtml; - if (Array.isArray(v.changes)) { - changesHtml = v.changes.map(c => `
  • ${c}
  • `).join(''); - } else { - // String format: split by newline and format - changesHtml = v.changes.split('\n').filter(line => line.trim()).map(c => `
  • ${c.trim()}
  • `).join(''); - } + + // 生成HTML + const changesHtml = v.changes.map(cat => { + const itemsHtml = cat.items.map(item => { + if (typeof item === 'string') { + // 普通描述项 + return `
  • ${item}
  • `; + } else if (item.title && item.desc) { + // 有子标题的项 + return ` +
  • +
    ${item.title}
    +
    ${item.desc}
    +
  • + `; + } + return ''; + }).join(''); + + return ` +
    +

    + + ${cat.category} +

    +
      + ${itemsHtml} +
    +
    + `; + }).join(''); + return `

    ${v.version}

    ${date}
    -
      +
      ${changesHtml} -
    +
    `; }).join(''); diff --git a/website/public/changelog.json b/website/public/changelog.json index 4b4f3a2..c2338da 100644 --- a/website/public/changelog.json +++ b/website/public/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 向量化优化明度直方图计算,响应更快", + "代码重构:统一颜色管理,消除硬编码" + ] + } ] } ] -- Gitee From 6f41e38be054932e07453cbc18ec2d5018175740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E5=B1=B1=E5=85=AC=E4=BB=94?= Date: Mon, 2 Mar 2026 17:06:14 +0800 Subject: [PATCH 16/16] Update pages.yml --- .github/workflows/pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index bb21727..5be2d40 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: -- Gitee