Refactor input stuff
This is the start of a significant refactoring of everything related to sending messages, which is roughly:
- the chatbox
- action handling
- message sending on the c++ side
- autocompletion of users/rooms/emojis/commands/things i forgot
Notable changes so far include:
- ChatBox is now a ColumnLayout. As part of this, i removed the height animations for now. <del>as far as i can tell, they were broken anyway.</del> I'll readd them later
- Actions were refactored to live outside of the message sending function and are now each an object; it's mostly a wrapper around a function that is executed when the action is invoked
- Everything that used to live in ChatBoxHelper is now in NeoChatRoom; that means that the exact input status (text, message being replied to, message being edited, attachment) is now saved between room switching).
- To edit/reply an event, set `NeoChatRoom::chatBox{edit,reply}Id` to the desired event id, `NeoChatRoom::chatBox{reply,edit}{User,Message}` will then be updated automatically
- Attachments behave equivalently with `NeoChatRoom::chatBoxAttachmentPath`
- Error message reporting from ActionsHandler has been fixed (same fix as in !517) and moved to NeoChatRoom
Broken at the moment:
- [x] Any kind of autocompletion
- [x] Mentions
- [x] Fancy effects
- [x] sed-style edits
- [x] last-user-message edits and replies
- [x] Some of the actions, probably
- [x] Replies from notifications
- [x] Lots of keyboard shortcuts
- [x] Custom emojis
- [x] ChatBox height animations
TODO:
- [x] User / room mentions based on QTextCursors instead of the hack we currently use
- [x] Refactor autocompletion stuff
- [x] ???
- [x] Profit
This commit is contained in:
@@ -3,8 +3,6 @@
|
||||
|
||||
#include "neochatroom.h"
|
||||
|
||||
#include <cmark.h>
|
||||
|
||||
#include <QFileInfo>
|
||||
#include <QMetaObject>
|
||||
#include <QMimeDatabase>
|
||||
@@ -642,24 +640,6 @@ void NeoChatRoom::removeLocalAlias(const QString &alias)
|
||||
setLocalAliases(a);
|
||||
}
|
||||
|
||||
QString NeoChatRoom::markdownToHTML(const QString &markdown)
|
||||
{
|
||||
const auto str = markdown.toUtf8();
|
||||
char *tmp_buf = cmark_markdown_to_html(str.constData(), str.size(), CMARK_OPT_HARDBREAKS);
|
||||
|
||||
const std::string html(tmp_buf);
|
||||
|
||||
free(tmp_buf);
|
||||
|
||||
auto result = QString::fromStdString(html).trimmed();
|
||||
|
||||
result.replace("<!-- raw HTML omitted -->", "");
|
||||
result.replace("<p>", "");
|
||||
result.replace("</p>", "");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
QString msgTypeToString(MessageEventType msgType)
|
||||
{
|
||||
switch (msgType) {
|
||||
@@ -684,11 +664,6 @@ QString msgTypeToString(MessageEventType msgType)
|
||||
}
|
||||
}
|
||||
|
||||
QString NeoChatRoom::preprocessText(const QString &text)
|
||||
{
|
||||
return markdownToHTML(text);
|
||||
}
|
||||
|
||||
void NeoChatRoom::postMessage(const QString &rawText, const QString &text, MessageEventType type, const QString &replyEventId, const QString &relateToEventId)
|
||||
{
|
||||
postHtmlMessage(rawText, text, type, replyEventId, relateToEventId);
|
||||
@@ -1094,7 +1069,99 @@ void NeoChatRoom::reportEvent(const QString &eventId, const QString &reason)
|
||||
auto job = connection()->callApi<ReportContentJob>(id(), eventId, -50, reason);
|
||||
connect(job, &BaseJob::finished, this, [this, job]() {
|
||||
if (job->error() == BaseJob::Success) {
|
||||
Q_EMIT positiveMessage(i18n("Report sent successfully."));
|
||||
Q_EMIT showMessage(Positive, i18n("Report sent successfully."));
|
||||
Q_EMIT showMessage(MessageType::Positive, i18n("Report sent successfully."));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
QString NeoChatRoom::chatBoxText() const
|
||||
{
|
||||
return m_chatBoxText;
|
||||
}
|
||||
|
||||
void NeoChatRoom::setChatBoxText(const QString &text)
|
||||
{
|
||||
m_chatBoxText = text;
|
||||
Q_EMIT chatBoxTextChanged();
|
||||
}
|
||||
|
||||
QString NeoChatRoom::chatBoxReplyId() const
|
||||
{
|
||||
return m_chatBoxReplyId;
|
||||
}
|
||||
|
||||
void NeoChatRoom::setChatBoxReplyId(const QString &replyId)
|
||||
{
|
||||
m_chatBoxReplyId = replyId;
|
||||
Q_EMIT chatBoxReplyIdChanged();
|
||||
}
|
||||
|
||||
QString NeoChatRoom::chatBoxEditId() const
|
||||
{
|
||||
return m_chatBoxEditId;
|
||||
}
|
||||
|
||||
void NeoChatRoom::setChatBoxEditId(const QString &editId)
|
||||
{
|
||||
m_chatBoxEditId = editId;
|
||||
Q_EMIT chatBoxEditIdChanged();
|
||||
}
|
||||
|
||||
NeoChatUser *NeoChatRoom::chatBoxReplyUser() const
|
||||
{
|
||||
if (m_chatBoxReplyId.isEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
return static_cast<NeoChatUser *>(user((*findInTimeline(m_chatBoxReplyId))->senderId()));
|
||||
}
|
||||
|
||||
QString NeoChatRoom::chatBoxReplyMessage() const
|
||||
{
|
||||
if (m_chatBoxReplyId.isEmpty()) {
|
||||
return {};
|
||||
}
|
||||
return eventToString(*static_cast<const RoomMessageEvent *>(&**findInTimeline(m_chatBoxReplyId)));
|
||||
}
|
||||
|
||||
NeoChatUser *NeoChatRoom::chatBoxEditUser() const
|
||||
{
|
||||
if (m_chatBoxEditId.isEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
return static_cast<NeoChatUser *>(user((*findInTimeline(m_chatBoxEditId))->senderId()));
|
||||
}
|
||||
|
||||
QString NeoChatRoom::chatBoxEditMessage() const
|
||||
{
|
||||
if (m_chatBoxEditId.isEmpty()) {
|
||||
return {};
|
||||
}
|
||||
return eventToString(*static_cast<const RoomMessageEvent *>(&**findInTimeline(m_chatBoxEditId)));
|
||||
}
|
||||
|
||||
QString NeoChatRoom::chatBoxAttachmentPath() const
|
||||
{
|
||||
return m_chatBoxAttachmentPath;
|
||||
}
|
||||
|
||||
void NeoChatRoom::setChatBoxAttachmentPath(const QString &attachmentPath)
|
||||
{
|
||||
m_chatBoxAttachmentPath = attachmentPath;
|
||||
Q_EMIT chatBoxAttachmentPathChanged();
|
||||
}
|
||||
|
||||
QVector<Mention> *NeoChatRoom::mentions()
|
||||
{
|
||||
return &m_mentions;
|
||||
}
|
||||
|
||||
QString NeoChatRoom::savedText() const
|
||||
{
|
||||
return m_savedText;
|
||||
}
|
||||
|
||||
void NeoChatRoom::setSavedText(const QString &savedText)
|
||||
{
|
||||
m_savedText = savedText;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user