diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index e7d0c935..9299745c 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -1,206 +1,207 @@ set(ruqola_userfeedback_SRCS) if (TARGET KUserFeedbackWidgets) set(ruqola_userfeedback_SRCS ${ruqola_userfeedback_SRCS} userfeedback/userfeedbackmanager.cpp userfeedback/ruqolauserfeedbackprovider.cpp ) endif() set(Ruqola_widgets_SRCS ruqolamainwindow.cpp ruqolacentralwidget.cpp ruqolaloginwidget.cpp ruqolamainwidget.cpp ) set(Ruqola_widgets_dialog_SRCS dialogs/serverinfowidget.cpp dialogs/serverinfodialog.cpp dialogs/uploadfiledialog.cpp dialogs/uploadfilewidget.cpp dialogs/channelinfowidget.cpp dialogs/channelinfodialog.cpp dialogs/searchchanneldialog.cpp dialogs/searchchannelwidget.cpp dialogs/modifystatusdialog.cpp dialogs/modifystatuswidget.cpp dialogs/createnewchanneldialog.cpp dialogs/createnewchannelwidget.cpp dialogs/showlistmessagebasedialog.cpp dialogs/showlistmessagebasewidget.cpp dialogs/createnewaccountdialog.cpp dialogs/createnewaccountwidget.cpp dialogs/showpinnedmessagesdialog.cpp dialogs/showstarredmessagesdialog.cpp dialogs/showmentionsmessagesdialog.cpp dialogs/showsnipperedmessagesdialog.cpp dialogs/configurenotificationdialog.cpp dialogs/configurenotificationwidget.cpp dialogs/searchmessagedialog.cpp dialogs/searchmessagewidget.cpp dialogs/reportmessagedialog.cpp dialogs/reportmessagewidget.cpp dialogs/showimagedialog.cpp dialogs/showimagewidget.cpp dialogs/showattachmentdialog.cpp dialogs/showattachmentwidget.cpp dialogs/directchannelinfodialog.cpp dialogs/directchannelinfowidget.cpp dialogs/attachment/listattachmentdelegate.cpp dialogs/showdiscussionsdialog.cpp dialogs/showdiscussionswidget.cpp dialogs/discussion/listdiscussiondelegate.cpp dialogs/createnewdiscussiondialog.cpp dialogs/createnewdiscussionwidget.cpp dialogs/channelpassworddialog.cpp dialogs/channelpasswordwidget.cpp dialogs/addusersinroomdialog.cpp dialogs/addusersinroomwidget.cpp dialogs/adduserscompletionlineedit.cpp dialogs/showthreadsdialog.cpp dialogs/searchchannel/searchchanneldelegate.cpp dialogs/takevideomessagedialog.cpp dialogs/takevideomessagewidget.cpp dialogs/inviteusersdialog.cpp dialogs/inviteuserswidget.cpp dialogs/autotranslateconfiguredialog.cpp dialogs/autotranslateconfigurewidget.cpp dialogs/showvideowidget.cpp dialogs/showvideodialog.cpp dialogs/playsounddialog.cpp dialogs/playsoundwidget.cpp dialogs/createvideomessagedialog.cpp dialogs/createvideomessagewidget.cpp ) set(Ruqola_configure_SRCS configuredialog/configuresettingsdialog.cpp configuredialog/configureaccountwidget.cpp configuredialog/accountserverlistwidget.cpp configuredialog/configureaccountserverwidget.cpp configuredialog/configurespellcheckingwidget.cpp configuredialog/configureuserfeedbackwidget.cpp configuredialog/configuregeneralwidget.cpp ) set(Ruqola_threadwidget_SRCS threadwidget/threadmessagewidget.cpp threadwidget/threadmessagedialog.cpp ) ki18n_wrap_ui(Ruqola_configure_SRCS configuredialog/configureaccountserverwidget.ui ) set(Ruqola_channellist_SRCS channellist/channellistwidget.cpp channellist/statuscombobox.cpp channellist/channellistview.cpp channellist/channellistdelegate.cpp ) set(Ruqola_roomwidget_SRCS room/roomwidget.cpp room/roomheaderwidget.cpp room/messagelistview.cpp room/messagetextedit.cpp room/delegate/messagelistdelegate.cpp room/delegate/messagedelegatehelperbase.cpp room/delegate/messagedelegatehelpertext.cpp room/delegate/messagedelegatehelperimage.cpp room/delegate/messagedelegatehelperfile.cpp room/delegate/messagedelegatehelperreactions.cpp room/delegate/messagedelegatehelpervideo.cpp room/delegate/messagedelegatehelpersound.cpp room/delegate/pixmapcache.cpp room/messagelinewidget.cpp room/readonlylineeditwidget.cpp room/usersinroomflowwidget.cpp room/usersinroomlabel.cpp room/channelactionpopupmenu.cpp + room/roomutil.cpp ) set(Ruqola_misc_widget_SRCS misc/accountmenu.cpp misc/accountsoverviewwidget.cpp misc/emoticonmenuwidget.cpp misc/emoticonselectorwidget.cpp misc/adduserswidget.cpp misc/clickableuserwidget.cpp ) set(Ruqola_common_SRCS common/completionlineedit.cpp common/completionlistview.cpp common/emojicompletiondelegate.cpp common/authenticationcombobox.cpp common/flowlayout.cpp common/commandcompletiondelegate.cpp common/delegatepaintutil.cpp ) ecm_qt_declare_logging_category(Ruqola_widgets_SRCS HEADER ruqolawidgets_debug.h IDENTIFIER RUQOLAWIDGETS_LOG CATEGORY_NAME org.kde.ruqola.widgets) qt5_add_resources(Ruqola_widgets_SRCS ruqolawidget.qrc) add_library(libruqolawidgets ${ruqola_userfeedback_SRCS} ${Ruqola_common_SRCS} ${Ruqola_widgets_SRCS} ${Ruqola_widgets_dialog_SRCS} ${Ruqola_channellist_SRCS} ${Ruqola_roomwidget_SRCS} ${Ruqola_configure_SRCS} ${Ruqola_misc_widget_SRCS} ${Ruqola_threadwidget_SRCS} ) generate_export_header(libruqolawidgets BASE_NAME libruqolawidgets) set(ruqola_userfeedback_LIB) if (TARGET KUserFeedbackWidgets) set(ruqola_userfeedback_LIB KUserFeedbackWidgets) endif() target_link_libraries(libruqolawidgets Qt5::Gui Qt5::Widgets Qt5::MultimediaWidgets KF5::I18n KF5::ConfigCore KF5::XmlGui KF5::KIOWidgets KF5::WidgetsAddons KF5::SonnetUi KF5::TextWidgets KF5::IconThemes librocketchatrestapi-qt5 libruqolacore ${ruqola_userfeedback_LIB} ) if (NOT WIN32) target_link_libraries(libruqolawidgets Qt5::DBus) endif() set_target_properties(libruqolawidgets PROPERTIES OUTPUT_NAME ruqolawidgets VERSION ${RUQOLA_LIB_VERSION} SOVERSION ${RUQOLA_LIB_SOVERSION} ) if (BUILD_TESTING) add_subdirectory(autotests) add_subdirectory(tests) add_subdirectory(channellist/autotests) add_subdirectory(room/autotests) add_subdirectory(dialogs/autotests) add_subdirectory(misc/autotests) add_subdirectory(configuredialog/autotests) add_subdirectory(common/autotests) add_subdirectory(threadwidget/autotests) endif() install(TARGETS libruqolawidgets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} LIBRARY NAMELINK_SKIP) diff --git a/src/widgets/room/roomutil.cpp b/src/widgets/room/roomutil.cpp new file mode 100644 index 00000000..42d52910 --- /dev/null +++ b/src/widgets/room/roomutil.cpp @@ -0,0 +1,26 @@ +/* + Copyright (c) 2020 Laurent Montel + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2 of the License or + ( at your option ) version 3 or, at the discretion of KDE e.V. + ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "roomutil.h" + +QString RoomUtil::generateUserLink(const QString &userName) +{ + return QStringLiteral("ruqola:/user/") + userName; +} diff --git a/src/widgets/room/roomutil.h b/src/widgets/room/roomutil.h new file mode 100644 index 00000000..604be6fb --- /dev/null +++ b/src/widgets/room/roomutil.h @@ -0,0 +1,31 @@ +/* + Copyright (c) 2020 Laurent Montel + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2 of the License or + ( at your option ) version 3 or, at the discretion of KDE e.V. + ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef ROOMUTIL_H +#define ROOMUTIL_H + +#include "libruqolawidgets_private_export.h" +#include +namespace RoomUtil +{ +LIBRUQOLAWIDGETS_TESTS_EXPORT QString generateUserLink(const QString &userName); +} + +#endif // ROOMUTIL_H diff --git a/src/widgets/room/roomwidget.cpp b/src/widgets/room/roomwidget.cpp index 2c2bf781..2e3df0aa 100644 --- a/src/widgets/room/roomwidget.cpp +++ b/src/widgets/room/roomwidget.cpp @@ -1,513 +1,514 @@ /* Copyright (c) 2020 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "roomwidget.h" #include "roomheaderwidget.h" #include "messagelistview.h" #include "messagelinewidget.h" #include "ruqola.h" #include "rocketchataccount.h" #include "roomwrapper.h" #include "readonlylineeditwidget.h" #include "messagetextedit.h" +#include "roomutil.h" #include "ruqolawidgets_debug.h" #include "usersinroomflowwidget.h" #include "dialogs/createnewdiscussiondialog.h" #include "dialogs/searchmessagedialog.h" #include "dialogs/configurenotificationdialog.h" #include "dialogs/showattachmentdialog.h" #include "dialogs/showdiscussionsdialog.h" #include "dialogs/showmentionsmessagesdialog.h" #include "dialogs/showpinnedmessagesdialog.h" #include "dialogs/showsnipperedmessagesdialog.h" #include "dialogs/showstarredmessagesdialog.h" #include "dialogs/showthreadsdialog.h" #include "dialogs/autotranslateconfiguredialog.h" #include "dialogs/channelinfodialog.h" #include "dialogs/directchannelinfodialog.h" #include "dialogs/inviteusersdialog.h" #include "dialogs/addusersinroomdialog.h" #include "threadwidget/threadmessagedialog.h" #include #include #include #include #include #include #include #include #include #include RoomWidget::RoomWidget(QWidget *parent) : QWidget(parent) { auto *mainLayout = new QVBoxLayout(this); mainLayout->setObjectName(QStringLiteral("mainLayout")); mainLayout->setContentsMargins(0, 0, 0, 0); mRoomHeaderWidget = new RoomHeaderWidget(this); mRoomHeaderWidget->setObjectName(QStringLiteral("mRoomHeaderWidget")); mainLayout->addWidget(mRoomHeaderWidget); mUsersInRoomFlowWidget = new UsersInRoomFlowWidget(this); mUsersInRoomFlowWidget->setObjectName(QStringLiteral("mUsersInRoomFlowWidget")); mainLayout->addWidget(mUsersInRoomFlowWidget); mUsersInRoomFlowWidget->setVisible(false); mMessageListView = new MessageListView(MessageListView::Mode::Editing, this); mMessageListView->setObjectName(QStringLiteral("mMessageListView")); mainLayout->addWidget(mMessageListView, 1); mStackedWidget = new QStackedWidget(this); mStackedWidget->setObjectName(QStringLiteral("mStackedWidget")); mainLayout->addWidget(mStackedWidget); mMessageLineWidget = new MessageLineWidget(this); mMessageLineWidget->setObjectName(QStringLiteral("mMessageLineWidget")); mStackedWidget->addWidget(mMessageLineWidget); mReadOnlyLineEditWidget = new ReadOnlyLineEditWidget(this); mReadOnlyLineEditWidget->setObjectName(QStringLiteral("mReadOnlyLineEditWidget")); mStackedWidget->addWidget(mReadOnlyLineEditWidget); mStackedWidget->setCurrentWidget(mMessageLineWidget); connect(mMessageLineWidget, &MessageLineWidget::keyPressed, this, &RoomWidget::keyPressedInLineEdit); connect(mRoomHeaderWidget, &RoomHeaderWidget::favoriteChanged, this, &RoomWidget::slotChangeFavorite); connect(mRoomHeaderWidget, &RoomHeaderWidget::encryptedChanged, this, &RoomWidget::slotEncryptedChanged); connect(mRoomHeaderWidget, &RoomHeaderWidget::goBackToRoom, this, &RoomWidget::slotGoBackToRoom); connect(mRoomHeaderWidget, &RoomHeaderWidget::listOfUsersChanged, this, &RoomWidget::slotShowListOfUsersInRoom); connect(mRoomHeaderWidget, &RoomHeaderWidget::searchMessageRequested, this, &RoomWidget::slotSearchMessages); connect(mRoomHeaderWidget, &RoomHeaderWidget::actionRequested, this, &RoomWidget::slotActionRequested); connect(mRoomHeaderWidget, &RoomHeaderWidget::channelInfoRequested, this, &RoomWidget::slotChannelInfoRequested); connect(mMessageListView, &MessageListView::editMessageRequested, mMessageLineWidget, &MessageLineWidget::setEditMessage); connect(mMessageListView, &MessageListView::createNewDiscussion, this, &RoomWidget::slotCreateNewDiscussion); connect(mMessageListView, &MessageListView::createPrivateConversation, this, &RoomWidget::slotCreatePrivateDiscussion); connect(mMessageListView, &MessageListView::loadHistoryRequested, this, &RoomWidget::slotLoadHistory); connect(mMessageListView, &MessageListView::replyInThreadRequested, mMessageLineWidget, &MessageLineWidget::setReplyInThread); setAcceptDrops(true); } RoomWidget::~RoomWidget() { delete mRoomWrapper; } void RoomWidget::slotLoadHistory() { mCurrentRocketChatAccount->loadHistory(mRoomId, mRoomType); } void RoomWidget::slotChannelInfoRequested() { if (mRoomType == QLatin1String("d")) { QPointer dlg = new DirectChannelInfoDialog(this); dlg->setUserName(mRoomWrapper->name()); dlg->exec(); delete dlg; } else { QPointer dlg = new ChannelInfoDialog(this); dlg->setRoomWrapper(mRoomWrapper); dlg->exec(); delete dlg; } } void RoomWidget::slotActionRequested(RoomHeaderWidget::ChannelActionType type) { switch (type) { case RoomHeaderWidget::ShowMentions: slotShowMentions(); break; case RoomHeaderWidget::ShowPinned: slotPinnedMessages(); break; case RoomHeaderWidget::ShowStarred: slotStarredMessages(); break; case RoomHeaderWidget::ShowSnippered: slotSnipperedMessages(); break; case RoomHeaderWidget::ShowDiscussions: slotShowDiscussions(); break; case RoomHeaderWidget::ShowThreads: slotShowThreads(); break; case RoomHeaderWidget::ShowAttachment: slotShowFileAttachments(); break; case RoomHeaderWidget::Notification: slotConfigureNotification(); break; case RoomHeaderWidget::AutoTranslate: slotConfigureAutoTranslate(); break; case RoomHeaderWidget::InviteUsers: slotInviteUsers(); break; case RoomHeaderWidget::AddUsersInRoom: slotAddUsersInRoom(); break; } } void RoomWidget::slotAddUsersInRoom() { QPointer dlg = new AddUsersInRoomDialog(this); if (dlg->exec()) { const QStringList users = dlg->users(); for (const QString &user : users) { Ruqola::self()->rocketChatAccount()->addUserToRoom(user, mRoomId, mRoomType); } } delete dlg; } void RoomWidget::slotInviteUsers() { QPointer dlg = new InviteUsersDialog(this); dlg->setRoomId(mRoomId); dlg->generateLink(); dlg->exec(); delete dlg; } void RoomWidget::updateListView() { mMessageListView->viewport()->update(); } void RoomWidget::slotConfigureAutoTranslate() { QPointer dlg = new AutoTranslateConfigureDialog(this); dlg->setRoomWrapper(mRoomWrapper); dlg->exec(); delete dlg; } void RoomWidget::slotConfigureNotification() { QPointer dlg = new ConfigureNotificationDialog(this); dlg->setRoomWrapper(mRoomWrapper); dlg->exec(); delete dlg; } void RoomWidget::slotStarredMessages() { QPointer dlg = new ShowStarredMessagesDialog(this); dlg->setRoomId(mRoomId); dlg->setModel(mCurrentRocketChatAccount->listMessagesFilterProxyModel()); mCurrentRocketChatAccount->getListMessages(mRoomId, ListMessagesModel::StarredMessages); connect(dlg, &ShowListMessageBaseDialog::goToMessageRequested, mMessageListView, &MessageListView::goToMessage); dlg->exec(); delete dlg; } void RoomWidget::slotPinnedMessages() { QPointer dlg = new ShowPinnedMessagesDialog(this); dlg->setRoomId(mRoomId); dlg->setModel(mCurrentRocketChatAccount->listMessagesFilterProxyModel()); mCurrentRocketChatAccount->getListMessages(mRoomId, ListMessagesModel::PinnedMessages); connect(dlg, &ShowListMessageBaseDialog::goToMessageRequested, mMessageListView, &MessageListView::goToMessage); dlg->exec(); delete dlg; } void RoomWidget::slotShowMentions() { QPointer dlg = new ShowMentionsMessagesDialog(this); dlg->setRoomId(mRoomId); dlg->setModel(mCurrentRocketChatAccount->listMessagesFilterProxyModel()); mCurrentRocketChatAccount->getListMessages(mRoomId, ListMessagesModel::MentionsMessages); connect(dlg, &ShowListMessageBaseDialog::goToMessageRequested, mMessageListView, &MessageListView::goToMessage); dlg->exec(); delete dlg; } void RoomWidget::slotSnipperedMessages() { QPointer dlg = new ShowSnipperedMessagesDialog(this); dlg->setRoomId(mRoomId); dlg->setModel(mCurrentRocketChatAccount->listMessagesFilterProxyModel()); mCurrentRocketChatAccount->getListMessages(mRoomId, ListMessagesModel::SnipperedMessages); connect(dlg, &ShowListMessageBaseDialog::goToMessageRequested, mMessageListView, &MessageListView::goToMessage); dlg->exec(); delete dlg; } void RoomWidget::slotShowThreads() { QPointer dlg = new ShowThreadsDialog(this); dlg->setModel(mCurrentRocketChatAccount->listMessagesFilterProxyModel()); dlg->setRoomId(mRoomId); mCurrentRocketChatAccount->getListMessages(mRoomId, ListMessagesModel::ThreadsMessages); connect(dlg, &ShowListMessageBaseDialog::goToMessageRequested, mMessageListView, &MessageListView::goToMessage); dlg->exec(); delete dlg; } void RoomWidget::slotShowDiscussions() { QPointer dlg = new ShowDiscussionsDialog(this); dlg->setModel(mCurrentRocketChatAccount->discussionsFilterProxyModel()); dlg->setRoomId(mRoomId); mCurrentRocketChatAccount->discussionsInRoom(mRoomId); dlg->exec(); delete dlg; } void RoomWidget::slotShowFileAttachments() { QPointer dlg = new ShowAttachmentDialog(this); mCurrentRocketChatAccount->roomFiles(mRoomId, mRoomType); dlg->setModel(mCurrentRocketChatAccount->filesForRoomFilterProxyModel()); dlg->setRoomId(mRoomId); dlg->setRoomType(mRoomType); dlg->exec(); delete dlg; } void RoomWidget::slotSearchMessages() { QPointer dlg = new SearchMessageDialog(this); dlg->setRoomId(mRoomId); dlg->setModel(Ruqola::self()->rocketChatAccount()->searchMessageFilterProxyModel()); connect(dlg, &SearchMessageDialog::goToMessageRequested, mMessageListView, &MessageListView::goToMessage); dlg->exec(); delete dlg; } void RoomWidget::slotCreateNewDiscussion(const QString &messageId, const QString &originalMessage) { QPointer dlg = new CreateNewDiscussionDialog(this); dlg->setDiscussionName(originalMessage); dlg->setChannelName(mRoomHeaderWidget->roomName()); if (dlg->exec()) { const CreateNewDiscussionDialog::NewDiscussionInfo info = dlg->newDiscussionInfo(); mCurrentRocketChatAccount->createDiscussion(mRoomId, info.discussionName, info.message, messageId, info.users); } delete dlg; } void RoomWidget::slotCreatePrivateDiscussion(const QString &userName) { - Q_EMIT Ruqola::self()->rocketChatAccount()->openLinkRequested(QStringLiteral("ruqola:/user/") + userName); + Q_EMIT Ruqola::self()->rocketChatAccount()->openLinkRequested(RoomUtil::generateUserLink(userName)); } void RoomWidget::dragEnterEvent(QDragEnterEvent *event) { const QMimeData *mimeData = event->mimeData(); if (mimeData->hasUrls()) { event->accept(); } } void RoomWidget::dropEvent(QDropEvent *event) { const QMimeData *mimeData = event->mimeData(); if (mimeData->hasUrls()) { mMessageLineWidget->handleMimeData(mimeData); } } void RoomWidget::setChannelSelected(const QString &roomId, const QString &roomType) { if (mMessageLineWidget->text().isEmpty()) { auto *vbar = mMessageListView->verticalScrollBar(); if (vbar->value() != vbar->maximum()) { AccountRoomSettings::PendingTypedInfo info; info.scrollbarPosition = mMessageListView->verticalScrollBar()->value(); mCurrentRocketChatAccount->accountRoomSettings()->add(mRoomId, info); } else { mCurrentRocketChatAccount->accountRoomSettings()->remove(mRoomId); } } else { AccountRoomSettings::PendingTypedInfo info; info.text = mMessageLineWidget->text(); info.messageIdBeingEdited = mMessageLineWidget->messageIdBeingEdited(); info.scrollbarPosition = mMessageListView->verticalScrollBar()->value(); mCurrentRocketChatAccount->accountRoomSettings()->add(mRoomId, info); } setRoomId(roomId); setRoomType(roomType); const AccountRoomSettings::PendingTypedInfo currentPendingInfo = mCurrentRocketChatAccount->accountRoomSettings()->value(roomId); if (currentPendingInfo.isValid()) { mMessageLineWidget->setText(currentPendingInfo.text); mMessageLineWidget->setMessageIdBeingEdited(currentPendingInfo.messageIdBeingEdited); if (currentPendingInfo.scrollbarPosition != -1) { mMessageListView->verticalScrollBar()->setValue(currentPendingInfo.scrollbarPosition); } } else { mMessageLineWidget->setText(QString()); } mMessageLineWidget->setMode(mMessageLineWidget->messageIdBeingEdited().isEmpty() ? MessageLineWidget::EditingMode::NewMessage : MessageLineWidget::EditingMode::EditMessage); mMessageLineWidget->setFocus(); } void RoomWidget::updateRoomHeader() { if (mRoomWrapper) { mRoomHeaderWidget->setRoomName(mRoomWrapper->displayRoomName()); mRoomHeaderWidget->setRoomAnnouncement(mRoomWrapper->announcement()); mRoomHeaderWidget->setRoomTopic(mRoomWrapper->topic()); mRoomHeaderWidget->setFavoriteStatus(mRoomWrapper->favorite()); mRoomHeaderWidget->setEncypted(mRoomWrapper->encrypted()); mRoomHeaderWidget->setIsDiscussion(mRoomWrapper->isDiscussionRoom()); //TODO Description ? if (mRoomWrapper->roomMessageInfo().isEmpty()) { mStackedWidget->setCurrentWidget(mMessageLineWidget); } else { mStackedWidget->setCurrentWidget(mReadOnlyLineEditWidget); mReadOnlyLineEditWidget->setMessage(mRoomWrapper->roomMessageInfo()); } } } QString RoomWidget::roomId() const { return mRoomId; } void RoomWidget::setRoomType(const QString &roomType) { mRoomType = roomType; } RoomWrapper *RoomWidget::roomWrapper() const { return mRoomWrapper; } void RoomWidget::slotShowListOfUsersInRoom(bool checked) { mUsersInRoomFlowWidget->setVisible(checked); } void RoomWidget::setRoomId(const QString &roomId) { mRoomId = roomId; delete mRoomWrapper; mRoomWrapper = mCurrentRocketChatAccount->roomWrapper(mRoomId); connectRoomWrapper(); mMessageLineWidget->setRoomId(roomId); mMessageListView->setChannelSelected(roomId); mUsersInRoomFlowWidget->setRoomWrapper(mRoomWrapper); mRoomHeaderWidget->setRoomWrapper(mRoomWrapper); } void RoomWidget::connectRoomWrapper() { if (mRoomWrapper) { connect(mRoomWrapper, &RoomWrapper::announcementChanged, this, [this]() { mRoomHeaderWidget->setRoomAnnouncement(mRoomWrapper->announcement()); }); connect(mRoomWrapper, &RoomWrapper::topicChanged, this, [this]() { mRoomHeaderWidget->setRoomTopic(mRoomWrapper->topic()); }); connect(mRoomWrapper, &RoomWrapper::nameChanged, this, [this]() { mRoomHeaderWidget->setRoomName(mRoomWrapper->displayRoomName()); }); connect(mRoomWrapper, &RoomWrapper::favoriteChanged, this, [this]() { mRoomHeaderWidget->setFavoriteStatus(mRoomWrapper->favorite()); }); connect(mRoomWrapper, &RoomWrapper::encryptedChanged, this, [this]() { mRoomHeaderWidget->setEncypted(mRoomWrapper->encrypted()); }); connect(mRoomWrapper, &RoomWrapper::autoTranslateLanguageChanged, this, &RoomWidget::updateListView); connect(mRoomWrapper, &RoomWrapper::autoTranslateChanged, this, &RoomWidget::updateListView); connect(mRoomWrapper, &RoomWrapper::ignoredUsersChanged, this, &RoomWidget::updateListView); } updateRoomHeader(); } void RoomWidget::slotClearNotification() { mCurrentRocketChatAccount->clearUnreadMessages(mRoomId); } void RoomWidget::slotEncryptedChanged(bool b) { qCWarning(RUQOLAWIDGETS_LOG) << "change encrypted not supported yet"; //TODO mCurrentRocketChatAccount->slot } void RoomWidget::slotChangeFavorite(bool b) { mCurrentRocketChatAccount->changeFavorite(mRoomId, b); } void RoomWidget::keyPressedInLineEdit(QKeyEvent *ev) { const int key = ev->key(); if (key == Qt::Key_Escape) { slotClearNotification(); ev->accept(); } else { mMessageListView->handleKeyPressEvent(ev); } } QString RoomWidget::roomType() const { return mRoomType; } void RoomWidget::setCurrentRocketChatAccount(RocketChatAccount *account) { if (mCurrentRocketChatAccount) { disconnect(mCurrentRocketChatAccount, &RocketChatAccount::openThreadRequested, this, &RoomWidget::slotOpenThreadRequested); } mCurrentRocketChatAccount = account; connect(mCurrentRocketChatAccount, &RocketChatAccount::openThreadRequested, this, &RoomWidget::slotOpenThreadRequested); mMessageLineWidget->setCurrentRocketChatAccount(account); mRoomHeaderWidget->setCurrentRocketChatAccount(account); mRoomId.clear(); //Clear it otherwise if we switch between two account with same roomId (as "GENERAL") we will see incorrect room. } void RoomWidget::slotGoBackToRoom() { Q_EMIT selectChannelRequested(mRoomWrapper->parentRid()); } void RoomWidget::slotOpenThreadRequested(const QString &threadMessageId, const QString &threadMessagePreview) { QPointer dlg = new ThreadMessageDialog(this); dlg->setThreadMessageId(threadMessageId); dlg->setCurrentRocketChatAccount(mCurrentRocketChatAccount); dlg->setThreadPreview(threadMessagePreview); dlg->setRoomId(mRoomId); dlg->exec(); delete dlg; } diff --git a/src/widgets/room/usersinroomlabel.cpp b/src/widgets/room/usersinroomlabel.cpp index a2d2d7b7..049d9330 100644 --- a/src/widgets/room/usersinroomlabel.cpp +++ b/src/widgets/room/usersinroomlabel.cpp @@ -1,206 +1,207 @@ /* Copyright (c) 2020 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "usersinroomlabel.h" #include "roomwrapper.h" #include "ruqola.h" #include "rocketchataccount.h" +#include "roomutil.h" #include "dialogs/directchannelinfodialog.h" #include #include #include #include #include #include #include UsersInRoomLabel::UsersInRoomLabel(QWidget *parent) : QWidget(parent) { QHBoxLayout *mainLayout = new QHBoxLayout(this); mainLayout->setObjectName(QStringLiteral("mainLayout")); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); mIconLabel = new QLabel(this); mIconLabel->setObjectName(QStringLiteral("mIconLabel")); mainLayout->addWidget(mIconLabel); mUserNameLabel = new UserLabel(this); mUserNameLabel->setObjectName(QStringLiteral("mUserNameLabel")); mainLayout->addWidget(mUserNameLabel); } UsersInRoomLabel::~UsersInRoomLabel() { } void UsersInRoomLabel::setUserInfo(const UsersInRoomLabel::UserInfo &info) { mUserNameLabel->setText(info.userDisplayName); mIconLabel->setPixmap(QIcon::fromTheme(info.iconStatus).pixmap(18, 18)); mUserNameLabel->setUserId(info.userId); mUserNameLabel->setUserName(info.userName); } void UsersInRoomLabel::setRoomWrapper(RoomWrapper *roomWrapper) { mUserNameLabel->setRoomWrapper(roomWrapper); } UserLabel::UserLabel(QWidget *parent) : QLabel(parent) { setTextFormat(Qt::RichText); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &UserLabel::customContextMenuRequested, this, &UserLabel::slotCustomContextMenuRequested); } UserLabel::~UserLabel() { } void UserLabel::setRoomWrapper(RoomWrapper *roomWrapper) { mRoomWrapper = roomWrapper; } void UserLabel::setUserName(const QString &userName) { mUserName = userName; } void UserLabel::setUserId(const QString &userId) { mUserId = userId; } void UserLabel::slotOpenConversation() { - Q_EMIT Ruqola::self()->rocketChatAccount()->openLinkRequested(QStringLiteral("ruqola:/user/") + mUserName); + Q_EMIT Ruqola::self()->rocketChatAccount()->openLinkRequested(RoomUtil::generateUserLink(mUserName)); } void UserLabel::slotBlockUser() { const bool userIsBlocked = mRoomWrapper->blocker(); if (!userIsBlocked) { if (KMessageBox::No == KMessageBox::questionYesNo(this, i18n("Do you want to block this user?"), i18n("Block User"))) { return; } } Ruqola::self()->rocketChatAccount()->blockUser(mRoomWrapper->roomId(), !userIsBlocked); } void UserLabel::slotIgnoreUser() { const bool userIsIgnored = mRoomWrapper->userIsIgnored(mUserId); if (!userIsIgnored) { if (KMessageBox::No == KMessageBox::questionYesNo(this, i18n("Do you want to ignore this user?"), i18n("Ignore User"))) { return; } } Ruqola::self()->rocketChatAccount()->ignoreUser(mRoomWrapper->roomId(), mUserId, !userIsIgnored); } void UserLabel::slotRemoveFromRoom() { Ruqola::self()->rocketChatAccount()->kickUser(mRoomWrapper->roomId(), mUserId, mRoomWrapper->channelType()); } void UserLabel::slotCustomContextMenuRequested(const QPoint &pos) { const bool canManageUsersInRoom = mRoomWrapper->canChangeRoles(); const QString ownUserId = Ruqola::self()->rocketChatAccount()->userID(); const bool isAdirectChannel = mRoomWrapper->channelType() == QStringLiteral("d"); const bool isNotMe = mUserId != ownUserId; QMenu menu(this); if (isNotMe && !isAdirectChannel) { QAction *conversationAction = new QAction(i18n("Start Conversation"), &menu); connect(conversationAction, &QAction::triggered, this, &UserLabel::slotOpenConversation); menu.addAction(conversationAction); } if (isNotMe) { if (!menu.isEmpty()) { menu.addSeparator(); } QAction *userInfoAction = new QAction(i18n("User Info"), &menu); userInfoAction->setIcon(QIcon::fromTheme(QStringLiteral("documentinfo"))); connect(userInfoAction, &QAction::triggered, this, &UserLabel::slotUserInfo); menu.addAction(userInfoAction); } if (canManageUsersInRoom && !isAdirectChannel) { if (!menu.isEmpty()) { menu.addSeparator(); } const bool hasOwnerRole = mRoomWrapper->userHasOwnerRole(mUserId); QAction *removeAsUser = new QAction(hasOwnerRole ? i18n("Remove as Owner") : i18n("Add as Owner"), &menu); connect(removeAsUser, &QAction::triggered, this, [this, hasOwnerRole]() { Ruqola::self()->rocketChatAccount()->changeRoles(mRoomWrapper->roomId(), mUserId, mRoomWrapper->channelType(), hasOwnerRole ? RocketChatAccount::RemoveOwner : RocketChatAccount::AddOwner); }); menu.addAction(removeAsUser); const bool hasLeaderRole = mRoomWrapper->userHasLeaderRole(mUserId); QAction *removeAsLeader = new QAction(hasLeaderRole ? i18n("Remove as Leader") : i18n("Add as Leader"), &menu); connect(removeAsLeader, &QAction::triggered, this, [this, hasLeaderRole]() { Ruqola::self()->rocketChatAccount()->changeRoles(mRoomWrapper->roomId(), mUserId, mRoomWrapper->channelType(), hasLeaderRole ? RocketChatAccount::RemoveLeader : RocketChatAccount::AddLeader); }); menu.addAction(removeAsLeader); const bool hasModeratorRole = mRoomWrapper->userHasModeratorRole(mUserId); QAction *removeAsModerator = new QAction(hasModeratorRole ? i18n("Remove as Moderator") : i18n("Add as Moderator"), &menu); connect(removeAsModerator, &QAction::triggered, this, [this, hasModeratorRole]() { Ruqola::self()->rocketChatAccount()->changeRoles(mRoomWrapper->roomId(), mUserId, mRoomWrapper->channelType(), hasModeratorRole ? RocketChatAccount::RemoveModerator : RocketChatAccount::AddModerator); }); menu.addAction(removeAsModerator); QAction *removeFromRoom = new QAction(i18n("Remove from Room"), &menu); connect(removeFromRoom, &QAction::triggered, this, &UserLabel::slotRemoveFromRoom); menu.addAction(removeFromRoom); } if (isNotMe) { if (!menu.isEmpty()) { menu.addSeparator(); } const bool userIsIgnored = mRoomWrapper->userIsIgnored(mUserId); QAction *ignoreAction = new QAction(userIsIgnored ? i18n("Unignore") : i18n("Ignore"), &menu); connect(ignoreAction, &QAction::triggered, this, &UserLabel::slotIgnoreUser); menu.addAction(ignoreAction); if (isAdirectChannel) { if (!menu.isEmpty()) { menu.addSeparator(); } const bool userIsBlocked = mRoomWrapper->blocker(); QAction *blockAction = new QAction(userIsBlocked ? i18n("Unblock User") : i18n("Block User"), &menu); connect(blockAction, &QAction::triggered, this, &UserLabel::slotBlockUser); menu.addAction(blockAction); } } menu.exec(mapToGlobal(pos)); } void UserLabel::slotUserInfo() { QPointer dlg = new DirectChannelInfoDialog(this); dlg->setUserName(mUserName); dlg->exec(); delete dlg; }