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"