Offer conversation deletion in the desktop PM context menu

This commit is contained in:
evgeny committed 2026-10-26 22:11:39 +01:00
1 parent 8e3c536cbb
commit df80c43a57
2 files changed
+20 -1

No files matched your search

+16 -1
View File
@@ -224,8 +224,17 @@ ChannelList::ChannelList(DbManager* db, QWidget *parent)
connect(m_listView, &QWidget::customContextMenuRequested, this, [this](const QPoint& point) {
auto index = m_listView->indexAt(point);
QString channel = index.data(ChannelChannelIdRole).toString();
if (!index.isValid() || channel.isEmpty() || channel.startsWith(QStringLiteral("dm:"))) return;
if (!index.isValid() || channel.isEmpty()) return;
QMenu menu(this);
if (channel.startsWith(QStringLiteral("dm:"))) {
const QString conv = channel.mid(3), name = index.data(ChannelNameRole).toString();
const quint64 generation = index.data(ChannelDmGenerationRole).toULongLong();
auto* remove = menu.addAction(QCoreApplication::translate("ChatGui", "Delete conversation"));
remove->setObjectName(QStringLiteral("deleteDmAction"));
remove->setEnabled(generation && m_dmDeleting.value(conv) != generation);
if (menu.exec(m_listView->viewport()->mapToGlobal(point)) == remove) emit dmDeleteRequested(conv, generation, name);
return;
}
auto* files = menu.addAction(QCoreApplication::translate("ChatGui", "Group files"));
if (menu.exec(m_listView->viewport()->mapToGlobal(point)) == files) emit filesRequested(channel);
});
@@ -271,6 +280,11 @@ bool ChannelList::eventFilter(QObject* target, QEvent* event) {
return true;
}
void ChannelList::setDmDeleting(const QString& convId, quint64 generation, bool deleting) {
if (deleting) m_dmDeleting.insert(convId, generation);
else if (m_dmDeleting.value(convId) == generation) m_dmDeleting.remove(convId);
}
void ChannelList::refreshDmPresence() {
if (!m_dmPresenceTimer->isActive()) m_dmPresenceTimer->start();
}
@@ -367,6 +381,7 @@ void ChannelList::loadChannels() {
auto *item = new QStandardItem();
item->setData(name, ChannelNameRole);
item->setData(QStringLiteral("dm:") + dm.convId, ChannelChannelIdRole);
item->setData(QVariant::fromValue(dm.generation), ChannelDmGenerationRole);
item->setData(m_dmOnline.value(dm.convId), ChannelDmOnlineRole);
item->setData(QString(), ChannelLastMessageRole);
item->setData(0, ChannelUnreadCountRole);
+4
View File
@@ -23,6 +23,8 @@ public:
void refreshDmPresence();
void onDmCallRoute(const uint8_t* data, int len);
void clearDmPresence();
/* Отмечает ожидающее удаление поколения PM; повторное действие в меню недоступно до результата. */
void setDmDeleting(const QString& convId, quint64 generation, bool deleting);
void selectChannel(const QString& channelId);
void setChannelPeersOnline(const QString& channelId, int count);
void setAutoConnectActive(bool active);
@@ -32,6 +34,7 @@ public:
signals:
void channelSelected(const QString& channelId);
void dmDeleteRequested(const QString& convId, quint64 generation, const QString& name);
void filesRequested(const QString& channelId);
void ownFilesDropped(const QString& channelId, const QStringList& paths);
void joinRequested();
@@ -50,6 +53,7 @@ private:
QLabel *m_dropHint;
bool m_autoConnectActive = false;
QHash<QString, bool> m_dmOnline;
QHash<QString, quint64> m_dmDeleting; /* conv_id → поколение ожидающего удаления */
QTimer* m_dmPresenceTimer;
CpuLoadIndicator* m_cpuLoad;
};