feat(chat,todo): 小埃同学对话窗口与待办窗口

Chat:
- DTK2 窗口:左侧会话列表 + 右侧对话区 + 输入框
- DeepSeek / 自定义 API,SSE 流式输出,首字即显示
- 会话持久化到 chat.json,新建/切换/标题自动生成
- 设置对话框:API Key、API 地址、模型、系统提示,含开通指引
- 拖放:左侧空白=新建对话,左侧会话=指定会话,右侧对话区=当前会话
- Ctrl+Enter 发送,错误以消息形式回显

Todo:
- 待办窗口(layer-shell,不抢焦点、不进 dock),复选框/删除/新建
- 待办持久化 todo.json,--todo 打开,独立 desktop 入口

其他:
- desktop 入口改为打开对话窗口,--chat 参数
- 单实例消息支持 show/todo/chat
This commit is contained in:
2026-10-30 20:12:31 +08:00
parent 150a49af2f
commit e3c8da1a3f
12 changed files with 1363 additions and 10 deletions
+41
View File
@@ -0,0 +1,41 @@
// SPDX-FileCopyrightText: 2026 GXDE OS Team
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <DBlurEffectWidget>
#include <QWidget>
class QLabel;
class QListView;
class TodoModel;
/**
* Floating todo window (optional keep-above, draggable, hidden from the dock).
*
* On Wayland it is a layer-shell overlay surface (keyboard interactivity is
* none so it never steals focus); new entries are added from the panel or the
* "+" button which opens a normal dialog.
*/
class TodoWindow : public Dtk::Widget::DBlurEffectWidget
{
Q_OBJECT
public:
explicit TodoWindow(TodoModel *model, QWidget *parent = nullptr);
void popup();
void refreshLayout();
protected:
void showEvent(QShowEvent *event) override;
private:
void setupWindow();
void setupUi();
void addEntry();
TodoModel *m_model = nullptr;
QListView *m_view = nullptr;
QLabel *m_countLabel = nullptr;
};