菜单

主题化

相关源文件

本文档描述了 ChatGPT 桌面应用程序中的主题系统。它概述了主题如何在应用程序中实现、配置、切换和应用。主题系统为应用程序提供了不同的视觉外观,包括浅色模式、深色模式和基于系统的外观。

主题类型

该应用程序支持三种主题选项

主题名称描述UI 表示
系统使用系统的默认主题设置标题栏中的系统图标
浅色强制使用浅色主题,无论系统设置如何标题栏中的浅色图标
深色强制使用深色主题,无论系统设置如何标题栏中的深色图标

来源:src/view/Titlebar.tsx98-109

主题架构

主题系统跨越了应用程序的前端(React)和后端(Tauri/Rust)组件。这种架构支持持久的主题设置,同时提供响应式的用户界面。

来源

主题配置和存储

主题存储在由 AppConf 系统管理的应用程序配置中。当用户更改主题时,应用程序会

  1. 更新配置中的主题设置
  2. 保存配置
  3. 重启应用程序以应用新主题

在应用程序初始化期间,会使用 AppConf::get_theme(&handle) 将主题应用于窗口。

来源

主题切换实现

主题切换 UI 在 Titlebar 组件中实现。当用户点击主题图标时,它会按以下顺序循环遍历可用主题:系统 → 浅色 → 深色 → 系统。

Titlebar 组件中的主题切换逻辑

来源:src/view/Titlebar.tsx98-109

handleTheme 函数调用 set_theme Tauri 命令

来源:src/view/Titlebar.tsx94-96

前端主题集成

前端组件通过 useTheme hook 访问当前主题,该 hook

  1. 以“浅色”作为默认主题进行初始化
  2. 监听来自 Tauri 窗口的主题更改
  3. 将当前主题提供给 React 组件

hook 的实现方式如下

来源:src/hooks/useTheme.tsx4-23

后端主题实现

当收到主题更改请求时,后端通过 cmd.rs 中的 set_theme 命令进行处理

此命令将

  1. 加载当前应用程序配置
  2. 用新的主题值进行修改
  3. 保存更新后的配置
  4. 重启应用程序以应用新主题

在应用程序初始化期间,通过设置过程将主题应用于窗口

来源

CSS 实现

应用程序使用 CSS 类来实现特定于主题的样式,特别是使用 Tailwind CSS 的 `dark:` 前缀用于深色模式变体。例如,在 Titlebar 组件中,

当激活深色主题时,`dark:bg-app-gray-2` 类会将深灰色背景应用于标题栏。

来源:src/view/Titlebar.tsx135-138

运行时主题状态

Titlebar 组件维护当前主题状态并将其与后端同步

  1. 主题状态使用 useState 进行初始化
  2. 组件挂载时,它会从应用程序配置中检索当前主题
  3. 当用户更改主题时,它会更新本地状态和后端配置

来源:src/view/Titlebar.tsx24-43

结论

ChatGPT 桌面应用程序中的主题系统提供了一种灵活的方式来定制应用程序的视觉外观。它涵盖了前端和后端,前端负责 UI控件和即时反馈,后端负责持久化和全局主题应用。

该系统展示了前端和后端之间清晰的关注点分离,以及用于主题管理的明确定义的接口。