X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/431da0482caa72f90a6a04785383eb1d133f678e..c7a2e55df95c703749d05022458cb2362fa786bf:/src/panels/information/informationpanel.cpp diff --git a/src/panels/information/informationpanel.cpp b/src/panels/information/informationpanel.cpp index d45974a48..16dc721b2 100644 --- a/src/panels/information/informationpanel.cpp +++ b/src/panels/information/informationpanel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Peter Penz * + * Copyright (C) 2006-2009 by Peter Penz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -18,12 +18,16 @@ ***************************************************************************/ #include "informationpanel.h" -#include + +#include "informationpanelcontent.h" +#include +#include +#include +#include +#include #include #include -#include "informationpanelcontent.h" - -#include +#include InformationPanel::InformationPanel(QWidget* parent) : Panel(parent), @@ -45,30 +49,15 @@ InformationPanel::~InformationPanel() { } -QSize InformationPanel::sizeHint() const -{ - QSize size = Panel::sizeHint(); - size.setWidth(minimumSizeHint().width()); - return size; -} - void InformationPanel::setSelection(const KFileItemList& selection) { - if (!isVisible()) { - return; - } + m_selection = selection; + m_fileItem = KFileItem(); - if ((selection.count() == 0) && (m_selection.count() == 0)) { - // The selection has not really changed, only the current index. - // QItemSelectionModel emits a signal in this case and it is less - // expensive doing the check this way instead of patching - // DolphinView::emitSelectionChanged(). + if (!isVisible()) { return; } - m_selection = selection; - m_fileItem = KFileItem(); - const int count = selection.count(); if (count == 0) { if (!isEqualToShownUrl(url())) { @@ -89,34 +78,46 @@ void InformationPanel::requestDelayedItemInfo(const KFileItem& item) return; } + if (QApplication::mouseButtons() & Qt::LeftButton) { + // Ignore the request of an item information when a rubberband + // selection is ongoing. + return; + } + cancelRequest(); - 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) { + 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 + m_urlCandidate = item.url(); + m_fileItem = item; + m_infoTimer->start(); } } bool InformationPanel::urlChanged() { - if (!url().isValid() || isEqualToShownUrl(url())) { + if (!url().isValid()) { return false; } - m_shownUrl = url(); - if (isVisible()) { - cancelRequest(); + 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 @@ -137,6 +138,8 @@ void InformationPanel::showEvent(QShowEvent* event) // Information Panel init(); } + + m_shownUrl = url(); showItemInfo(); } } @@ -152,7 +155,8 @@ void InformationPanel::resizeEvent(QResizeEvent* event) void InformationPanel::contextMenuEvent(QContextMenuEvent* event) { - m_content->configureSettings(); + // TODO: Move code from InformationPanelContent::configureSettings() here + m_content->configureSettings(customContextMenuActions()); Panel::contextMenuEvent(event); } @@ -164,10 +168,11 @@ 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; @@ -177,11 +182,14 @@ void InformationPanel::showItemInfo() } if (item.isNull()) { - // no item is hovered and no selection has been done: provide - // an item for the directory represented by m_shownUrl - m_folderStatJob = KIO::stat(m_shownUrl, KIO::HideProgressInfo); - connect(m_folderStatJob, SIGNAL(result(KJob*)), - this, SLOT(slotFolderStatFinished(KJob*))); + // 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); + if (m_folderStatJob->uiDelegate()) { + KJobWidgets::setWindow(m_folderStatJob, this); + } + connect(m_folderStatJob, &KIO::Job::result, + this, &InformationPanel::slotFolderStatFinished); } else { m_content->showItem(item); } @@ -198,13 +206,14 @@ void InformationPanel::slotFolderStatFinished(KJob* job) void InformationPanel::slotInfoTimeout() { m_shownUrl = m_urlCandidate; + m_urlCandidate.clear(); showItemInfo(); } void InformationPanel::reset() { if (m_invalidUrlCandidate == m_shownUrl) { - m_invalidUrlCandidate = KUrl(); + m_invalidUrlCandidate = QUrl(); // The current URL is still invalid. Reset // the content to show the directory URL. @@ -217,11 +226,11 @@ void InformationPanel::reset() void InformationPanel::slotFileRenamed(const QString& source, const QString& dest) { - if (m_shownUrl == KUrl(source)) { - m_shownUrl = KUrl(dest); - m_fileItem = KFileItem(KFileItem::Unknown, KFileItem::Unknown, m_shownUrl); + if (m_shownUrl == QUrl::fromLocalFile(source)) { + m_shownUrl = QUrl::fromLocalFile(dest); + m_fileItem = KFileItem(m_shownUrl); - if ((m_selection.count() == 1) && (m_selection[0].url() == KUrl(source))) { + if ((m_selection.count() == 1) && (m_selection[0].url() == QUrl::fromLocalFile(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 @@ -235,10 +244,10 @@ void InformationPanel::slotFileRenamed(const QString& source, const QString& des void InformationPanel::slotFilesAdded(const QString& directory) { - if (m_shownUrl == KUrl(directory)) { + if (m_shownUrl == QUrl::fromLocalFile(directory)) { // If the 'trash' icon changes because the trash has been emptied or got filled, // the signal filesAdded("trash:/") will be emitted. - KFileItem item(KFileItem::Unknown, KFileItem::Unknown, KUrl(directory)); + KFileItem item(QUrl::fromLocalFile(directory)); requestDelayedItemInfo(item); } } @@ -246,7 +255,7 @@ void InformationPanel::slotFilesAdded(const QString& directory) void InformationPanel::slotFilesChanged(const QStringList& files) { foreach (const QString& fileName, files) { - if (m_shownUrl == KUrl(fileName)) { + if (m_shownUrl == QUrl::fromLocalFile(fileName)) { showItemInfo(); break; } @@ -256,7 +265,7 @@ void InformationPanel::slotFilesChanged(const QStringList& files) void InformationPanel::slotFilesRemoved(const QStringList& files) { foreach (const QString& fileName, files) { - if (m_shownUrl == KUrl(fileName)) { + if (m_shownUrl == QUrl::fromLocalFile(fileName)) { // the currently shown item has been removed, show // the parent directory as fallback markUrlAsInvalid(); @@ -267,15 +276,15 @@ void InformationPanel::slotFilesRemoved(const QStringList& files) void InformationPanel::slotEnteredDirectory(const QString& directory) { - if (m_shownUrl == KUrl(directory)) { - KFileItem item(KFileItem::Unknown, KFileItem::Unknown, KUrl(directory)); + if (m_shownUrl == QUrl::fromLocalFile(directory)) { + KFileItem item(QUrl::fromLocalFile(directory)); requestDelayedItemInfo(item); } } void InformationPanel::slotLeftDirectory(const QString& directory) { - if (m_shownUrl == KUrl(directory)) { + if (m_shownUrl == QUrl::fromLocalFile(directory)) { // The signal 'leftDirectory' is also emitted when a media // has been unmounted. In this case no directory change will be // done in Dolphin, but the Information Panel must be updated to @@ -288,17 +297,20 @@ void InformationPanel::cancelRequest() { delete m_folderStatJob; m_folderStatJob = 0; + m_infoTimer->stop(); -} + m_resetUrlTimer->stop(); + // Don't reset m_urlChangedTimer. As it is assured that the timeout of m_urlChangedTimer + // has the smallest interval (see init()), it is not possible that the exceeded timer + // would overwrite an information provided by a selection or hovering. -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 +bool InformationPanel::isEqualToShownUrl(const QUrl& url) const { - return m_shownUrl.equals(url, KUrl::CompareWithoutTrailingSlash); + return m_shownUrl.matches(url, QUrl::StripTrailingSlash); } void InformationPanel::markUrlAsInvalid() @@ -309,42 +321,43 @@ void InformationPanel::markUrlAsInvalid() void InformationPanel::init() { - const int defaultDelay = 300; - m_infoTimer = new QTimer(this); - m_infoTimer->setInterval(defaultDelay); + m_infoTimer->setInterval(300); m_infoTimer->setSingleShot(true); - connect(m_infoTimer, SIGNAL(timeout()), - this, SLOT(slotInfoTimeout())); + connect(m_infoTimer, &QTimer::timeout, + this, &InformationPanel::slotInfoTimeout); m_urlChangedTimer = new QTimer(this); - m_urlChangedTimer->setInterval(defaultDelay); + m_urlChangedTimer->setInterval(200); m_urlChangedTimer->setSingleShot(true); - connect(m_urlChangedTimer, SIGNAL(timeout()), - this, SLOT(showItemInfo())); + connect(m_urlChangedTimer, &QTimer::timeout, + this, &InformationPanel::showItemInfo); m_resetUrlTimer = new QTimer(this); - m_resetUrlTimer->setInterval(defaultDelay * 3); + m_resetUrlTimer->setInterval(1000); m_resetUrlTimer->setSingleShot(true); - connect(m_resetUrlTimer, SIGNAL(timeout()), - this, SLOT(reset())); + connect(m_resetUrlTimer, &QTimer::timeout, + this, &InformationPanel::reset); + + Q_ASSERT(m_urlChangedTimer->interval() < m_infoTimer->interval()); + Q_ASSERT(m_urlChangedTimer->interval() < m_resetUrlTimer->interval()); org::kde::KDirNotify* dirNotify = new org::kde::KDirNotify(QString(), QString(), QDBusConnection::sessionBus(), this); - connect(dirNotify, SIGNAL(FileRenamed(QString, QString)), SLOT(slotFileRenamed(QString, QString))); - connect(dirNotify, SIGNAL(FilesAdded(QString)), SLOT(slotFilesAdded(QString))); - connect(dirNotify, SIGNAL(FilesChanged(QStringList)), SLOT(slotFilesChanged(QStringList))); - connect(dirNotify, SIGNAL(FilesRemoved(QStringList)), SLOT(slotFilesRemoved(QStringList))); - connect(dirNotify, SIGNAL(enteredDirectory(QString)), SLOT(slotEnteredDirectory(QString))); - connect(dirNotify, SIGNAL(leftDirectory(QString)), SLOT(slotLeftDirectory(QString))); + connect(dirNotify, &OrgKdeKDirNotifyInterface::FileRenamed, this, &InformationPanel::slotFileRenamed); + connect(dirNotify, &OrgKdeKDirNotifyInterface::FilesAdded, this, &InformationPanel::slotFilesAdded); + connect(dirNotify, &OrgKdeKDirNotifyInterface::FilesChanged, this, &InformationPanel::slotFilesChanged); + connect(dirNotify, &OrgKdeKDirNotifyInterface::FilesRemoved, this, &InformationPanel::slotFilesRemoved); + connect(dirNotify, &OrgKdeKDirNotifyInterface::enteredDirectory, this, &InformationPanel::slotEnteredDirectory); + connect(dirNotify, &OrgKdeKDirNotifyInterface::leftDirectory, this, &InformationPanel::slotLeftDirectory); m_content = new InformationPanelContent(this); - connect(m_content, SIGNAL(urlActivated(KUrl)), this, SIGNAL(urlActivated(KUrl))); + connect(m_content, &InformationPanelContent::urlActivated, this, &InformationPanel::urlActivated); QVBoxLayout* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_content); m_initialized = true; } -#include "informationpanel.moc"