]> cloud.milkyroute.net Git - dolphin.git/commitdiff
InformationPanel: Allow to refresh the panel when its displayed content changes
authorMéven Car <meven29@gmail.com>
Sat, 24 Apr 2021 09:00:31 +0000 (09:00 +0000)
committerMéven Car <meven29@gmail.com>
Sat, 24 Apr 2021 09:00:31 +0000 (09:00 +0000)
BUG: 430095
BUG: 412902
FIXED-IN: 21.08

src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/panels/information/informationpanel.cpp
src/panels/information/informationpanel.h
src/views/dolphinview.cpp
src/views/dolphinview.h

index a126a0bf4bd8102f590a32d39cca1158df5b2609..f14849e6d437eeac1c877da122881b6d9ae32493 100644 (file)
@@ -24,7 +24,6 @@
 #include "panels/folders/folderspanel.h"
 #include "panels/places/placesitemmodel.h"
 #include "panels/places/placespanel.h"
-#include "panels/information/informationpanel.h"
 #include "panels/terminal/terminalpanel.h"
 #include "settings/dolphinsettingsdialog.h"
 #include "statusbar/dolphinstatusbar.h"
@@ -1788,6 +1787,8 @@ void DolphinMainWindow::setupDockWidgets()
             infoPanel, &InformationPanel::setSelection);
     connect(this, &DolphinMainWindow::requestItemInfo,
             infoPanel, &InformationPanel::requestDelayedItemInfo);
+    connect(this, &DolphinMainWindow::fileItemsChanged,
+            infoPanel, &InformationPanel::slotFilesItemChanged);
 #endif
 
     // i18n: This is the last paragraph for the "What's This"-texts of all four panels.
@@ -2173,6 +2174,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container)
             this, &DolphinMainWindow::slotSelectionChanged);
     connect(view, &DolphinView::requestItemInfo,
             this, &DolphinMainWindow::requestItemInfo);
+    connect(view, &DolphinView::fileItemsChanged,
+            this, &DolphinMainWindow::fileItemsChanged);
     connect(view, &DolphinView::tabRequested,
             this, &DolphinMainWindow::openNewTab);
     connect(view, &DolphinView::requestContextMenu,
index 396afbd906d478dcef47d76411a7f39b378bb2b9..f351cc992f65e241cc37f8ce2d986b8125ae521c 100644 (file)
 #include <KSortableList>
 #include <kxmlguiwindow.h>
 
+#ifdef HAVE_BALOO
+    #include "panels/information/informationpanel.h"
+#endif
+
 #include <QIcon>
 #include <QList>
 #include <QMenu>
@@ -192,6 +196,12 @@ Q_SIGNALS:
      */
     void requestItemInfo(const KFileItem& item);
 
+    /**
+     * It is emitted when in the current view, files are changed,
+     * or dirs have files/removed from them.
+     */
+    void fileItemsChanged(const KFileItemList &changedFileItems);
+
     /**
      * Is emitted if the settings have been changed.
      */
@@ -656,7 +666,6 @@ private:
     QMetaObject::Connection m_updateHistoryConnection;
 
     QMenu m_searchTools;
-
 };
 
 inline DolphinViewContainer* DolphinMainWindow::activeViewContainer() const
index da15ccbddffc338ab6239001f3f7833583f5c4cf..fa101f89a2a2a6524b3f838e15e4e0528c65dc5e 100644 (file)
@@ -1015,6 +1015,8 @@ void KFileItemModel::slotItemsAdded(const QUrl &directoryUrl, const KFileItemLis
         // emitted during the maximum update interval.
         m_maximumUpdateIntervalTimer->start();
     }
+
+    Q_EMIT fileItemsChanged({KFileItem(directoryUrl)});
 }
 
 void KFileItemModel::slotItemsDeleted(const KFileItemList& items)
@@ -1023,6 +1025,7 @@ void KFileItemModel::slotItemsDeleted(const KFileItemList& items)
 
     QVector<int> indexesToRemove;
     indexesToRemove.reserve(items.count());
+    KFileItemList dirsChanged;
 
     for (const KFileItem& item : items) {
         const int indexForItem = index(item);
@@ -1036,6 +1039,11 @@ void KFileItemModel::slotItemsDeleted(const KFileItemList& items)
                 m_filteredItems.erase(it);
             }
         }
+
+        QUrl parentUrl = item.url().adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash);
+        if (dirsChanged.findByUrl(parentUrl).isNull()) {
+            dirsChanged << KFileItem(parentUrl);
+        }
     }
 
     std::sort(indexesToRemove.begin(), indexesToRemove.end());
@@ -1063,6 +1071,8 @@ void KFileItemModel::slotItemsDeleted(const KFileItemList& items)
     const KItemRangeList itemRanges = KItemRangeList::fromSortedContainer(indexesToRemove);
     removeFilteredChildren(itemRanges);
     removeItems(itemRanges, DeleteItemData);
+
+    Q_EMIT fileItemsChanged(dirsChanged);
 }
 
 void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >& items)
@@ -1077,6 +1087,7 @@ void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >&
     indexes.reserve(items.count());
 
     QSet<QByteArray> changedRoles;
+    KFileItemList changedFiles;
 
     QListIterator<QPair<KFileItem, KFileItem> > it(items);
     while (it.hasNext()) {
@@ -1102,6 +1113,7 @@ void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >&
 
             m_items.remove(oldItem.url());
             m_items.insert(newItem.url(), indexForItem);
+            changedFiles.append(newItem);
             indexes.append(indexForItem);
         } else {
             // Check if 'oldItem' is one of the filtered items.
@@ -1130,6 +1142,8 @@ void KFileItemModel::slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >&
     std::sort(indexes.begin(), indexes.end());
     const KItemRangeList itemRangeList = KItemRangeList::fromSortedContainer(indexes);
     emitItemsChangedAndTriggerResorting(itemRangeList, changedRoles);
+
+    Q_EMIT fileItemsChanged(changedFiles);
 }
 
 void KFileItemModel::slotClear()
index 886a1c6de52e72b3e0651b2797d6717256905a36..acf4b761cf51bde3b470c197ce5ad36e81721962 100644 (file)
@@ -245,6 +245,12 @@ Q_SIGNALS:
      */
     void urlIsFileError(const QUrl& url);
 
+    /**
+     * It is emitted for files when they change and
+     * for dirs when files are added or removed.
+     */
+    void fileItemsChanged(const KFileItemList &changedFileItems);
+
 protected:
     void onGroupedSortingChanged(bool current) override;
     void onSortRoleChanged(const QByteArray& current, const QByteArray& previous, bool resortItems = true) override;
index f843e7f4624016332e4fcd3f432ff64b91172c0f..9a6fc370884333e89a48c57746da39e62b03c007 100644 (file)
@@ -242,6 +242,7 @@ void InformationPanel::showItemInfo()
             connect(m_folderStatJob, &KIO::Job::result,
                     this, &InformationPanel::slotFolderStatFinished);
         } else {
+            m_shownUrl = item.url();
             m_content->showItem(item);
         }
     }
@@ -303,6 +304,15 @@ void InformationPanel::slotFilesAdded(const QString& directory)
     }
 }
 
+void InformationPanel::slotFilesItemChanged(const KFileItemList &changedFileItems)
+{
+    const auto item = changedFileItems.findByUrl(m_shownUrl);
+    if (!item.isNull()) {
+        m_fileItem = item;
+        showItemInfo();
+    }
+}
+
 void InformationPanel::slotFilesChanged(const QStringList& files)
 {
     for (const QString& fileName : files) {
index debd88e46439c26d33c2950c43d8124283ddeb4e..d7f89bc9c7415f5db25dbc72359a2b5b72f906f3 100644 (file)
@@ -46,6 +46,8 @@ public Q_SLOTS:
      */
     void requestDelayedItemInfo(const KFileItem& item);
 
+    void slotFilesItemChanged(const KFileItemList &changedFileItems);
+
 protected:
     /** @see Panel::urlChanged() */
     bool urlChanged() override;
index 987066419528eed6e5cd59c5d49c120ef5b76ec9..ce77dd325c28023f6a56c28691d4537555fa0146 100644 (file)
@@ -179,6 +179,7 @@ DolphinView::DolphinView(const QUrl& url, QWidget* parent) :
     connect(m_model, &KFileItemModel::errorMessage,           this, &DolphinView::errorMessage);
     connect(m_model, &KFileItemModel::directoryRedirection, this, &DolphinView::slotDirectoryRedirection);
     connect(m_model, &KFileItemModel::urlIsFileError,            this, &DolphinView::urlIsFileError);
+    connect(m_model, &KFileItemModel::fileItemsChanged,            this, &DolphinView::fileItemsChanged);
 
     connect(this, &DolphinView::itemCountChanged,
             this, &DolphinView::updatePlaceholderLabel);
index be8263917dea4dfde9ca9f0919a8d64ee99759c1..bb093774fc6576aed1407223856bfdff6753e75c 100644 (file)
@@ -593,6 +593,8 @@ Q_SIGNALS:
 
     void goUpRequested();
 
+    void fileItemsChanged(const KFileItemList &changedFileItems);
+
 protected:
     /** Changes the zoom level if Control is pressed during a wheel event. */
     void wheelEvent(QWheelEvent* event) override;