[AI] fix: use C++ QMenu for context menu; grab keyboard for Esc/toggle Replace QML Popup with CardsDockApplet::showContextMenu() using a native QMenu. This avoids dock icon clipping and ensures all three items are readable without overlapping the dock. In CardsStack, switch DLayerShellWindow keyboard interactivity to Exclusive while shown and call grabKeyboard()/activateWindow()/setFocus() so Esc and repeat shortcut invocations reliably close the popup. Simplify main.qml: remove Popup/Layout imports, right-click now calls cardsdockApplet.showContextMenu().
[AI] fix: use C++ QMenu for context menu; grab keyboard for Esc/toggle
基于 docs/design/index.html 设计稿(Next-Deepin-Dock 风格)实现的 dde-dock 树外插件。 在用户唤起时才把「系统剪贴板」「文件中转站」两张事件卡片以弹层形式叠放切换,与真实系统行为一致。
docs/design/index.html
旧版 dde-shell(Qt6/QML/xmake)实现已挪到 legacy-ddeshell/,不参与本工程构建,仅供参考与回退。
legacy-ddeshell/
dde-dock 栏仅 62px 高,放不下多卡片大 UI,因此采用:
dde-dock 进程 └─ MainPanel(dock 栏) └─ CardsDockItem ← 本插件注册的 PluginsItemInterface 项(栏上只放一个小图标) └─ itemPopupApplet() → CardsStack(点击图标 / 全局快捷键唤出的弹层) ├─ ClipboardCard 系统剪贴板(当前内容置顶 + 历史) └─ FileTransferCard 文件中转站(暂存 + 拖出传输)
CardsDockItem
flags() = Quick_Single
CardsStack
EventSink
org.deepin.dde.InputDevice1
clipboardmodel
filetransfer
Ctrl+Alt+V
Ctrl+Alt+F
text/uri-list
触发规则要点(已敲定)
Shift
Ctrl
Shift+Ctrl
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
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 通过即接口/依赖对齐
make cp libcardsdock.so ~/.local/lib/dde-dock/plugins/ # 或 /usr/lib/dde-dock/plugins/ pkill dde-dock; dde-dock # 日志应见:init plugin: "cardsdock"
.card
DGuiApplicationHelper
⚠️ 当前代码在 Windows 未本地编译,接口签名已逐一对齐 dde-dock 源码;编译/运行需在 Deepin 或 deepin WSL 验证(见上)。
代码 MIT;图标来自 deepin-icon-theme(GPL-3.0,源在 docs/design/assets)。
卡片式 Dock(dde-shell Panel 插件):复刻 deepin_ui_html 设计稿,xmake 构建 + Lua 工具链,真实事件驱动卡片
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
deepin-cardsdock — 多卡片 Dock(dde-dock 插件)
基于
docs/design/index.html设计稿(Next-Deepin-Dock 风格)实现的 dde-dock 树外插件。 在用户唤起时才把「系统剪贴板」「文件中转站」两张事件卡片以弹层形式叠放切换,与真实系统行为一致。架构
dde-dock 栏仅 62px 高,放不下多卡片大 UI,因此采用:
CardsDockItem:62px 内居中图标,点击唤起弹层;flags() = Quick_Single。CardsStack:上滑淡入,分段控件切换两张卡片,并接收拖入(文件中转站入站)。EventSink:经 D-Busorg.deepin.dde.InputDevice1注册全局快捷键,激活时唤起对应卡片。clipboardmodel(dataChanged + 1s 轮询双通道)与filetransfer(入站 + 还原/删除)。卡片与真实触发
Ctrl+Alt+V全局快捷键 · 系统 selection 被外部唤起Ctrl+Alt+F全局快捷键 · 拖文件入 dock 栏/中转站卡text/uri-list);复制/移动/链接语义与文件管理器一致触发规则要点(已敲定)
Shift=移动、Ctrl=复制、Shift+Ctrl=链接;同分区默认移动、跨分区默认复制(光标随动作实时变化)。工程结构(重构为 dde-dock 插件后)
构建与验证
WSL 编译验证(无 DDE 显示会话,仅验证接口/依赖对齐)
Deepin 真机加载
实施进度
.card视觉:active/stack1/enter 三态 + OutBack/InOutCubic 缓动)+DGuiApplicationHelper深浅主题适配(面板/卡片配色随主题切换)EventSink的 InputDevice1 DBus 方法/信号名以真机为准License
代码 MIT;图标来自 deepin-icon-theme(GPL-3.0,源在 docs/design/assets)。