Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHannah von Reth <hannah.vonreth@owncloud.com>2021-04-28 18:18:35 +0300
committerHannah von Reth <vonreth@kde.org>2021-05-18 12:19:35 +0300
commita2c238b9be273d6fec7c20c667d4719b88c6615a (patch)
tree2111197af58423c1267934a99b2a231df2a03d72 /src
parent54159cb09bdf00dd9a183c81b2e4ae4caca3f19b (diff)
Add context menu to activity list
Diffstat (limited to 'src')
-rw-r--r--src/gui/activitylistmodel.cpp14
-rw-r--r--src/gui/activitywidget.cpp95
-rw-r--r--src/gui/activitywidget.h3
-rw-r--r--src/gui/activitywidget.ui3
-rw-r--r--src/gui/protocolitemmodel.cpp1
-rw-r--r--src/gui/protocolwidget.cpp3
6 files changed, 51 insertions, 68 deletions
diff --git a/src/gui/activitylistmodel.cpp b/src/gui/activitylistmodel.cpp
index ccc03acd0..b6371b41a 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 dcedb337a..02b65156f 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<int>(ActivityListModel::ActivityRole::Path));
_ui->_activityList->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
_ui->_activityList->horizontalHeader()->setSectionResizeMode(static_cast<int>(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<int>(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<int>(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 4e85747f3..b4a4f5542 100644
--- a/src/gui/activitywidget.h
+++ b/src/gui/activitywidget.h
@@ -71,7 +71,6 @@ public:
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:
int _notificationRequestsRunning;
ActivityListModel *_model;
+ QSortFilterProxyModel *_sortModel;
QVBoxLayout *_notificationsLayout;
};
diff --git a/src/gui/activitywidget.ui b/src/gui/activitywidget.ui
index c6dd90f7f..0ebbbc920 100644
--- a/src/gui/activitywidget.ui
+++ b/src/gui/activitywidget.ui
@@ -83,6 +83,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
+ <property name="contextMenuPolicy">
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
diff --git a/src/gui/protocolitemmodel.cpp b/src/gui/protocolitemmodel.cpp
index 7123449c8..7dab9c9f6 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 a21eaa7e9..82dd11aac 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]);