Files
utun2/tools/chatgui/src/dminvitedialog.h
T

38 lines
2.7 KiB
C++

/* Выбор группы для приглашения фиксированного собеседника в PM.
* Показывает только группы, где локальный узел — участник; отправка выполняется dm_invite_trampoline.
* Только GUI-поток: использовать exec(), обработчик результата выбирает activeModalWidget.
* Занимает единственный dm_invite_result callback bridge; не совмещать с другим его владельцем.
* Деструктор снимает callback и, если pending/core доступны, ставит отмену регистрации по request_id.
* Уже отправленное PM-сообщение закрытием не отзывается. */
#pragma once
#include <QDialog>
#include <QString>
#include <cstdint>
class DbManager;
class QComboBox;
class QLabel;
class QPushButton;
class DmInviteDialog : public QDialog {
Q_OBJECT
public:
// db обязателен и используется при создании; peer — ненулевой чужой node_id, name — имя для UI/PM.
// source — контекстный ID группы/маршрута для DM. Аргументы строк копируются, DB не переходит во владение диалога.
DmInviteDialog(DbManager* db, quint64 peer, const QString& name, const QString& source, QWidget* parent = nullptr);
~DmInviteDialog() override;
// Читать после Accepted: conv_id без префикса dm:, непустой только после успешного результата отправки.
QString conversationId() const { return m_convId; }
private:
void sendInvite();
void onResult(const uint8_t* data, int len);
quint64 m_peer, m_requestId = 0; // Фиксированный адресат и ID текущего запроса; оба сверяются в ответе.
QString m_name, m_source, m_convId; // Имя/контекст адресата и conv_id успешной личной беседы.
QComboBox* m_groups; // Дочерний список доступных групп, блокируется на время регистрации/отправки.
QLabel* m_status; // Дочерний статус/ошибка без изменения выбранного адресата.
QPushButton* m_send; // Дочерняя кнопка, недоступна до выбора группы и пока pending.
bool m_pending = false; // Есть принятый запрос; снимается только совпадающим результатом.
};