File indexing completed on 2024-05-12 16:27:12
0001 /* 0002 SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "channelnamevalidlineedit.h" 0008 #include "rocketchataccount.h" 0009 0010 #include <KColorScheme> 0011 #include <KStatefulBrush> 0012 #include <chrono> 0013 using namespace std::chrono_literals; 0014 0015 ChannelNameValidLineEdit::ChannelNameValidLineEdit(RocketChatAccount *account, QWidget *parent) 0016 : SearchWithDelayLineEdit(parent) 0017 , mRocketChatAccount(account) 0018 { 0019 setDelayMs(500ms); 0020 setPlaceholderText(QString()); 0021 connect(this, &ChannelNameValidLineEdit::searchRequested, this, &ChannelNameValidLineEdit::slotSearchChannelRequested); 0022 connect(this, &ChannelNameValidLineEdit::searchCleared, this, &ChannelNameValidLineEdit::clearLineEdit); 0023 if (mRocketChatAccount) { 0024 connect(mRocketChatAccount->ddp(), &DDPClient::result, this, &ChannelNameValidLineEdit::slotSearchDone); 0025 auto mChannelNameValidLineEditValidator = 0026 new ChannelNameValidLineEditValidator(QRegularExpression(account->ruqolaServerConfig()->channelNameValidation()), this); 0027 connect(mChannelNameValidLineEditValidator, &ChannelNameValidLineEditValidator::textIsValid, this, &ChannelNameValidLineEdit::slotTextIsValid); 0028 setValidator(mChannelNameValidLineEditValidator); 0029 } 0030 } 0031 0032 ChannelNameValidLineEdit::~ChannelNameValidLineEdit() = default; 0033 0034 void ChannelNameValidLineEdit::slotTextIsValid(bool state) 0035 { 0036 if (text().isEmpty()) { 0037 Q_EMIT channelIsValid(ChannelNameValidLineEdit::ChannelNameStatus::Unknown); 0038 } else { 0039 Q_EMIT channelIsValid(state ? ChannelNameValidLineEdit::ChannelNameStatus::Valid : ChannelNameValidLineEdit::ChannelNameStatus::InvalidCharacters); 0040 } 0041 } 0042 0043 void ChannelNameValidLineEdit::clearLineEdit() 0044 { 0045 updateStyleSheet(true); 0046 Q_EMIT channelIsValid(ChannelNameValidLineEdit::ChannelNameStatus::Unknown); 0047 } 0048 0049 void ChannelNameValidLineEdit::slotSearchChannelRequested(const QString &text) 0050 { 0051 if (!text.trimmed().isEmpty()) { 0052 mDdpIdentifier = mRocketChatAccount->ddp()->roomNameExists(text); 0053 } else { 0054 clearLineEdit(); 0055 } 0056 } 0057 0058 void ChannelNameValidLineEdit::slotSearchDone(quint64 id, const QJsonDocument &result) 0059 { 0060 if (id == mDdpIdentifier) { 0061 const QJsonObject objresult = result.object(); 0062 const auto resultValue = objresult.value(QLatin1String("result")); 0063 if (!resultValue.isUndefined()) { 0064 emitIsValid(!resultValue.toBool()); 0065 } 0066 } 0067 } 0068 0069 void ChannelNameValidLineEdit::updateStyleSheet(bool state) 0070 { 0071 #ifndef QT_NO_STYLE_STYLESHEET 0072 QString styleSheet; 0073 if (mNegativeBackground.isEmpty()) { 0074 const KStatefulBrush bgBrush(KColorScheme::View, KColorScheme::NegativeBackground); 0075 mNegativeBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(palette()).color().name()); 0076 } 0077 if (!state) { 0078 styleSheet = mNegativeBackground; 0079 } 0080 setStyleSheet(styleSheet); 0081 #endif 0082 } 0083 0084 void ChannelNameValidLineEdit::emitIsValid(bool state) 0085 { 0086 updateStyleSheet(state); 0087 Q_EMIT channelIsValid(state ? ChannelNameValidLineEdit::ChannelNameStatus::Valid : ChannelNameValidLineEdit::ChannelNameStatus::AlreadyExistingName); 0088 } 0089 0090 ChannelNameValidLineEditValidator::ChannelNameValidLineEditValidator(const QRegularExpression &re, QObject *parent) 0091 : QRegularExpressionValidator(re, parent) 0092 { 0093 } 0094 0095 QValidator::State ChannelNameValidLineEditValidator::validate(QString &input, int &pos) const 0096 { 0097 const QValidator::State state = QRegularExpressionValidator::validate(input, pos); 0098 Q_EMIT textIsValid(state == QValidator::State::Acceptable); 0099 return state; 0100 } 0101 0102 ChannelNameValidLineEditValidator::~ChannelNameValidLineEditValidator() = default; 0103 0104 #include "moc_channelnamevalidlineedit.cpp"