Files
gxde-ai-see/tests/portal/drop_target.py
T
shenmo7192 3a73a8c5d1 feat(factory): 内容工厂与链接处理
- 第三栏内容工厂:按拖入类型展示动作,动作按钮本身可接收 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 源/目标)
2026-10-30 20:09:01 +08:00

42 lines
1.1 KiB
Python

#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2026 GXDE OS Team
# SPDX-License-Identifier: GPL-3.0-or-later
"""GTK3 drop target used by the portal integration test.
GtkTextView accepts text drops out of the box; every insertion is printed as
``DROP <text> at <offset>`` so the orchestrator can assert that the *native*
drop landed in this window.
"""
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa: E402
class Target(Gtk.Window):
def __init__(self):
super().__init__(title="PortalDropTarget")
self.set_default_size(420, 280)
self.set_position(Gtk.WindowPosition.CENTER)
view = Gtk.TextView()
view.set_wrap_mode(Gtk.WrapMode.WORD)
self.buffer = view.get_buffer()
self.buffer.connect("insert-text", self.on_insert)
scroller = Gtk.ScrolledWindow()
scroller.add(view)
self.add(scroller)
self.connect("destroy", Gtk.main_quit)
self.show_all()
def on_insert(self, buffer, location, text, length):
print("DROP", repr(text), "at", location.get_offset(), flush=True)
Target()
Gtk.main()