- 第三栏内容工厂:按拖入类型展示动作,动作按钮本身可接收 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 源/目标)
56 lines
1.2 KiB
C++
56 lines
1.2 KiB
C++
// SPDX-FileCopyrightText: 2026 GXDE OS Team
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <QAbstractListModel>
|
|
#include <QList>
|
|
#include <QString>
|
|
|
|
struct TodoItem
|
|
{
|
|
QString id;
|
|
QString text;
|
|
bool done = false;
|
|
qint64 createdAt = 0;
|
|
};
|
|
|
|
/**
|
|
* Persisted todo list backing the todo window and the "add to todo" action.
|
|
*/
|
|
class TodoModel : public QAbstractListModel
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
enum Roles {
|
|
TextRole = Qt::UserRole + 1,
|
|
DoneRole,
|
|
IdRole,
|
|
};
|
|
|
|
static TodoModel *instance();
|
|
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
|
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
|
|
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
|
|
|
void add(const QString &text);
|
|
void setDone(int row, bool done);
|
|
const TodoItem *itemAt(int row) const;
|
|
int count() const { return m_items.size(); }
|
|
|
|
void load();
|
|
void save() const;
|
|
|
|
signals:
|
|
void countChanged();
|
|
|
|
private:
|
|
explicit TodoModel(QObject *parent = nullptr);
|
|
|
|
QList<TodoItem> m_items;
|
|
QString m_path;
|
|
};
|