Re-run clang-format

This commit is contained in:
Nicolas Fella
2021-08-23 19:38:34 +02:00
parent 0f106b1bbc
commit 589dfe0343
26 changed files with 201 additions and 265 deletions

View File

@@ -12,8 +12,8 @@
#include <QStringBuilder> #include <QStringBuilder>
#include "controller.h" #include "controller.h"
#include "roommanager.h"
#include "customemojimodel.h" #include "customemojimodel.h"
#include "roommanager.h"
ActionsHandler::ActionsHandler(QObject *parent) ActionsHandler::ActionsHandler(QObject *parent)
: QObject(parent) : QObject(parent)
@@ -62,7 +62,6 @@ void ActionsHandler::setConnection(Connection *connection)
void ActionsHandler::postEdit(const QString &text) void ActionsHandler::postEdit(const QString &text)
{ {
const auto localId = Controller::instance().activeConnection()->userId(); const auto localId = Controller::instance().activeConnection()->userId();
for (auto it = m_room->messageEvents().crbegin(); it != m_room->messageEvents().crend(); ++it) { for (auto it = m_room->messageEvents().crbegin(); it != m_room->messageEvents().crend(); ++it) {
const auto &evt = **it; const auto &evt = **it;
@@ -104,12 +103,12 @@ void ActionsHandler::postMessage(const QString &text,
const QString &replyEventId, const QString &replyEventId,
const QString &editEventId, const QString &editEventId,
const QVariantMap &usernames, const QVariantMap &usernames,
CustomEmojiModel* cem) CustomEmojiModel *cem)
{ {
QString rawText = text; QString rawText = text;
QString cleanedText = text; QString cleanedText = text;
auto preprocess = [cem](const QString& it) -> QString { auto preprocess = [cem](const QString &it) -> QString {
if (cem == nullptr) { if (cem == nullptr) {
return it; return it;
} }
@@ -135,8 +134,8 @@ void ActionsHandler::postMessage(const QString &text,
static const QString lennyPrefix = QStringLiteral("/lenny"); static const QString lennyPrefix = QStringLiteral("/lenny");
static const QString tableflipPrefix = QStringLiteral("/tableflip"); static const QString tableflipPrefix = QStringLiteral("/tableflip");
static const QString unflipPrefix = QStringLiteral("/unflip"); static const QString unflipPrefix = QStringLiteral("/unflip");
//static const QString plainPrefix = QStringLiteral("/plain "); // TODO // static const QString plainPrefix = QStringLiteral("/plain "); // TODO
//static const QString htmlPrefix = QStringLiteral("/html "); // TODO // static const QString htmlPrefix = QStringLiteral("/html "); // TODO
static const QString rainbowPrefix = QStringLiteral("/rainbow "); static const QString rainbowPrefix = QStringLiteral("/rainbow ");
static const QString rainbowmePrefix = QStringLiteral("/rainbowme "); static const QString rainbowmePrefix = QStringLiteral("/rainbowme ");
static const QString spoilerPrefix = QStringLiteral("/spoiler "); static const QString spoilerPrefix = QStringLiteral("/spoiler ");
@@ -144,12 +143,12 @@ void ActionsHandler::postMessage(const QString &text,
static const QString noticePrefix = QStringLiteral("/notice "); static const QString noticePrefix = QStringLiteral("/notice ");
// Actions commands // Actions commands
//static const QString ddgPrefix = QStringLiteral("/ddg "); // TODO // static const QString ddgPrefix = QStringLiteral("/ddg "); // TODO
//static const QString nickPrefix = QStringLiteral("/nick "); // TODO // static const QString nickPrefix = QStringLiteral("/nick "); // TODO
//static const QString meroomnickPrefix = QStringLiteral("/myroomnick "); // TODO // static const QString meroomnickPrefix = QStringLiteral("/myroomnick "); // TODO
//static const QString roomavatarPrefix = QStringLiteral("/roomavatar "); // TODO // static const QString roomavatarPrefix = QStringLiteral("/roomavatar "); // TODO
//static const QString myroomavatarPrefix = QStringLiteral("/myroomavatar "); // TODO // static const QString myroomavatarPrefix = QStringLiteral("/myroomavatar "); // TODO
//static const QString myavatarPrefix = QStringLiteral("/myavatar "); // TODO // static const QString myavatarPrefix = QStringLiteral("/myavatar "); // TODO
static const QString invitePrefix = QStringLiteral("/invite "); static const QString invitePrefix = QStringLiteral("/invite ");
static const QString joinPrefix = QStringLiteral("/join "); static const QString joinPrefix = QStringLiteral("/join ");
static const QString joinShortPrefix = QStringLiteral("/j "); static const QString joinShortPrefix = QStringLiteral("/j ");
@@ -157,8 +156,8 @@ void ActionsHandler::postMessage(const QString &text,
static const QString leavePrefix = QStringLiteral("/leave"); static const QString leavePrefix = QStringLiteral("/leave");
static const QString ignorePrefix = QStringLiteral("/ignore "); static const QString ignorePrefix = QStringLiteral("/ignore ");
static const QString unignorePrefix = QStringLiteral("/unignore "); static const QString unignorePrefix = QStringLiteral("/unignore ");
//static const QString queryPrefix = QStringLiteral("/query "); // TODO // static const QString queryPrefix = QStringLiteral("/query "); // TODO
//static const QString msgPrefix = QStringLiteral("/msg "); // TODO // static const QString msgPrefix = QStringLiteral("/msg "); // TODO
static const QString reactPrefix = QStringLiteral("/react "); static const QString reactPrefix = QStringLiteral("/react ");
// Admin commands // Admin commands

View File

@@ -18,7 +18,6 @@ class ActionsHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
/// \brief The connection that will handle sending the message. /// \brief The connection that will handle sending the message.
Q_PROPERTY(Connection *connection READ connection WRITE setConnection NOTIFY connectionChanged) Q_PROPERTY(Connection *connection READ connection WRITE setConnection NOTIFY connectionChanged)
@@ -35,8 +34,6 @@ public:
explicit ActionsHandler(QObject *parent = nullptr); explicit ActionsHandler(QObject *parent = nullptr);
~ActionsHandler(); ~ActionsHandler();
[[nodiscard]] Connection *connection() const; [[nodiscard]] Connection *connection() const;
void setConnection(Connection *connection); void setConnection(Connection *connection);
@@ -57,8 +54,12 @@ public Q_SLOTS:
/// \brief Post a message. /// \brief Post a message.
/// ///
/// This also interprets commands if any. /// This also interprets commands if any.
void void postMessage(const QString &text,
postMessage(const QString &text, const QString &attachementPath, const QString &replyEventId, const QString &editEventId, const QVariantMap &usernames, CustomEmojiModel* cem); const QString &attachementPath,
const QString &replyEventId,
const QString &editEventId,
const QVariantMap &usernames,
CustomEmojiModel *cem);
/// \brief Send edit instructions (.e.g s/hallo/hello/) /// \brief Send edit instructions (.e.g s/hallo/hello/)
/// ///

View File

@@ -6,7 +6,7 @@
#include "colorschemer.h" #include "colorschemer.h"
ColorSchemer::ColorSchemer(QObject* parent) ColorSchemer::ColorSchemer(QObject *parent)
: QObject(parent) : QObject(parent)
, c(new KColorSchemeManager(this)) , c(new KColorSchemeManager(this))
{ {

View File

@@ -3,8 +3,8 @@
#pragma once #pragma once
#include <QObject>
#include <QIdentityProxyModel> #include <QIdentityProxyModel>
#include <QObject>
class QAbstractItemModel; class QAbstractItemModel;
class KColorSchemeManager; class KColorSchemeManager;
@@ -14,16 +14,15 @@ class ColorSchemer : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(QAbstractItemModel *model READ model CONSTANT) Q_PROPERTY(QAbstractItemModel *model READ model CONSTANT)
public: public:
ColorSchemer(QObject* parent = nullptr); ColorSchemer(QObject *parent = nullptr);
~ColorSchemer(); ~ColorSchemer();
QAbstractItemModel* model() const; QAbstractItemModel *model() const;
Q_INVOKABLE void apply(int idx); Q_INVOKABLE void apply(int idx);
Q_INVOKABLE void apply(const QString &name); Q_INVOKABLE void apply(const QString &name);
Q_INVOKABLE int indexForScheme(const QString &name) const; Q_INVOKABLE int indexForScheme(const QString &name) const;
Q_INVOKABLE QString nameForIndex(int index) const; Q_INVOKABLE QString nameForIndex(int index) const;
private: private:
KColorSchemeManager* c; KColorSchemeManager *c;
}; };

View File

@@ -6,7 +6,6 @@
#include "actionshandler.h" #include "actionshandler.h"
#include "commandmodel.h" #include "commandmodel.h"
QVariantList CommandModel::filterModel(const QString &filter) QVariantList CommandModel::filterModel(const QString &filter)
{ {
QVariantList result; QVariantList result;
@@ -24,85 +23,47 @@ QVariantList CommandModel::filterModel(const QString &filter)
return result; return result;
} }
QVariantList CommandModel::commands() QVariantList CommandModel::commands()
{ {
QVariantList commands; QVariantList commands;
// Messages commands // Messages commands
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/me "), QStringLiteral("<message>"), i18n("Displays action")}));
QStringLiteral("/me "),
QStringLiteral("<message>"),
i18n("Displays action")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/shrug "), QStringLiteral("<message>"), i18n("Prepends ¯\\_(ツ)_/¯ to a plain-text message")}));
QStringLiteral("/shrug "),
QStringLiteral("<message>"),
i18n("Prepends ¯\\_(ツ)_/¯ to a plain-text message")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/lenny "), QStringLiteral("<message>"), i18n("Prepends ( ͡° ͜ʖ ͡°) to a plain-text message")}));
QStringLiteral("/lenny "),
QStringLiteral("<message>"),
i18n("Prepends ( ͡° ͜ʖ ͡°) to a plain-text message")}));
commands.append(QVariant::fromValue(Command{ commands.append(
QStringLiteral("/tableflip "), QVariant::fromValue(Command{QStringLiteral("/tableflip "), QStringLiteral("<message>"), i18n("Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message")}));
QStringLiteral("<message>"),
i18n("Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message")}));
commands.append(QVariant::fromValue(Command{ commands.append(
QStringLiteral("/unflip "), QVariant::fromValue(Command{QStringLiteral("/unflip "), QStringLiteral("<message>"), i18n("Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message")}));
QStringLiteral("<message>"),
i18n("Prepends ┬──┬ ( ゜-゜ノ) to a plain-text message")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(
QStringLiteral("/plain "), Command{QStringLiteral("/plain "), QStringLiteral("<message>"), i18n("Sends a message as plain text, without interpreting it as markdown")}));
QStringLiteral("<message>"),
i18n("Sends a message as plain text, without interpreting it as markdown")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(
QStringLiteral("/html "), Command{QStringLiteral("/html "), QStringLiteral("<message>"), i18n("Sends a message as html, without interpreting it as markdown")}));
QStringLiteral("<message>"),
i18n("Sends a message as html, without interpreting it as markdown")}));
commands.append(QVariant::fromValue(Command{ commands.append(
QStringLiteral("/rainbow "), QVariant::fromValue(Command{QStringLiteral("/rainbow "), QStringLiteral("<message>"), i18n("Sends the given message coloured as a rainbow")}));
QStringLiteral("<message>"),
i18n("Sends the given message coloured as a rainbow")}));
commands.append(QVariant::fromValue(Command{ commands.append(
QStringLiteral("/rainbowme "), QVariant::fromValue(Command{QStringLiteral("/rainbowme "), QStringLiteral("<message>"), i18n("Sends the given emote coloured as a rainbow")}));
QStringLiteral("<message>"),
i18n("Sends the given emote coloured as a rainbow")}));
commands.append(QVariant::fromValue(Command{
QStringLiteral("/spoiler "),
QStringLiteral("<message>"),
i18n("Sends the given message as a spoiler")}));
commands.append(QVariant::fromValue(Command{QStringLiteral("/spoiler "), QStringLiteral("<message>"), i18n("Sends the given message as a spoiler")}));
// Actions commands // Actions commands
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/join "), QStringLiteral("<room-address>"), i18n("Joins room with given address")}));
QStringLiteral("/join "), QStringLiteral("<room-address>"),
i18n("Joins room with given address")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/part "), QStringLiteral("[<room-address>]"), i18n("Leave room")}));
QStringLiteral("/part "),
QStringLiteral("[<room-address>]"),
i18n("Leave room")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/invite "), QStringLiteral("<user-id>"), i18n("Invites user with given id to current room")}));
QStringLiteral("/invite "),
QStringLiteral("<user-id>"),
i18n("Invites user with given id to current room")}));
commands.append(QVariant::fromValue(Command{ commands.append(QVariant::fromValue(Command{QStringLiteral("/react "), QStringLiteral("<reaction text>"), i18n("React to this message with a text")}));
QStringLiteral("/react "),
QStringLiteral("<reaction text>"),
i18n("React to this message with a text")}));
// TODO more see elements /help action // TODO more see elements /help action
return commands; return commands;
} }

View File

@@ -21,11 +21,10 @@ struct Command {
QString parameter; QString parameter;
QString help; QString help;
Q_GADGET Q_GADGET
Q_PROPERTY(QString command MEMBER command) Q_PROPERTY(QString command MEMBER command)
Q_PROPERTY(QString parameter MEMBER parameter) Q_PROPERTY(QString parameter MEMBER parameter)
Q_PROPERTY(QString help MEMBER help) Q_PROPERTY(QString help MEMBER help)
}; };
Q_DECLARE_METATYPE(Command) Q_DECLARE_METATYPE(Command)

View File

@@ -23,12 +23,12 @@
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QQuickItem>
#include <QGuiApplication> #include <QGuiApplication>
#include <QMovie> #include <QMovie>
#include <QNetworkConfigurationManager> #include <QNetworkConfigurationManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QPixmap> #include <QPixmap>
#include <QQuickItem>
#include <QQuickWindow> #include <QQuickWindow>
#include <QStandardPaths> #include <QStandardPaths>
#include <QStringBuilder> #include <QStringBuilder>
@@ -50,9 +50,9 @@
#include "neochatconfig.h" #include "neochatconfig.h"
#include "neochatroom.h" #include "neochatroom.h"
#include "neochatuser.h" #include "neochatuser.h"
#include "roommanager.h"
#include "settings.h" #include "settings.h"
#include "utils.h" #include "utils.h"
#include "roommanager.h"
#include <KStandardShortcut> #include <KStandardShortcut>
#ifndef Q_OS_ANDROID #ifndef Q_OS_ANDROID
@@ -119,8 +119,7 @@ Controller::Controller(QObject *parent)
} }
#endif #endif
connect(m_mgr, &QNetworkConfigurationManager::onlineStateChanged, connect(m_mgr, &QNetworkConfigurationManager::onlineStateChanged, this, &Controller::isOnlineChanged);
this, &Controller::isOnlineChanged);
} }
Controller::~Controller() Controller::~Controller()
@@ -399,7 +398,7 @@ void Controller::changeAvatar(Connection *conn, const QUrl &localFile)
{ {
auto job = conn->uploadFile(localFile.toLocalFile()); auto job = conn->uploadFile(localFile.toLocalFile());
#ifdef QUOTIENT_07 #ifdef QUOTIENT_07
if(isJobPending(job)) { if (isJobPending(job)) {
#else #else
if (isJobRunning(job)) { if (isJobRunning(job)) {
#endif #endif
@@ -643,4 +642,3 @@ bool Controller::hasWindowSystem() const
return false; return false;
#endif #endif
} }

View File

@@ -4,8 +4,8 @@
#pragma once #pragma once
#include <QMediaPlayer> #include <QMediaPlayer>
#include <QQuickItem>
#include <QObject> #include <QObject>
#include <QQuickItem>
#include <KAboutData> #include <KAboutData>
#include <KFormat> #include <KFormat>
@@ -91,6 +91,7 @@ public:
Q_INVOKABLE void openOrCreateDirectChat(NeoChatUser *user); Q_INVOKABLE void openOrCreateDirectChat(NeoChatUser *user);
Q_INVOKABLE void setBlur(QQuickItem *item, bool blur); Q_INVOKABLE void setBlur(QQuickItem *item, bool blur);
private: private:
explicit Controller(QObject *parent = nullptr); explicit Controller(QObject *parent = nullptr);
~Controller() override; ~Controller() override;

View File

@@ -2,8 +2,8 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <csapi/account-data.h> #include <csapi/account-data.h>
#include <csapi/profile.h>
#include <csapi/content-repo.h> #include <csapi/content-repo.h>
#include <csapi/profile.h>
#include "customemojimodel_p.h" #include "customemojimodel_p.h"
@@ -19,16 +19,16 @@ void CustomEmojiModel::fetchEmojies()
return; return;
} }
const auto& data = d->conn->accountData("im.ponies.user_emotes"); const auto &data = d->conn->accountData("im.ponies.user_emotes");
if (data == nullptr) { if (data == nullptr) {
return; return;
} }
QJsonObject emojies = data->contentJson()["images"].toObject(); QJsonObject emojies = data->contentJson()["images"].toObject();
//TODO: Remove with stable migration // TODO: Remove with stable migration
const auto legacyEmojies = data->contentJson()["emoticons"].toObject(); const auto legacyEmojies = data->contentJson()["emoticons"].toObject();
for(const auto &emoji : legacyEmojies.keys()) { for (const auto &emoji : legacyEmojies.keys()) {
if(!emojies.contains(emoji)) { if (!emojies.contains(emoji)) {
emojies[emoji] = legacyEmojies[emoji]; emojies[emoji] = legacyEmojies[emoji];
} }
} }
@@ -36,22 +36,18 @@ void CustomEmojiModel::fetchEmojies()
beginResetModel(); beginResetModel();
d->emojies.clear(); d->emojies.clear();
for (const auto& emoji : emojies.keys()) { for (const auto &emoji : emojies.keys()) {
const auto& data = emojies[emoji]; const auto &data = emojies[emoji];
const auto e = emoji.startsWith(":") ? emoji : (QStringLiteral(":") + emoji + QStringLiteral(":")); const auto e = emoji.startsWith(":") ? emoji : (QStringLiteral(":") + emoji + QStringLiteral(":"));
d->emojies << CustomEmoji { d->emojies << CustomEmoji{e, data.toObject()["url"].toString(), QRegularExpression(QStringLiteral(R"((^|[^\\]))") + e)};
e,
data.toObject()["url"].toString(),
QRegularExpression(QStringLiteral(R"((^|[^\\]))") + e)
};
} }
endResetModel(); endResetModel();
} }
void CustomEmojiModel::addEmoji(const QString& name, const QUrl& location) void CustomEmojiModel::addEmoji(const QString &name, const QUrl &location)
{ {
using namespace Quotient; using namespace Quotient;
@@ -59,7 +55,7 @@ void CustomEmojiModel::addEmoji(const QString& name, const QUrl& location)
if (running(job)) { if (running(job)) {
connect(job, &BaseJob::success, this, [this, name, job] { connect(job, &BaseJob::success, this, [this, name, job] {
const auto& data = d->conn->accountData("im.ponies.user_emotes"); const auto &data = d->conn->accountData("im.ponies.user_emotes");
auto json = data != nullptr ? data->contentJson() : QJsonObject(); auto json = data != nullptr ? data->contentJson() : QJsonObject();
auto emojiData = json["images"].toObject(); auto emojiData = json["images"].toObject();
emojiData[QStringLiteral("%1").arg(name)] = QJsonObject({ emojiData[QStringLiteral("%1").arg(name)] = QJsonObject({
@@ -75,30 +71,30 @@ void CustomEmojiModel::addEmoji(const QString& name, const QUrl& location)
} }
} }
void CustomEmojiModel::removeEmoji(const QString& name) void CustomEmojiModel::removeEmoji(const QString &name)
{ {
using namespace Quotient; using namespace Quotient;
const auto& data = d->conn->accountData("im.ponies.user_emotes"); const auto &data = d->conn->accountData("im.ponies.user_emotes");
Q_ASSERT(data != nullptr); // something's screwed if we get here with a nullptr Q_ASSERT(data != nullptr); // something's screwed if we get here with a nullptr
auto json = data->contentJson(); auto json = data->contentJson();
const QString _name = name.mid(1).chopped(1); const QString _name = name.mid(1).chopped(1);
auto emojiData = json["images"].toObject(); auto emojiData = json["images"].toObject();
if(emojiData.contains(name)) { if (emojiData.contains(name)) {
emojiData.remove(name); emojiData.remove(name);
json["images"] = emojiData; json["images"] = emojiData;
} }
if(emojiData.contains(_name)) { if (emojiData.contains(_name)) {
emojiData.remove(_name); emojiData.remove(_name);
json["images"] = emojiData; json["images"] = emojiData;
} }
emojiData = json["emoticons"].toObject(); emojiData = json["emoticons"].toObject();
if(emojiData.contains(name)) { if (emojiData.contains(name)) {
emojiData.remove(name); emojiData.remove(name);
json["emoticons"] = emojiData; json["emoticons"] = emojiData;
} }
if(emojiData.contains(_name)) { if (emojiData.contains(_name)) {
emojiData.remove(_name); emojiData.remove(_name);
json["emoticons"] = emojiData; json["emoticons"] = emojiData;
} }

View File

@@ -1,8 +1,8 @@
// SPDX-FileCopyrightText: 2021 Carson Black <uhhadd@gmail.com> // SPDX-FileCopyrightText: 2021 Carson Black <uhhadd@gmail.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include "emojimodel.h"
#include "customemojimodel_p.h" #include "customemojimodel_p.h"
#include "emojimodel.h"
enum Roles { enum Roles {
Name, Name,
@@ -10,13 +10,16 @@ enum Roles {
ModelData, // for emulating the regular emoji model's usage, otherwise the UI code would get too complicated ModelData, // for emulating the regular emoji model's usage, otherwise the UI code would get too complicated
}; };
CustomEmojiModel::CustomEmojiModel(QObject* parent) : QAbstractListModel(parent), d(new Private) CustomEmojiModel::CustomEmojiModel(QObject *parent)
: QAbstractListModel(parent)
, d(new Private)
{ {
connect(this, &CustomEmojiModel::connectionChanged, this, &CustomEmojiModel::fetchEmojies); connect(this, &CustomEmojiModel::connectionChanged, this, &CustomEmojiModel::fetchEmojies);
connect(this, &CustomEmojiModel::connectionChanged, this, [this]() { connect(this, &CustomEmojiModel::connectionChanged, this, [this]() {
if (!d->conn) return; if (!d->conn)
return;
connect(d->conn, &Connection::accountDataChanged, this, [this](const QString& id) { connect(d->conn, &Connection::accountDataChanged, this, [this](const QString &id) {
if (id != QStringLiteral("im.ponies.user_emotes")) { if (id != QStringLiteral("im.ponies.user_emotes")) {
return; return;
} }
@@ -27,24 +30,19 @@ CustomEmojiModel::CustomEmojiModel(QObject* parent) : QAbstractListModel(parent)
CustomEmojiModel::~CustomEmojiModel() CustomEmojiModel::~CustomEmojiModel()
{ {
} }
QVariant CustomEmojiModel::data(const QModelIndex& idx, int role) const QVariant CustomEmojiModel::data(const QModelIndex &idx, int role) const
{ {
const auto row = idx.row(); const auto row = idx.row();
if (row >= d->emojies.length()) { if (row >= d->emojies.length()) {
return QVariant(); return QVariant();
} }
const auto& data = d->emojies[row]; const auto &data = d->emojies[row];
switch (Roles(role)) { switch (Roles(role)) {
case Roles::ModelData: case Roles::ModelData:
return QVariant::fromValue(Emoji( return QVariant::fromValue(Emoji(QStringLiteral("image://mxc/") + data.url.mid(6), data.name, true));
QStringLiteral("image://mxc/") + data.url.mid(6),
data.name,
true
));
case Roles::Name: case Roles::Name:
return data.name; return data.name;
case Roles::ImageURL: case Roles::ImageURL:
@@ -54,28 +52,28 @@ QVariant CustomEmojiModel::data(const QModelIndex& idx, int role) const
return QVariant(); return QVariant();
} }
int CustomEmojiModel::rowCount(const QModelIndex& parent) const int CustomEmojiModel::rowCount(const QModelIndex &parent) const
{ {
Q_UNUSED(parent) Q_UNUSED(parent)
return d->emojies.length(); return d->emojies.length();
} }
QHash<int,QByteArray> CustomEmojiModel::roleNames() const QHash<int, QByteArray> CustomEmojiModel::roleNames() const
{ {
return { return {
{ Name, "name" }, {Name, "name"},
{ ImageURL, "imageURL" }, {ImageURL, "imageURL"},
{ ModelData, "modelData" }, {ModelData, "modelData"},
}; };
} }
Connection* CustomEmojiModel::connection() const Connection *CustomEmojiModel::connection() const
{ {
return d->conn; return d->conn;
} }
void CustomEmojiModel::setConnection(Connection* it) void CustomEmojiModel::setConnection(Connection *it)
{ {
if (d->conn == it) { if (d->conn == it) {
return; return;
@@ -90,8 +88,10 @@ void CustomEmojiModel::setConnection(Connection* it)
QString CustomEmojiModel::preprocessText(const QString &it) QString CustomEmojiModel::preprocessText(const QString &it)
{ {
auto cp = it; auto cp = it;
for (const auto& emoji : qAsConst(d->emojies)) { for (const auto &emoji : qAsConst(d->emojies)) {
cp.replace(emoji.regexp, QStringLiteral(R"(<img data-mx-emoticon="" src="%1" alt="%2" title="%2" height="32" vertical-align="middle" />)").arg(emoji.url, emoji.name)); cp.replace(
emoji.regexp,
QStringLiteral(R"(<img data-mx-emoticon="" src="%1" alt="%2" title="%2" height="32" vertical-align="middle" />)").arg(emoji.url, emoji.name));
} }
return cp; return cp;
} }
@@ -99,15 +99,13 @@ QString CustomEmojiModel::preprocessText(const QString &it)
QVariantList CustomEmojiModel::filterModel(const QString &filter) QVariantList CustomEmojiModel::filterModel(const QString &filter)
{ {
QVariantList results; QVariantList results;
for (const auto& emoji : qAsConst(d->emojies)) { for (const auto &emoji : qAsConst(d->emojies)) {
if (results.length() >= 10) break; if (results.length() >= 10)
if (!emoji.name.contains(filter, Qt::CaseInsensitive)) continue; break;
if (!emoji.name.contains(filter, Qt::CaseInsensitive))
continue;
results << QVariant::fromValue(Emoji( results << QVariant::fromValue(Emoji(QStringLiteral("image://mxc/") + emoji.url.mid(6), emoji.name, true));
QStringLiteral("image://mxc/") + emoji.url.mid(6),
emoji.name,
true
));
} }
return results; return results;
} }

View File

@@ -13,43 +13,39 @@ using namespace Quotient;
class CustomEmojiModel : public QAbstractListModel class CustomEmojiModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(Connection *connection READ connection WRITE setConnection NOTIFY connectionChanged) Q_PROPERTY(Connection *connection READ connection WRITE setConnection NOTIFY connectionChanged)
public: public:
// constructors // constructors
explicit CustomEmojiModel(QObject* parent = nullptr); explicit CustomEmojiModel(QObject *parent = nullptr);
~CustomEmojiModel(); ~CustomEmojiModel();
// model // model
QVariant data(const QModelIndex& idx, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex& parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QHash<int,QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
// property setters // property setters
Connection* connection() const; Connection *connection() const;
void setConnection(Connection* it); void setConnection(Connection *it);
Q_SIGNAL void connectionChanged(); Q_SIGNAL void connectionChanged();
// QML functions // QML functions
Q_INVOKABLE QString preprocessText(const QString& it); Q_INVOKABLE QString preprocessText(const QString &it);
Q_INVOKABLE QVariantList filterModel(const QString &filter); Q_INVOKABLE QVariantList filterModel(const QString &filter);
Q_INVOKABLE void addEmoji(const QString& name, const QUrl& location); Q_INVOKABLE void addEmoji(const QString &name, const QUrl &location);
Q_INVOKABLE void removeEmoji(const QString& name); Q_INVOKABLE void removeEmoji(const QString &name);
private: private:
struct Private; struct Private;
std::unique_ptr<Private> d; std::unique_ptr<Private> d;
void fetchEmojies(); void fetchEmojies();
}; };

View File

@@ -5,15 +5,13 @@
#include "customemojimodel.h" #include "customemojimodel.h"
struct CustomEmoji struct CustomEmoji {
{
QString name; // with :semicolons: QString name; // with :semicolons:
QString url; // mxc:// QString url; // mxc://
QRegularExpression regexp; QRegularExpression regexp;
}; };
struct CustomEmojiModel::Private struct CustomEmojiModel::Private {
{ Connection *conn = nullptr;
Connection* conn = nullptr;
QList<CustomEmoji> emojies; QList<CustomEmoji> emojies;
}; };

View File

@@ -10,8 +10,7 @@
DevicesModel::DevicesModel(QObject *parent) DevicesModel::DevicesModel(QObject *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
{ {
connect(&Controller::instance(), &Controller::activeConnectionChanged, connect(&Controller::instance(), &Controller::activeConnectionChanged, this, &DevicesModel::fetchDevices);
this, &DevicesModel::fetchDevices);
fetchDevices(); fetchDevices();
} }

View File

@@ -35,7 +35,7 @@ void Login::init()
m_testing = true; m_testing = true;
Q_EMIT testingChanged(); Q_EMIT testingChanged();
if(!m_connection) { if (!m_connection) {
m_connection = new Connection(this); m_connection = new Connection(this);
} }
m_connection->resolveServer(m_matrixId); m_connection->resolveServer(m_matrixId);

View File

@@ -2,16 +2,16 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
#include <QCommandLineParser> #include <QCommandLineParser>
#include <QDebug>
#include <QFontDatabase> #include <QFontDatabase>
#include <QGuiApplication> #include <QGuiApplication>
#include <QIcon>
#include <QNetworkProxy> #include <QNetworkProxy>
#include <QNetworkProxyFactory> #include <QNetworkProxyFactory>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
#include <QQmlContext> #include <QQmlContext>
#include <QQuickStyle> #include <QQuickStyle>
#include <QQuickWindow> #include <QQuickWindow>
#include <QDebug>
#include <QIcon>
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
#include <QGuiApplication> #include <QGuiApplication>
@@ -31,6 +31,7 @@
#include "accountlistmodel.h" #include "accountlistmodel.h"
#include "actionshandler.h" #include "actionshandler.h"
#include "blurhashimageprovider.h"
#include "chatboxhelper.h" #include "chatboxhelper.h"
#include "chatdocumenthandler.h" #include "chatdocumenthandler.h"
#include "clipboard.h" #include "clipboard.h"
@@ -38,6 +39,7 @@
#include "controller.h" #include "controller.h"
#include "csapi/joining.h" #include "csapi/joining.h"
#include "csapi/leaving.h" #include "csapi/leaving.h"
#include "customemojimodel.h"
#include "devicesmodel.h" #include "devicesmodel.h"
#include "emojimodel.h" #include "emojimodel.h"
#include "filetypesingleton.h" #include "filetypesingleton.h"
@@ -50,16 +52,14 @@
#include "neochatuser.h" #include "neochatuser.h"
#include "notificationsmanager.h" #include "notificationsmanager.h"
#include "publicroomlistmodel.h" #include "publicroomlistmodel.h"
#include <room.h>
#include "roomlistmodel.h" #include "roomlistmodel.h"
#include "roommanager.h" #include "roommanager.h"
#include "sortfilterroomlistmodel.h" #include "sortfilterroomlistmodel.h"
#include "spellcheckhighlighter.h"
#include "userdirectorylistmodel.h" #include "userdirectorylistmodel.h"
#include "userlistmodel.h" #include "userlistmodel.h"
#include "webshortcutmodel.h" #include "webshortcutmodel.h"
#include "spellcheckhighlighter.h" #include <room.h>
#include "customemojimodel.h"
#include "blurhashimageprovider.h"
#ifdef HAVE_COLORSCHEME #ifdef HAVE_COLORSCHEME
#include "colorschemer.h" #include "colorschemer.h"
#endif #endif
@@ -112,27 +112,28 @@ int main(int argc, char *argv[])
about.addAuthor(i18n("Tobias Fella"), QString(), QStringLiteral("fella@posteo.de")); about.addAuthor(i18n("Tobias Fella"), QString(), QStringLiteral("fella@posteo.de"));
about.setOrganizationDomain("kde.org"); about.setOrganizationDomain("kde.org");
about.addComponent(QStringLiteral("libQuotient"), i18n("A Qt5 library to write cross-platform clients for Matrix"), QString(), QStringLiteral("https://github.com/quotient-im/libquotient"), KAboutLicense::LGPL_V2_1); about.addComponent(QStringLiteral("libQuotient"),
i18n("A Qt5 library to write cross-platform clients for Matrix"),
QString(),
QStringLiteral("https://github.com/quotient-im/libquotient"),
KAboutLicense::LGPL_V2_1);
KAboutData::setApplicationData(about); KAboutData::setApplicationData(about);
QGuiApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.neochat"))); QGuiApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.neochat")));
#ifdef HAVE_KDBUSADDONS #ifdef HAVE_KDBUSADDONS
KDBusService service(KDBusService::Unique); KDBusService service(KDBusService::Unique);
service.connect(&service, service.connect(&service, &KDBusService::activateRequested, &RoomManager::instance(), [](const QStringList &arguments, const QString &workingDirectory) {
&KDBusService::activateRequested, Q_UNUSED(workingDirectory);
&RoomManager::instance(), if (arguments.isEmpty()) {
[](const QStringList &arguments, const QString &workingDirectory) { return;
Q_UNUSED(workingDirectory); }
if(arguments.isEmpty()) { auto args = arguments;
return; args.removeFirst();
} for (const auto &arg : args) {
auto args = arguments; RoomManager::instance().openResource(arg);
args.removeFirst(); }
for (const auto &arg : args) { });
RoomManager::instance().openResource(arg);
}
});
#endif #endif
#ifdef NEOCHAT_FLATPAK #ifdef NEOCHAT_FLATPAK

View File

@@ -87,7 +87,7 @@ void ThumbnailResponse::prepareResult()
errorStr.clear(); errorStr.clear();
} else if (job->error() == BaseJob::Abandoned) { } else if (job->error() == BaseJob::Abandoned) {
errorStr = i18n("Image request has been cancelled"); errorStr = i18n("Image request has been cancelled");
//qDebug() << "ThumbnailResponse: cancelled for" << mediaId; // qDebug() << "ThumbnailResponse: cancelled for" << mediaId;
} else { } else {
errorStr = job->errorString(); errorStr = job->errorString();
qWarning() << "ThumbnailResponse: no valid image for" << mediaId << "-" << errorStr; qWarning() << "ThumbnailResponse: no valid image for" << mediaId << "-" << errorStr;

View File

@@ -18,8 +18,8 @@
#include <QQmlEngine> // for qmlRegisterType() #include <QQmlEngine> // for qmlRegisterType()
#include <QTimeZone> #include <QTimeZone>
#include <KLocalizedString>
#include <KFormat> #include <KFormat>
#include <KLocalizedString>
#include "utils.h" #include "utils.h"
@@ -184,7 +184,7 @@ void MessageEventModel::setRoom(NeoChatRoom *room)
beginRemoveRows({}, i, i); beginRemoveRows({}, i, i);
}); });
connect(m_currentRoom, &Room::pendingEventDiscarded, this, &MessageEventModel::endRemoveRows); connect(m_currentRoom, &Room::pendingEventDiscarded, this, &MessageEventModel::endRemoveRows);
connect(m_currentRoom, &Room::readMarkerMoved, this, [=](const QString &fromEventId, const QString &toEventId){ connect(m_currentRoom, &Room::readMarkerMoved, this, [=](const QString &fromEventId, const QString &toEventId) {
Q_UNUSED(fromEventId); Q_UNUSED(fromEventId);
moveReadMarker(toEventId); moveReadMarker(toEventId);
}); });
@@ -370,7 +370,6 @@ int MessageEventModel::rowCount(const QModelIndex &parent) const
} else { } else {
return m_currentRoom->timelineSize(); return m_currentRoom->timelineSize();
} }
} }
bool MessageEventModel::canFetchMore(const QModelIndex &parent) const bool MessageEventModel::canFetchMore(const QModelIndex &parent) const
@@ -388,7 +387,6 @@ void MessageEventModel::fetchMore(const QModelIndex &parent)
} }
} }
inline QVariantMap userAtEvent(NeoChatUser *user, NeoChatRoom *room, const RoomEvent &evt) inline QVariantMap userAtEvent(NeoChatUser *user, NeoChatRoom *room, const RoomEvent &evt)
{ {
Q_UNUSED(evt) Q_UNUSED(evt)
@@ -415,22 +413,22 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
bool isPending = row < timelineBaseIndex(); bool isPending = row < timelineBaseIndex();
if (m_lastReadEventIndex.row() == row) { if (m_lastReadEventIndex.row() == row) {
switch(role) { switch (role) {
case EventTypeRole: case EventTypeRole:
return QStringLiteral("readMarker"); return QStringLiteral("readMarker");
case TimeRole: case TimeRole: {
{ const QDateTime eventDate = data(index(m_lastReadEventIndex.row() + 1, 0), TimeRole).toDateTime();
const QDateTime eventDate = data(index(m_lastReadEventIndex.row() + 1, 0), TimeRole).toDateTime(); const KFormat format;
const KFormat format; return format.formatRelativeDateTime(eventDate, QLocale::ShortFormat);
return format.formatRelativeDateTime(eventDate, QLocale::ShortFormat); }
}
case SpecialMarksRole: case SpecialMarksRole:
return EventStatus::Hidden; return EventStatus::Hidden;
} }
return {}; return {};
} }
const auto timelineIt = m_currentRoom->messageEvents().crbegin() + std::max(0, row - timelineBaseIndex() - (m_lastReadEventIndex.isValid() && m_lastReadEventIndex.row() < row ? 1 : 0)); const auto timelineIt = m_currentRoom->messageEvents().crbegin()
+ std::max(0, row - timelineBaseIndex() - (m_lastReadEventIndex.isValid() && m_lastReadEventIndex.row() < row ? 1 : 0));
const auto pendingIt = m_currentRoom->pendingEvents().crbegin() + std::min(row, timelineBaseIndex()); const auto pendingIt = m_currentRoom->pendingEvents().crbegin() + std::min(row, timelineBaseIndex());
const auto &evt = isPending ? **pendingIt : **timelineIt; const auto &evt = isPending ? **pendingIt : **timelineIt;
@@ -684,12 +682,11 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
content = QVariant::fromValue(e->image().originalJson); content = QVariant::fromValue(e->image().originalJson);
} }
return QVariantMap{ return QVariantMap{{"eventId", replyEventId},
{"eventId", replyEventId}, {"display", m_currentRoom->eventToString(replyEvt, Qt::RichText)},
{"display", m_currentRoom->eventToString(replyEvt, Qt::RichText)}, {"content", content},
{"content", content}, {"type", type},
{"type", type}, {"author", userAtEvent(static_cast<NeoChatUser *>(m_currentRoom->user(replyEvt.senderId())), m_currentRoom, evt)}};
{"author", userAtEvent(static_cast<NeoChatUser *>(m_currentRoom->user(replyEvt.senderId())), m_currentRoom, evt)}};
} }
if (role == ShowAuthorRole) { if (role == ShowAuthorRole) {
@@ -759,7 +756,7 @@ int MessageEventModel::eventIDToIndex(const QString &eventID) const
{ {
const auto it = m_currentRoom->findInTimeline(eventID); const auto it = m_currentRoom->findInTimeline(eventID);
if (it == m_currentRoom->historyEdge()) { if (it == m_currentRoom->historyEdge()) {
//qWarning() << "Trying to find inexistent event:" << eventID; // qWarning() << "Trying to find inexistent event:" << eventID;
return -1; return -1;
} }
return it - m_currentRoom->messageEvents().rbegin() + timelineBaseIndex(); return it - m_currentRoom->messageEvents().rbegin() + timelineBaseIndex();

View File

@@ -275,15 +275,13 @@ QVariantList NeoChatRoom::getUsers(const QString &keyword) const
return matchedList; return matchedList;
} }
QVariantMap NeoChatRoom::getUser(const QString& userID) const QVariantMap NeoChatRoom::getUser(const QString &userID) const
{ {
NeoChatUser user(userID, connection()); NeoChatUser user(userID, connection());
return QVariantMap { return QVariantMap{{QStringLiteral("id"), user.id()},
{ QStringLiteral("id"), user.id() }, {QStringLiteral("displayName"), user.displayname(this)},
{ QStringLiteral("displayName"), user.displayname(this) }, {QStringLiteral("avatarMediaId"), user.avatarMediaId(this)},
{ QStringLiteral("avatarMediaId"), user.avatarMediaId(this) }, {QStringLiteral("color"), user.color()}};
{ QStringLiteral("color"), user.color() }
};
} }
QUrl NeoChatRoom::urlToMxcUrl(const QUrl &mxcUrl) QUrl NeoChatRoom::urlToMxcUrl(const QUrl &mxcUrl)
@@ -328,7 +326,7 @@ QString NeoChatRoom::eventToString(const RoomEvent &evt, Qt::TextFormat format,
htmlBody.replace(utils::strikethroughRegExp, "<s>\\1</s>"); htmlBody.replace(utils::strikethroughRegExp, "<s>\\1</s>");
auto url = connection()->homeserver(); auto url = connection()->homeserver();
auto base = url.scheme() + QStringLiteral("://") + url.host() + (url.port() != -1 ? ':'+QString::number(url.port()) : QString()); auto base = url.scheme() + QStringLiteral("://") + url.host() + (url.port() != -1 ? ':' + QString::number(url.port()) : QString());
htmlBody.replace(utils::mxcImageRegExp, QStringLiteral(R"(<img \1 src="%1/_matrix/media/r0/download/\2/\3" \4 > )").arg(base)); htmlBody.replace(utils::mxcImageRegExp, QStringLiteral(R"(<img \1 src="%1/_matrix/media/r0/download/\2/\3" \4 > )").arg(base));
return htmlBody; return htmlBody;
@@ -472,7 +470,7 @@ void NeoChatRoom::changeAvatar(const QUrl &localFile)
{ {
const auto job = connection()->uploadFile(localFile.toLocalFile()); const auto job = connection()->uploadFile(localFile.toLocalFile());
#ifdef QUOTIENT_07 #ifdef QUOTIENT_07
if(isJobPending(job)) { if (isJobPending(job)) {
#else #else
if (isJobRunning(job)) { if (isJobRunning(job)) {
#endif #endif
@@ -553,7 +551,7 @@ QString msgTypeToString(MessageEventType msgType)
} }
} }
QString NeoChatRoom::preprocessText(const QString& text) QString NeoChatRoom::preprocessText(const QString &text)
{ {
return markdownToHTML(text); return markdownToHTML(text);
} }

View File

@@ -16,8 +16,8 @@
#endif #endif
#include "controller.h" #include "controller.h"
#include "roommanager.h"
#include "neochatconfig.h" #include "neochatconfig.h"
#include "roommanager.h"
NotificationsManager &NotificationsManager::instance() NotificationsManager &NotificationsManager::instance()
{ {

View File

@@ -353,7 +353,7 @@ QVariant RoomListModel::data(const QModelIndex &index, int role) const
if (room->isDirectChat()) { if (room->isDirectChat()) {
return RoomType::Direct; return RoomType::Direct;
} }
const RoomCreateEvent* creationEvent = room->creation(); const RoomCreateEvent *creationEvent = room->creation();
QJsonObject contentJson = creationEvent->contentJson(); QJsonObject contentJson = creationEvent->contentJson();
QJsonObject::const_iterator typeIter = contentJson.find("type"); QJsonObject::const_iterator typeIter = contentJson.find("type");
if (typeIter != contentJson.end()) { if (typeIter != contentJson.end()) {

View File

@@ -3,13 +3,13 @@
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
#include "roommanager.h" #include "roommanager.h"
#include "neochatroom.h"
#include "neochatconfig.h"
#include "controller.h" #include "controller.h"
#include <QDesktopServices> #include "neochatconfig.h"
#include <QStandardPaths> #include "neochatroom.h"
#include <KConfigGroup> #include <KConfigGroup>
#include <KLocalizedString> #include <KLocalizedString>
#include <QDesktopServices>
#include <QStandardPaths>
#include <csapi/joining.h> #include <csapi/joining.h>
#include <utility> #include <utility>
@@ -22,7 +22,8 @@ RoomManager::RoomManager(QObject *parent)
} }
RoomManager::~RoomManager() RoomManager::~RoomManager()
{} {
}
RoomManager &RoomManager::instance() RoomManager &RoomManager::instance()
{ {
@@ -37,10 +38,9 @@ NeoChatRoom *RoomManager::currentRoom() const
void RoomManager::openResource(const QString &idOrUri, const QString &action) void RoomManager::openResource(const QString &idOrUri, const QString &action)
{ {
Uri uri { idOrUri }; Uri uri{idOrUri};
if (!uri.isValid()) { if (!uri.isValid()) {
Q_EMIT warning(i18n("Malformed or empty Matrix id"), Q_EMIT warning(i18n("Malformed or empty Matrix id"), i18n("%1 is not a correct Matrix identifier", idOrUri));
i18n("%1 is not a correct Matrix identifier", idOrUri));
return; return;
} }
auto account = Controller::instance().activeConnection(); auto account = Controller::instance().activeConnection();
@@ -57,8 +57,7 @@ void RoomManager::openResource(const QString &idOrUri, const QString &action)
const auto result = visitResource(account, uri); const auto result = visitResource(account, uri);
if (result == Quotient::CouldNotResolve) { if (result == Quotient::CouldNotResolve) {
Q_EMIT warning(i18n("Room not found"), Q_EMIT warning(i18n("Room not found"), i18n("There's no room %1 in the room list. Check the spelling and the account.", idOrUri));
i18n("There's no room %1 in the room list. Check the spelling and the account.", idOrUri));
} else { // Invalid cases should have been eliminated earlier } else { // Invalid cases should have been eliminated earlier
Q_ASSERT(result == Quotient::UriResolved); Q_ASSERT(result == Quotient::UriResolved);
} }
@@ -89,13 +88,12 @@ void RoomManager::loadInitialRoom()
openRoomForActiveConnection(); openRoomForActiveConnection();
connect(&Controller::instance(), &Controller::activeConnectionChanged, connect(&Controller::instance(), &Controller::activeConnectionChanged, this, &RoomManager::openRoomForActiveConnection);
this, &RoomManager::openRoomForActiveConnection);
} }
void RoomManager::openRoomForActiveConnection() void RoomManager::openRoomForActiveConnection()
{ {
if(!Controller::instance().activeConnection()) { if (!Controller::instance().activeConnection()) {
return; return;
} }
// Read from last open room // Read from last open room
@@ -110,8 +108,7 @@ void RoomManager::openRoomForActiveConnection()
if (!roomId.isEmpty()) { if (!roomId.isEmpty()) {
// Here we can cast because the controller has been configured to // Here we can cast because the controller has been configured to
// return NeoChatRoom instead of simple Quotient::Room // return NeoChatRoom instead of simple Quotient::Room
const auto room = qobject_cast<NeoChatRoom *>( const auto room = qobject_cast<NeoChatRoom *>(Controller::instance().activeConnection()->room(roomId));
Controller::instance().activeConnection()->room(roomId));
if (room) { if (room) {
enterRoom(room); enterRoom(room);
@@ -144,7 +141,7 @@ void RoomManager::openWindow(NeoChatRoom *room)
Q_EMIT openRoomInNewWindow(room); Q_EMIT openRoomInNewWindow(room);
} }
UriResolveResult RoomManager::visitUser(User* user, const QString &action) UriResolveResult RoomManager::visitUser(User *user, const QString &action)
{ {
if (action == "mention" || action.isEmpty()) { if (action == "mention" || action.isEmpty()) {
// send it has QVariantMap because the properties in the // send it has QVariantMap because the properties in the
@@ -186,12 +183,10 @@ void RoomManager::visitRoom(Room *room, const QString &eventId)
} }
} }
void RoomManager::joinRoom(Quotient::Connection *account, void RoomManager::joinRoom(Quotient::Connection *account, const QString &roomAliasOrId, const QStringList &viaServers)
const QString &roomAliasOrId,
const QStringList &viaServers)
{ {
account->joinRoom(QUrl::toPercentEncoding(roomAliasOrId), viaServers); account->joinRoom(QUrl::toPercentEncoding(roomAliasOrId), viaServers);
connectSingleShot(account, &Quotient::Connection::newRoom, this, [=](Quotient::Room *room){ connectSingleShot(account, &Quotient::Connection::newRoom, this, [=](Quotient::Room *room) {
enterRoom(dynamic_cast<NeoChatRoom *>(room)); enterRoom(dynamic_cast<NeoChatRoom *>(room));
}); });
} }
@@ -199,8 +194,7 @@ void RoomManager::joinRoom(Quotient::Connection *account,
bool RoomManager::visitNonMatrix(const QUrl &url) bool RoomManager::visitNonMatrix(const QUrl &url)
{ {
if (!QDesktopServices::openUrl(url)) { if (!QDesktopServices::openUrl(url)) {
Q_EMIT warning(i18n("No application for the link"), Q_EMIT warning(i18n("No application for the link"), i18n("Your operating system could not find an application for the link."));
i18n("Your operating system could not find an application for the link."));
} }
return true; return true;
} }
@@ -215,7 +209,7 @@ void RoomManager::reset()
void RoomManager::leaveRoom(NeoChatRoom *room) void RoomManager::leaveRoom(NeoChatRoom *room)
{ {
if(m_lastCurrentRoom && room->id() == m_lastCurrentRoom->id()) { if (m_lastCurrentRoom && room->id() == m_lastCurrentRoom->id()) {
m_lastCurrentRoom = nullptr; m_lastCurrentRoom = nullptr;
} }
if (m_currentRoom && m_currentRoom->id() == room->id()) { if (m_currentRoom && m_currentRoom->id() == room->id()) {

View File

@@ -3,13 +3,14 @@
#pragma once #pragma once
#include <KConfig>
#include <QObject> #include <QObject>
#include <uriresolver.h> #include <uriresolver.h>
#include <KConfig>
class NeoChatRoom; class NeoChatRoom;
namespace Quotient { namespace Quotient
{
class Room; class Room;
class User; class User;
} }
@@ -53,8 +54,7 @@ public:
// Overrided methods from UriResolverBase // Overrided methods from UriResolverBase
UriResolveResult visitUser(User *user, const QString &action) override; UriResolveResult visitUser(User *user, const QString &action) override;
void joinRoom(Quotient::Connection *account, const QString &roomAliasOrId, void joinRoom(Quotient::Connection *account, const QString &roomAliasOrId, const QStringList &viaServers) override;
const QStringList &viaServers) override;
Q_INVOKABLE void visitRoom(Quotient::Room *room, const QString &eventId) override; Q_INVOKABLE void visitRoom(Quotient::Room *room, const QString &eventId) override;
Q_INVOKABLE bool visitNonMatrix(const QUrl &url) override; Q_INVOKABLE bool visitNonMatrix(const QUrl &url) override;

View File

@@ -79,10 +79,12 @@ SpellcheckHighlighter::SpellcheckHighlighter(QObject *parent)
: QSyntaxHighlighter(parent) : QSyntaxHighlighter(parent)
#ifndef Q_OS_ANDROID #ifndef Q_OS_ANDROID
, mSpellchecker{new Sonnet::Speller()} , mSpellchecker{new Sonnet::Speller()}
, mLanguageGuesser{new Sonnet::GuessLanguage()} , mLanguageGuesser
{
new Sonnet::GuessLanguage()
}
#endif #endif
, m_document(nullptr) , m_document(nullptr), m_cursorPosition(-1)
, m_cursorPosition(-1)
{ {
// Danger red from our color scheme // Danger red from our color scheme
mErrorFormat.setForeground(QColor(0xED, 0x15, 0x15)); mErrorFormat.setForeground(QColor(0xED, 0x15, 0x15));

View File

@@ -49,7 +49,7 @@ void UserListModel::setRoom(Quotient::Room *room)
} }
for (User *user : qAsConst(m_users)) { for (User *user : qAsConst(m_users)) {
#ifdef QUOTIENT_07 #ifdef QUOTIENT_07
connect(user, &User::defaultAvatarChanged, this, [=](){ connect(user, &User::defaultAvatarChanged, this, [=]() {
avatarChanged(user, m_currentRoom); avatarChanged(user, m_currentRoom);
}); });
#else #else
@@ -154,7 +154,7 @@ void UserListModel::userAdded(Quotient::User *user)
m_users.insert(pos, user); m_users.insert(pos, user);
endInsertRows(); endInsertRows();
#ifdef QUOTIENT_07 #ifdef QUOTIENT_07
connect(user, &User::defaultAvatarChanged, this, [=](){ connect(user, &User::defaultAvatarChanged, this, [=]() {
avatarChanged(user, m_currentRoom); avatarChanged(user, m_currentRoom);
}); });
#else #else

View File

@@ -5,13 +5,12 @@
#include "webshortcutmodel.h" #include "webshortcutmodel.h"
#ifdef HAVE_KIO #ifdef HAVE_KIO
#include <KUriFilter>
#include <KIO/CommandLauncherJob> #include <KIO/CommandLauncherJob>
#include <KUriFilter>
#endif #endif
#include <KStringHandler> #include <KStringHandler>
struct KWebShortcutModelPrivate struct KWebShortcutModelPrivate {
{
QString selectedText; QString selectedText;
#ifdef HAVE_KIO #ifdef HAVE_KIO
KUriFilterData filterData; KUriFilterData filterData;
@@ -29,7 +28,6 @@ KWebShortcutModel::~KWebShortcutModel()
{ {
} }
QString KWebShortcutModel::selectedText() const QString KWebShortcutModel::selectedText() const
{ {
return d->selectedText; return d->selectedText;
@@ -101,12 +99,12 @@ QVariant KWebShortcutModel::data(const QModelIndex &index, int role) const
#ifdef HAVE_KIO #ifdef HAVE_KIO
switch (role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
return d->searchProviders[index.row()]; return d->searchProviders[index.row()];
case Qt::DecorationRole: case Qt::DecorationRole:
return d->filterData.iconNameForPreferredSearchProvider(d->searchProviders[index.row()]); return d->filterData.iconNameForPreferredSearchProvider(d->searchProviders[index.row()]);
case Qt::EditRole: case Qt::EditRole:
return d->filterData.queryForPreferredSearchProvider(d->searchProviders[index.row()]); return d->filterData.queryForPreferredSearchProvider(d->searchProviders[index.row()]);
} }
#endif #endif
return {}; return {};
@@ -115,10 +113,10 @@ QVariant KWebShortcutModel::data(const QModelIndex &index, int role) const
void KWebShortcutModel::trigger(const QString &data) void KWebShortcutModel::trigger(const QString &data)
{ {
#ifdef HAVE_KIO #ifdef HAVE_KIO
KUriFilterData filterData(data); KUriFilterData filterData(data);
if (KUriFilter::self()->filterSearchUri(filterData, KUriFilter::WebShortcutFilter)) { if (KUriFilter::self()->filterSearchUri(filterData, KUriFilter::WebShortcutFilter)) {
Q_EMIT openUrl(filterData.uri().url()); Q_EMIT openUrl(filterData.uri().url());
} }
#else #else
Q_UNUSED(data); Q_UNUSED(data);
#endif #endif
@@ -127,7 +125,7 @@ void KWebShortcutModel::trigger(const QString &data)
void KWebShortcutModel::configureWebShortcuts() void KWebShortcutModel::configureWebShortcuts()
{ {
#ifdef HAVE_KIO #ifdef HAVE_KIO
auto job = new KIO::CommandLauncherJob("kcmshell5", QStringList() << "webshortcuts", this); auto job = new KIO::CommandLauncherJob("kcmshell5", QStringList() << "webshortcuts", this);
job->exec(); job->exec();
#endif #endif
} }

View File

@@ -62,6 +62,7 @@ public:
Q_SIGNALS: Q_SIGNALS:
void selectedTextChanged(); void selectedTextChanged();
void openUrl(const QUrl &url); void openUrl(const QUrl &url);
private: private:
std::unique_ptr<KWebShortcutModelPrivate> d; std::unique_ptr<KWebShortcutModelPrivate> d;
}; };