- 第三栏内容工厂:按拖入类型展示动作,动作按钮本身可接收 drop - 链接分类:http(s) 按扩展名判定图片/音视频/文档/压缩包/网页 - http 链接动作:打开、下载、另存为、复制、Markdown、复制文件名、待办、问小埃 - 非标准 scheme:尝试打开、复制;thunder 解析 base64 真实地址,magnet 解析 dn - 文字动作:ICU 分词、正则提取链接、朗读(spd-say)、复制、待办 - 文件/图片动作:打开、提取文字(占位)、生成描述、保存图片、复制路径、待办 - Downloader:异步下载到 XDG 下载目录 / 另存为,面板 toast 提示 - TodoModel:持久化到 todo.json,供「添加到待办」使用 - 无头自测 gxde-ai-see-selftest:链接分类/分词/提取链接/动作匹配 - 合成器 portal 自测脚本 tests/portal(虚拟指针 + GTK 源/目标)
51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-FileCopyrightText: 2026 GXDE OS Team
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
"""GTK3 drag source used by the portal integration test."""
|
|
|
|
import gi
|
|
|
|
gi.require_version("Gtk", "3.0")
|
|
|
|
from gi.repository import Gdk, Gtk # noqa: E402
|
|
|
|
|
|
class Source(Gtk.Window):
|
|
def __init__(self):
|
|
super().__init__(title="PortalDragSource")
|
|
self.set_default_size(420, 280)
|
|
self.set_position(Gtk.WindowPosition.CENTER)
|
|
|
|
label = Gtk.Label()
|
|
label.set_markup("<span size='x-large'>DRAG ME</span>\n\nportal test payload")
|
|
label.set_hexpand(True)
|
|
label.set_vexpand(True)
|
|
|
|
box = Gtk.EventBox()
|
|
box.add(label)
|
|
self.add(box)
|
|
box.add_events(
|
|
Gdk.EventMask.BUTTON_PRESS_MASK
|
|
| Gdk.EventMask.BUTTON_RELEASE_MASK
|
|
| Gdk.EventMask.POINTER_MOTION_MASK
|
|
)
|
|
box.connect("button-press-event", lambda *args: print("PRESS", flush=True))
|
|
box.connect("button-release-event", lambda *args: print("RELEASE", flush=True))
|
|
box.connect("motion-notify-event", lambda *args: print("MOTION", flush=True))
|
|
|
|
box.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
|
|
box.drag_source_add_text_targets()
|
|
box.connect("drag-data-get", self.on_drag_data_get)
|
|
box.connect("drag-begin", lambda *args: print("DRAG-BEGIN", flush=True))
|
|
box.connect("drag-end", lambda *args: print("DRAG-END", flush=True))
|
|
|
|
self.connect("destroy", Gtk.main_quit)
|
|
self.show_all()
|
|
|
|
def on_drag_data_get(self, widget, context, data, info, time):
|
|
data.set_text("portal-payload-42", -1)
|
|
|
|
|
|
Source()
|
|
Gtk.main()
|