File indexing completed on 2023-11-26 08:17:49

0001 /*
0002    SPDX-FileCopyrightText: 2018-2023 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QJsonObject>
0010 #include <QObject>
0011 
0012 #include "model/inputcompletermodel.h"
0013 
0014 #include "libruqolacore_export.h"
0015 
0016 class QAbstractItemModel;
0017 class RocketChatAccount;
0018 class CommandsModelFilterProxyModel;
0019 class EmoticonModelFilterProxyModel;
0020 class LIBRUQOLACORE_EXPORT InputTextManager : public QObject
0021 {
0022     Q_OBJECT
0023 public:
0024     enum CompletionForType {
0025         Channel = 0,
0026         User,
0027         Emoji,
0028         Command,
0029         None,
0030     };
0031     explicit InputTextManager(RocketChatAccount *account, QObject *parent = nullptr);
0032     ~InputTextManager() override;
0033 
0034     void setEmoticonModel(QAbstractItemModel *model);
0035 
0036     [[nodiscard]] InputCompleterModel *inputCompleterModel() const;
0037     [[nodiscard]] QAbstractItemModel *emojiCompleterModel() const;
0038 
0039     void inputTextCompleter(const QJsonObject &obj);
0040 
0041     [[nodiscard]] QString applyCompletion(const QString &newWord, const QString &str, int *pPosition);
0042 
0043     void setInputTextChanged(const QString &str, int position);
0044 
0045     void clearCompleter();
0046 
0047     // Only for autotests
0048     [[nodiscard]] QString searchWord(const QString &text, int position, int &start);
0049 
0050     void setCommandModel(QAbstractItemModel *model);
0051     [[nodiscard]] QAbstractItemModel *commandModel() const;
0052 
0053 Q_SIGNALS:
0054     // Trigger autocompletion request in DDPClient (via RocketChatAccount)
0055     // Emitted with Channel and User, never Emoji or None
0056     void completionRequested(const QString &pattern, const QString &exceptions, InputTextManager::CompletionForType type);
0057     void completionTypeChanged(InputTextManager::CompletionForType type);
0058 
0059 private:
0060     Q_DISABLE_COPY(InputTextManager)
0061 
0062     void slotCompletionChannels(const QString &pattern);
0063     void setCompletionType(CompletionForType type);
0064     void slotCompletionChannelDone(const QJsonObject &root);
0065 
0066     InputCompleterModel *const mInputCompleterModel;
0067     EmoticonModelFilterProxyModel *const mEmoticonFilterProxyModel;
0068     CommandsModelFilterProxyModel *const mCommandFilterProxyModel;
0069     RocketChatAccount *const mAccount;
0070     CompletionForType mCurrentCompletionType = None;
0071     QString mCurrentCompletionPattern;
0072 };
0073 
0074 Q_DECLARE_METATYPE(InputTextManager::CompletionForType)