Skip to content

Commit 3acd81b

Browse files
committed
chore: 发布 v0.1.5
1 parent fa9e2a3 commit 3acd81b

28 files changed

Lines changed: 2801 additions & 2845 deletions

.clang-format

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
BasedOnStyle: LLVM
2+
IndentWidth: 4
3+
ColumnLimit: 120
4+
BreakBeforeBraces: Custom
5+
BraceWrapping:
6+
AfterClass: true
7+
AfterControlStatement: false
8+
AfterEnum: true
9+
AfterFunction: true
10+
AfterNamespace: false
11+
AfterStruct: true
12+
BeforeCatch: false
13+
BeforeElse: false
14+
IndentBraces: false
15+
PointerAlignment: Right
16+
SortIncludes: true

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
本项目遵循面向用户的变更记录格式。版本号在正式发布前可能继续调整。
44

5+
## [0.1.5] - 2026-07-08
6+
7+
### 新增
8+
9+
- 终端支持时间戳、RX/TX 方向符号和 ESP-IDF `V/D/I/W/E` 日志等级分色显示,并适配深色和浅色主题。
10+
- 增加项目级 `.clang-format`、格式化脚本和 CMake `format``format-check` 目标。
11+
12+
### 变更
13+
14+
- 将 Workbench 页面按布局、左侧设置区、终端渲染、常用包、文件发送、连接控制和状态管理拆分到 `src/app/view/workbench/`,降低单文件复杂度。
15+
- 使用 clang-format 统一格式化项目 C/C++ 源码。
16+
517
## [0.1.4] - 2026-07-08
618

719
### 修复

CMakeLists.txt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.21)
22

33
project(
44
FluentSerialAssistant
5-
VERSION 0.1.4
5+
VERSION 0.1.5
66
DESCRIPTION "A Fluent Qt serial assistant prototype"
77
LANGUAGES CXX
88
)
@@ -14,6 +14,25 @@ set(CMAKE_AUTOMOC ON)
1414
set(CMAKE_AUTORCC ON)
1515
set(CMAKE_AUTOUIC ON)
1616

17+
find_package(Python3 COMPONENTS Interpreter)
18+
find_program(CLANG_FORMAT_EXECUTABLE clang-format)
19+
if(CLANG_FORMAT_EXECUTABLE AND Python3_EXECUTABLE)
20+
add_custom_target(format
21+
COMMAND "${CMAKE_COMMAND}" -E env "CLANG_FORMAT=${CLANG_FORMAT_EXECUTABLE}"
22+
"${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/format_code.py" .
23+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
24+
COMMENT "Format C/C++ sources"
25+
VERBATIM
26+
)
27+
add_custom_target(format-check
28+
COMMAND "${CMAKE_COMMAND}" -E env "CLANG_FORMAT=${CLANG_FORMAT_EXECUTABLE}"
29+
"${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/format_code.py" --check .
30+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
31+
COMMENT "Check C/C++ source formatting"
32+
VERBATIM
33+
)
34+
endif()
35+
1736
if(MINGW)
1837
string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL " -ffunction-sections -fdata-sections")
1938
string(APPEND CMAKE_C_FLAGS_MINSIZEREL " -ffunction-sections -fdata-sections")
@@ -54,6 +73,15 @@ add_executable(FluentSerialAssistant
5473
src/app/view/settings_page.h
5574
src/app/view/workbench_page.cpp
5675
src/app/view/workbench_page.h
76+
src/app/view/workbench/workbench_page_connection.cpp
77+
src/app/view/workbench/workbench_page_files.cpp
78+
src/app/view/workbench/workbench_page_internal.h
79+
src/app/view/workbench/workbench_page_layout.cpp
80+
src/app/view/workbench/workbench_page_packets.cpp
81+
src/app/view/workbench/workbench_page_side_sections.cpp
82+
src/app/view/workbench/workbench_page_state.cpp
83+
src/app/view/workbench/workbench_page_terminal.cpp
84+
src/app/view/workbench/workbench_page_terminal_sections.cpp
5785
src/app/resources/app.qrc
5886
src/main.cpp
5987
)

CONTRIBUTING.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ cmake --build --preset mingw-debug --parallel
4141
- 可见业务 UI 尽量使用 FluentQtWidgets 组件。
4242
- 不引入与当前目标无关的大型依赖。
4343
- 注释应解释必要的业务意图,避免重复代码字面含义。
44+
- 提交前建议运行格式化检查:
45+
46+
```powershell
47+
cmake --build build/codex-release --target format-check
48+
```
49+
50+
如需自动格式化:
51+
52+
```powershell
53+
cmake --build build/codex-release --target format
54+
```
4455

4556
## Issue 建议
4657

README.md

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,19 @@ Fluent 串口助手是一个基于 C++17、Qt 6 Widgets 和 FluentQtWidgets 的
7979
├── docs/images/ # README 截图和文档图片
8080
├── scripts/ # 发布和辅助脚本
8181
├── src/
82-
│ ├── app/core/ # HEX 解析等通用逻辑
83-
│ ├── app/resources/ # Qt 资源与 Windows 图标
82+
│ ├── app/core/ # 字体偏好、HEX 解析、更新检查等通用逻辑
83+
│ ├── app/resources/ # Qt 资源、应用图标和平台资源
8484
│ ├── app/serial/ # QSerialPort 封装
85-
│ └── app/view/ # 主窗口、终端页、设置页
85+
│ └── app/view/ # 主窗口、设置页和终端工作台
86+
│ └── workbench/ # 终端工作台按职责拆分的实现文件
87+
│ ├── *_layout.cpp # 页面整体布局
88+
│ ├── *_side_sections.cpp # 左侧连接、收发、常用包、文件发送配置
89+
│ ├── *_terminal_sections.cpp # 终端区和发送区 UI
90+
│ ├── *_terminal.cpp # 终端记录、过滤、分色和渲染
91+
│ ├── *_packets.cpp # 发送历史和常用包
92+
│ ├── *_files.cpp # 记录导出、接收保存和文件发送
93+
│ ├── *_connection.cpp # 连接、重连和控件启停
94+
│ └── *_state.cpp # 设置恢复、保存、计数和状态更新
8695
├── third_party/FluentQtWidgets/
8796
├── CMakeLists.txt
8897
├── CMakePresets.json
@@ -168,28 +177,6 @@ dist/FluentSerialAssistant-release
168177
- 排除未使用的插件、翻译和软件 OpenGL fallback
169178
-`.exe``.dll` 执行 `strip --strip-unneeded`
170179

171-
## CI
172-
173-
仓库提供 GitHub Actions 工作流:
174-
175-
```text
176-
.github/workflows/ci.yml
177-
```
178-
179-
CI 会在以下平台执行 Release 构建:
180-
181-
- Windows:`windows-latest`,MSVC 2022
182-
- Linux:`ubuntu-latest`,GCC
183-
- macOS:`macos-15`,Clang
184-
185-
CI 不使用本机 `CMakePresets.json` 中的固定 Qt 路径,而是在工作流中安装 Qt 并通过 CMake 直接配置。
186-
187-
推送 `v*` 标签会触发 Release 打包:
188-
189-
- Windows:使用 `windeployqt` 生成部署目录。
190-
- macOS:使用 `.app` bundle,包含应用 `.icns` 图标。
191-
- Linux:生成携带 Qt 运行库、Qt 插件、启动脚本和桌面图标元数据的 `.tar.gz`
192-
193180
## 使用说明
194181

195182
1. 选择串口端口,必要时点击刷新。
@@ -202,19 +189,6 @@ CI 不使用本机 `CMakePresets.json` 中的固定 Qt 路径,而是在工作
202189
8. 可开启自动断帧、时间戳、自动滚动、循环发送等选项。
203190
9. 使用 TXT、CSV、BIN 导出会话记录。
204191

205-
## 贡献
206-
207-
欢迎提交 Issue 和 Pull Request。请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md)
208-
209-
建议贡献方向:
210-
211-
- 串口协议解析器
212-
- 更完善的 HEX 编辑体验
213-
- 会话保存和恢复
214-
- 自动测试
215-
- 跨平台打包
216-
- UI 可访问性和键盘操作
217-
218192
## 许可证
219193

220194
本项目采用 GNU General Public License v3.0 or later,详见 [LICENSE](LICENSE)

docs/release-notes/v0.1.5.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Fluent 串口助手 v0.1.5
2+
3+
这是一个终端显示增强和代码结构整理版本。
4+
5+
## 新增
6+
7+
- 终端时间戳使用独立颜色显示。
8+
- RX/TX 方向符号使用独立颜色显示。
9+
- ESP-IDF `V/D/I/W/E` 日志等级前缀支持分色显示,例如 `I (4929)``W (3639)``E (3639)`
10+
- 增加项目级 `.clang-format`、格式化脚本和 CMake `format``format-check` 目标。
11+
12+
## 变更
13+
14+
- 将 Workbench 页面拆分为多个职责清晰的实现文件,提升后续维护可读性。
15+
- 全量格式化项目 C/C++ 源码。
16+
17+
## 验证
18+
19+
- `cmake --build build/codex-release --target format-check`
20+
- `cmake --build build/codex-release --parallel`

scripts/format_code.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import os
5+
import shutil
6+
import subprocess
7+
import sys
8+
from pathlib import Path
9+
10+
11+
REPO_ROOT = Path(__file__).resolve().parents[1]
12+
SOURCE_SUFFIXES = {".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx", ".m", ".mm"}
13+
EXCLUDED_DIRS = {
14+
".git",
15+
".github",
16+
"build",
17+
"dist",
18+
"third_party",
19+
}
20+
21+
22+
def iter_source_files(paths):
23+
for raw_path in paths:
24+
path = (REPO_ROOT / raw_path).resolve() if not Path(raw_path).is_absolute() else Path(raw_path).resolve()
25+
if not path.exists():
26+
raise FileNotFoundError(path)
27+
if path.is_file():
28+
if path.suffix in SOURCE_SUFFIXES:
29+
yield path
30+
continue
31+
for child in sorted(path.rglob("*")):
32+
if not child.is_file() or child.suffix not in SOURCE_SUFFIXES:
33+
continue
34+
relative_parts = child.relative_to(REPO_ROOT).parts
35+
if any(part in EXCLUDED_DIRS for part in relative_parts):
36+
continue
37+
yield child
38+
39+
40+
def main():
41+
parser = argparse.ArgumentParser(description="Format C/C++ source files with clang-format.")
42+
parser.add_argument("paths", nargs="*", default=["src"], help="Files or directories to format.")
43+
parser.add_argument("--check", action="store_true", help="Check formatting without modifying files.")
44+
args = parser.parse_args()
45+
46+
clang_format = os.environ.get("CLANG_FORMAT") or shutil.which("clang-format")
47+
if not clang_format:
48+
print("clang-format was not found in PATH.", file=sys.stderr)
49+
return 1
50+
51+
files = list(dict.fromkeys(iter_source_files(args.paths)))
52+
if not files:
53+
return 0
54+
55+
command = [clang_format, "--dry-run", "--Werror"] if args.check else [clang_format, "-i"]
56+
result = subprocess.run(command + [str(path) for path in files], cwd=REPO_ROOT)
57+
return result.returncode
58+
59+
60+
if __name__ == "__main__":
61+
raise SystemExit(main())

0 commit comments

Comments
 (0)