// SPDX-FileCopyrightText: 2021 Nheko Contributors // // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include class TimelineModel; class ImagePackModel; class QMimeData; class QDropEvent; class QStringList; enum class MarkdownOverride { NOT_SPECIFIED, // no override set ON, OFF, }; class InputBar : public QObject { Q_OBJECT Q_PROPERTY(bool uploading READ uploading NOTIFY uploadingChanged) 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); } public slots: QString text() const; QString previousText(); QString nextText(); void setText(QString newText); void send(); void paste(bool fromMouse); void insertMimeData(const QMimeData *data); void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text); void openFileSelection(); bool uploading() const { return uploading_; } void message(QString body, MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED, bool rainbowify = false); void reaction(const QString &reactedEvent, const QString &reactionKey); void sticker(ImagePackModel *model, int row); private slots: void startTyping(); void stopTyping(); signals: void insertText(QString text); void textChanged(QString newText); void uploadingChanged(bool value); private: void emote(QString body, bool rainbowify); void notice(QString body, bool rainbowify); void command(QString name, QString args); void image(const QString &filename, const std::optional &file, const QString &url, const QString &mime, uint64_t dsize, const QSize &dimensions, const QString &blurhash); void file(const QString &filename, const std::optional &encryptedFile, const QString &url, const QString &mime, uint64_t dsize); void audio(const QString &filename, const std::optional &file, const QString &url, const QString &mime, uint64_t dsize); void video(const QString &filename, const std::optional &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_; TimelineModel *room; std::deque history_; std::size_t history_index_ = 0; int selectionStart = 0, selectionEnd = 0, cursorPosition = 0; bool uploading_ = false; };