From e5a6b2b6efcb56072146aad5996132070f9c2078 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Fri, 6 Aug 2021 04:31:30 +0200
Subject: [PATCH] Allow creating new packs

---
 .../qml/dialogs/ImagePackEditorDialog.qml     |  8 +++---
 .../qml/dialogs/ImagePackSettingsDialog.qml   | 28 +++++++++++++++++++
 src/Cache.cpp                                 |  2 +-
 src/ImagePackListModel.cpp                    | 18 ++++++++++++
 src/ImagePackListModel.h                      |  4 +++
 src/SingleImagePackModel.cpp                  |  4 ++-
 6 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/resources/qml/dialogs/ImagePackEditorDialog.qml b/resources/qml/dialogs/ImagePackEditorDialog.qml
index 893012152..b839c9e34 100644
--- a/resources/qml/dialogs/ImagePackEditorDialog.qml
+++ b/resources/qml/dialogs/ImagePackEditorDialog.qml
@@ -186,7 +186,7 @@ ApplicationWindow {
 
                     ToggleButton {
                         checked: imagePack.isEmotePack
-                        onToggled: imagePack.isEmotePack = checked
+                        onClicked: imagePack.isEmotePack = checked
                         Layout.alignment: Qt.AlignRight
                     }
 
@@ -196,7 +196,7 @@ ApplicationWindow {
 
                     ToggleButton {
                         checked: imagePack.isStickerPack
-                        onToggled: imagePack.isStickerPack = checked
+                        onClicked: imagePack.isStickerPack = checked
                         Layout.alignment: Qt.AlignRight
                     }
 
@@ -251,7 +251,7 @@ ApplicationWindow {
 
                     ToggleButton {
                         checked: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.IsEmote)
-                        onToggled: imagePack.setData(imagePack.index(currentImageIndex, 0), text, SingleImagePackModel.IsEmote)
+                        onClicked: imagePack.setData(imagePack.index(currentImageIndex, 0), checked, SingleImagePackModel.IsEmote)
                         Layout.alignment: Qt.AlignRight
                     }
 
@@ -261,7 +261,7 @@ ApplicationWindow {
 
                     ToggleButton {
                         checked: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.IsSticker)
-                        onToggled: imagePack.setData(imagePack.index(currentImageIndex, 0), text, SingleImagePackModel.IsSticker)
+                        onClicked: imagePack.setData(imagePack.index(currentImageIndex, 0), checked, SingleImagePackModel.IsSticker)
                         Layout.alignment: Qt.AlignRight
                     }
 
diff --git a/resources/qml/dialogs/ImagePackSettingsDialog.qml b/resources/qml/dialogs/ImagePackSettingsDialog.qml
index c57867fd6..5181619c0 100644
--- a/resources/qml/dialogs/ImagePackSettingsDialog.qml
+++ b/resources/qml/dialogs/ImagePackSettingsDialog.qml
@@ -62,6 +62,34 @@ ApplicationWindow {
                     enabled: !Settings.mobileMode
                 }
 
+                footer: ColumnLayout {
+                    Button {
+                        palette: Nheko.colors
+                        onClicked: {
+                            var dialog = packEditor.createObject(timelineRoot, {
+                                "imagePack": packlist.newPack(false)
+                            });
+                            dialog.show();
+                        }
+                        width: packlist.width
+                        visible: !packlist.containsAccountPack
+                        text: qsTr("Create account pack")
+                    }
+
+                    Button {
+                        palette: Nheko.colors
+                        onClicked: {
+                            var dialog = packEditor.createObject(timelineRoot, {
+                                "imagePack": packlist.newPack(true)
+                            });
+                            dialog.show();
+                        }
+                        width: packlist.width
+                        text: qsTr("New room pack")
+                    }
+
+                }
+
                 delegate: AvatarListTile {
                     id: packItem
 
diff --git a/src/Cache.cpp b/src/Cache.cpp
index f3f3dbb65..6650334ad 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -3401,7 +3401,7 @@ Cache::getImagePacks(const std::string &room_id, std::optional<bool> stickers)
                         info.pack.pack   = pack.pack;
 
                         for (const auto &img : pack.images) {
-                                if (img.second.overrides_usage() &&
+                                if (stickers.has_value() && img.second.overrides_usage() &&
                                     (stickers ? !img.second.is_sticker() : !img.second.is_emoji()))
                                         continue;
 
diff --git a/src/ImagePackListModel.cpp b/src/ImagePackListModel.cpp
index 89f1f68ec..6392de228 100644
--- a/src/ImagePackListModel.cpp
+++ b/src/ImagePackListModel.cpp
@@ -74,3 +74,21 @@ ImagePackListModel::packAt(int row)
         QQmlEngine::setObjectOwnership(e, QQmlEngine::CppOwnership);
         return e;
 }
+
+SingleImagePackModel *
+ImagePackListModel::newPack(bool inRoom)
+{
+        ImagePackInfo info{};
+        if (inRoom)
+                info.source_room = room_id;
+        return new SingleImagePackModel(info);
+}
+
+bool
+ImagePackListModel::containsAccountPack() const
+{
+        for (const auto &p : packs)
+                if (p->roomid().isEmpty())
+                        return true;
+        return false;
+}
diff --git a/src/ImagePackListModel.h b/src/ImagePackListModel.h
index 0a044690f..2aa5abb25 100644
--- a/src/ImagePackListModel.h
+++ b/src/ImagePackListModel.h
@@ -12,6 +12,7 @@ class SingleImagePackModel;
 class ImagePackListModel : public QAbstractListModel
 {
         Q_OBJECT
+        Q_PROPERTY(bool containsAccountPack READ containsAccountPack CONSTANT)
 public:
         enum Roles
         {
@@ -29,6 +30,9 @@ public:
         QVariant data(const QModelIndex &index, int role) const override;
 
         Q_INVOKABLE SingleImagePackModel *packAt(int row);
+        Q_INVOKABLE SingleImagePackModel *newPack(bool inRoom);
+
+        bool containsAccountPack() const;
 
 private:
         std::string room_id;
diff --git a/src/SingleImagePackModel.cpp b/src/SingleImagePackModel.cpp
index ddecf1ad7..dea252640 100644
--- a/src/SingleImagePackModel.cpp
+++ b/src/SingleImagePackModel.cpp
@@ -15,7 +15,7 @@
 #include "timeline/Permissions.h"
 #include "timeline/TimelineModel.h"
 
-Q_DECLARE_METATYPE(mtx::common::ImageInfo);
+Q_DECLARE_METATYPE(mtx::common::ImageInfo)
 
 SingleImagePackModel::SingleImagePackModel(ImagePackInfo pack_, QObject *parent)
   : QAbstractListModel(parent)
@@ -285,6 +285,8 @@ SingleImagePackModel::save()
                                   ChatPage::instance()->showNotification(
                                     tr("Failed to update image pack: {}")
                                       .arg(QString::fromStdString(e->matrix_error.error)));
+
+                          nhlog::net()->info("Uploaded image pack: {}", statekey_);
                   });
         }
 }
-- 
GitLab