From 39a9fe01a3b2b1e8cb70b141bee613e8894326c2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 3 Nov 2026 00:16:21 +0100 Subject: [PATCH] Expose accepted sends and define history follow policy --- tools/chatgui/src/inputbar.cpp | 1 + tools/chatgui/src/inputbar.h | 1 + tools/chatgui/src/messagelist.h | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/chatgui/src/inputbar.cpp b/tools/chatgui/src/inputbar.cpp index 23977404d..b03fde97b 100644 --- a/tools/chatgui/src/inputbar.cpp +++ b/tools/chatgui/src/inputbar.cpp @@ -516,6 +516,7 @@ void InputBar::submissionResult(quint64 request, bool success) { if (!pending.source.isEmpty() && pending.attachmentRevision == m_attachmentRevision) clearPendingAttachment(); if (!submissionPending() && !m_submissionFailed && !m_clipboardPreparing && m_input->toPlainText().isEmpty() && m_pendingAttachSrc.isEmpty()) clearReply(); + emit messageAccepted(); } /* Черновик и выбранный ответ восстанавливаются после сохранения/отмены. Вложения остаются в composer. */ diff --git a/tools/chatgui/src/inputbar.h b/tools/chatgui/src/inputbar.h index 0d1860f6c..be67c84f2 100644 --- a/tools/chatgui/src/inputbar.h +++ b/tools/chatgui/src/inputbar.h @@ -68,6 +68,7 @@ public: void cancelEdit(); // Восстановить обычный черновик/reply/preview; late result edit игнорируется, запрос ядра не отменяется. signals: + void messageAccepted(); // Новая отправка текущего composer подтверждена ядром; правки/отказы/старый target не уведомляют. /* Текст текущего контекста; справа удалены только пробелы/табуляции. replyTo пуст либо ключ 32 байта. * request ненулевой для канала (включая обычный текст), 0 для PM; обработчик фиксирует текущую цель синхронно. */ void sendMessage(const QString &text, const QByteArray& replyTo, quint64 request); diff --git a/tools/chatgui/src/messagelist.h b/tools/chatgui/src/messagelist.h index a6751c837..8818b279d 100644 --- a/tools/chatgui/src/messagelist.h +++ b/tools/chatgui/src/messagelist.h @@ -44,7 +44,7 @@ public: // Сохранить канал, сменить target; для dm: зафиксировать generation и запросить снимок. void loadChannel(const QString& channelId); // Добавить отсутствующие сообщения (до 200); не вытеснять историческое окно цитаты. - void refresh(); + void refresh(bool outgoing = false); // Новое своё сообщение возвращает к последним; входящее — только из близкой к низу позиции. // Перечитать имена, обновить авторов и превью цитат. void reloadLocalNicks(); // Для CHAT поставить read/верхнюю позицию в ui_state; окно старой цитаты сохраняет свежий watermark. PM пропускается. @@ -176,6 +176,9 @@ private: void restoreScrollPosition(const QString& channelId); // Максимальный rowid полностью видимых строк; watermark меняется после принятия записи. void updateReadPosition(); + bool nearHistoryBottom() const; // До изменения модели: осталось не больше десяти строк текущего шрифта. + void scrollHistoryToBottom(); // Синхронный layout и bottom, повтор после Qt layout с проверкой канала/поколения/окна. + void showLatestMessages(); // Покинуть окно старой цитаты и прокрутить последние сообщения вниз. // Persistent index/QPointer защищают menu от замены модели/уничтожения UI. void onMessageContextMenu(const QPoint& pos); // Запросить выбранное поколение PM; ожидающее удаление блокирует запрос.