File indexing completed on 2024-12-01 07:42:30
0001 /* 0002 SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "ruqolacentralwidget.h" 0008 #include "rocketchataccount.h" 0009 #include "ruqolaglobalconfig.h" 0010 #include "ruqolaloginwidget.h" 0011 #include "ruqolamainwidget.h" 0012 #include "servererrorinfo.h" 0013 #include "servererrorinfohistory/servererrorinfomessagewidget.h" 0014 #include "servererrorinfohistorymanager.h" 0015 #include "whatsnew/whatsnewmessagewidget.h" 0016 #include "whatsnew/whatsnewwidget.h" 0017 #include <KLocalizedString> 0018 #include <QHBoxLayout> 0019 #include <QStackedWidget> 0020 0021 RuqolaCentralWidget::RuqolaCentralWidget(QWidget *parent) 0022 : QWidget(parent) 0023 , mStackedWidget(new QStackedWidget(this)) 0024 , mRuqolaMainWidget(new RuqolaMainWidget(this)) 0025 , mRuqolaLoginWidget(new RuqolaLoginWidget(this)) 0026 , mMainLayout(new QVBoxLayout(this)) 0027 { 0028 mMainLayout->setContentsMargins({}); 0029 mMainLayout->setObjectName(QStringLiteral("mainlayout")); 0030 mMainLayout->setSpacing(0); 0031 0032 const QString newFeaturesMD5 = WhatsNewWidget::newFeaturesMD5(); 0033 const bool hasNewFeature = (RuqolaGlobalConfig::self()->previousNewFeaturesMD5() != newFeaturesMD5); 0034 if (hasNewFeature) { 0035 auto whatsNewMessageWidget = new WhatsNewMessageWidget(this); 0036 whatsNewMessageWidget->setObjectName(QStringLiteral("whatsNewMessageWidget")); 0037 mMainLayout->addWidget(whatsNewMessageWidget); 0038 RuqolaGlobalConfig::self()->setPreviousNewFeaturesMD5(newFeaturesMD5); 0039 whatsNewMessageWidget->animatedShow(); 0040 } 0041 0042 mStackedWidget->setObjectName(QStringLiteral("mStackedWidget")); 0043 mMainLayout->addWidget(mStackedWidget); 0044 0045 mRuqolaMainWidget->setObjectName(QStringLiteral("mRuqolaMainWidget")); 0046 mStackedWidget->addWidget(mRuqolaMainWidget); 0047 0048 mRuqolaLoginWidget->setObjectName(QStringLiteral("mRuqolaLoginWidget")); 0049 mStackedWidget->addWidget(mRuqolaLoginWidget); 0050 0051 mStackedWidget->setCurrentWidget(mRuqolaLoginWidget); 0052 connect(mRuqolaMainWidget, &RuqolaMainWidget::channelSelected, this, &RuqolaCentralWidget::channelSelected); 0053 connect(ServerErrorInfoHistoryManager::self(), &ServerErrorInfoHistoryManager::newServerErrorInfo, this, &RuqolaCentralWidget::slotNewErrorInfo); 0054 } 0055 0056 RuqolaCentralWidget::~RuqolaCentralWidget() = default; 0057 0058 void RuqolaCentralWidget::createServerErrorInfoMessageWidget() 0059 { 0060 mServerErrorInfoMessageWidget = new ServerErrorInfoMessageWidget(this); 0061 mServerErrorInfoMessageWidget->setObjectName(QStringLiteral("mServerErrorInfoMessageWidget")); 0062 mMainLayout->insertWidget(0, mServerErrorInfoMessageWidget); 0063 } 0064 0065 void RuqolaCentralWidget::slotNewErrorInfo() 0066 { 0067 if (!mServerErrorInfoMessageWidget) { 0068 createServerErrorInfoMessageWidget(); 0069 } 0070 mServerErrorInfoMessageWidget->animatedShow(); 0071 } 0072 0073 void RuqolaCentralWidget::slotJobFailedInfo(const QString &messageError, const QString &accountName) 0074 { 0075 ServerErrorInfo info; 0076 info.setAccountName(accountName); 0077 info.setMessage(messageError); 0078 ServerErrorInfoHistoryManager::self()->addServerErrorInfo(std::move(info)); 0079 } 0080 0081 void RuqolaCentralWidget::slotSocketError(QAbstractSocket::SocketError error, const QString &errorString) 0082 { 0083 Q_UNUSED(error) 0084 // ## let's hope this happens while the login widget is visible, but that's quite likely 0085 // Testcase: try to connect to a server that doesn't exist 0086 mRuqolaLoginWidget->showError(errorString); 0087 } 0088 0089 Room *RuqolaCentralWidget::room() const 0090 { 0091 return mRuqolaMainWidget->room(); 0092 } 0093 0094 QString RuqolaCentralWidget::roomId() const 0095 { 0096 return mRuqolaMainWidget->roomId(); 0097 } 0098 0099 Room::RoomType RuqolaCentralWidget::roomType() const 0100 { 0101 return mRuqolaMainWidget->roomType(); 0102 } 0103 0104 void RuqolaCentralWidget::selectNextUnreadChannel() 0105 { 0106 mRuqolaMainWidget->selectNextUnreadChannel(); 0107 } 0108 0109 void RuqolaCentralWidget::setCurrentRocketChatAccount(RocketChatAccount *account) 0110 { 0111 if (mCurrentRocketChatAccount) { 0112 disconnect(mCurrentRocketChatAccount, nullptr, this, nullptr); 0113 } 0114 mCurrentRocketChatAccount = account; 0115 connect(mCurrentRocketChatAccount, &RocketChatAccount::loginStatusChanged, this, &RuqolaCentralWidget::slotLoginStatusChanged); 0116 connect(mCurrentRocketChatAccount, &RocketChatAccount::socketError, this, &RuqolaCentralWidget::slotSocketError); 0117 connect(mCurrentRocketChatAccount, &RocketChatAccount::jobFailed, this, &RuqolaCentralWidget::slotJobFailedInfo); 0118 mRuqolaMainWidget->setCurrentRocketChatAccount(mCurrentRocketChatAccount); 0119 // Check if account is connected or not. 0120 slotLoginStatusChanged(); 0121 } 0122 0123 void RuqolaCentralWidget::slotLoginStatusChanged() 0124 { 0125 const auto loginStatus = mCurrentRocketChatAccount->loginStatus(); 0126 mRuqolaLoginWidget->setLoginStatus(loginStatus); 0127 bool loginPage = false; 0128 if (loginStatus == DDPAuthenticationManager::LoggedIn) { 0129 mStackedWidget->setCurrentWidget(mRuqolaMainWidget); 0130 } else { 0131 mStackedWidget->setCurrentWidget(mRuqolaLoginWidget); 0132 mRuqolaLoginWidget->setRocketChatAccount(mCurrentRocketChatAccount); 0133 loginPage = true; 0134 } 0135 Q_EMIT loginPageActivated(loginPage); 0136 } 0137 0138 #include "moc_ruqolacentralwidget.cpp"