Skip to content

Commit

Permalink
feat: Allow opening duplicate clicked folders within the same process
Browse files Browse the repository at this point in the history
Allow opening duplicate clicked folders within the same process

Log: Allow opening duplicate clicked folders within the same process
Task: https://pms.uniontech.com/task-view-341709.html
  • Loading branch information
liyigang1 committed May 7, 2024
1 parent afeaf5a commit 7a16f8a
Show file tree
Hide file tree
Showing 28 changed files with 721 additions and 573 deletions.
13 changes: 12 additions & 1 deletion assets/configs/org.deepin.dde.file-manager.json
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,17 @@
"description[zh_CN]": "日志规则",
"permissions": "readwrite",
"visibility": "public"
}
},
"dfm.openfolderinaseparateprocess": {
"value":false,
"serial":0,
"flags":[],
"name":"Open folder windows in a separate process",
"name[zh_CN]":"在单独的进程中打开文件夹窗口",
"description[zh_CN]":"用于判断是否在单独的进程中打开文件夹窗口",
"description":"Used to determine whether to enable Open folder windows in a separate process",
"permissions":"readwrite",
"visibility":"private"
},
}
}
5 changes: 5 additions & 0 deletions include/dfm-base/dfm_global_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ inline constexpr char kDesktopLoadFilesTime[] { "LoadFilesTime" };
inline constexpr char kDesktopLoadFilesCount[] { "LoadFilesCount" };
} // namespace DataPersistence

namespace DConfigGlobal {
inline constexpr char kDefaultCfgPath[] { "org.deepin.dde.file-manager" };
inline constexpr char kOpenfolderwindowsinaseparateprocess[] { "dfm.openfolderinaseparateprocess" };
}

} // namespace Global
} // namespace dfmbase

Expand Down
1 change: 1 addition & 0 deletions include/dfm-base/widgets/filemanagerwindowsmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class FileManagerWindowsManager final : public QObject
QList<quint64> windowIdList();
void resetPreviousActivedWindowId();
quint64 previousActivedWindowId();
bool containsCurrentUrl(const QUrl &url, const QWidget *win = nullptr);

Q_SIGNALS:
void windowCreated(quint64 windId);
Expand Down
19 changes: 15 additions & 4 deletions src/apps/dde-file-manager/commandparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,10 @@ void CommandParser::openInHomeDirectory()
{
QString homePath = StandardPaths::location(StandardPaths::StandardLocation::kHomePath);
QUrl url = QUrl::fromUserInput(homePath);
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url);
auto flag = !DConfigManager::instance()->
value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess, false).toBool();
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url, flag);
}

void CommandParser::openInUrls()
Expand Down Expand Up @@ -294,8 +297,12 @@ void CommandParser::openInUrls()
}
argumentUrls.append(url);
}
if (argumentUrls.isEmpty())
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, QUrl(), true);
if (argumentUrls.isEmpty()) {
auto flag = !DConfigManager::instance()->
value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess, false).toBool();
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, QUrl(), flag);
}
for (const QUrl &url : argumentUrls)
openWindowWithUrl(url);
}
Expand All @@ -314,7 +321,11 @@ void CommandParser::openWindowWithUrl(const QUrl &url)
dpfSignalDispatcher->publish(GlobalEventType::kLoadPlugins, QStringList() << name);
});
}
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url, isSet("n") || isSet("s") || isSet("sessionfile"));
auto flag = DConfigManager::instance()->
value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess, false).toBool();
flag = flag ? false : isSet("n") || isSet("s") || isSet("sessionfile");
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url, flag);
}

void CommandParser::openSession()
Expand Down
2 changes: 1 addition & 1 deletion src/dfm-base/base/application/application.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class Application : public QObject
kUrlOfNewTab, // default path to new tabs
kThemeName,
kFileAndDirMixedSort, // Mixed sorting of ordinary files and directories
kListItemExpandable // Item expandable as tree in FileView with list view mode
kListItemExpandable, // Item expandable as tree in FileView with list view mode
};

Q_ENUM(ApplicationAttribute)
Expand Down
20 changes: 18 additions & 2 deletions src/dfm-base/base/configs/settingbackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <dfm-base/base/configs/dconfig/dconfigmanager.h>
#include <dfm-base/settingdialog/settingjsongenerator.h>
#include <dfm-base/dfm_global_defines.h>

#include <DSettings>

Expand All @@ -31,7 +32,7 @@ using namespace dfmbase;

BidirectionHash<QString, Application::ApplicationAttribute> SettingBackendPrivate::keyToAA {
{ LV2_GROUP_OPEN_ACTION ".00_allways_open_on_new_window", Application::kAllwayOpenOnNewWindow },
{ LV2_GROUP_OPEN_ACTION ".01_open_file_action", Application::kOpenFileMode },
{ LV2_GROUP_OPEN_ACTION ".02_open_file_action", Application::kOpenFileMode },
{ LV2_GROUP_NEW_TAB_WINDOWS ".00_default_window_path", Application::kUrlOfNewWindow },
{ LV2_GROUP_NEW_TAB_WINDOWS ".01_new_tab_path", Application::kUrlOfNewTab },
{ LV2_GROUP_VIEW ".00_icon_size", Application::kIconSizeLevel },
Expand Down Expand Up @@ -226,7 +227,22 @@ void SettingBackend::initBasicSettingConfig()
ins->addCheckBoxConfig(LV2_GROUP_OPEN_ACTION ".00_allways_open_on_new_window",
tr("Always open folder in new window"),
false);
ins->addComboboxConfig(LV2_GROUP_OPEN_ACTION ".01_open_file_action",
ins->addCheckBoxConfig(LV2_GROUP_OPEN_ACTION ".01_open_folder_windows_in_aseparate_process",
tr("Open folder windows in a separate process"),
false);
addSettingAccessor(
LV2_GROUP_OPEN_ACTION ".01_open_folder_windows_in_aseparate_process",
[]() {
return DConfigManager::instance()->value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess,
false);
},
[](const QVariant &val) {
DConfigManager::instance()->setValue(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess,
val);
});
ins->addComboboxConfig(LV2_GROUP_OPEN_ACTION ".02_open_file_action",
tr("Open file:"),
QStringList { tr("Click"),
tr("Double click") },
Expand Down
21 changes: 20 additions & 1 deletion src/dfm-base/widgets/dfmwindow/filemanagerwindowsmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <dfm-base/utils/finallyutil.h>
#include <dfm-base/utils/universalutils.h>
#include <dfm-base/shortcut/shortcut.h>
#include <dfm-base/utils/fileutils.h>

#include <QDebug>
#include <QEvent>
Expand Down Expand Up @@ -50,7 +51,10 @@ FileManagerWindow *FileManagerWindowsManagerPrivate::activeExistsWindowByUrl(con
for (int i = 0; i != count; ++i) {
quint64 key = windows.keys().at(i);
auto window = windows.value(key);
if (window && UniversalUtils::urlEquals(window->currentUrl(), url)) {
auto cur = window->currentUrl();
if (window && (UniversalUtils::urlEquals(url, cur) ||
UniversalUtils::urlEquals(url, FileUtils::bindUrlTransform(cur)) ||
UniversalUtils::urlEquals(cur, FileUtils::bindUrlTransform(url)))) {
qCInfo(logDFMBase) << "Find url: " << url << " window: " << window;
if (window->isMinimized())
window->setWindowState(window->windowState() & ~Qt::WindowMinimized);
Expand Down Expand Up @@ -309,6 +313,21 @@ quint64 FileManagerWindowsManager::previousActivedWindowId()
return d->previousActivedWindowId;
}

bool FileManagerWindowsManager::containsCurrentUrl(const QUrl &url, const QWidget *win)
{
auto windows = d->windows.values();
for (auto w : windows) {
if (win == w || !w)
continue;
auto cur = w->currentUrl();
if (UniversalUtils::urlEquals(url, cur) ||
UniversalUtils::urlEquals(url, FileUtils::bindUrlTransform(cur)) ||
UniversalUtils::urlEquals(cur, FileUtils::bindUrlTransform(url)))
return true;
}
return false;
}

FileManagerWindowsManager::FileManagerWindowsManager(QObject *parent)
: QObject(parent), d(new FileManagerWindowsManagerPrivate(this))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include <dfm-base/utils/fileutils.h>
#include <dfm-base/base/standardpaths.h>
#include <dfm-base/base/application/application.h>
#include <dfm-base/widgets/filemanagerwindowsmanager.h>
#include <dfm-base/base/configs/dconfig/dconfigmanager.h>

#include <dfm-framework/dpf.h>

Expand Down Expand Up @@ -201,8 +203,13 @@ bool FileOperatorMenuScene::triggered(QAction *action)
if (infoPtr && infoPtr->isAttributes(OptInfoType::kIsSymLink))
cdUrl = QUrl::fromLocalFile(infoPtr->pathOf(PathInfoType::kSymLinkTarget));

if (Application::instance()->appAttribute(Application::kAllwayOpenOnNewWindow).toBool()) {
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, cdUrl);
auto flag = DConfigManager::instance()->
value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess, false).toBool();

if ((flag && FileManagerWindowsManager::instance().containsCurrentUrl(cdUrl)) ||
Application::instance()->appAttribute(Application::kAllwayOpenOnNewWindow).toBool()) {
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, cdUrl, !flag);
} else {
dpfSignalDispatcher->publish(GlobalEventType::kChangeCurrentUrl, d->windowId, cdUrl);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <dfm-base/dfm_global_defines.h>
#include <dfm-base/dfm_event_defines.h>
#include <dfm-base/dbusservice/global_server_defines.h>
#include <dfm-base/base/configs/dconfig/dconfigmanager.h>
#include <dfm-base/base/application/application.h>
#include <dfm-base/base/urlroute.h>
#include <dfm-base/widgets/filemanagerwindowsmanager.h>
Expand Down Expand Up @@ -54,8 +55,12 @@ void ComputerEventCaller::cdTo(quint64 winId, const QUrl &url)
}

DFMBASE_USE_NAMESPACE
if (Application::appAttribute(Application::ApplicationAttribute::kAllwayOpenOnNewWindow).toBool())
sendEnterInNewWindow(url);
auto flag = DConfigManager::instance()->
value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess, false).toBool();
if ((flag && FileManagerWindowsManager::instance().containsCurrentUrl(url))
|| Application::appAttribute(Application::ApplicationAttribute::kAllwayOpenOnNewWindow).toBool())
sendEnterInNewWindow(url, !flag);
else
dpfSignalDispatcher->publish(GlobalEventType::kChangeCurrentUrl, winId, url);
}
Expand All @@ -67,14 +72,14 @@ void ComputerEventCaller::cdTo(quint64 winId, const QString &path)
cdTo(winId, ComputerUtils::makeLocalUrl(path));
}

void ComputerEventCaller::sendEnterInNewWindow(const QUrl &url)
void ComputerEventCaller::sendEnterInNewWindow(const QUrl &url, const bool isNew)
{
if (!ComputerUtils::checkGvfsMountExist(url)) {
fmInfo() << "gvfs url not exists" << url;
return;
}

dpfSignalDispatcher->publish(DFMBASE_NAMESPACE::GlobalEventType::kOpenNewWindow, url);
dpfSignalDispatcher->publish(DFMBASE_NAMESPACE::GlobalEventType::kOpenNewWindow, url, isNew);
}

void ComputerEventCaller::sendEnterInNewTab(quint64 winId, const QUrl &url)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class ComputerEventCaller
static void cdTo(quint64 winId, const QUrl &url);
static void cdTo(quint64 winId, const QString &path);

static void sendEnterInNewWindow(const QUrl &url);
static void sendEnterInNewWindow(const QUrl &url, const bool isNew = true);
static void sendEnterInNewTab(quint64 winId, const QUrl &url);

static void sendContextActionTriggered(quint64 winId, const QUrl &url, const QString &action);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ void SideBarEventCaller::sendEject(const QUrl &url)
dpfSignalDispatcher->publish("dfmplugin_sidebar", "signal_Item_EjectClicked", url);
}

void SideBarEventCaller::sendOpenWindow(const QUrl &url)
void SideBarEventCaller::sendOpenWindow(const QUrl &url, const bool isNew)
{
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url);
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url, isNew);
}

void SideBarEventCaller::sendOpenTab(quint64 windowId, const QUrl &url)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class SideBarEventCaller
public:
static void sendItemActived(quint64 windowId, const QUrl &url);
static void sendEject(const QUrl &url);
static void sendOpenWindow(const QUrl &url);
static void sendOpenWindow(const QUrl &url, const bool isNew = true);
static void sendOpenTab(quint64 windowId, const QUrl &url);
static void sendShowFilePropertyDialog(const QUrl &url);
static bool sendCheckTabAddable(quint64 windowId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@
#include <dfm-base/utils/systempathutil.h>
#include <dfm-base/utils/universalutils.h>
#include <dfm-base/utils/networkutils.h>
#include <dfm-base/base/application/application.h>
#include <dfm-base/base/configs/dconfig/dconfigmanager.h>
#include <dfm-base/base/application/settings.h>
#include <dfm-base/base/application/application.h>
#include <dfm-base/utils/dialogmanager.h>
#include <dfm-base/dfm_global_defines.h>

#include <QApplication>
#include <QVBoxLayout>
Expand Down Expand Up @@ -261,6 +263,27 @@ void SideBarWidget::onItemActived(const QModelIndex &index)
}

QApplication::restoreOverrideCursor();
auto flag = DConfigManager::instance()->
value(dfmbase::Global::DConfigGlobal::kDefaultCfgPath,
dfmbase::Global::DConfigGlobal::kOpenfolderwindowsinaseparateprocess, false).toBool();

auto target = item->targetUrl();
if (flag && FileManagerWindowsManager::instance().containsCurrentUrl(target)) {

// run Open folder windows in a separate process
SideBarManager::instance()->openFolderInASeparateProcess(target);
auto preIndex = sidebarView->previousIndex();
if (!preIndex.isValid()) {
sidebarView->setPreviousIndex(preIndex);
return;
}
SideBarItem *preItem = kSidebarModelIns->itemFromIndex(preIndex);
if (!preItem || dynamic_cast<SideBarItemSeparator *>(preItem))
return;
setCurrentUrl(qvariant_cast<QUrl>(preItem->data(SideBarItem::Roles::kItemUrlRole)));
sidebarView->setPreviousIndex(preIndex);
return;
}
SideBarManager::instance()->runCd(item, SideBarHelper::windowId(this));
sidebarView->update(sidebarView->previousIndex());
sidebarView->update(sidebarView->currentIndex());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,11 @@ void SideBarHelper::saveGroupsStateToConfig(const QVariant &var)
DConfigManager::instance()->setValue(ConfigInfos::kConfName, ConfigInfos::kGroupExpandedKey, rule);
}

void SideBarHelper::openFolderInASeparateProcess(const QUrl &url)
{
SideBarEventCaller::sendOpenWindow(url, false);
}

QMutex &SideBarHelper::mutex()
{
static QMutex m;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class SideBarHelper
static QVariantMap groupExpandRules();

static void saveGroupsStateToConfig(const QVariant &var);
static void openFolderInASeparateProcess(const QUrl &url);

public:
static bool contextMenuEnabled; // TODO(xust) tmp solution, using GroupPolicy instead.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ void SideBarManager::runRename(SideBarItem *item, quint64 windowId, const QStrin
}
}

void SideBarManager::openFolderInASeparateProcess(const QUrl &url)
{
SideBarHelper::openFolderInASeparateProcess(url);
}

SideBarManager::SideBarManager(QObject *parent)
: QObject(parent)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class SideBarManager final : public QObject
void runCd(SideBarItem *item, quint64 windowId);
void runContextMenu(SideBarItem *item, quint64 windowId, const QPoint &globalPos);
void runRename(SideBarItem *item, quint64 windowId, const QString &name);
void openFolderInASeparateProcess(const QUrl &url);

private:
explicit SideBarManager(QObject *parent = nullptr);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ DFM_LOG_USE_CATEGORY(DPWORKSPACE_NAMESPACE)
enum class DirOpenMode : uint8_t {
kOpenInCurrentWindow,
kOpenNewWindow,
kAwaysInCurrentWindow,
//kForceOpenNewWindow // Todo(yanghao): ???
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ DFMBASE_USE_NAMESPACE

static constexpr char kEventNS[] { DPF_MACRO_TO_STR(DPWORKSPACE_NAMESPACE) };

void WorkspaceEventCaller::sendOpenWindow(const QList<QUrl> &urls)
void WorkspaceEventCaller::sendOpenWindow(const QList<QUrl> &urls, const bool isNew)
{
bool hooked = dpfHookSequence->run(kEventNS, "hook_SendOpenWindow", urls);
if (hooked)
return;

if (urls.isEmpty()) {
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, QUrl());
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, QUrl(), isNew);
} else {
for (const QUrl &url : urls)
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url);
dpfSignalDispatcher->publish(GlobalEventType::kOpenNewWindow, url, isNew);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class WorkspaceEventCaller
WorkspaceEventCaller() = delete;

public:
static void sendOpenWindow(const QList<QUrl> &urls);
static void sendOpenWindow(const QList<QUrl> &urls, const bool isNew = true);
static void sendChangeCurrentUrl(const quint64 windowId, const QUrl &url);
static void sendOpenAsAdmin(const QUrl &url);

Expand Down
Loading

0 comments on commit 7a16f8a

Please sign in to comment.