From 9fe2bafb1c50fd777853d3a5c51cb510d8409d55 Mon Sep 17 00:00:00 2001 From: liuyangming Date: Wed, 3 Jan 2024 18:19:06 +0800 Subject: [PATCH] fix: [workspace]tree view issue support expand file item in my-share view. Log: fix tree view issue Bug: https://pms.uniontech.com/bug-view-235073.html --- .../fileinfo/sharefileinfo.cpp | 15 +++++---- .../iterator/shareiterator.cpp | 26 ++++++++++++++-- .../menu/mysharemenuscene.cpp | 31 ++++++++++++------- .../private/shareiterator_p.h | 12 ++++++- 4 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/plugins/filemanager/dfmplugin-myshares/fileinfo/sharefileinfo.cpp b/src/plugins/filemanager/dfmplugin-myshares/fileinfo/sharefileinfo.cpp index 9e82c8071c..9fd76d882b 100644 --- a/src/plugins/filemanager/dfmplugin-myshares/fileinfo/sharefileinfo.cpp +++ b/src/plugins/filemanager/dfmplugin-myshares/fileinfo/sharefileinfo.cpp @@ -25,8 +25,12 @@ ShareFileInfo::~ShareFileInfo() QString ShareFileInfo::displayOf(const DisPlayInfoType type) const { - if (DisPlayInfoType::kFileDisplayName == type) - return d->fileName(); + if (DisPlayInfoType::kFileDisplayName == type) { + auto name = d->fileName(); + if (name.isEmpty()) + name = ProxyFileInfo::displayOf(type); + return name; + } return ProxyFileInfo::displayOf(type); } @@ -56,12 +60,7 @@ QUrl ShareFileInfo::urlOf(const UrlInfoType type) const bool ShareFileInfo::isAttributes(const OptInfoType type) const { - switch (type) { - case FileIsType::kIsDir: - return true; - default: - return ProxyFileInfo::isAttributes(type); - } + return ProxyFileInfo::isAttributes(type); } bool ShareFileInfo::canAttributes(const CanableInfoType type) const diff --git a/src/plugins/filemanager/dfmplugin-myshares/iterator/shareiterator.cpp b/src/plugins/filemanager/dfmplugin-myshares/iterator/shareiterator.cpp index 2151d85bb3..1927e545a9 100644 --- a/src/plugins/filemanager/dfmplugin-myshares/iterator/shareiterator.cpp +++ b/src/plugins/filemanager/dfmplugin-myshares/iterator/shareiterator.cpp @@ -9,6 +9,8 @@ #include #include +#include +#include #include @@ -17,8 +19,10 @@ DFMBASE_USE_NAMESPACE ShareIterator::ShareIterator(const QUrl &url, const QStringList &nameFilters, QDir::Filters filters, QDirIterator::IteratorFlags flags) : AbstractDirIterator(url, nameFilters, filters, flags), - d(new ShareIteratorPrivate(this)) + d(new ShareIteratorPrivate(this, url)) { + if (!UniversalUtils::urlEquals(url, ShareUtils::rootUrl())) + d->proxy = new LocalDirIterator(ShareUtils::convertToLocalUrl(url), nameFilters, filters, flags); } ShareIterator::~ShareIterator() @@ -27,24 +31,38 @@ ShareIterator::~ShareIterator() QUrl ShareIterator::next() { + if (d->proxy) + return ShareUtils::makeShareUrl(d->proxy->next().path()); + if (d->shares.isEmpty()) return {}; + d->currentInfo = d->shares.takeFirst(); + return fileUrl(); } bool ShareIterator::hasNext() const { + if (d->proxy) + return d->proxy->hasNext(); + return !d->shares.isEmpty(); } QString ShareIterator::fileName() const { + if (d->proxy) + return d->proxy->fileName(); + return d->currentInfo.value(ShareInfoKeys::kName).toString(); } QUrl ShareIterator::fileUrl() const { + if (d->proxy) + return ShareUtils::makeShareUrl(d->proxy->fileUrl().path()); + return ShareUtils::makeShareUrl(d->currentInfo.value(ShareInfoKeys::kPath).toString()); } @@ -55,13 +73,17 @@ const FileInfoPointer ShareIterator::fileInfo() const QUrl ShareIterator::url() const { + if (d->rootUrl.isValid()) + return d->rootUrl; + return ShareUtils::rootUrl(); } -ShareIteratorPrivate::ShareIteratorPrivate(ShareIterator *qq) +ShareIteratorPrivate::ShareIteratorPrivate(ShareIterator *qq, const QUrl &url) : q(qq) { shares = dpfSlotChannel->push("dfmplugin_dirshare", "slot_Share_AllShareInfos").value>(); + rootUrl = url; } ShareIteratorPrivate::~ShareIteratorPrivate() diff --git a/src/plugins/filemanager/dfmplugin-myshares/menu/mysharemenuscene.cpp b/src/plugins/filemanager/dfmplugin-myshares/menu/mysharemenuscene.cpp index 31b6e8f15f..66f73d3120 100644 --- a/src/plugins/filemanager/dfmplugin-myshares/menu/mysharemenuscene.cpp +++ b/src/plugins/filemanager/dfmplugin-myshares/menu/mysharemenuscene.cpp @@ -7,6 +7,7 @@ #include "events/shareeventscaller.h" #include +#include #include "plugins/common/core/dfmplugin-menu/menu_eventinterface_helper.h" #include @@ -126,18 +127,24 @@ void MyShareMenuScenePrivate::createFileMenu(QMenu *parent) predicateAction[MySharesActionId::kOpenShareFolder] = act; if (selectFiles.count() == 1) { - act = parent->addAction(predicateName[MySharesActionId::kOpenShareInNewWin]); - act->setProperty(ActionPropertyKey::kActionID, MySharesActionId::kOpenShareInNewWin); - predicateAction[MySharesActionId::kOpenShareInNewWin] = act; - - act = parent->addAction(predicateName[MySharesActionId::kOpenShareInNewTab]); - act->setProperty(ActionPropertyKey::kActionID, MySharesActionId::kOpenShareInNewTab); - predicateAction[MySharesActionId::kOpenShareInNewTab] = act; - parent->addSeparator(); - - act = parent->addAction(predicateName[MySharesActionId::kCancleSharing]); - act->setProperty(ActionPropertyKey::kActionID, MySharesActionId::kCancleSharing); - predicateAction[MySharesActionId::kCancleSharing] = act; + auto info = InfoFactory::create(selectFiles.first()); + if (info && info->isAttributes(OptInfoType::kIsDir)) { + act = parent->addAction(predicateName[MySharesActionId::kOpenShareInNewWin]); + act->setProperty(ActionPropertyKey::kActionID, MySharesActionId::kOpenShareInNewWin); + predicateAction[MySharesActionId::kOpenShareInNewWin] = act; + + act = parent->addAction(predicateName[MySharesActionId::kOpenShareInNewTab]); + act->setProperty(ActionPropertyKey::kActionID, MySharesActionId::kOpenShareInNewTab); + predicateAction[MySharesActionId::kOpenShareInNewTab] = act; + parent->addSeparator(); + + bool shared = dpfSlotChannel->push("dfmplugin_dirshare", "slot_Share_IsPathShared", info->pathOf(PathInfoType::kAbsoluteFilePath)).toBool(); + if (shared) { + act = parent->addAction(predicateName[MySharesActionId::kCancleSharing]); + act->setProperty(ActionPropertyKey::kActionID, MySharesActionId::kCancleSharing); + predicateAction[MySharesActionId::kCancleSharing] = act; + } + } } parent->addSeparator(); diff --git a/src/plugins/filemanager/dfmplugin-myshares/private/shareiterator_p.h b/src/plugins/filemanager/dfmplugin-myshares/private/shareiterator_p.h index 16422fe386..e45054d3e5 100644 --- a/src/plugins/filemanager/dfmplugin-myshares/private/shareiterator_p.h +++ b/src/plugins/filemanager/dfmplugin-myshares/private/shareiterator_p.h @@ -7,6 +7,12 @@ #include "dfmplugin_myshares_global.h" +#include + +namespace dfmbase { +class LocalDirIterator; +} + namespace dfmplugin_myshares { class ShareIterator; @@ -15,13 +21,17 @@ class ShareIteratorPrivate friend class ShareIterator; public: - explicit ShareIteratorPrivate(ShareIterator *qq); + explicit ShareIteratorPrivate(ShareIterator *qq, const QUrl &url); ~ShareIteratorPrivate(); private: + dfmbase::LocalDirIterator *proxy { nullptr }; + ShareIterator *q { nullptr }; ShareInfoList shares; ShareInfo currentInfo; + + QUrl rootUrl; }; }