summary refs log tree commit diff
path: root/src/ui
diff options
context:
space:
mode:
authorDeepBlueV7.X <nicolas.werner@hotmail.de>2022-02-12 18:52:47 +0000
committerGitHub <noreply@github.com>2022-02-12 18:52:47 +0000
commita930e3c804c56aeb4f8d336b19d4abcd699556d1 (patch)
tree73f06796cff7941b9f0e7ab2b2a9e59054da0afa /src/ui
parentFix application name on Wayland in flatpak (diff)
parentHidden events: Refactor slightly for reusability (diff)
downloadnheko-a930e3c804c56aeb4f8d336b19d4abcd699556d1.tar.xz
Merge pull request #891 from tastytea/hidden-events-gui
Add GUI to change hidden events per room
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/HiddenEvents.cpp93
-rw-r--r--src/ui/HiddenEvents.h46
-rw-r--r--src/ui/RoomSettings.cpp3
-rw-r--r--src/ui/RoomSettings.h2
4 files changed, 144 insertions, 0 deletions
diff --git a/src/ui/HiddenEvents.cpp b/src/ui/HiddenEvents.cpp
new file mode 100644

index 00000000..a8da812e --- /dev/null +++ b/src/ui/HiddenEvents.cpp
@@ -0,0 +1,93 @@ +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "HiddenEvents.h" + +#include "Cache_p.h" +#include "MainWindow.h" +#include "MatrixClient.h" + +void +HiddenEvents::load() +{ + using namespace mtx::events; + mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEvents; + hiddenEvents.hidden_event_types = std::vector{ + EventType::Reaction, + EventType::CallCandidates, + EventType::Unsupported, + }; + + if (auto temp = + cache::client()->getAccountData(mtx::events::EventType::NhekoHiddenEvents, "")) { + auto h = std::get< + mtx::events::AccountDataEvent<mtx::events::account_data::nheko_extensions::HiddenEvents>>( + *temp); + if (h.content.hidden_event_types) + hiddenEvents = std::move(h.content); + } + + if (!roomid_.isEmpty()) { + if (auto temp = cache::client()->getAccountData(mtx::events::EventType::NhekoHiddenEvents, + roomid_.toStdString())) { + auto h = std::get<mtx::events::AccountDataEvent< + mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp); + if (h.content.hidden_event_types) + hiddenEvents = std::move(h.content); + } + } + + hiddenEvents_.clear(); + hiddenEvents_ = std::move(hiddenEvents.hidden_event_types.value()); + emit hiddenEventsChanged(); +} + +Q_INVOKABLE void +HiddenEvents::toggle(int type) +{ + auto t = qml_mtx_events::fromRoomEventType(static_cast<qml_mtx_events::EventType>(type)); + if (auto it = std::find(begin(hiddenEvents_), end(hiddenEvents_), t); it != end(hiddenEvents_)) + hiddenEvents_.erase(it); + else + hiddenEvents_.push_back(t); + emit hiddenEventsChanged(); +} + +QVariantList +HiddenEvents::hiddenEvents() const +{ + QVariantList l; + for (const auto &e : hiddenEvents_) { + l.push_back(qml_mtx_events::toRoomEventType(e)); + } + + return l; +} + +void +HiddenEvents::save() +{ + mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEvents; + hiddenEvents.hidden_event_types = hiddenEvents_; + + if (roomid_.isEmpty()) + http::client()->put_account_data(hiddenEvents, [](mtx::http::RequestErr e) { + if (e) { + nhlog::net()->error("Failed to set hidden events: {}", *e); + MainWindow::instance()->showNotification( + tr("Failed to set hidden events: %1") + .arg(QString::fromStdString(e->matrix_error.error))); + } + }); + else + http::client()->put_room_account_data( + roomid_.toStdString(), hiddenEvents, [](mtx::http::RequestErr e) { + if (e) { + nhlog::net()->error("Failed to set hidden events: {}", *e); + MainWindow::instance()->showNotification( + tr("Failed to set hidden events: %1") + .arg(QString::fromStdString(e->matrix_error.error))); + } + }); +} diff --git a/src/ui/HiddenEvents.h b/src/ui/HiddenEvents.h new file mode 100644
index 00000000..928b14ba --- /dev/null +++ b/src/ui/HiddenEvents.h
@@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include <QObject> +#include <QString> +#include <QVariantList> + +#include "timeline/TimelineModel.h" + +class HiddenEvents : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString roomid READ roomid WRITE setRoomid NOTIFY roomidChanged REQUIRED) + Q_PROPERTY(QVariantList hiddenEvents READ hiddenEvents NOTIFY hiddenEventsChanged) +public: + explicit HiddenEvents(QObject *p = nullptr) + : QObject(p) + {} + + Q_INVOKABLE void toggle(int type); + Q_INVOKABLE void save(); + + [[nodiscard]] QString roomid() const { return roomid_; } + void setRoomid(const QString &r) + { + roomid_ = r; + emit roomidChanged(); + + load(); + } + + [[nodiscard]] QVariantList hiddenEvents() const; + +signals: + void roomidChanged(); + void hiddenEventsChanged(); + +private: + QString roomid_; + std::vector<mtx::events::EventType> hiddenEvents_; + + void load(); +}; diff --git a/src/ui/RoomSettings.cpp b/src/ui/RoomSettings.cpp
index 5407edee..43a11b7f 100644 --- a/src/ui/RoomSettings.cpp +++ b/src/ui/RoomSettings.cpp
@@ -12,10 +12,13 @@ #include <QMimeDatabase> #include <QStandardPaths> #include <QVBoxLayout> +#include <mtx/events/event_type.hpp> #include <mtx/responses/common.hpp> #include <mtx/responses/media.hpp> +#include <mtxclient/http/client.hpp> #include "Cache.h" +#include "Cache_p.h" #include "Config.h" #include "Logging.h" #include "MatrixClient.h" diff --git a/src/ui/RoomSettings.h b/src/ui/RoomSettings.h
index 75b7bae0..f79aa3f7 100644 --- a/src/ui/RoomSettings.h +++ b/src/ui/RoomSettings.h
@@ -8,8 +8,10 @@ #include <QLabel> #include <QObject> #include <QPushButton> +#include <QSet> #include <QString> +#include <mtx/events/event_type.hpp> #include <mtx/events/guest_access.hpp> #include "CacheStructs.h"