Skip to content

Commit

Permalink
Add context menu to activity list
Browse files Browse the repository at this point in the history
  • Loading branch information
TheOneRing committed Apr 28, 2021
1 parent 637e288 commit 5cfe9a1
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 68 deletions.
14 changes: 14 additions & 0 deletions src/gui/activitylistmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
95 changes: 30 additions & 65 deletions src/gui/activitywidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
Expand All @@ -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
Expand Down Expand Up @@ -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());
}


/* ==================================================================== */

Expand Down
3 changes: 2 additions & 1 deletion src/gui/activitywidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -94,6 +93,7 @@ private slots:
void slotCheckToCleanWidgets();

private:
void slotItemContextMenu();
void showLabels();
QString timeString(QDateTime dt, QLocale::FormatType format) const;
Ui::ActivityWidget *_ui;
Expand All @@ -113,6 +113,7 @@ private slots:
int _notificationRequestsRunning;

ActivityListModel *_model;
QSortFilterProxyModel *_sortModel;
QVBoxLayout *_notificationsLayout;
};

Expand Down
3 changes: 3 additions & 0 deletions src/gui/activitywidget.ui
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
Expand Down
1 change: 0 additions & 1 deletion src/gui/protocolitemmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/gui/protocolwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
Expand All @@ -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);
Expand Down Expand Up @@ -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]);
Expand Down

0 comments on commit 5cfe9a1

Please sign in to comment.