From e2f547149a5d54747ab44a6f777f91edd8d2f76e Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Mon, 27 Jan 2020 15:59:25 +0100
Subject: [PATCH] Allow sending messages as plain text

---
 src/ChatPage.cpp                     |  2 +-
 src/UserSettingsPage.cpp             | 89 ++++++++++++----------------
 src/UserSettingsPage.h               | 10 ++++
 src/install-debian.txt               | 24 ++++++++
 src/timeline/TimelineViewManager.cpp | 17 ++++--
 src/timeline/TimelineViewManager.h   |  5 +-
 6 files changed, 88 insertions(+), 59 deletions(-)
 create mode 100644 src/install-debian.txt

diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 125e229a4..c7739281e 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -116,7 +116,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
         contentLayout_->setMargin(0);
 
         top_bar_      = new TopRoomBar(this);
-        view_manager_ = new TimelineViewManager(this);
+        view_manager_ = new TimelineViewManager(userSettings_, this);
 
         contentLayout_->addWidget(top_bar_);
         contentLayout_->addWidget(view_manager_->getWidget());
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 6809d605c..b73f80a17 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -50,6 +50,7 @@ UserSettings::load()
         hasDesktopNotifications_      = settings.value("user/desktop_notifications", true).toBool();
         isStartInTrayEnabled_         = settings.value("user/window/start_in_tray", false).toBool();
         isGroupViewEnabled_           = settings.value("user/group_view", true).toBool();
+        isMarkdownEnabled_            = settings.value("user/markdown_enabled", true).toBool();
         isTypingNotificationsEnabled_ = settings.value("user/typing_notifications", true).toBool();
         isReadReceiptsEnabled_        = settings.value("user/read_receipts", true).toBool();
         theme_                        = settings.value("user/theme", defaultTheme_).toString();
@@ -126,6 +127,7 @@ UserSettings::save()
         settings.setValue("typing_notifications", isTypingNotificationsEnabled_);
         settings.setValue("read_receipts", isReadReceiptsEnabled_);
         settings.setValue("group_view", isGroupViewEnabled_);
+        settings.setValue("markdown_enabled", isMarkdownEnabled_);
         settings.setValue("desktop_notifications", hasDesktopNotifications_);
         settings.setValue("theme", theme());
         settings.setValue("font_family", font_);
@@ -167,70 +169,46 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         topBarLayout_->addWidget(backBtn_, 1, Qt::AlignLeft | Qt::AlignVCenter);
         topBarLayout_->addStretch(1);
 
-        auto trayOptionLayout_ = new QHBoxLayout;
-        trayOptionLayout_->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto trayLabel = new QLabel(tr("Minimize to tray"), this);
-        trayLabel->setFont(font);
-        trayToggle_ = new Toggle(this);
+        auto addSetting = [this, &font](QString labelText) {
+                auto layout = new QHBoxLayout;
+                layout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
 
-        trayOptionLayout_->addWidget(trayLabel);
-        trayOptionLayout_->addWidget(trayToggle_, 0, Qt::AlignRight);
+                auto label = new QLabel(labelText, this);
+                label->setFont(font);
 
-        auto startInTrayOptionLayout_ = new QHBoxLayout;
-        startInTrayOptionLayout_->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto startInTrayLabel = new QLabel(tr("Start in tray"), this);
-        startInTrayLabel->setFont(font);
-        startInTrayToggle_ = new Toggle(this);
-        if (!settings_->isTrayEnabled())
-                startInTrayToggle_->setDisabled(true);
+                auto toggle = new Toggle(this);
 
-        startInTrayOptionLayout_->addWidget(startInTrayLabel);
-        startInTrayOptionLayout_->addWidget(startInTrayToggle_, 0, Qt::AlignRight);
+                layout->addWidget(label);
+                layout->addWidget(toggle, 0, Qt::AlignRight);
 
-        auto groupViewLayout = new QHBoxLayout;
-        groupViewLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto groupViewLabel = new QLabel(tr("Group's sidebar"), this);
-        groupViewLabel->setFont(font);
-        groupViewToggle_ = new Toggle(this);
+                return std::pair{layout, toggle};
+        };
 
-        groupViewLayout->addWidget(groupViewLabel);
-        groupViewLayout->addWidget(groupViewToggle_, 0, Qt::AlignRight);
+        QHBoxLayout *trayOptionLayout_           = nullptr;
+        std::tie(trayOptionLayout_, trayToggle_) = addSetting(tr("Minimize to tray"));
 
-        auto avatarViewLayout = new QHBoxLayout;
-        avatarViewLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto avatarViewLabel = new QLabel(tr("Circular Avatars"), this);
-        avatarViewLabel->setFont(font);
-        avatarCircles_ = new Toggle(this);
-
-        avatarViewLayout->addWidget(avatarViewLabel);
-        avatarViewLayout->addWidget(avatarCircles_, 0, Qt::AlignRight);
+        QHBoxLayout *startInTrayOptionLayout_                  = nullptr;
+        std::tie(startInTrayOptionLayout_, startInTrayToggle_) = addSetting(tr("Start in tray"));
+        if (!settings_->isTrayEnabled())
+                startInTrayToggle_->setDisabled(true);
 
-        auto typingLayout = new QHBoxLayout;
-        typingLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto typingLabel = new QLabel(tr("Typing notifications"), this);
-        typingLabel->setFont(font);
-        typingNotifications_ = new Toggle(this);
+        QHBoxLayout *groupViewLayout                = nullptr;
+        std::tie(groupViewLayout, groupViewToggle_) = addSetting(tr("Group's sidebar"));
 
-        typingLayout->addWidget(typingLabel);
-        typingLayout->addWidget(typingNotifications_, 0, Qt::AlignRight);
+        QHBoxLayout *avatarViewLayout              = nullptr;
+        std::tie(avatarViewLayout, avatarCircles_) = addSetting(tr("Circular Avatars"));
 
-        auto receiptsLayout = new QHBoxLayout;
-        receiptsLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto receiptsLabel = new QLabel(tr("Read receipts"), this);
-        receiptsLabel->setFont(font);
-        readReceipts_ = new Toggle(this);
+        QHBoxLayout *typingLayout                    = nullptr;
+        std::tie(typingLayout, typingNotifications_) = addSetting(tr("Typing notifications"));
 
-        receiptsLayout->addWidget(receiptsLabel);
-        receiptsLayout->addWidget(readReceipts_, 0, Qt::AlignRight);
+        QHBoxLayout *receiptsLayout             = nullptr;
+        std::tie(receiptsLayout, readReceipts_) = addSetting(tr("Read receipts"));
 
-        auto desktopLayout = new QHBoxLayout;
-        desktopLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
-        auto desktopLabel = new QLabel(tr("Desktop notifications"), this);
-        desktopLabel->setFont(font);
-        desktopNotifications_ = new Toggle(this);
+        QHBoxLayout *markdownLayout                = nullptr;
+        std::tie(markdownLayout, markdownEnabled_) = addSetting(tr("Send messages as markdown"));
 
-        desktopLayout->addWidget(desktopLabel);
-        desktopLayout->addWidget(desktopNotifications_, 0, Qt::AlignRight);
+        QHBoxLayout *desktopLayout                     = nullptr;
+        std::tie(desktopLayout, desktopNotifications_) = addSetting(tr("Desktop notifications"));
 
         auto scaleFactorOptionLayout = new QHBoxLayout;
         scaleFactorOptionLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin);
@@ -385,6 +363,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         mainLayout_->addWidget(new HorizontalLine(this));
         mainLayout_->addLayout(typingLayout);
         mainLayout_->addLayout(receiptsLayout);
+        mainLayout_->addLayout(markdownLayout);
         mainLayout_->addLayout(desktopLayout);
         mainLayout_->addWidget(new HorizontalLine(this));
 
@@ -466,6 +445,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
                 settings_->setAvatarCircles(!isDisabled);
         });
 
+        connect(markdownEnabled_, &Toggle::toggled, this, [this](bool isDisabled) {
+                settings_->setMarkdownEnabled(!isDisabled);
+        });
+
         connect(typingNotifications_, &Toggle::toggled, this, [this](bool isDisabled) {
                 settings_->setTypingNotifications(!isDisabled);
         });
@@ -496,8 +479,10 @@ UserSettingsPage::showEvent(QShowEvent *)
         trayToggle_->setState(!settings_->isTrayEnabled());
         startInTrayToggle_->setState(!settings_->isStartInTrayEnabled());
         groupViewToggle_->setState(!settings_->isGroupViewEnabled());
+        avatarCircles_->setState(!settings_->isAvatarCirclesEnabled());
         typingNotifications_->setState(!settings_->isTypingNotificationsEnabled());
         readReceipts_->setState(!settings_->isReadReceiptsEnabled());
+        markdownEnabled_->setState(!settings_->isMarkdownEnabled());
         desktopNotifications_->setState(!settings_->hasDesktopNotifications());
         deviceIdValue_->setText(QString::fromStdString(http::client()->device_id()));
 
diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index 28236e831..8658e80e0 100644
--- a/src/UserSettingsPage.h
+++ b/src/UserSettingsPage.h
@@ -68,6 +68,12 @@ public:
                 save();
         }
 
+        void setMarkdownEnabled(bool state)
+        {
+                isMarkdownEnabled_ = state;
+                save();
+        }
+
         void setReadReceipts(bool state)
         {
                 isReadReceiptsEnabled_ = state;
@@ -96,6 +102,8 @@ public:
         bool isTrayEnabled() const { return isTrayEnabled_; }
         bool isStartInTrayEnabled() const { return isStartInTrayEnabled_; }
         bool isGroupViewEnabled() const { return isGroupViewEnabled_; }
+        bool isAvatarCirclesEnabled() const { return avatarCircles_; }
+        bool isMarkdownEnabled() const { return isMarkdownEnabled_; }
         bool isTypingNotificationsEnabled() const { return isTypingNotificationsEnabled_; }
         bool isReadReceiptsEnabled() const { return isReadReceiptsEnabled_; }
         bool hasDesktopNotifications() const { return hasDesktopNotifications_; }
@@ -116,6 +124,7 @@ private:
         bool isTrayEnabled_;
         bool isStartInTrayEnabled_;
         bool isGroupViewEnabled_;
+        bool isMarkdownEnabled_;
         bool isTypingNotificationsEnabled_;
         bool isReadReceiptsEnabled_;
         bool hasDesktopNotifications_;
@@ -168,6 +177,7 @@ private:
         Toggle *groupViewToggle_;
         Toggle *typingNotifications_;
         Toggle *readReceipts_;
+        Toggle *markdownEnabled_;
         Toggle *desktopNotifications_;
         Toggle *avatarCircles_;
         QLabel *deviceFingerprintValue_;
diff --git a/src/install-debian.txt b/src/install-debian.txt
new file mode 100644
index 000000000..68387665f
--- /dev/null
+++ b/src/install-debian.txt
@@ -0,0 +1,24 @@
+sudo apt install cmake
+sudo apt install gcc make automake
+sudo apt install qt5-default
+sudo apt install liblmdb-dev
+sudo apt install qttools5-dev-tools
+sudo apt install qttools5-dev-tools
+sudo apt install qttools5
+sudo apt install qt5-qmltooling-plugins qml-module-qtgstreamer
+sudo apt install libqt5webview5-dev
+sudo apt install libqt5quickcontrols2-5
+sudo apt install qtquickcontrols2-5-dev
+sudo apt install libssl-dev
+sudo apt install qml-module-qtgraphicaleffects
+sudo apt install qml-module-qtquick-controls2
+sudo apt install qml-module-qtquick-layouts
+sudo apt install qml-module-qtmultimedia
+sudo apt install qml-module-qt-labs-settings qml-module-qt-labs-sharedimage
+sudo apt install qttools5-dev
+sudo apt install libqt5svg5-dev
+sudo apt install qt5multimedia
+sudo apt install libqt5multimedia5
+sudo apt install libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5multimediawidgets5
+sudo apt install qt5ct
+sudo apt install qtmultimedia5-dev
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index b3fd65a1b..578d075f3 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -18,8 +18,7 @@ Q_DECLARE_METATYPE(mtx::events::collections::TimelineEvents)
 void
 TimelineViewManager::updateColorPalette()
 {
-        UserSettings settings;
-        if (settings.theme() == "light") {
+        if (settings->theme() == "light") {
                 QPalette lightActive(/*windowText*/ QColor("#333"),
                                      /*button*/ QColor("#333"),
                                      /*light*/ QColor(),
@@ -31,7 +30,7 @@ TimelineViewManager::updateColorPalette()
                                      /*window*/ QColor("white"));
                 view->rootContext()->setContextProperty("currentActivePalette", lightActive);
                 view->rootContext()->setContextProperty("currentInactivePalette", lightActive);
-        } else if (settings.theme() == "dark") {
+        } else if (settings->theme() == "dark") {
                 QPalette darkActive(/*windowText*/ QColor("#caccd1"),
                                     /*button*/ QColor("#caccd1"),
                                     /*light*/ QColor(),
@@ -50,9 +49,10 @@ TimelineViewManager::updateColorPalette()
         }
 }
 
-TimelineViewManager::TimelineViewManager(QWidget *parent)
+TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettings, QWidget *parent)
   : imgProvider(new MxcImageProvider())
   , colorImgProvider(new ColorImageProvider())
+  , settings(userSettings)
 {
         qmlRegisterUncreatableMetaObject(qml_mtx_events::staticMetaObject,
                                          "im.nheko",
@@ -207,6 +207,11 @@ TimelineViewManager::queueTextMessage(const QString &msg, const std::optional<Re
                 text.relates_to.in_reply_to.event_id = related->related_event;
         }
 
+        if (!settings->isMarkdownEnabled()) {
+                text.format         = "";
+                text.formatted_body = "";
+        }
+
         if (timeline_)
                 timeline_->sendMessage(text);
 }
@@ -219,8 +224,10 @@ TimelineViewManager::queueEmoteMessage(const QString &msg)
         mtx::events::msg::Emote emote;
         emote.body = msg.trimmed().toStdString();
 
-        if (html != msg.trimmed().toHtmlEscaped())
+        if (html != msg.trimmed().toHtmlEscaped() && settings->isMarkdownEnabled()) {
                 emote.formatted_body = html.toStdString();
+                emote.format         = "org.matrix.custom.html";
+        }
 
         if (timeline_)
                 timeline_->sendMessage(emote);
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 63075649e..426e066f8 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -15,6 +15,7 @@
 
 class MxcImageProvider;
 class ColorImageProvider;
+class UserSettings;
 
 class TimelineViewManager : public QObject
 {
@@ -26,7 +27,7 @@ class TimelineViewManager : public QObject
           bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged)
 
 public:
-        TimelineViewManager(QWidget *parent = 0);
+        TimelineViewManager(QSharedPointer<UserSettings> userSettings, QWidget *parent = 0);
         QWidget *getWidget() const { return container; }
 
         void sync(const mtx::responses::Rooms &rooms);
@@ -97,4 +98,6 @@ private:
         QHash<QString, QSharedPointer<TimelineModel>> models;
         TimelineModel *timeline_ = nullptr;
         bool isInitialSync_      = true;
+
+        QSharedPointer<UserSettings> settings;
 };
-- 
GitLab