Set the parents of the QActions for Dolphin integration correctly
The parent must be the plugin itself. Otherwise the QActions are not destroyed when the menu vanishes.
This commit is contained in:
parent
951235d082
commit
d48c7be6fa
|
@ -47,17 +47,22 @@ SyncthingFileItemAction::SyncthingFileItemAction(QObject *parent, const QVariant
|
||||||
|
|
||||||
QList<QAction *> SyncthingFileItemAction::actions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget)
|
QList<QAction *> SyncthingFileItemAction::actions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget)
|
||||||
{
|
{
|
||||||
const QList<QAction *> actions = createActions(fileItemInfo, parentWidget);
|
Q_UNUSED(parentWidget)
|
||||||
|
|
||||||
// don't show anything if no relevant actions could be determined
|
// create actions
|
||||||
if (s_data.connection().isConnected() && actions.isEmpty()) {
|
const QList<QAction *> subActions = createActions(fileItemInfo, this);
|
||||||
return QList<QAction *>();
|
QList<QAction *> topLevelActions;
|
||||||
|
|
||||||
|
// don't show anything if no relevant actions could be determined but successfully connected
|
||||||
|
if (s_data.connection().isConnected() && !s_data.hasError() && subActions.isEmpty()) {
|
||||||
|
return topLevelActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
return QList<QAction *>({ new SyncthingMenuAction(fileItemInfo, actions, parentWidget) });
|
topLevelActions << new SyncthingMenuAction(fileItemInfo, subActions, this);
|
||||||
|
return topLevelActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget)
|
QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListProperties &fileItemInfo, QObject *parent)
|
||||||
{
|
{
|
||||||
QList<QAction *> actions;
|
QList<QAction *> actions;
|
||||||
auto &data = s_data;
|
auto &data = s_data;
|
||||||
|
@ -107,7 +112,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
} else {
|
} else {
|
||||||
rescanLabel = tr("Rescan \"%1\"").arg(detectedItems.front().name);
|
rescanLabel = tr("Rescan \"%1\"").arg(detectedItems.front().name);
|
||||||
}
|
}
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), rescanLabel, parentWidget);
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), rescanLabel, parent);
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
for (const SyncthingItem &item : detectedItems) {
|
for (const SyncthingItem &item : detectedItems) {
|
||||||
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, item.dir->id, item.path));
|
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, item.dir->id, item.path));
|
||||||
|
@ -121,8 +126,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
if (!detectedDirs.isEmpty()) {
|
if (!detectedDirs.isEmpty()) {
|
||||||
// rescan item
|
// rescan item
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
||||||
detectedDirs.size() == 1 ? tr("Rescan \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Rescan selected directories"),
|
detectedDirs.size() == 1 ? tr("Rescan \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Rescan selected directories"), parent);
|
||||||
parentWidget);
|
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
for (const SyncthingDir *dir : detectedDirs) {
|
for (const SyncthingDir *dir : detectedDirs) {
|
||||||
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
||||||
|
@ -145,12 +149,10 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
}
|
}
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
||||||
detectedDirs.size() == 1 ? tr("Resume \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Resume selected directories"),
|
detectedDirs.size() == 1 ? tr("Resume \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Resume selected directories"), parent);
|
||||||
parentWidget);
|
|
||||||
} else {
|
} else {
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-pause")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-pause")),
|
||||||
detectedDirs.size() == 1 ? tr("Pause \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Pause selected directories"),
|
detectedDirs.size() == 1 ? tr("Pause \"%1\"").arg(detectedDirs.front()->displayName()) : tr("Pause selected directories"), parent);
|
||||||
parentWidget);
|
|
||||||
}
|
}
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
connect(actions.back(), &QAction::triggered,
|
connect(actions.back(), &QAction::triggered,
|
||||||
|
@ -165,7 +167,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
// rescan item
|
// rescan item
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("folder-sync")),
|
||||||
containingDirs.size() == 1 ? tr("Rescan \"%1\"").arg(containingDirs.front()->displayName()) : tr("Rescan containing directories"),
|
containingDirs.size() == 1 ? tr("Rescan \"%1\"").arg(containingDirs.front()->displayName()) : tr("Rescan containing directories"),
|
||||||
parentWidget);
|
parent);
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
for (const SyncthingDir *dir : containingDirs) {
|
for (const SyncthingDir *dir : containingDirs) {
|
||||||
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
connect(actions.back(), &QAction::triggered, bind(&SyncthingFileItemActionStaticData::rescanDir, &data, dir->id, QString()));
|
||||||
|
@ -188,11 +190,11 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-start")),
|
||||||
containingDirs.size() == 1 ? tr("Resume \"%1\"").arg(containingDirs.front()->displayName()) : tr("Resume containing directories"),
|
containingDirs.size() == 1 ? tr("Resume \"%1\"").arg(containingDirs.front()->displayName()) : tr("Resume containing directories"),
|
||||||
parentWidget);
|
parent);
|
||||||
} else {
|
} else {
|
||||||
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-pause")),
|
actions << new QAction(QIcon::fromTheme(QStringLiteral("media-playback-pause")),
|
||||||
containingDirs.size() == 1 ? tr("Pause \"%1\"").arg(containingDirs.front()->displayName()) : tr("Pause containing directories"),
|
containingDirs.size() == 1 ? tr("Pause \"%1\"").arg(containingDirs.front()->displayName()) : tr("Pause containing directories"),
|
||||||
parentWidget);
|
parent);
|
||||||
}
|
}
|
||||||
if (connection.isConnected()) {
|
if (connection.isConnected()) {
|
||||||
connect(actions.back(), &QAction::triggered,
|
connect(actions.back(), &QAction::triggered,
|
||||||
|
@ -204,7 +206,7 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
|
|
||||||
// add actions to show further information about directory if the selection is only about one particular Syncthing dir
|
// add actions to show further information about directory if the selection is only about one particular Syncthing dir
|
||||||
if (lastDir && detectedDirs.size() + containingDirs.size() == 1) {
|
if (lastDir && detectedDirs.size() + containingDirs.size() == 1) {
|
||||||
auto *statusActions = new SyncthingDirActions(*lastDir, parentWidget);
|
auto *statusActions = new SyncthingDirActions(*lastDir, parent);
|
||||||
connect(&connection, &SyncthingConnection::newDirs, statusActions,
|
connect(&connection, &SyncthingConnection::newDirs, statusActions,
|
||||||
static_cast<void (SyncthingDirActions::*)(const vector<SyncthingDir> &)>(&SyncthingDirActions::updateStatus));
|
static_cast<void (SyncthingDirActions::*)(const vector<SyncthingDir> &)>(&SyncthingDirActions::updateStatus));
|
||||||
connect(&connection, &SyncthingConnection::dirStatusChanged, statusActions,
|
connect(&connection, &SyncthingConnection::dirStatusChanged, statusActions,
|
||||||
|
@ -214,13 +216,13 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
|
|
||||||
// add separator
|
// add separator
|
||||||
if (!actions.isEmpty()) {
|
if (!actions.isEmpty()) {
|
||||||
QAction *const separator = new QAction(parentWidget);
|
QAction *const separator = new QAction(parent);
|
||||||
separator->setSeparator(true);
|
separator->setSeparator(true);
|
||||||
actions << separator;
|
actions << separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add error action
|
// add error action
|
||||||
QAction *const errorAction = new SyncthingInfoAction(parentWidget);
|
QAction *const errorAction = new SyncthingInfoAction(parent);
|
||||||
errorAction->setText(data.currentError());
|
errorAction->setText(data.currentError());
|
||||||
errorAction->setIcon(QIcon::fromTheme(QStringLiteral("state-error")));
|
errorAction->setIcon(QIcon::fromTheme(QStringLiteral("state-error")));
|
||||||
errorAction->setVisible(data.hasError());
|
errorAction->setVisible(data.hasError());
|
||||||
|
@ -230,12 +232,12 @@ QList<QAction *> SyncthingFileItemAction::createActions(const KFileItemListPrope
|
||||||
actions << errorAction;
|
actions << errorAction;
|
||||||
|
|
||||||
// add config file selection
|
// add config file selection
|
||||||
QAction *const configFileAction = new QAction(QIcon::fromTheme(QStringLiteral("settings-configure")), tr("Select Syncthing config ..."));
|
QAction *const configFileAction = new QAction(QIcon::fromTheme(QStringLiteral("settings-configure")), tr("Select Syncthing config ..."), parent);
|
||||||
connect(configFileAction, &QAction::triggered, &data, &SyncthingFileItemActionStaticData::selectSyncthingConfig);
|
connect(configFileAction, &QAction::triggered, &data, &SyncthingFileItemActionStaticData::selectSyncthingConfig);
|
||||||
actions << configFileAction;
|
actions << configFileAction;
|
||||||
|
|
||||||
// about about action
|
// about about action
|
||||||
QAction *const aboutAction = new QAction(QIcon::fromTheme(QStringLiteral("help-about")), tr("About"));
|
QAction *const aboutAction = new QAction(QIcon::fromTheme(QStringLiteral("help-about")), tr("About"), parent);
|
||||||
connect(aboutAction, &QAction::triggered, &SyncthingFileItemActionStaticData::showAboutDialog);
|
connect(aboutAction, &QAction::triggered, &SyncthingFileItemActionStaticData::showAboutDialog);
|
||||||
actions << aboutAction;
|
actions << aboutAction;
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ class SyncthingFileItemAction : public KAbstractFileItemActionPlugin {
|
||||||
public:
|
public:
|
||||||
SyncthingFileItemAction(QObject *parent, const QVariantList &args);
|
SyncthingFileItemAction(QObject *parent, const QVariantList &args);
|
||||||
QList<QAction *> actions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget) override;
|
QList<QAction *> actions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget) override;
|
||||||
static QList<QAction *> createActions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget);
|
static QList<QAction *> createActions(const KFileItemListProperties &fileItemInfo, QObject *parent);
|
||||||
static SyncthingFileItemActionStaticData &staticData();
|
static SyncthingFileItemActionStaticData &staticData();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
|
|
||||||
using namespace Data;
|
using namespace Data;
|
||||||
|
|
||||||
SyncthingMenuAction::SyncthingMenuAction(const KFileItemListProperties &properties, const QList<QAction *> &actions, QWidget *parentWidget)
|
SyncthingMenuAction::SyncthingMenuAction(const KFileItemListProperties &properties, const QList<QAction *> &actions, QObject *parent)
|
||||||
: QAction(parentWidget)
|
: QAction(parent)
|
||||||
, m_properties(properties)
|
, m_properties(properties)
|
||||||
, m_notifier(SyncthingFileItemAction::staticData().connection())
|
, m_notifier(SyncthingFileItemAction::staticData().connection())
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ void SyncthingMenuAction::handleConnectedChanged()
|
||||||
menu->deleteLater();
|
menu->deleteLater();
|
||||||
setMenu(nullptr);
|
setMenu(nullptr);
|
||||||
}
|
}
|
||||||
createMenu(SyncthingFileItemAction::createActions(m_properties, parentWidget()));
|
createMenu(SyncthingFileItemAction::createActions(m_properties, parent()));
|
||||||
|
|
||||||
// update status of action itself
|
// update status of action itself
|
||||||
updateActionStatus();
|
updateActionStatus();
|
||||||
|
|
|
@ -19,7 +19,7 @@ class SyncthingMenuAction : public QAction {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SyncthingMenuAction(const KFileItemListProperties &properties = KFileItemListProperties(),
|
explicit SyncthingMenuAction(const KFileItemListProperties &properties = KFileItemListProperties(),
|
||||||
const QList<QAction *> &actions = QList<QAction *>(), QWidget *parentWidget = nullptr);
|
const QList<QAction *> &actions = QList<QAction *>(), QObject *parent = nullptr);
|
||||||
#ifdef DEBUG_BUILD
|
#ifdef DEBUG_BUILD
|
||||||
~SyncthingMenuAction() override;
|
~SyncthingMenuAction() override;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue