Skip to content
Snippets Groups Projects
InputBar.h 3.39 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    #pragma once
    
    #include <QObject>
    
    #include <QTimer>
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    #include <deque>
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    #include <mtx/common.hpp>
    #include <mtx/responses/messages.hpp>
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    class TimelineModel;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    class QMimeData;
    
    class QDropEvent;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    class QStringList;
    
    enum class MarkdownOverride
    {
    
            NOT_SPECIFIED, // no override set
    
    Loren Burkholder's avatar
    Loren Burkholder committed
            ON,
            OFF,
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    class InputBar : public QObject
    {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            Q_OBJECT
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            Q_PROPERTY(bool uploading READ uploading NOTIFY uploadingChanged)
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    public:
            InputBar(TimelineModel *parent)
              : QObject()
              , room(parent)
    
            {
                    typingRefresh_.setInterval(10'000);
                    typingRefresh_.setSingleShot(true);
                    typingTimeout_.setInterval(5'000);
                    typingTimeout_.setSingleShot(true);
                    connect(&typingRefresh_, &QTimer::timeout, this, &InputBar::startTyping);
                    connect(&typingTimeout_, &QTimer::timeout, this, &InputBar::stopTyping);
            }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    public slots:
    
            QString text() const;
            QString previousText();
            QString nextText();
    
            void setText(QString newText) { emit textChanged(newText); }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void send();
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void paste(bool fromMouse);
    
            void insertMimeData(const QMimeData *data);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void openFileSelection();
            bool uploading() const { return uploading_; }
    
            void message(QString body, MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            QObject *completerFor(QString completerName);
    
    
    private slots:
            void startTyping();
            void stopTyping();
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    signals:
            void insertText(QString text);
    
            void textChanged(QString newText);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void uploadingChanged(bool value);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    private:
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void emote(QString body);
            void command(QString name, QString args);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            void image(const QString &filename,
                       const std::optional<mtx::crypto::EncryptedFile> &file,
                       const QString &url,
                       const QString &mime,
                       uint64_t dsize,
                       const QSize &dimensions,
                       const QString &blurhash);
            void file(const QString &filename,
                      const std::optional<mtx::crypto::EncryptedFile> &encryptedFile,
                      const QString &url,
                      const QString &mime,
                      uint64_t dsize);
            void audio(const QString &filename,
                       const std::optional<mtx::crypto::EncryptedFile> &file,
                       const QString &url,
                       const QString &mime,
                       uint64_t dsize);
            void video(const QString &filename,
                       const std::optional<mtx::crypto::EncryptedFile> &file,
                       const QString &url,
                       const QString &mime,
                       uint64_t dsize);
    
            void showPreview(const QMimeData &source, QString path, const QStringList &formats);
            void setUploading(bool value)
            {
                    if (value != uploading_) {
                            uploading_ = value;
                            emit uploadingChanged(value);
                    }
            }
    
            QTimer typingRefresh_;
            QTimer typingTimeout_;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            TimelineModel *room;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            std::deque<QString> history_;
            std::size_t history_index_ = 0;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            int selectionStart = 0, selectionEnd = 0, cursorPosition = 0;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            bool uploading_ = false;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    };