English | 简体中文
感谢你考虑为 Widget-RS 做出贡献!本项目致力于构建一个基于 Rust 的现代桌面小部件平台,不论是提交 Bug 反馈、代码优化还是新增插件,我们都非常欢迎!
- 环境配置:请确保你的机器已安装最新版 Rust (>= 1.75)。
- 格式化与 Lint:我们在
rustfmt.toml与clippy.toml中统一了代码风格和检查级别。请在提交代码前,务必在根目录运行以下命令进行自我检查:cargo fmt --all cargo clippy --workspace --all-targets --all-features -- -D warnings
为了配合 GitHub Actions 以及 widget-cli release 自动化发布工具,本项目强制要求使用 Conventional Commits (约定式提交)。
提交信息格式要求如下:
<type>(<scope>): <subject>
- type 必须是以下关键字之一:
feat: 新增功能(会触发次版本升级,并写入 Release Notes)fix: 修复 Bug(会触发修订号升级,并写入 Release Notes)docs: 仅修改文档 (如 README.md)style: 调整代码格式(不影响功能)refactor: 重构代码(非新增功能也非修复 bug)perf: 性能优化test: 新增或修改测试chore: 构建过程或辅助工具变动
- scope (可选): 指明改动影响的模块,如
ui,core,sticky,todo。 - subject: 简短的改动描述。
✅ 正确示例:
feat(sticky): add color picker support❌ 错误示例:fixed some bugs或更新便签功能
本项目采用插件化架构,开发一个新的桌面部件非常简单。为了保持代码可维护性,我们强制要求在插件开发中采用 UI 与逻辑分离 (MVC 模式)。
- 在
plugins/目录下新建一个 Cargo 包:cargo new --lib plugins/my_plugin - 按照分离规范组织代码结构:
src/model.rs: 纯数据结构定义、状态管理与持久化逻辑。src/view.rs: 具体的GPUI渲染树实现 (实现Render和WidgetContentTrait)。src/lib.rs: 作为模块入口,暴露插件和统一装配。
- 你的小部件 UI 结构体必须实现
widget_core::WidgetContentTrait,提供plugin_id()和drag_label(),窗口级能力(编辑模式、拖拽、边框切换)由WidgetWindow统一管理,禁止在插件内手动实现。 - 在
lib.rs中实现widget_core::PluginTrait,spawn_window使用WidgetWindow包装你的内容:fn spawn_window(&self, cx: &mut App) -> AnyWindowHandle { let options = widget_core::default_widget_window_options(cx, "my_plugin", (100.0, 100.0, 300.0, 300.0)); cx.open_window(options, |window, cx| { let content = cx.new(|cx| MyWidget::new(window, cx)); let widget_window = cx.new(|_cx| widget_core::WidgetWindow::new(content)); cx.new(|cx| gpui_component::Root::new(widget_window, window, cx)) }).unwrap().into() }
- 暴露统一入口点:
pub fn create_plugin() -> std::sync::Arc<dyn widget_core::Plugin> { std::sync::Arc::new(MyPlugin) }
- 使用提供的命令行工具自动化注册插件:
cargo run -p widget-cli -- plugin add my_plugin --path plugins/my_plugin
注意: 编辑模式检测、拖拽条、窗口边框、
update_window_edit_mode等窗口级逻辑已由WidgetWindow容器统一封装,不要在插件中重复实现。
详细的 API 说明请参考 插件开发指南(英文版:Plugin Development Guide)。
本项目使用 cargo-packager 进行应用程序的打包和分发。
如果你需要在本地构建安装包进行测试,请运行以下命令:
cargo packager --release(注意:首次使用需要先安装该工具,运行 cargo install cargo-packager --locked)
期待你的第一个 PR!🚀