Milestone 2: 状态栏¶
状态: ⬜ 待开始 预计周期: 3-5 天 前置依赖: Milestone 1: 桌面骨架可见 目标: 屏幕顶部出现一条状态栏,显示时间、基础系统图标
一、阶段目标¶
实现 StatusBar 面板,注册到 PanelManager 作为 Top edge panel,显示时间和基础系统图标,并跟随主题变色。
完成标志: 运行后屏幕顶部有一条高度 32-48dp 的状态栏,能看到当前时间 (HH:MM),背景色跟随主题。
二、当前状态分析¶
已有基础设施¶
| 组件 | 文件 | 状态 |
|---|---|---|
IStatusBar 接口 |
desktop/ui/components/statusbar/IStatusBar.h |
✅ 继承自 IPanel,接口空壳 |
IPanel 接口 |
desktop/ui/components/IPanel.h |
✅ position() / priority() / preferredSize() / widget() |
PanelManager |
desktop/ui/components/PanelManager.h/.cpp |
✅ registerPanel() 接受 WeakPtr<IPanel> |
ThemeManager |
ui/core/theme_manager.h |
✅ 单例,currentTheme() → ICFTheme |
ICFTheme |
ui/core/i_cf_theme.h |
✅ colorScheme() / typography() / motionSpec() |
| Material Label | ui/widget/material/widget/label/ |
✅ 文字显示控件 |
| Material Animation | ui/components/animation/ |
✅ Fade/Slide/Scale 动画工厂 |
关键缺口¶
- IStatusBar 是空接口 — 没有定义任何方法,需要扩展
- 没有 StatusBar 具体实现 — 需要
StatusBar类 - 没有系统信息获取 — 需要 QTime/QDateTime 读取
- StatusBar 未注册到 PanelManager — CFDesktopEntity 中未接入
三、待实现任务¶
Day 1: StatusBar 数据模型与接口扩展¶
Step 1: 扩展 IStatusBar 接口¶
- [ ] 修改
desktop/ui/components/statusbar/IStatusBar.h - 添加纯虚方法:
- 添加信号声明 (或用 Qt 的 signals/slots 机制)
Step 2: 定义 StatusBarStyle 枚举¶
- [ ] 在
IStatusBar.h或新文件中定义:
Day 2: StatusBar Widget 实现¶
Step 3: 创建 StatusBar 类¶
- [ ] 创建文件
desktop/ui/components/statusbar/status_bar.h - [ ] 创建文件
desktop/ui/components/statusbar/status_bar.cpp - [ ] 类声明:
class StatusBar : public QWidget, public IStatusBar { Q_OBJECT public: explicit StatusBar(QWidget* parent = nullptr); // IPanel 接口 PanelPosition position() const override { return PanelPosition::Top; } int priority() const override { return 100; } int preferredSize() const override { return 48; } // 48dp QWidget* widget() const override { return const_cast<StatusBar*>(this); } // IStatusBar 接口 void setTimeVisible(bool v) override; bool isTimeVisible() const override; void setIconsVisible(bool v) override; bool isIconsVisible() const override; protected: void paintEvent(QPaintEvent* event) override; private slots: void onTimeout(); private: void setupUi(); void applyTheme(); };
Step 4: 实现 StatusBar 内容¶
- [ ]
setupUi(): - 创建
QHBoxLayout - 左侧:可选的系统图标区 (先用占位 QLabel)
- 中间:时间显示 (
QLabel或自定义绘制) - 右侧:系统图标区 (WiFi/电池/音量 占位)
- [ ]
paintEvent(): - 绘制背景 (使用
theme->colorScheme().surfaceContainer()) - 底部分割线 (可选,1px
outline()颜色) - [ ]
onTimeout(): QTimer每秒触发,更新时间显示- 格式:
HH:MM或根据 StatusBarStyle 调整 - [ ]
applyTheme(): - 获取 ThemeManager 当前主题
- 设置文字颜色:
theme->colorScheme().onSurface() - 设置字体:
theme->typography().bodyMedium() - 设置背景色
可复用:
- ui/widget/material/widget/label/ — Material Label 控件
- ui/core/theme_manager.h — ThemeManager
- ui/base/color.h — CFColor 工具
Day 3: 系统图标占位¶
Step 5: 实现基础图标项¶
- [ ] 创建
StatusIcon简单 Widget (或直接用 QLabel + Unicode 字符) - 时间图标: 显示时间文本
- WiFi 图标: Unicode
📶或简单的 QPainter 绘制 - 电池图标: Unicode
🔋或占位方块 - 音量图标: Unicode
🔊或占位方块 - [ ] 建议: 第一版用 Unicode 文本或纯色方块作为占位,不必等图标系统
Day 4: 注册到 PanelManager¶
Step 6: 在 CFDesktopEntity::run_init() 中创建并注册 StatusBar¶
- [ ] 修改
desktop/ui/CFDesktopEntity.cpp的run_init(): - [ ] 确保 StatusBar 被创建为 CFDesktop 的子 Widget
- [ ] PanelManager 会自动将其布局到顶部,并减小 availableGeometry
Step 7: 验证布局联动¶
- [ ] 确认 PanelManager::availableGeometry() 现在顶部缩小了 48dp
- [ ] 确认 ShellLayer 的 geometry 跟着调整
- [ ] 确认 StatusBar 的 position() 返回
PanelPosition::Top
Day 5: 主题联动与收尾¶
Step 8: 主题切换响应¶
- [ ] StatusBar 监听 ThemeManager 的主题变更信号
- [ ] 切换主题时调用
applyTheme()更新颜色和字体 - [ ] 验证 Light/Dark 切换时状态栏正确变色
Step 9: 基础测试¶
- [ ] 编写简单单元测试:
- [ ] StatusBar 构造不 crash
- [ ]
position()返回Top - [ ]
preferredSize()返回正数 - [ ]
widget()返回 self - [ ] 手动验证:
- [ ] 时间每秒更新
- [ ] 主题切换生效
四、关键文件清单¶
需要修改的文件¶
| 文件 | 修改内容 |
|---|---|
desktop/ui/components/statusbar/IStatusBar.h |
扩展接口方法 |
desktop/ui/CFDesktopEntity.cpp |
创建 StatusBar 并注册到 PanelManager |
desktop/ui/components/CMakeLists.txt |
添加新文件 |
需要新建的文件¶
| 文件 | 内容 |
|---|---|
desktop/ui/components/statusbar/status_bar.h |
StatusBar 类声明 |
desktop/ui/components/statusbar/status_bar.cpp |
StatusBar 实现 |
desktop/ui/components/statusbar/status_icon.h |
状态图标项 (可选) |
desktop/ui/components/statusbar/status_icon.cpp |
状态图标实现 (可选) |
参考文件 (只读)¶
| 文件 | 用途 |
|---|---|
desktop/ui/components/statusbar/IStatusBar.h:29 |
IStatusBar 接口 (继承 IPanel) |
desktop/ui/components/IPanel.h:42 |
IPanel 接口定义 |
desktop/ui/components/PanelManager.h:30 |
registerPanel() 方法 |
desktop/ui/components/PanelManager.cpp |
面板布局实现 |
ui/core/theme_manager.h |
ThemeManager 单例 |
ui/widget/material/widget/label/ |
Label 控件参考 |
五、验收标准¶
- [ ] 屏幕顶部有一条高度 32-48dp 的状态栏
- [ ] 显示当前时间 (HH:MM),每秒更新
- [ ] 右侧有系统图标占位 (至少 WiFi、电池)
- [ ] 背景色和文字色跟随 ThemeManager 主题
- [ ] PanelManager 的
availableGeometry()顶部缩小了对应高度 - [ ] Light/Dark 主题切换时状态栏正确变色
最后更新: 2026-03-31