Window {
id: root
+ required property var allConflicts
+
flags: Qt.Dialog
visible: true
SyncConflictsModel {
id: realModel
+
+ conflictActivities: root.allConflicts
}
ScrollView {
id: conflictListView
model: DelegateModel {
- model: ListModel {
- ListElement {
- existingFileName: 'Text File.txt'
- conflictFileName: 'Text File.txt'
- existingSize: '2 B'
- conflictSize: '15 B'
- existingDate: '28 avril 2023 09:53'
- conflictDate: '28 avril 2023 09:53'
- existingSelected: false
- conflictSelected: false
- existingPreviewUrl: 'https://nextcloud.local/index.php/apps/theming/img/core/filetypes/text.svg?v=b9feb2d6'
- conflictPreviewUrl: 'https://nextcloud.local/index.php/apps/theming/img/core/filetypes/text.svg?v=b9feb2d6'
- }
-
- ListElement {
- existingFileName: 'Text File.txt'
- conflictFileName: 'Text File.txt'
- existingSize: '2 B'
- conflictSize: '15 B'
- existingDate: '28 avril 2023 09:53'
- conflictDate: '28 avril 2023 09:53'
- existingSelected: false
- conflictSelected: false
- existingPreviewUrl: 'https://nextcloud.local/index.php/apps/theming/img/core/filetypes/text.svg?v=b9feb2d6'
- conflictPreviewUrl: 'https://nextcloud.local/index.php/apps/theming/img/core/filetypes/text.svg?v=b9feb2d6'
- }
-
- ListElement {
- existingFileName: 'Text File.txt'
- conflictFileName: 'Text File.txt'
- existingSize: '2 B'
- conflictSize: '15 B'
- existingDate: '28 avril 2023 09:53'
- conflictDate: '28 avril 2023 09:53'
- existingSelected: false
- conflictSelected: false
- existingPreviewUrl: 'https://nextcloud.local/index.php/apps/theming/img/core/filetypes/text.svg?v=b9feb2d6'
- conflictPreviewUrl: 'https://nextcloud.local/index.php/apps/theming/img/core/filetypes/text.svg?v=b9feb2d6'
- }
- }
+ model: realModel
delegate: ConflictDelegate {
width: conflictListView.contentItem.width
_editFileLocallyLoadingDialog = nullptr;
}
-void Systray::createResolveConflictsDialog()
+void Systray::createResolveConflictsDialog(const OCC::ActivityList &allConflicts)
{
const auto callDialog = new QQmlComponent(_trayEngine, QStringLiteral("qrc:/qml/src/gui/ResolveConflictsDialog.qml"));
- const QVariantMap initialProperties{};
+ const QVariantMap initialProperties{
+ {"allConflicts", QVariant::fromValue(allConflicts)},
+ };
if(callDialog->isError()) {
qCWarning(lcSystray) << callDialog->errorString();
void createCallDialog(const OCC::Activity &callNotification, const OCC::AccountStatePtr accountState);
void createEditFileLocallyLoadingDialog(const QString &fileName);
void destroyEditFileLocallyLoadingDialog();
- void createResolveConflictsDialog();
+ void createResolveConflictsDialog(const OCC::ActivityList &allConflicts);
void slotCurrentUserChanged();
contentsFont.bold: true
bgColor: Style.currentUserHeaderColor
- visible: !syncStatus.syncing &&
+ visible: !activityModel.hasManySyncConflicts &&
+ !syncStatus.syncing &&
NC.UserModel.currentUser.hasLocalFolder &&
NC.UserModel.currentUser.isConnected
enabled: visible
}
}
}
+
+ CustomButton {
+ Layout.preferredWidth: syncNowFm.boundingRect(text).width +
+ leftPadding +
+ rightPadding +
+ Style.standardSpacing * 2
+ Layout.rightMargin: Style.trayHorizontalMargin
+
+ text: qsTr("Solve all conflicts")
+ textColor: Style.adjustedCurrentUserHeaderColor
+ textColorHovered: Style.currentUserHeaderTextColor
+ contentsFont.bold: true
+ bgColor: Style.currentUserHeaderColor
+
+ visible: activityModel.hasManySyncConflicts &&
+ !syncStatus.syncing &&
+ NC.UserModel.currentUser.hasLocalFolder &&
+ NC.UserModel.currentUser.isConnected
+ enabled: visible
+ onClicked: {
+ Systray.createResolveConflictsDialog();
+ }
+ }
}
_finalList.append(activity);
}
endInsertRows();
+
+ auto conflictsCount = 0;
+ for(const auto &activity : _finalList) {
+ if (activity._syncFileItemStatus == SyncFileItem::Conflict) {
+ ++conflictsCount;
+ }
+ }
+
+ if (!_hasManySyncConflicts && conflictsCount > 2) {
+ _hasManySyncConflicts = true;
+ emit hasManySyncConflictsChanged();
+ } else if (_hasManySyncConflicts && conflictsCount <= 2) {
+ _hasManySyncConflicts = false;
+ emit hasManySyncConflictsChanged();
+ }
}
void ActivityListModel::addErrorToActivityList(const Activity &activity)
{
return activity._talkNotificationData.messageSent;
}
+
+bool ActivityListModel::hasManySyncConflicts() const
+{
+ return _hasManySyncConflicts;
+}
+
}
Q_OBJECT
Q_PROPERTY(quint32 maxActionButtons READ maxActionButtons CONSTANT)
Q_PROPERTY(AccountState *accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged)
+ Q_PROPERTY(bool hasManySyncConflicts READ hasManySyncConflicts NOTIFY hasManySyncConflictsChanged)
public:
enum DataRole {
[[nodiscard]] QString replyMessageSent(const Activity &activity) const;
+ [[nodiscard]] bool hasManySyncConflicts() const;
+
public slots:
void slotRefreshActivity();
void slotRefreshActivityInitial();
signals:
void accountStateChanged();
+ void hasManySyncConflictsChanged();
void activityJobStatusCode(int statusCode);
void sendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
bool _doneFetching = false;
bool _hideOldActivities = true;
+ bool _hasManySyncConflicts = false;
+
static constexpr quint32 MaxActionButtons = 3;
};
}