[network/ruqola] src/widgets: Allow to update menu

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

Allow to update menu

M  +2    -2    src/widgets/dialogs/directchannelinfowidget.cpp
M  +47   -38   src/widgets/room/usersinroommenu.cpp
M  +4    -1    src/widgets/room/usersinroommenu.h

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

diff --git a/src/widgets/dialogs/directchannelinfowidget.cpp b/src/widgets/dialogs/directchannelinfowidget.cpp
index 6e40206173..b48c78cada 100644
--- a/src/widgets/dialogs/directchannelinfowidget.cpp
+++ b/src/widgets/dialogs/directchannelinfowidget.cpp
@@ -269,9 +269,9 @@ void DirectChannelActionWidget::generateRoomMenu(const User &user)
     menu->setUserId(user.userId());
     menu->setUserName(user.userName());
     menu->setRoom(mRoom);
-    mToolButton->setMenu(menu->createMenu());
+    mToolButton->setMenu(menu->createUserInRoomMenu());
     connect(mToolButton->menu(), &QMenu::aboutToShow, this, [menu]() {
-        // TODO
+        menu->updateUserInRoomMenu();
     });
 }
 
diff --git a/src/widgets/room/usersinroommenu.cpp b/src/widgets/room/usersinroommenu.cpp
index b8e8240252..fed17c06e6 100644
--- a/src/widgets/room/usersinroommenu.cpp
+++ b/src/widgets/room/usersinroommenu.cpp
@@ -109,35 +109,46 @@ void UsersInRoomMenu::slotRemoveFromRoom()
     mRocketChatAccount->kickUser(mRoom->roomId(), mUserId, mRoom->channelType());
 }
 
-QMenu *UsersInRoomMenu::createMenu() const
+QMenu *UsersInRoomMenu::createUserInRoomMenu()
 {
+    mMenu = new QMenu(mParentWidget);
+    return mMenu;
+}
+
+void UsersInRoomMenu::updateUserInRoomMenu()
+{
+    if (!mMenu) {
+        mMenu = new QMenu(mParentWidget);
+    } else {
+        mMenu->clear();
+    }
+
     const bool canManageUsersInRoom = mRoom->canChangeRoles();
     const bool isAdministrator = mRocketChatAccount->ownUser().isAdministrator();
     const QByteArray ownUserId = mRocketChatAccount->userId();
     const bool isAdirectChannel = mRoom->channelType() == Room::RoomType::Direct;
     const bool isNotMe = mUserId != ownUserId;
-    QMenu *menu = new QMenu(mParentWidget);
 
     if (mRocketChatAccount->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"), mMenu);
             connect(conversationAction, &QAction::triggered, this, &UsersInRoomMenu::slotOpenConversation);
-            menu->addAction(conversationAction);
+            mMenu->addAction(conversationAction);
         }
     }
-    if (!menu->isEmpty()) {
-        menu->addSeparator();
+    if (!mMenu->isEmpty()) {
+        mMenu->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"), mMenu);
     connect(userInfoAction, &QAction::triggered, this, &UsersInRoomMenu::slotUserInfo);
-    menu->addAction(userInfoAction);
+    mMenu->addAction(userInfoAction);
     if ((isAdministrator || canManageUsersInRoom) && !isAdirectChannel) {
-        if (!menu->isEmpty()) {
-            menu->addSeparator();
+        if (!mMenu->isEmpty()) {
+            mMenu->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"), mMenu);
             connect(removeAsOwner, &QAction::triggered, this, [this, hasOwnerRole]() {
                 mRocketChatAccount->changeRoles(mRoom->roomId(),
                                                 QString::fromLatin1(mUserId),
@@ -145,76 +156,75 @@ QMenu *UsersInRoomMenu::createMenu() const
                                                 hasOwnerRole ? RocketChatAccount::RoleType::RemoveOwner : RocketChatAccount::RoleType::AddOwner);
             });
 
-            menu->addAction(removeAsOwner);
+            mMenu->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"), mMenu);
             connect(removeAsLeader, &QAction::triggered, this, [this, hasLeaderRole]() {
                 mRocketChatAccount->changeRoles(mRoom->roomId(),
                                                 QString::fromLatin1(mUserId),
                                                 mRoom->channelType(),
                                                 hasLeaderRole ? RocketChatAccount::RoleType::RemoveLeader : RocketChatAccount::RoleType::AddLeader);
             });
-            menu->addAction(removeAsLeader);
+            mMenu->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"), mMenu);
             connect(removeAsModerator, &QAction::triggered, this, [this, hasModeratorRole]() {
                 mRocketChatAccount->changeRoles(mRoom->roomId(),
                                                 QString::fromLatin1(mUserId),
                                                 mRoom->channelType(),
                                                 hasModeratorRole ? RocketChatAccount::RoleType::RemoveModerator : RocketChatAccount::RoleType::AddModerator);
             });
-            menu->addAction(removeAsModerator);
+            mMenu->addAction(removeAsModerator);
         }
         if (isAdministrator || mRoom->hasPermission(u"remove-user"_s)) {
-            menu->addSeparator();
-            auto removeFromRoom = new QAction(i18nc("@action", "Remove from Room"), menu);
+            mMenu->addSeparator();
+            auto removeFromRoom = new QAction(i18nc("@action", "Remove from Room"), mMenu);
             connect(removeFromRoom, &QAction::triggered, this, &UsersInRoomMenu::slotRemoveFromRoom);
-            menu->addAction(removeFromRoom);
+            mMenu->addAction(removeFromRoom);
         }
     }
     if (isNotMe) {
-        if (!menu->isEmpty()) {
-            menu->addSeparator();
+        if (!mMenu->isEmpty()) {
+            mMenu->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"), mMenu);
             connect(blockAction, &QAction::triggered, this, &UsersInRoomMenu::slotBlockUser);
-            menu->addAction(blockAction);
+            mMenu->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"), mMenu);
             connect(ignoreAction, &QAction::triggered, this, &UsersInRoomMenu::slotIgnoreUser);
-            menu->addAction(ignoreAction);
-            menu->addSeparator();
+            mMenu->addAction(ignoreAction);
+            mMenu->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"), mMenu);
                 muteAction->setIcon(userIsMuted ? QIcon::fromTheme("mic-on"_L1) : QIcon::fromTheme("mic-off"_L1));
                 connect(muteAction, &QAction::triggered, this, &UsersInRoomMenu::slotMuteUser);
-                menu->addAction(muteAction);
+                mMenu->addAction(muteAction);
             }
         }
 
-        menu->addSeparator();
-        auto reportUserAction = new QAction(QIcon::fromTheme("emblem-warning"_L1), i18nc("@action", "Report User"), menu);
+        mMenu->addSeparator();
+        auto reportUserAction = new QAction(QIcon::fromTheme("emblem-warning"_L1), i18nc("@action", "Report User"), mMenu);
         connect(reportUserAction, &QAction::triggered, this, &UsersInRoomMenu::slotReportUser);
-        menu->addAction(reportUserAction);
+        mMenu->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);
+            mMenu->addSeparator();
+            auto banUserFromRoomAction = new QAction(QIcon::fromTheme("im-ban-user"_L1), i18nc("@action", "Ban User From Room"), mMenu);
             connect(banUserFromRoomAction, &QAction::triggered, this, &UsersInRoomMenu::slotBanUserFromRoomAction);
-            menu->addAction(banUserFromRoomAction);
+            mMenu->addAction(banUserFromRoomAction);
         }
     }
-    return menu;
 }
 
 void UsersInRoomMenu::slotCustomContextMenuRequested(const QPoint &pos)
@@ -223,10 +233,9 @@ void UsersInRoomMenu::slotCustomContextMenuRequested(const QPoint &pos)
     if (offline) {
         return;
     }
-    auto menu = createMenu();
+    updateUserInRoomMenu();
 
-    menu->exec(mParentWidget->mapToGlobal(pos));
-    delete menu;
+    mMenu->exec(mParentWidget->mapToGlobal(pos));
 }
 
 void UsersInRoomMenu::slotBanUserFromRoomAction()
diff --git a/src/widgets/room/usersinroommenu.h b/src/widgets/room/usersinroommenu.h
index 15224b1189..aeb00d1bfd 100644
--- a/src/widgets/room/usersinroommenu.h
+++ b/src/widgets/room/usersinroommenu.h
@@ -25,7 +25,9 @@ public:
     void setUserId(const QByteArray &userId);
     void setParentWidget(QWidget *parentWidget);
 
-    [[nodiscard]] QMenu *createMenu() const;
+    void updateUserInRoomMenu();
+
+    [[nodiscard]] QMenu *createUserInRoomMenu();
 
 private:
     LIBRUQOLAWIDGETS_NO_EXPORT void slotOpenConversation();
@@ -41,4 +43,5 @@ private:
     QPointer<Room> mRoom;
     QWidget *mParentWidget = nullptr;
     RocketChatAccount *const mRocketChatAccount;
+    QMenu *mMenu = nullptr;
 };
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.