From 562fa65b43ff4d51fb46902a90be8661f79a50a1 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Wed, 28 Apr 2021 17:15:28 +0200 Subject: [PATCH 1/2] Make clazy a bit more happy --- src/gui/activitywidget.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/gui/activitywidget.cpp b/src/gui/activitywidget.cpp index e5e49d08562..dcedb337aba 100644 --- a/src/gui/activitywidget.cpp +++ b/src/gui/activitywidget.cpp @@ -97,7 +97,7 @@ ActivityWidget::ActivityWidget(QWidget *parent) showLabels(); } - for (const auto widget : _widgetForNotifId) { + for (const auto widget : qAsConst(_widgetForNotifId)) { if (widget->activity().uuid() == ast->account()->uuid()) { scheduleWidgetToRemove(widget); } @@ -313,16 +313,15 @@ void ActivityWidget::slotBuildNotificationDisplay(const ActivityList &list) const auto accId = list.first().uuid(); QList strayCats; - for (const auto &id : _widgetForNotifId.keys()) { - NotificationWidget *widget = _widgetForNotifId[id]; + for (auto it = _widgetForNotifId.cbegin(); it != _widgetForNotifId.cend(); ++it) { bool found = false; // do not mark widgets of other accounts to delete. - if (widget->activity().uuid() != accId) { + if (it.value()->activity().uuid() != accId) { continue; } for (const auto &activity : list) { - if (activity.id() == id) { + if (activity.id() == it.key()) { // found an activity found = true; break; @@ -330,7 +329,7 @@ void ActivityWidget::slotBuildNotificationDisplay(const ActivityList &list) } if (!found) { // the activity does not exist any more. - strayCats.append(id); + strayCats.append(it.key()); } } @@ -376,10 +375,10 @@ void ActivityWidget::slotSendNotificationRequest(const QString &accountName, con qCInfo(lcActivity) << "Server Notification Request " << verb << link << "on account" << accountName; NotificationWidget *theSender = qobject_cast(sender()); - const QStringList validVerbs = QStringList() << "GET" - << "PUT" - << "POST" - << "DELETE"; + const QStringList validVerbs = { QStringLiteral("GET"), + QStringLiteral("PUT"), + QStringLiteral("POST"), + QStringLiteral("DELETE") }; if (validVerbs.contains(verb)) { AccountStatePtr acc = AccountManager::instance()->account(accountName); From a7825bb2d5d71dba0886d1485f0df6601cff3466 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Wed, 28 Apr 2021 17:18:35 +0200 Subject: [PATCH 2/2] Add context menu to activity list --- changelog/unreleased/8158 | 1 + src/gui/activitylistmodel.cpp | 14 ++++++ src/gui/activitywidget.cpp | 95 +++++++++++------------------------ src/gui/activitywidget.h | 3 +- src/gui/activitywidget.ui | 3 ++ src/gui/protocolitemmodel.cpp | 1 - src/gui/protocolwidget.cpp | 3 +- 7 files changed, 52 insertions(+), 68 deletions(-) diff --git a/changelog/unreleased/8158 b/changelog/unreleased/8158 index 1d1139247ff..e9eff7342d1 100644 --- a/changelog/unreleased/8158 +++ b/changelog/unreleased/8158 @@ -7,3 +7,4 @@ https://github.com/owncloud/client/issues/8158 https://github.com/owncloud/client/issues/4336 https://github.com/owncloud/client/issues/8528 https://github.com/owncloud/client/pull/8584 +https://github.com/owncloud/client/pull/8585 diff --git a/src/gui/activitylistmodel.cpp b/src/gui/activitylistmodel.cpp index ccc03acd02c..b6371b41a78 100644 --- a/src/gui/activitylistmodel.cpp +++ b/src/gui/activitylistmodel.cpp @@ -122,6 +122,20 @@ QVariant ActivityListModel::headerData(int section, Qt::Orientation orientation, Q_UNREACHABLE(); break; }; + case Models::StringFormatWidthRole: + switch (actionRole) { + case ActivityRole::Text: + return 120; + case ActivityRole::Account: + return 20; + case ActivityRole::PointInTime: + return 20; + case ActivityRole::Path: + return 30; + case ActivityRole::ColumnCount: + Q_UNREACHABLE(); + break; + } }; } return QAbstractTableModel::headerData(section, orientation, role); diff --git a/src/gui/activitywidget.cpp b/src/gui/activitywidget.cpp index dcedb337aba..02b65156fad 100644 --- a/src/gui/activitywidget.cpp +++ b/src/gui/activitywidget.cpp @@ -57,10 +57,10 @@ ActivityWidget::ActivityWidget(QWidget *parent) _ui->setupUi(this); _model = new ActivityListModel(this); - auto sortModel = new QSortFilterProxyModel(this); - sortModel->setSourceModel(_model); - _ui->_activityList->setModel(sortModel); - sortModel->setSortRole(Models::UnderlyingDataRole); + _sortModel = new QSortFilterProxyModel(this); + _sortModel->setSourceModel(_model); + _ui->_activityList->setModel(_sortModel); + _sortModel->setSortRole(Models::UnderlyingDataRole); _ui->_activityList->hideColumn(static_cast(ActivityListModel::ActivityRole::Path)); _ui->_activityList->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); _ui->_activityList->horizontalHeader()->setSectionResizeMode(static_cast(ActivityListModel::ActivityRole::Text), QHeaderView::Stretch); @@ -105,8 +105,7 @@ ActivityWidget::ActivityWidget(QWidget *parent) }); connect(_model, &QAbstractItemModel::modelReset, this, &ActivityWidget::dataChanged); - - connect(_ui->_activityList, &QListView::activated, this, &ActivityWidget::slotOpenFile); + connect(_ui->_activityList, &QListView::customContextMenuRequested, this, &ActivityWidget::slotItemContextMenu); connect(&_removeTimer, &QTimer::timeout, this, &ActivityWidget::slotCheckToCleanWidgets); _removeTimer.setInterval(1000); @@ -174,55 +173,6 @@ void ActivityWidget::slotAccountActivityStatus(AccountState *ast, int statusCode showLabels(); } -// FIXME: Reused from protocol widget. Move over to utilities. -QString ActivityWidget::timeString(QDateTime dt, QLocale::FormatType format) const -{ - const QLocale loc = QLocale::system(); - QString dtFormat = loc.dateTimeFormat(format); - static const QRegExp re("(HH|H|hh|h):mm(?!:s)"); - dtFormat.replace(re, "\\1:mm:ss"); - return loc.toString(dt, dtFormat); -} - -void ActivityWidget::storeActivityList(QTextStream &ts) -{ - ActivityList activities = _model->activityList(); - - foreach (Activity activity, activities) { - ts << right - // account name - << qSetFieldWidth(30) - << activity.accName() - // separator - << qSetFieldWidth(0) << "," - - // date and time - << qSetFieldWidth(34) - << activity.dateTime().toString() - // separator - << qSetFieldWidth(0) << "," - - // file - << qSetFieldWidth(30) - << activity.file() - // separator - << qSetFieldWidth(0) << "," - - // subject - << qSetFieldWidth(100) - << activity.subject() - // separator - << qSetFieldWidth(0) << "," - - // message (mostly empty) - << qSetFieldWidth(55) - << activity.message() - // - << qSetFieldWidth(0) - << endl; - } -} - void ActivityWidget::checkActivityTabVisibility() { int accountCount = AccountManager::instance()->accounts().count(); @@ -239,16 +189,6 @@ void ActivityWidget::checkActivityTabVisibility() emit hideActivityTab(!hasAccountsWithActivity && !hasNotifications); } -void ActivityWidget::slotOpenFile(QModelIndex indx) -{ - if (indx.isValid()) { - const auto fullPath = indx.data(static_cast(ActivityListModel::ActivityRole::Path)).toString(); - if (QFile::exists(fullPath)) { - showInFileManager(fullPath); - } - } -} - // GUI: Display the notifications. // All notifications in list are coming from the same account // but in the _widgetForNotifId hash widgets for all accounts are @@ -501,6 +441,31 @@ void ActivityWidget::slotCheckToCleanWidgets() } } +void ActivityWidget::slotItemContextMenu() +{ + auto rows = _ui->_activityList->selectionModel()->selectedRows(); + auto menu = new QMenu(this); + menu->setAttribute(Qt::WA_DeleteOnClose); + + // keep in sync with ProtocolWidget::showContextMenu + menu->addAction(tr("Copy to clipboard"), this, [text = Models::formatSelection(rows)] { + QApplication::clipboard()->setText(text); + }); + + if (rows.size() == 1) { + // keep in sync with ProtocolWidget::showContextMenu + const auto localPath = rows.first().siblingAtColumn(static_cast(ActivityListModel::ActivityRole::Path)).data(Models::UnderlyingDataRole).toString(); + if (!localPath.isEmpty()) { + menu->addAction(tr("Show in file browser"), this, [localPath] { + if (QFileInfo::exists(localPath)) { + showInFileManager(localPath); + } + }); + } + } + menu->popup(QCursor::pos()); +} + /* ==================================================================== */ diff --git a/src/gui/activitywidget.h b/src/gui/activitywidget.h index 4e85747f367..b4a4f554288 100644 --- a/src/gui/activitywidget.h +++ b/src/gui/activitywidget.h @@ -71,7 +71,6 @@ class ActivityWidget : public QWidget void checkActivityTabVisibility(); public slots: - void slotOpenFile(QModelIndex indx); void slotRefreshActivities(AccountState *ptr); void slotRefreshNotifications(AccountState *ptr); void slotRemoveAccount(AccountState *ptr); @@ -94,6 +93,7 @@ private slots: void slotCheckToCleanWidgets(); private: + void slotItemContextMenu(); void showLabels(); QString timeString(QDateTime dt, QLocale::FormatType format) const; Ui::ActivityWidget *_ui; @@ -113,6 +113,7 @@ private slots: int _notificationRequestsRunning; ActivityListModel *_model; + QSortFilterProxyModel *_sortModel; QVBoxLayout *_notificationsLayout; }; diff --git a/src/gui/activitywidget.ui b/src/gui/activitywidget.ui index c6dd90f7f32..0ebbbc9205f 100644 --- a/src/gui/activitywidget.ui +++ b/src/gui/activitywidget.ui @@ -83,6 +83,9 @@ 0 + + Qt::CustomContextMenu + true diff --git a/src/gui/protocolitemmodel.cpp b/src/gui/protocolitemmodel.cpp index 7123449c829..7dab9c9f65a 100644 --- a/src/gui/protocolitemmodel.cpp +++ b/src/gui/protocolitemmodel.cpp @@ -145,7 +145,6 @@ QVariant ProtocolItemModel::headerData(int section, Qt::Orientation orientation, }; case Models::StringFormatWidthRole: - // TODO: fine tune switch (actionRole) { case ProtocolItemRole::Time: return 20; diff --git a/src/gui/protocolwidget.cpp b/src/gui/protocolwidget.cpp index a21eaa7e91d..82dd11aac07 100644 --- a/src/gui/protocolwidget.cpp +++ b/src/gui/protocolwidget.cpp @@ -78,6 +78,7 @@ void ProtocolWidget::showContextMenu(QWidget *parent, ProtocolItemModel *model, auto menu = new QMenu(parent); menu->setAttribute(Qt::WA_DeleteOnClose); + // keep in sync with ActivityWidget::slotItemContextMenu menu->addAction(tr("Copy to clipboard"), parent, [text = Models::formatSelection(items)] { QApplication::clipboard()->setText(text); }); @@ -89,6 +90,7 @@ void ProtocolWidget::showContextMenu(QWidget *parent, ProtocolItemModel *model, { const QString localPath = folder->path() + data.path(); if (QFileInfo::exists(localPath)) { + // keep in sync with ActivityWidget::slotItemContextMenu menu->addAction(tr("Show in file browser"), parent, [localPath] { if (QFileInfo::exists(localPath)) { showInFileManager(localPath); @@ -129,7 +131,6 @@ void ProtocolWidget::showContextMenu(QWidget *parent, ProtocolItemModel *model, void ProtocolWidget::slotItemContextMenu() { - QModelIndexList list; auto rows = _ui->_tableView->selectionModel()->selectedRows(); for (int i = 0; i < rows.size(); ++i) { rows[i] = _sortModel->mapToSource(rows[i]);