[network/ruqola] src/widgets/room: Prepare to use menu in direct channel info

Laurent Montel <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit e7cfef9bdd5c51046a20acc799b23098408af082 by Laurent Montel.
Committed on 19/07/2026 at 11:23.
Pushed by mlaurent into branch 'master'.

Prepare to use menu in direct channel info

M  +48   -39   src/widgets/room/usersinroommenu.cpp
M  +2    -0    src/widgets/room/usersinroommenu.h

https://invent.kde.org/network/ruqola/-/commit/e7cfef9bdd5c51046a20acc799b23098408af082

diff --git a/src/widgets/room/usersinroommenu.cpp b/src/widgets/room/usersinroommenu.cpp
index 2aca1ba435..7b5ad452bd 100644
--- a/src/widgets/room/usersinroommenu.cpp
+++ b/src/widgets/room/usersinroommenu.cpp
@@ -110,40 +110,36 @@ void UsersInRoomMenu::slotRemoveFromRoom()
     Ruqola::self()->rocketChatAccount()->kickUser(mRoom->roomId(), mUserId, mRoom->channelType());
 }
 
-void UsersInRoomMenu::slotCustomContextMenuRequested(const QPoint &pos)
+QMenu *UsersInRoomMenu::createMenu()
 {
     auto account = Ruqola::self()->rocketChatAccount();
-    const bool offline = account->offlineMode();
-    if (offline) {
-        return;
-    }
     const bool canManageUsersInRoom = mRoom->canChangeRoles();
     const bool isAdministrator = account->ownUser().isAdministrator();
     const QByteArray ownUserId = account->userId();
     const bool isAdirectChannel = mRoom->channelType() == Room::RoomType::Direct;
     const bool isNotMe = mUserId != ownUserId;
-    QMenu menu(mParentWidget);
+    QMenu *menu = new QMenu(mParentWidget);
 
     if (account->hasPermission(u"create-d"_s)) {
         if (isNotMe && !isAdirectChannel) {
-            auto conversationAction = new QAction(i18nc("@action", "Start Conversation"), &menu);
+            auto conversationAction = new QAction(i18nc("@action", "Start Conversation"), menu);
             connect(conversationAction, &QAction::triggered, this, &UsersInRoomMenu::slotOpenConversation);
-            menu.addAction(conversationAction);
+            menu->addAction(conversationAction);
         }
     }
-    if (!menu.isEmpty()) {
-        menu.addSeparator();
+    if (!menu->isEmpty()) {
+        menu->addSeparator();
     }
-    auto userInfoAction = new QAction(QIcon::fromTheme(u"documentinfo"_s), i18nc("@action", "User Info"), &menu);
+    auto userInfoAction = new QAction(QIcon::fromTheme(u"documentinfo"_s), i18nc("@action", "User Info"), menu);
     connect(userInfoAction, &QAction::triggered, this, &UsersInRoomMenu::slotUserInfo);
-    menu.addAction(userInfoAction);
+    menu->addAction(userInfoAction);
     if ((isAdministrator || canManageUsersInRoom) && !isAdirectChannel) {
-        if (!menu.isEmpty()) {
-            menu.addSeparator();
+        if (!menu->isEmpty()) {
+            menu->addSeparator();
         }
         if (isAdministrator || mRoom->hasPermission(u"set-owner"_s)) {
             const bool hasOwnerRole = mRoom->userHasOwnerRole(mUserId);
-            auto removeAsOwner = new QAction(hasOwnerRole ? i18nc("@action", "Remove as Owner") : i18nc("@action", "Add as Owner"), &menu);
+            auto removeAsOwner = new QAction(hasOwnerRole ? i18nc("@action", "Remove as Owner") : i18nc("@action", "Add as Owner"), menu);
             connect(removeAsOwner, &QAction::triggered, this, [this, hasOwnerRole, account]() {
                 account->changeRoles(mRoom->roomId(),
                                      QString::fromLatin1(mUserId),
@@ -151,76 +147,89 @@ void UsersInRoomMenu::slotCustomContextMenuRequested(const QPoint &pos)
                                      hasOwnerRole ? RocketChatAccount::RoleType::RemoveOwner : RocketChatAccount::RoleType::AddOwner);
             });
 
-            menu.addAction(removeAsOwner);
+            menu->addAction(removeAsOwner);
         }
 
         if (isAdministrator || mRoom->hasPermission(u"set-leader"_s)) {
             const bool hasLeaderRole = mRoom->userHasLeaderRole(mUserId);
-            auto removeAsLeader = new QAction(hasLeaderRole ? i18nc("@action", "Remove as Leader") : i18nc("@action", "Add as Leader"), &menu);
+            auto removeAsLeader = new QAction(hasLeaderRole ? i18nc("@action", "Remove as Leader") : i18nc("@action", "Add as Leader"), menu);
             connect(removeAsLeader, &QAction::triggered, this, [this, hasLeaderRole, account]() {
                 account->changeRoles(mRoom->roomId(),
                                      QString::fromLatin1(mUserId),
                                      mRoom->channelType(),
                                      hasLeaderRole ? RocketChatAccount::RoleType::RemoveLeader : RocketChatAccount::RoleType::AddLeader);
             });
-            menu.addAction(removeAsLeader);
+            menu->addAction(removeAsLeader);
         }
 
         if (isAdministrator || mRoom->hasPermission(u"set-moderator"_s)) {
             const bool hasModeratorRole = mRoom->userHasModeratorRole(mUserId);
-            auto removeAsModerator = new QAction(hasModeratorRole ? i18nc("@action", "Remove as Moderator") : i18nc("@action", "Add as Moderator"), &menu);
+            auto removeAsModerator = new QAction(hasModeratorRole ? i18nc("@action", "Remove as Moderator") : i18nc("@action", "Add as Moderator"), menu);
             connect(removeAsModerator, &QAction::triggered, this, [this, hasModeratorRole, account]() {
                 account->changeRoles(mRoom->roomId(),
                                      QString::fromLatin1(mUserId),
                                      mRoom->channelType(),
                                      hasModeratorRole ? RocketChatAccount::RoleType::RemoveModerator : RocketChatAccount::RoleType::AddModerator);
             });
-            menu.addAction(removeAsModerator);
+            menu->addAction(removeAsModerator);
         }
         if (isAdministrator || mRoom->hasPermission(u"remove-user"_s)) {
-            menu.addSeparator();
-            auto removeFromRoom = new QAction(i18nc("@action", "Remove from Room"), &menu);
+            menu->addSeparator();
+            auto removeFromRoom = new QAction(i18nc("@action", "Remove from Room"), menu);
             connect(removeFromRoom, &QAction::triggered, this, &UsersInRoomMenu::slotRemoveFromRoom);
-            menu.addAction(removeFromRoom);
+            menu->addAction(removeFromRoom);
         }
     }
     if (isNotMe) {
-        if (!menu.isEmpty()) {
-            menu.addSeparator();
+        if (!menu->isEmpty()) {
+            menu->addSeparator();
         }
         if (isAdirectChannel) {
             const bool userIsBlocked = mRoom->blocker();
-            auto blockAction = new QAction(userIsBlocked ? i18nc("@action", "Unblock User") : i18nc("@action", "Block User"), &menu);
+            auto blockAction = new QAction(userIsBlocked ? i18nc("@action", "Unblock User") : i18nc("@action", "Block User"), menu);
             connect(blockAction, &QAction::triggered, this, &UsersInRoomMenu::slotBlockUser);
-            menu.addAction(blockAction);
+            menu->addAction(blockAction);
         } else {
             const bool userIsIgnored = mRoom->userIsIgnored(mUserId);
-            auto ignoreAction = new QAction(userIsIgnored ? i18nc("@action", "Unignore") : i18nc("@action", "Ignore"), &menu);
+            auto ignoreAction = new QAction(userIsIgnored ? i18nc("@action", "Unignore") : i18nc("@action", "Ignore"), menu);
             connect(ignoreAction, &QAction::triggered, this, &UsersInRoomMenu::slotIgnoreUser);
-            menu.addAction(ignoreAction);
-            menu.addSeparator();
+            menu->addAction(ignoreAction);
+            menu->addSeparator();
             if (mRoom->hasPermission(u"mute-user"_s)) {
                 const bool userIsMuted = mRoom->userIsMuted(mUserName);
-                auto muteAction = new QAction(userIsMuted ? i18nc("@action", "Unmute User") : i18nc("@action", "Mute User"), &menu);
+                auto muteAction = new QAction(userIsMuted ? i18nc("@action", "Unmute User") : i18nc("@action", "Mute User"), menu);
                 muteAction->setIcon(userIsMuted ? QIcon::fromTheme("mic-on"_L1) : QIcon::fromTheme("mic-off"_L1));
                 connect(muteAction, &QAction::triggered, this, &UsersInRoomMenu::slotMuteUser);
-                menu.addAction(muteAction);
+                menu->addAction(muteAction);
             }
         }
 
-        menu.addSeparator();
-        auto reportUserAction = new QAction(QIcon::fromTheme("emblem-warning"_L1), i18nc("@action", "Report User"), &menu);
+        menu->addSeparator();
+        auto reportUserAction = new QAction(QIcon::fromTheme("emblem-warning"_L1), i18nc("@action", "Report User"), menu);
         connect(reportUserAction, &QAction::triggered, this, &UsersInRoomMenu::slotReportUser);
-        menu.addAction(reportUserAction);
+        menu->addAction(reportUserAction);
 
         if (mRoom->hasPermission(u"ban-user"_s)) {
-            menu.addSeparator();
-            auto banUserFromRoomAction = new QAction(QIcon::fromTheme("im-ban-user"_L1), i18nc("@action", "Ban User From Room"), &menu);
+            menu->addSeparator();
+            auto banUserFromRoomAction = new QAction(QIcon::fromTheme("im-ban-user"_L1), i18nc("@action", "Ban User From Room"), menu);
             connect(banUserFromRoomAction, &QAction::triggered, this, &UsersInRoomMenu::slotBanUserFromRoomAction);
-            menu.addAction(banUserFromRoomAction);
+            menu->addAction(banUserFromRoomAction);
         }
     }
-    menu.exec(mParentWidget->mapToGlobal(pos));
+    return menu;
+}
+
+void UsersInRoomMenu::slotCustomContextMenuRequested(const QPoint &pos)
+{
+    auto account = Ruqola::self()->rocketChatAccount();
+    const bool offline = account->offlineMode();
+    if (offline) {
+        return;
+    }
+    auto menu = createMenu();
+
+    menu->exec(mParentWidget->mapToGlobal(pos));
+    delete menu;
 }
 
 void UsersInRoomMenu::slotBanUserFromRoomAction()
diff --git a/src/widgets/room/usersinroommenu.h b/src/widgets/room/usersinroommenu.h
index 5f24dd3704..303c08a18b 100644
--- a/src/widgets/room/usersinroommenu.h
+++ b/src/widgets/room/usersinroommenu.h
@@ -24,6 +24,8 @@ public:
     void setUserId(const QByteArray &userId);
     void setParentWidget(QWidget *parentWidget);
 
+    [[nodiscard]] QMenu *createMenu();
+
 private:
     LIBRUQOLAWIDGETS_NO_EXPORT void slotOpenConversation();
     LIBRUQOLAWIDGETS_NO_EXPORT void slotBlockUser();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.