Files
gxde-ai-see/src/factory/factoryactions.cpp
T
shenmo 3b92202f2d feat(panel): 内容工厂常驻、问问小埃大按钮、分词/朗读 Dialog
- 内容工厂固定高度常驻,面板尺寸/位置不再随拖拽变化
- 问问小埃改成与工厂项一致的大按钮,可点击/可 drop,drop 后新开对话并填入内容
- 工厂动作按内容过滤:无 CJK 不出分词,无链接不出提取,朗读仅文本
- 朗读打开语速 Dialog,分词改为可滑动选择的胶囊 + 复制
- BeginPortal 传面板矩形,供概览避让
2026-10-30 21:45:10 +08:00

161 lines
7.9 KiB
C++

// SPDX-FileCopyrightText: 2026 GXDE OS Team
// SPDX-License-Identifier: GPL-3.0-or-later
#include "factoryactions.h"
#include <QFileInfo>
#include <QRegularExpression>
#include "../actions/texttools.h"
namespace {
FactoryAction action(const QString &id, const QString &label, const QString &icon = QString(),
const QString &hint = QString(), bool enabled = true)
{
return FactoryAction{ id, label, icon, hint, enabled };
}
QVector<FactoryAction> linkActions(const DropContent &content)
{
QVector<FactoryAction> actions;
const LinkInfo &link = content.link;
if (link.kind == LinkInfo::Http) {
actions.append(action(QStringLiteral("open"), QStringLiteral("浏览器打开"),
QStringLiteral("web-browser")));
if (link.fileType == QStringLiteral("image")) {
actions.append(action(QStringLiteral("preview"), QStringLiteral("预览图片"),
QStringLiteral("image-x-generic")));
} else if (link.fileType == QStringLiteral("audio") ||
link.fileType == QStringLiteral("video")) {
actions.append(action(QStringLiteral("play"), QStringLiteral("在线播放"),
QStringLiteral("media-playback-start")));
}
actions.append(action(QStringLiteral("download"), QStringLiteral("下载"),
QStringLiteral("download")));
actions.append(action(QStringLiteral("save_as"), QStringLiteral("另存为…"),
QStringLiteral("document-save-as")));
actions.append(action(QStringLiteral("copy"), QStringLiteral("复制链接"),
QStringLiteral("edit-copy")));
actions.append(action(QStringLiteral("copy_markdown"), QStringLiteral("复制为 Markdown"),
QStringLiteral("edit-copy")));
actions.append(action(QStringLiteral("copy_name"), QStringLiteral("复制文件名"),
QStringLiteral("edit-copy")));
actions.append(action(QStringLiteral("todo"), QStringLiteral("添加到待办"),
QStringLiteral("checkbox-checked")));
return actions;
}
actions.append(action(QStringLiteral("try_open"), QStringLiteral("尝试打开"),
QStringLiteral("application-x-executable")));
if (!link.decodedUrl.isEmpty()) {
actions.append(action(QStringLiteral("decode"), QStringLiteral("查看真实地址"),
QStringLiteral("edit-find")));
actions.append(action(QStringLiteral("copy_decoded"), QStringLiteral("复制真实地址"),
QStringLiteral("edit-copy")));
}
actions.append(action(QStringLiteral("copy"), QStringLiteral("复制链接"),
QStringLiteral("edit-copy")));
if (!link.displayName.isEmpty()) {
actions.append(action(QStringLiteral("copy_name"), QStringLiteral("复制名称"),
QStringLiteral("edit-copy")));
}
actions.append(action(QStringLiteral("todo"), QStringLiteral("添加到待办"),
QStringLiteral("checkbox-checked")));
actions.append(action(QStringLiteral("ask"), QStringLiteral("问问小埃"),
QStringLiteral("dialog-question")));
return actions;
}
QVector<FactoryAction> fileActions(const DropContent &content)
{
QVector<FactoryAction> actions;
const QString path = content.filePaths.value(0);
const QString type = LinkTools::fileTypeForExtension(QFileInfo(path).suffix().toLower());
actions.append(action(QStringLiteral("open"), QStringLiteral("打开"),
QStringLiteral("document-open")));
if (type == QStringLiteral("image")) {
actions.append(action(QStringLiteral("ocr"), QStringLiteral("提取文字"),
QStringLiteral("insert-text")));
actions.append(action(QStringLiteral("describe"), QStringLiteral("生成描述"),
QStringLiteral("dialog-question")));
} else if (type == QStringLiteral("audio") || type == QStringLiteral("video")) {
actions.append(action(QStringLiteral("transcribe"), QStringLiteral("转文字"),
QStringLiteral("insert-text"), QStringLiteral("尚未接入"), false));
} else if (type == QStringLiteral("document") || type == QStringLiteral("code")) {
const QString fileText = TextTools::readTextFile(path);
if (!fileText.isEmpty() &&
fileText.contains(QRegularExpression(QStringLiteral("[\\x{4e00}-\\x{9fff}]")))) {
actions.append(action(QStringLiteral("segment"), QStringLiteral("分词"),
QStringLiteral("insert-text")));
}
if (!fileText.isEmpty() && !TextTools::extractLinks(fileText).isEmpty()) {
actions.append(action(QStringLiteral("extract_links"), QStringLiteral("提取链接"),
QStringLiteral("insert-link")));
}
if (!fileText.isEmpty()) {
actions.append(action(QStringLiteral("speak"), QStringLiteral("朗读"),
QStringLiteral("audio-volume-high")));
}
}
actions.append(action(QStringLiteral("copy_path"), QStringLiteral("复制路径"),
QStringLiteral("edit-copy")));
actions.append(action(QStringLiteral("todo"), QStringLiteral("添加到待办"),
QStringLiteral("checkbox-checked")));
actions.append(action(QStringLiteral("ask"), QStringLiteral("问问小埃"),
QStringLiteral("dialog-question")));
return actions;
}
} // namespace
QVector<FactoryAction> actionsFor(const DropContent &content)
{
switch (content.kind) {
case DropContent::Files:
return fileActions(content);
case DropContent::Image:
return {
action(QStringLiteral("preview"), QStringLiteral("预览图片"),
QStringLiteral("image-x-generic")),
action(QStringLiteral("save_image"), QStringLiteral("保存图片…"),
QStringLiteral("document-save-as")),
action(QStringLiteral("ocr"), QStringLiteral("提取文字"),
QStringLiteral("insert-text")),
action(QStringLiteral("describe"), QStringLiteral("生成描述"),
QStringLiteral("dialog-question")),
action(QStringLiteral("todo"), QStringLiteral("添加到待办"),
QStringLiteral("checkbox-checked")),
};
case DropContent::Text: {
QVector<FactoryAction> actions;
const QString &text = content.text;
if (text.contains(QRegularExpression(QStringLiteral("[\\x{4e00}-\\x{9fff}]")))) {
actions.append(action(QStringLiteral("segment"), QStringLiteral("分词"),
QStringLiteral("insert-text")));
}
if (!TextTools::extractLinks(text).isEmpty()) {
actions.append(action(QStringLiteral("extract_links"), QStringLiteral("提取链接"),
QStringLiteral("insert-link")));
}
actions.append(action(QStringLiteral("translate"), QStringLiteral("翻译"),
QStringLiteral("accessories-dictionary")));
actions.append(action(QStringLiteral("speak"), QStringLiteral("朗读"),
QStringLiteral("audio-volume-high")));
actions.append(action(QStringLiteral("copy"), QStringLiteral("复制"),
QStringLiteral("edit-copy")));
actions.append(action(QStringLiteral("todo"), QStringLiteral("添加到待办"),
QStringLiteral("checkbox-checked")));
return actions;
}
case DropContent::Link:
case DropContent::CustomLink:
return linkActions(content);
default:
return {};
}
}