目录

deepin-cardsdock — 多卡片 Dock(dde-dock 插件)

基于 docs/design/index.html 设计稿(Next-Deepin-Dock 风格)实现的 dde-dock 树外插件。 在用户唤起时才把「系统剪贴板」「文件中转站」两张事件卡片以弹层形式叠放切换,与真实系统行为一致。

旧版 dde-shell(Qt6/QML/xmake)实现已挪到 legacy-ddeshell/,不参与本工程构建,仅供参考与回退。

架构

dde-dock 栏仅 62px 高,放不下多卡片大 UI,因此采用:

dde-dock 进程
 └─ MainPanel(dock 栏)
     └─ CardsDockItem        ← 本插件注册的 PluginsItemInterface 项(栏上只放一个小图标)
         └─ itemPopupApplet() → CardsStack(点击图标 / 全局快捷键唤出的弹层)
              ├─ ClipboardCard     系统剪贴板(当前内容置顶 + 历史)
              └─ FileTransferCard  文件中转站(暂存 + 拖出传输)
  • 栏图标 CardsDockItem:62px 内居中图标,点击唤起弹层;flags() = Quick_Single。
  • 弹层 CardsStack:上滑淡入,分段控件切换两张卡片,并接收拖入(文件中转站入站)。
  • EventSink:经 D-Bus org.deepin.dde.InputDevice1 注册全局快捷键,激活时唤起对应卡片。
  • 复用框架无关的 clipboardmodel(dataChanged + 1s 轮询双通道)与 filetransfer(入站 + 还原/删除)。

卡片与真实触发

卡片 唤起方式 行为
系统剪贴板 托盘剪贴板指示器点击 · Ctrl+Alt+V 全局快捷键 · 系统 selection 被外部唤起 当前内容置顶 + 历史列表;点击条目复制回系统剪贴板(双向同步);支持搜索/清空/固定
文件中转站 Ctrl+Alt+F 全局快捷键 · 拖文件入 dock 栏/中转站卡 暂存文件;拖出到「可传输窗口」释放才启动真实传输(text/uri-list);复制/移动/链接语义与文件管理器一致

触发规则要点(已敲定)

  • 复制动作静默写入历史,不弹窗(消除复制噪声),仅用户主动唤起剪贴板时切换。
  • 中转站只「暂存 + 发起」,不在本插件内重复实现传输 I/O:拖到目标窗口由目标方执行实际读写。
  • 拖出修饰键:Shift=移动、Ctrl=复制、Shift+Ctrl=链接;同分区默认移动、跨分区默认复制(光标随动作实时变化)。

工程结构(重构为 dde-dock 插件后)

CMakeLists.txt             Qt5Widgets + Qt5DBus + Dtk + pkg_check_modules(dde-dock) 树外插件构建
src/
  cardsdock.json           api: 2.0.0,插件元数据
  cardsdockplugin.h/.cpp    PluginsItemInterface 实现 + 注册栏图标/弹层
  cardsdockitem.h/.cpp      栏图标(62px)
  cardsstack.h/.cpp         弹层:分段切换 + 两张卡片 + 拖入接收 + 淡入
  clipboardcard.h/.cpp      剪贴板卡片(当前置顶 + 历史 + 搜索 + 清空 + 点击回写)
  clipboardmodel.h/.cpp     (复用) 剪贴板历史(dataChanged + 1s 轮询双通道)
  filetransfercard.h/.cpp   中转站卡片(拖出传输 + 还原/删除)
  filetransfer.h/.cpp       (复用) 拖拽入站 + 进度;新增 filePath 访问器(拖出源)
  eventsink.h/.cpp          事件汇聚:DBus 注册 Ctrl+Alt+V / Ctrl+Alt+F 全局快捷键
  icons/cardsdock.svg       栏图标
resources.qrc              图标资源
docs/
  设计书-多卡片dock重构.md   设计终稿(架构 / 触发 / 卡片 / 阶段计划 / 风险)
  design/                   HTML 设计稿归档(已按新触发规则改造,可浏览器预览)
  DEPLOY-DEEPIN25.md        旧 dde-shell 真机部署手册(legacy)
legacy-ddeshell/            旧 dde-shell(Qt6/QML/xmake)实现,不参与构建
  src/ package/ tools/ xmake.lua

构建与验证

WSL 编译验证(无 DDE 显示会话,仅验证接口/依赖对齐)

sudo apt update
sudo apt install -y cmake extra-cmake-modules g++ pkg-config \
  qtbase5-dev qttools5-dev \
  dtkcore-dev dtkgui-dev dtkwidget-dev \
  dde-dock-dev                       # 提供 dde-dock.pc 与 /usr/include/dde-dock/ 接口头

mkdir -p build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j$(nproc)                     # 仅编译验证:make 通过即接口/依赖对齐

Deepin 真机加载

make
cp libcardsdock.so ~/.local/lib/dde-dock/plugins/   # 或 /usr/lib/dde-dock/plugins/
pkill dde-dock; dde-dock
# 日志应见:init plugin: "cardsdock"

实施进度

阶段 内容 状态
P0 CMake 脚手架 + 插件骨架(plugin/item/stack)+ json/qrc/图标 ✅ 已落地并提交
P1 剪贴板卡片(唤起触发 + 双向同步 + 复制静默入史) ✅ 已落地并提交
P2 中转站卡片(拖出传输 + 还原/删除 + 拖入入站) ✅ 已落地并提交
P3 堆叠滑入动画(复刻 HTML .card 视觉:active/stack1/enter 三态 + OutBack/InOutCubic 缓动)+ DGuiApplicationHelper 深浅主题适配(面板/卡片配色随主题切换) ✅ 已实现(待真机编译验证)
P4 Deepin 真机加载验证;EventSink 的 InputDevice1 DBus 方法/信号名以真机为准 ⏳ 待做

⚠️ 当前代码在 Windows 未本地编译,接口签名已逐一对齐 dde-dock 源码;编译/运行需在 Deepin 或 deepin WSL 验证(见上)。

License

代码 MIT;图标来自 deepin-icon-theme(GPL-3.0,源在 docs/design/assets)。

关于

卡片式 Dock(dde-shell Panel 插件):复刻 deepin_ui_html 设计稿,xmake 构建 + Lua 工具链,真实事件驱动卡片

3.8 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号