From 96a74d9ef07e830f9c383008667b5579e87eeecd Mon Sep 17 00:00:00 2001 From: Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com> Date: Mon, 13 Jan 2020 11:46:49 +0100 Subject: [PATCH] Minor improvements Signed-off-by: Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com> --- src/gui/tray/ActivityListModel.cpp | 132 ++++++++++++++++++----------- src/gui/tray/ActivityListModel.h | 1 + src/gui/tray/Window.qml | 17 ++-- 3 files changed, 93 insertions(+), 57 deletions(-) diff --git a/src/gui/tray/ActivityListModel.cpp b/src/gui/tray/ActivityListModel.cpp index 0f0b7f4ad..9e6ae09dd 100644 --- a/src/gui/tray/ActivityListModel.cpp +++ b/src/gui/tray/ActivityListModel.cpp @@ -33,7 +33,7 @@ namespace OCC { Q_LOGGING_CATEGORY(lcActivity, "nextcloud.gui.activity", QtInfoMsg) -ActivityListModel::ActivityListModel(AccountState *accountState, QObject* parent) +ActivityListModel::ActivityListModel(AccountState *accountState, QObject *parent) : QAbstractListModel() , _accountState(accountState) { @@ -42,7 +42,9 @@ ActivityListModel::ActivityListModel(AccountState *accountState, QObject* parent QHash ActivityListModel::roleNames() const { QHash roles; + roles[DisplayPathRole] = "displaypath"; roles[PathRole] = "path"; + roles[LinkRole] = "link"; roles[MessageRole] = "message"; roles[ActionRole] = "type"; roles[ActionIconRole] = "icon"; @@ -65,18 +67,32 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const QStringList list; switch (role) { + case DisplayPathRole: + if (!a._file.isEmpty()) { + auto folder = FolderMan::instance()->folder(a._folder); + QString relPath(a._file); + if (folder) { + relPath.prepend(folder->remotePath()); + } + list = FolderMan::instance()->findFileInLocalFolders(relPath, ast->account()); + if (list.count() > 0) { + return list.at(0); + } + } + return QString(); case PathRole: - if(!a._file.isEmpty()){ + if (!a._file.isEmpty()) { auto folder = FolderMan::instance()->folder(a._folder); QString relPath(a._file); - if(folder) relPath.prepend(folder->remotePath()); + if (folder) + relPath.prepend(folder->remotePath()); list = FolderMan::instance()->findFileInLocalFolders(relPath, ast->account()); if (list.count() > 0) { QString path = "file:///" + QString(list.at(0)); return QUrl(path); } // File does not exist anymore? Let's try to open its path - if(QFileInfo(relPath).exists()) { + if (QFileInfo(relPath).exists()) { list = FolderMan::instance()->findFileInLocalFolders(QFileInfo(relPath).path(), ast->account()); if (list.count() > 0) { return QVariant(list.at(0)); @@ -84,7 +100,7 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const } } return QString(); - case ActionsLinksRole:{ + case ActionsLinksRole: { QList customList; foreach (ActivityLink customItem, a._links) { QVariant customVariant; @@ -93,34 +109,34 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const } return customList; } - case ActionIconRole:{ - if(a._type == Activity::NotificationType){ + case ActionIconRole: { + if (a._type == Activity::NotificationType) { return "qrc:///client/resources/bell.svg"; - } else if(a._type == Activity::SyncResultType){ + } else if (a._type == Activity::SyncResultType) { return "qrc:///client/resources/state-error.svg"; - } else if(a._type == Activity::SyncFileItemType){ - if(a._status == SyncFileItem::NormalError - || a._status == SyncFileItem::FatalError - || a._status == SyncFileItem::DetailError - || a._status == SyncFileItem::BlacklistedError) { - return "qrc:///client/resources/state-error.svg"; - } else if(a._status == SyncFileItem::SoftError - || a._status == SyncFileItem::Conflict - || a._status == SyncFileItem::Restoration - || a._status == SyncFileItem::FileLocked){ - return "qrc:///client/resources/state-warning.svg"; - } else if(a._status == SyncFileItem::FileIgnored){ - return "qrc:///client/resources/state-info.svg"; - } else { - return "qrc:///client/resources/state-sync.svg"; - } + } else if (a._type == Activity::SyncFileItemType) { + if (a._status == SyncFileItem::NormalError + || a._status == SyncFileItem::FatalError + || a._status == SyncFileItem::DetailError + || a._status == SyncFileItem::BlacklistedError) { + return "qrc:///client/resources/state-error.svg"; + } else if (a._status == SyncFileItem::SoftError + || a._status == SyncFileItem::Conflict + || a._status == SyncFileItem::Restoration + || a._status == SyncFileItem::FileLocked) { + return "qrc:///client/resources/state-warning.svg"; + } else if (a._status == SyncFileItem::FileIgnored) { + return "qrc:///client/resources/state-info.svg"; + } else { + return "qrc:///client/resources/state-sync.svg"; + } } else { return "qrc:///client/resources/activity.svg"; } } case ObjectTypeRole: return a._objectType; - case ActionRole:{ + case ActionRole: { switch (a._type) { case Activity::ActivityType: return "Activity"; @@ -141,8 +157,13 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const return QString("No description available."); } return a._message; - case LinkRole: - return a._link; + case LinkRole: { + if (a._link.isEmpty()) { + return ""; + } else { + return a._link; + } + } case AccountRole: return a._accName; case PointInTimeRole: @@ -231,76 +252,86 @@ void ActivityListModel::slotActivitiesReceived(const QJsonDocument &json, int st combineActivityLists(); } -void ActivityListModel::addErrorToActivityList(Activity activity) { +void ActivityListModel::addErrorToActivityList(Activity activity) +{ qCInfo(lcActivity) << "Error successfully added to the notification list: " << activity._subject; _notificationErrorsLists.prepend(activity); combineActivityLists(); } -void ActivityListModel::addIgnoredFileToList(Activity newActivity) { +void ActivityListModel::addIgnoredFileToList(Activity newActivity) +{ qCInfo(lcActivity) << "First checking for duplicates then add file to the notification list of ignored files: " << newActivity._file; bool duplicate = false; - if(_listOfIgnoredFiles.size() == 0){ + if (_listOfIgnoredFiles.size() == 0) { _notificationIgnoredFiles = newActivity; _notificationIgnoredFiles._subject = tr("Files from the ignore list as well as symbolic links are not synced. This includes:"); _listOfIgnoredFiles.append(newActivity); return; } - foreach(Activity activity, _listOfIgnoredFiles){ - if(activity._file == newActivity._file){ + foreach (Activity activity, _listOfIgnoredFiles) { + if (activity._file == newActivity._file) { duplicate = true; break; } } - if(!duplicate){ + if (!duplicate) { _notificationIgnoredFiles._message.append(", " + newActivity._file); } } -void ActivityListModel::addNotificationToActivityList(Activity activity) { +void ActivityListModel::addNotificationToActivityList(Activity activity) +{ qCInfo(lcActivity) << "Notification successfully added to the notification list: " << activity._subject; _notificationLists.prepend(activity); combineActivityLists(); } -void ActivityListModel::clearNotifications() { +void ActivityListModel::clearNotifications() +{ qCInfo(lcActivity) << "Clear the notifications"; _notificationLists.clear(); combineActivityLists(); } -void ActivityListModel::removeActivityFromActivityList(int row) { +void ActivityListModel::removeActivityFromActivityList(int row) +{ Activity activity = _finalList.at(row); removeActivityFromActivityList(activity); combineActivityLists(); } -void ActivityListModel::addSyncFileItemToActivityList(Activity activity) { +void ActivityListModel::addSyncFileItemToActivityList(Activity activity) +{ qCInfo(lcActivity) << "Successfully added to the activity list: " << activity._subject; _syncFileItemLists.prepend(activity); combineActivityLists(); } -void ActivityListModel::removeActivityFromActivityList(Activity activity) { +void ActivityListModel::removeActivityFromActivityList(Activity activity) +{ qCInfo(lcActivity) << "Activity/Notification/Error successfully dismissed: " << activity._subject; qCInfo(lcActivity) << "Trying to remove Activity/Notification/Error from view... "; int index = -1; - if(activity._type == Activity::ActivityType){ + if (activity._type == Activity::ActivityType) { index = _activityLists.indexOf(activity); - if(index != -1) _activityLists.removeAt(index); - } else if(activity._type == Activity::NotificationType){ + if (index != -1) + _activityLists.removeAt(index); + } else if (activity._type == Activity::NotificationType) { index = _notificationLists.indexOf(activity); - if(index != -1) _notificationLists.removeAt(index); + if (index != -1) + _notificationLists.removeAt(index); } else { index = _notificationErrorsLists.indexOf(activity); - if(index != -1) _notificationErrorsLists.removeAt(index); + if (index != -1) + _notificationErrorsLists.removeAt(index); } - if(index != -1){ + if (index != -1) { qCInfo(lcActivity) << "Activity/Notification/Error successfully removed from the list."; qCInfo(lcActivity) << "Updating Activity/Notification/Error view."; combineActivityLists(); @@ -311,24 +342,24 @@ void ActivityListModel::combineActivityLists() { ActivityList resultList; - if(_notificationErrorsLists.count() > 0) { + if (_notificationErrorsLists.count() > 0) { std::sort(_notificationErrorsLists.begin(), _notificationErrorsLists.end()); resultList.append(_notificationErrorsLists); } - if(_listOfIgnoredFiles.size() > 0) + if (_listOfIgnoredFiles.size() > 0) resultList.append(_notificationIgnoredFiles); - if(_notificationLists.count() > 0) { + if (_notificationLists.count() > 0) { std::sort(_notificationLists.begin(), _notificationLists.end()); resultList.append(_notificationLists); } - if(_syncFileItemLists.count() > 0) { + if (_syncFileItemLists.count() > 0) { std::sort(_syncFileItemLists.begin(), _syncFileItemLists.end()); resultList.append(_syncFileItemLists); } - if(_activityLists.count() > 0) { + if (_activityLists.count() > 0) { std::sort(_activityLists.begin(), _activityLists.end()); resultList.append(_activityLists); } @@ -342,7 +373,8 @@ void ActivityListModel::combineActivityLists() endInsertRows(); } -bool ActivityListModel::canFetchActivities() const { +bool ActivityListModel::canFetchActivities() const +{ return _accountState->isConnected() && _accountState->account()->capabilities().hasActivities(); } diff --git a/src/gui/tray/ActivityListModel.h b/src/gui/tray/ActivityListModel.h index c5976e451..f073504a0 100644 --- a/src/gui/tray/ActivityListModel.h +++ b/src/gui/tray/ActivityListModel.h @@ -47,6 +47,7 @@ public: ActionTextRole, ActionRole, MessageRole, + DisplayPathRole, PathRole, LinkRole, PointInTimeRole, diff --git a/src/gui/tray/Window.qml b/src/gui/tray/Window.qml index e7e8c6907..602e15163 100644 --- a/src/gui/tray/Window.qml +++ b/src/gui/tray/Window.qml @@ -61,7 +61,6 @@ Window { trayWindow.setX( systrayBackend.calcTrayWindowX()); trayWindow.setY( systrayBackend.calcTrayWindowY()); systrayBackend.setOpened(); - userModelBackend.fetchCurrentActivityModel(); } onHideWindow: { trayWindow.hide(); @@ -470,7 +469,7 @@ Window { } Column { id: activityTextColumn - Layout.leftMargin: 6 + Layout.leftMargin: 4 spacing: 4 Layout.alignment: Qt.AlignLeft Text { @@ -482,7 +481,7 @@ Window { } Text { id: activityTextInfo - text: path + text: displaypath width: 220 elide: Text.ElideRight font.pointSize: 8 @@ -499,13 +498,12 @@ Window { Layout.alignment: Qt.AlignRight flat: true hoverEnabled: false - visible: (path === "") ? false : true + visible: (path !== "") ? true : false display: AbstractButton.IconOnly icon.source: "qrc:///client/resources/files.svg" icon.color: "transparent" - onClicked: - { + onClicked: { Qt.openUrlExternally(path) } } @@ -515,14 +513,19 @@ Window { Layout.alignment: Qt.AlignRight flat: true hoverEnabled: false + visible: (link !== "") ? true : false display: AbstractButton.IconOnly icon.source: "qrc:///client/resources/public.svg" icon.color: "transparent" + + onClicked: { + Qt.openUrlExternally(link) + } } } populate: Transition { - NumberAnimation { properties: "y"; from: -60; duration: 100; easing.type: Easing.Linear } + // prevent animations on initial list population } add: Transition { -- 2.30.2