2021-03-05 02:35:15 +03:00
|
|
|
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
2020-11-01 01:24:07 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <QObject>
|
2021-12-28 22:09:08 +03:00
|
|
|
#include <QStringList>
|
2020-11-17 04:37:43 +03:00
|
|
|
#include <QTimer>
|
2020-11-09 05:12:37 +03:00
|
|
|
#include <deque>
|
2020-11-01 01:24:07 +03:00
|
|
|
|
2020-11-15 06:52:49 +03:00
|
|
|
#include <mtx/common.hpp>
|
|
|
|
#include <mtx/responses/messages.hpp>
|
|
|
|
|
2020-11-01 01:24:07 +03:00
|
|
|
class TimelineModel;
|
2021-07-21 02:03:38 +03:00
|
|
|
class CombinedImagePackModel;
|
2020-11-15 06:52:49 +03:00
|
|
|
class QMimeData;
|
2020-11-25 19:02:23 +03:00
|
|
|
class QDropEvent;
|
2020-11-01 01:24:07 +03:00
|
|
|
|
2021-01-21 01:44:11 +03:00
|
|
|
enum class MarkdownOverride
|
|
|
|
{
|
2021-09-18 01:22:33 +03:00
|
|
|
NOT_SPECIFIED, // no override set
|
|
|
|
ON,
|
|
|
|
OFF,
|
2021-01-21 01:44:11 +03:00
|
|
|
};
|
|
|
|
|
2020-11-09 05:12:37 +03:00
|
|
|
class InputBar : public QObject
|
|
|
|
{
|
2021-09-18 01:22:33 +03:00
|
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY(bool uploading READ uploading NOTIFY uploadingChanged)
|
|
|
|
Q_PROPERTY(bool containsAtRoom READ containsAtRoom NOTIFY containsAtRoomChanged)
|
|
|
|
Q_PROPERTY(QString text READ text NOTIFY textChanged)
|
2020-11-01 01:24:07 +03:00
|
|
|
|
|
|
|
public:
|
2021-12-03 03:29:15 +03:00
|
|
|
explicit InputBar(TimelineModel *parent)
|
2021-09-18 01:22:33 +03:00
|
|
|
: 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);
|
|
|
|
}
|
2020-11-01 01:24:07 +03:00
|
|
|
|
|
|
|
public slots:
|
2021-12-03 03:34:34 +03:00
|
|
|
[[nodiscard]] QString text() const;
|
2021-09-18 01:22:33 +03:00
|
|
|
QString previousText();
|
|
|
|
QString nextText();
|
2021-12-03 03:54:43 +03:00
|
|
|
void setText(const QString &newText);
|
2021-09-18 01:22:33 +03:00
|
|
|
|
2021-12-03 03:34:34 +03:00
|
|
|
[[nodiscard]] bool containsAtRoom() const { return containsAtRoom_; }
|
2021-09-18 01:22:33 +03:00
|
|
|
|
|
|
|
void send();
|
|
|
|
void paste(bool fromMouse);
|
|
|
|
void insertMimeData(const QMimeData *data);
|
2021-12-03 03:54:43 +03:00
|
|
|
void updateState(int selectionStart, int selectionEnd, int cursorPosition, const QString &text);
|
2021-09-18 01:22:33 +03:00
|
|
|
void openFileSelection();
|
2021-12-03 03:34:34 +03:00
|
|
|
[[nodiscard]] bool uploading() const { return uploading_; }
|
2021-12-03 03:54:43 +03:00
|
|
|
void message(const QString &body,
|
2021-09-18 01:22:33 +03:00
|
|
|
MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED,
|
|
|
|
bool rainbowify = false);
|
|
|
|
void reaction(const QString &reactedEvent, const QString &reactionKey);
|
|
|
|
void sticker(CombinedImagePackModel *model, int row);
|
2020-11-01 01:24:07 +03:00
|
|
|
|
2020-11-17 04:37:43 +03:00
|
|
|
private slots:
|
2021-09-18 01:22:33 +03:00
|
|
|
void startTyping();
|
|
|
|
void stopTyping();
|
2020-11-17 04:37:43 +03:00
|
|
|
|
2020-11-09 05:12:37 +03:00
|
|
|
signals:
|
2021-09-18 01:22:33 +03:00
|
|
|
void insertText(QString text);
|
|
|
|
void textChanged(QString newText);
|
|
|
|
void uploadingChanged(bool value);
|
|
|
|
void containsAtRoomChanged();
|
2020-11-09 05:12:37 +03:00
|
|
|
|
2020-11-01 01:24:07 +03:00
|
|
|
private:
|
2021-12-03 03:54:43 +03:00
|
|
|
void emote(const QString &body, bool rainbowify);
|
|
|
|
void notice(const QString &body, bool rainbowify);
|
|
|
|
void command(const QString &name, QString args);
|
2021-09-18 01:22:33 +03:00
|
|
|
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);
|
|
|
|
|
2021-12-03 03:54:43 +03:00
|
|
|
void showPreview(const QMimeData &source, const QString &path, const QStringList &formats);
|
2021-09-18 01:22:33 +03:00
|
|
|
void setUploading(bool value)
|
|
|
|
{
|
|
|
|
if (value != uploading_) {
|
|
|
|
uploading_ = value;
|
|
|
|
emit uploadingChanged(value);
|
2020-11-15 06:52:49 +03:00
|
|
|
}
|
2021-09-18 01:22:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void updateAtRoom(const QString &t);
|
|
|
|
|
|
|
|
QTimer typingRefresh_;
|
|
|
|
QTimer typingTimeout_;
|
|
|
|
TimelineModel *room;
|
|
|
|
std::deque<QString> history_;
|
|
|
|
std::size_t history_index_ = 0;
|
|
|
|
int selectionStart = 0, selectionEnd = 0, cursorPosition = 0;
|
|
|
|
bool uploading_ = false;
|
|
|
|
bool containsAtRoom_ = false;
|
2020-11-01 01:24:07 +03:00
|
|
|
};
|