X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ef3b7d89914735f9cd321c4f668629121abfdbf1..39f89141b06c:/src/panels/information/informationpanel.cpp diff --git a/src/panels/information/informationpanel.cpp b/src/panels/information/informationpanel.cpp index 1f8e3b541..86a7bb999 100644 --- a/src/panels/information/informationpanel.cpp +++ b/src/panels/information/informationpanel.cpp @@ -18,9 +18,13 @@ ***************************************************************************/ #include "informationpanel.h" + +#include "informationpanelcontent.h" +#include #include +#include #include -#include "informationpanelcontent.h" +#include InformationPanel::InformationPanel(QWidget* parent) : Panel(parent), @@ -33,6 +37,7 @@ InformationPanel::InformationPanel(QWidget* parent) : m_invalidUrlCandidate(), m_fileItem(), m_selection(), + m_folderStatJob(0), m_content(0) { } @@ -48,24 +53,6 @@ QSize InformationPanel::sizeHint() const return size; } -void InformationPanel::setUrl(const KUrl& url) -{ - Panel::setUrl(url); - if (url.isValid() && !isEqualToShownUrl(url)) { - if (isVisible()) { - cancelRequest(); - m_shownUrl = url; - // Update the content with a delay. This gives - // the directory lister the chance to show the content - // before expensive operations are done to show - // meta information. - m_urlChangedTimer->start(); - } else { - m_shownUrl = url; - } - } -} - void InformationPanel::setSelection(const KFileItemList& selection) { if (!isVisible()) { @@ -99,29 +86,61 @@ void InformationPanel::setSelection(const KFileItemList& selection) void InformationPanel::requestDelayedItemInfo(const KFileItem& item) { - if (!isVisible()) { + if (!isVisible() || (item.isNull() && m_fileItem.isNull())) { return; } - cancelRequest(); + if (QApplication::mouseButtons() & Qt::LeftButton) { + // Ignore the request of an item information when a rubberband + // selection is ongoing. + return; + } - m_fileItem = KFileItem(); if (item.isNull()) { // The cursor is above the viewport. If files are selected, // show information regarding the selection. if (m_selection.size() > 0) { + cancelRequest(); + m_fileItem = KFileItem(); m_infoTimer->start(); } - } else { - const KUrl url = item.url(); - if (url.isValid() && !isEqualToShownUrl(url)) { - m_urlCandidate = item.url(); - m_fileItem = item; - m_infoTimer->start(); - } + } else if (item.url().isValid() && !isEqualToShownUrl(item.url())) { + // The cursor is above an item that is not shown currently + cancelRequest(); + + m_urlCandidate = item.url(); + m_fileItem = item; + m_infoTimer->start(); } } +bool InformationPanel::urlChanged() +{ + if (!url().isValid()) { + return false; + } + + if (!isVisible()) { + return true; + } + + cancelRequest(); + m_selection.clear(); + + if (!isEqualToShownUrl(url())) { + m_shownUrl = url(); + m_fileItem = KFileItem(); + + // Update the content with a delay. This gives + // the directory lister the chance to show the content + // before expensive operations are done to show + // meta information. + m_urlChangedTimer->start(); + } + + return true; +} + void InformationPanel::showEvent(QShowEvent* event) { Panel::showEvent(event); @@ -132,6 +151,8 @@ void InformationPanel::showEvent(QShowEvent* event) // Information Panel init(); } + + m_shownUrl = url(); showItemInfo(); } } @@ -159,30 +180,42 @@ void InformationPanel::showItemInfo() cancelRequest(); - if (showMultipleSelectionInfo()) { + if (m_fileItem.isNull() && (m_selection.count() > 1)) { + // The information for a selection of items should be shown m_content->showItems(m_selection); - m_shownUrl = KUrl(); } else { + // The information for exactly one item should be shown KFileItem item; if (!m_fileItem.isNull()) { item = m_fileItem; } else if (!m_selection.isEmpty()) { Q_ASSERT(m_selection.count() == 1); item = m_selection.first(); - } else { - // no item is hovered and no selection has been done: provide - // an item for the directory represented by m_shownUrl - item = KFileItem(KFileItem::Unknown, KFileItem::Unknown, m_shownUrl); - item.refresh(); } - m_content->showItem(item); + if (item.isNull()) { + // No item is hovered and no selection has been done: provide + // an item for the currently shown directory. + m_folderStatJob = KIO::stat(url(), KIO::HideProgressInfo); + connect(m_folderStatJob, SIGNAL(result(KJob*)), + this, SLOT(slotFolderStatFinished(KJob*))); + } else { + m_content->showItem(item); + } } } +void InformationPanel::slotFolderStatFinished(KJob* job) +{ + m_folderStatJob = 0; + const KIO::UDSEntry entry = static_cast(job)->statResult(); + m_content->showItem(KFileItem(entry, m_shownUrl)); +} + void InformationPanel::slotInfoTimeout() { m_shownUrl = m_urlCandidate; + m_urlCandidate.clear(); showItemInfo(); } @@ -205,6 +238,15 @@ void InformationPanel::slotFileRenamed(const QString& source, const QString& des if (m_shownUrl == KUrl(source)) { m_shownUrl = KUrl(dest); m_fileItem = KFileItem(KFileItem::Unknown, KFileItem::Unknown, m_shownUrl); + + if ((m_selection.count() == 1) && (m_selection[0].url() == KUrl(source))) { + m_selection[0] = m_fileItem; + // Implementation note: Updating the selection is only required if exactly one + // item is selected, as the name of the item is shown. If this should change + // in future: Before parsing the whole selection take care to test possible + // performance bottlenecks when renaming several hundreds of files. + } + showItemInfo(); } } @@ -262,12 +304,15 @@ void InformationPanel::slotLeftDirectory(const QString& directory) void InformationPanel::cancelRequest() { + delete m_folderStatJob; + m_folderStatJob = 0; + m_infoTimer->stop(); -} + m_urlChangedTimer->stop(); + m_resetUrlTimer->stop(); -bool InformationPanel::showMultipleSelectionInfo() const -{ - return m_fileItem.isNull() && (m_selection.count() > 1); + m_invalidUrlCandidate.clear(); + m_urlCandidate.clear(); } bool InformationPanel::isEqualToShownUrl(const KUrl& url) const @@ -315,6 +360,9 @@ void InformationPanel::init() m_content = new InformationPanelContent(this); connect(m_content, SIGNAL(urlActivated(KUrl)), this, SIGNAL(urlActivated(KUrl))); + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(m_content); + m_initialized = true; }