Skip to content

Commit

Permalink
fix: [extension-menu] The interface of insertAction() is not valid
Browse files Browse the repository at this point in the history
1. add the logic of insertAction() function.

Log: fix issue
Bug: https://pms.uniontech.com/bug-view-249329.html
  • Loading branch information
GongHeng2017 authored and Johnson-zs committed Apr 9, 2024
1 parent fe84152 commit 5af6f89
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// SPDX-FileCopyrightText: 2022 - 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include "dfmextmenucache.h"

#include <QThread>
#include <QApplication>

namespace dfmplugin_utils {

DFMExtMenuCache &DFMExtMenuCache::instance()
{
Q_ASSERT(qApp->thread() == QThread::currentThread());
static DFMExtMenuCache ins;
return ins;
}

DFMExtMenuCache::DFMExtMenuCache()
{
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: 2022 - 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef DFMEXTMENUCACHE_H
#define DFMEXTMENUCACHE_H

#include "dfmplugin_utils_global.h"

#include <QAction>

namespace dfmplugin_utils {

class DFMExtMenuCache : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(DFMExtMenuCache)

public:
static DFMExtMenuCache &instance();
QList<QPair<QAction *, QAction *>> extMenuSortRules {};

private:
DFMExtMenuCache();
};

}

#endif // DFMEXTMENUCACHE_H
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "private/dfmextactionimpl_p.h"
#include "dfmextactionimpl.h"
#include "dfmextmendefine.h"
#include "dfmextmenucache.h"

#include <QMetaObject>
#include <QFile>
Expand Down Expand Up @@ -143,6 +144,13 @@ bool DFMExtMenuImplPrivate::insertAction(DFMExtAction *before, DFMExtAction *act
QAction *ac = impl_d->qaction();
ac->setParent(menu);
menu->insertAction(beforeAc, ac);

// Record sorting rules
QPair<QAction *, QAction*> pair(beforeAc, ac);
QList<QPair<QAction *, QAction *>> &rules = DFMExtMenuCache::instance().extMenuSortRules;
if (!rules.contains(pair))
rules.push_back(pair);

return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "extensionlibmenuscene.h"
#include "dfmextmenuimpl.h"
#include "dfmextmenucache.h"
#include "private/extensionlibmenuscene_p.h"
#include "extensionimpl/pluginsload/extensionpluginmanager.h"

Expand Down Expand Up @@ -44,6 +45,8 @@ QString ExtensionLibMenuScene::name() const

bool ExtensionLibMenuScene::initialize(const QVariantHash &params)
{
DFMExtMenuCache::instance();

// request load extension plugins
if (ExtensionPluginManager::instance().currentState() != ExtensionPluginManager::kInitialized)
emit ExtensionPluginManager::instance().requestInitlaizePlugins();
Expand Down Expand Up @@ -84,6 +87,7 @@ bool ExtensionLibMenuScene::create(QMenu *parent)
const std::string &newCurrentPath { d->transformedCurrentDir.toLocalFile().toStdString() };
const std::string &newFocusPath { d->transformedFocusFile.toLocalFile().toStdString() };

DFMExtMenuCache::instance().extMenuSortRules.clear();
for (auto menu : ExtensionPluginManager::instance().menuPlugins()) {
menu->initialize(ExtensionPluginManager::instance().pluginMenuProxy());
if (d->isEmptyArea) {
Expand All @@ -105,6 +109,24 @@ void ExtensionLibMenuScene::updateState(QMenu *parent)
if (!parent)
return;

QList<QPair<QAction *, QAction *>> &rules = DFMExtMenuCache::instance().extMenuSortRules;
if (!rules.isEmpty()) {
QList<QPair<QAction *, QAction *>>::const_iterator itr = rules.begin();
QList<QAction*> actions = parent->actions();
for (; itr != rules.end(); ++itr) {
QAction *befor { (*itr).first };
QAction *action { (*itr).second };
int actionIndex { actions.indexOf(action) };
if (actions.contains(befor) && actionIndex != -1) {
actions.removeAt(actionIndex);
int beforIndex { actions.indexOf(befor) };
actions.insert(beforIndex, action);
}
}
parent->addActions(actions);
rules.clear();
}

return AbstractMenuScene::updateState(parent);
}

Expand Down

0 comments on commit 5af6f89

Please sign in to comment.