add removal of chat sessions, auto title + icon, proper stick-to-bottom as response is streamed

This commit is contained in:
2026-08-20 17:40:33 +02:00
parent 47bab21e22
commit 9657e5092a
12 changed files with 776 additions and 273 deletions
+11 -6
View File
@@ -3,7 +3,6 @@
#include "message.hpp"
#include <QDateTime>
#include <QJsonObject>
#include <QList>
#include <QObject>
#include <QString>
@@ -18,8 +17,10 @@ class ChatSession : public QObject {
Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(QString icon READ icon NOTIFY iconChanged)
Q_PROPERTY(QDateTime createdAt READ createdAt CONSTANT)
Q_PROPERTY(QDateTime updatedAt READ updatedAt NOTIFY updatedAtChanged)
Q_PROPERTY(bool pinned READ pinned NOTIFY pinnedChanged)
Q_PROPERTY(int messageCount READ messageCount NOTIFY messageCountChanged)
Q_PROPERTY(QList<ChatMessage*> messages READ messages NOTIFY messagesChanged)
@@ -28,6 +29,7 @@ class ChatSession : public QObject {
[[nodiscard]] QString id() const { return m_id; }
[[nodiscard]] QString title() const { return m_title; }
[[nodiscard]] QString icon() const { return m_icon; }
[[nodiscard]] QDateTime createdAt() const {
return QDateTime::fromMSecsSinceEpoch(m_createdAt);
}
@@ -36,6 +38,7 @@ class ChatSession : public QObject {
}
[[nodiscard]] qint64 createdAtMs() const { return m_createdAt; }
[[nodiscard]] qint64 updatedAtMs() const { return m_updatedAt; }
[[nodiscard]] bool pinned() const { return m_pinned; }
[[nodiscard]] int messageCount() const { return m_messageCount; }
[[nodiscard]] QList<ChatMessage*> messages() {
ensureLoaded();
@@ -43,10 +46,10 @@ class ChatSession : public QObject {
}
void setTitle(const QString& value);
void setIcon(const QString& value);
void setUpdatedAt(qint64 value);
void setPinned(bool value);
void setPath(const QString& value) { m_path = value; }
[[nodiscard]] QString path() const { return m_path; }
void setMeta(
const QString& title,
qint64 createdAt,
@@ -55,28 +58,30 @@ class ChatSession : public QObject {
void ensureLoaded();
[[nodiscard]] bool isLoaded() const { return m_loaded; }
void adoptMessages(QList<ChatMessage*> messages);
ChatMessage* appendMessage(
ChatMessage::Role role, const QString& content, qint64 timestamp);
void removeMessage(ChatMessage* message);
void clearMessages();
[[nodiscard]] QJsonObject document();
Q_SIGNALS:
void titleChanged();
void iconChanged();
void updatedAtChanged();
void pinnedChanged();
void messageCountChanged();
void messagesChanged();
private:
void loadMessages();
void setCount(int value);
QString m_id;
QString m_title;
QString m_icon;
qint64 m_createdAt = 0;
qint64 m_updatedAt = 0;
bool m_pinned = false;
int m_messageCount = 0;
QString m_path;
QList<ChatMessage*> m_messages;
bool m_loaded = false;
};