solve multiple conflicts from choose resolution
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 12 May 2023 13:01:28 +0000 (15:01 +0200)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Wed, 17 May 2023 06:43:54 +0000 (08:43 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/gui/ResolveConflictsDialog.qml
src/gui/conflictsolver.h
src/gui/syncconflictsmodel.cpp
src/gui/syncconflictsmodel.h

index d94541601147faad1782d067c18f4af7525ff6cd..b0a320e9f3ff603be5728ecc8ea62a694e95a3aa 100644 (file)
@@ -156,12 +156,11 @@ QtWindow.Window {
             }
 
             onAccepted: function() {
-                console.log("Ok clicked")
+                realModel.applyResolution()
                 Systray.destroyDialog(conflictsDialog)
             }
 
             onRejected: function() {
-                console.log("Cancel clicked")
                 Systray.destroyDialog(conflictsDialog)
             }
         }
index b000e78dcc2f75c732965607a1b66f964194af3e..018741b05ec89a9b8506d0c17494ebbe7bc7ce3f 100644 (file)
@@ -32,6 +32,7 @@ public:
         KeepRemoteVersion,
         KeepBothVersions
     };
+    Q_ENUM(Solution);
 
     explicit ConflictSolver(QWidget *parent = nullptr);
 
index cc9f4302b325cd90eaa4491fb6bb8e1531df4a8e..0a80e9a6dabcca3dc48b69696806b19addaae57e 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include "syncconflictsmodel.h"
+
 #include "folderman.h"
 
 #include <QLoggingCategory>
@@ -221,6 +222,19 @@ void SyncConflictsModel::selectAllConflicting(bool selected)
     }
 }
 
+void SyncConflictsModel::applyResolution()
+{
+    for(const auto &syncConflict : qAsConst(mConflictData)) {
+        if (syncConflict.isValid()) {
+            qCInfo(lcSyncConflictsModel) << syncConflict.mExistingFilePath << syncConflict.mConflictingFilePath << syncConflict.solution();
+            ConflictSolver solver;
+            solver.setLocalVersionFilename(syncConflict.mConflictingFilePath);
+            solver.setRemoteVersionFilename(syncConflict.mExistingFilePath);
+            solver.exec(syncConflict.solution());
+        }
+    }
+}
+
 void SyncConflictsModel::updateConflictsData()
 {
     mConflictData.clear();
@@ -260,6 +274,8 @@ void SyncConflictsModel::updateConflictsData()
             QUrl{QStringLiteral("image://tray-image-provider/:/fileicon") + conflictFileInfo.filePath()},
             false,
             false,
+            existingFileInfo.filePath(),
+            conflictFileInfo.filePath(),
         };
 
         mConflictData.push_back(std::move(newConflictData));
@@ -316,4 +332,24 @@ void SyncConflictsModel::setConflictingSelected(bool value,
     }
 }
 
+ConflictSolver::Solution SyncConflictsModel::ConflictInfo::solution() const
+{
+    auto result = ConflictSolver::Solution{};
+
+    if (mConflictSelected && mExistingSelected) {
+        result = ConflictSolver::KeepBothVersions;
+    } else if (!mConflictSelected && mExistingSelected) {
+        result = ConflictSolver::KeepLocalVersion;
+    } else if (mConflictSelected && !mExistingSelected) {
+        result = ConflictSolver::KeepRemoteVersion;
+    }
+
+    return result;
+}
+
+bool SyncConflictsModel::ConflictInfo::isValid() const
+{
+    return mConflictSelected || mExistingSelected;
+}
+
 }
index 2586ab17b03f20842ca330b0a4492e9e6fe1af51..e77d132babac2c95d90654fcd95973d56a090bc4 100644 (file)
@@ -17,6 +17,8 @@
 
 #include "tray/activitydata.h"
 
+#include "conflictsolver.h"
+
 #include <QAbstractListModel>
 #include <QMimeDatabase>
 #include <QLocale>
@@ -43,6 +45,11 @@ class SyncConflictsModel : public QAbstractListModel
         QUrl mConflictPreviewUrl;
         bool mExistingSelected = false;
         bool mConflictSelected = false;
+        QString mExistingFilePath;
+        QString mConflictingFilePath;
+
+        [[nodiscard]] ConflictSolver::Solution solution() const;
+        [[nodiscard]] bool isValid() const;
     };
 
 public:
@@ -85,6 +92,8 @@ public slots:
 
     void selectAllConflicting(bool selected);
 
+    void applyResolution();
+
 signals:
     void conflictActivitiesChanged();