Files
gxde-ai-see/src/factory/contentfactory.h
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

49 lines
1.1 KiB
C++

// SPDX-FileCopyrightText: 2026 GXDE OS Team
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QWidget>
#include "contentclassifier.h"
class QGridLayout;
class QLabel;
class QMimeData;
/**
* Third box of the panel: shows type aware actions for the dragged payload.
*
* Every action button is itself a drop target, so the user can drag the
* payload straight onto the action and release.
*/
class ContentFactory : public QWidget
{
Q_OBJECT
public:
explicit ContentFactory(QWidget *parent = nullptr);
void setContent(const DropContent &content);
void clearContent();
bool hasContent() const { return m_content.valid(); }
const DropContent &content() const { return m_content; }
signals:
void actionRequested(const QString &id, const DropContent &content);
void heightChanged();
void dragActivity();
protected:
void paintEvent(QPaintEvent *event) override;
bool eventFilter(QObject *watched, QEvent *event) override;
private:
void rebuild();
QLabel *m_summary = nullptr;
QWidget *m_actions = nullptr;
QGridLayout *m_grid = nullptr;
DropContent m_content;
};