[InformationPanel] Hide the video when the preview is disabled, avoid computing the preview when it is disabled

Summary:
Bug symptom : {F6698879}

Fix the bugs and allow to avoid launching a PreviewJob with all files even when the preview is disabled.

Test Plan:
 # In dolphin with an information panel with preview on
 # launch the video preview
 # Disable the preview

  ->bug 1: the video player control is still visible (this bug fix this)

 # re-enable preview

 -> bug 2: the video stays visible and the preview is displayed above (this bug fix this)

Reviewers: #dolphin, elvisangelaccio, ngraham

Reviewed By: #dolphin, elvisangelaccio, ngraham

Subscribers: ngraham, kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D19844
This commit is contained in:
Méven Car 2019-03-24 18:32:25 +01:00
parent aee1b07e26
commit 405aa4878f
3 changed files with 69 additions and 70 deletions

View file

@ -199,8 +199,8 @@ void InformationPanel::showContextMenu(const QPoint &pos) {
const bool isChecked = action->isChecked(); const bool isChecked = action->isChecked();
if (action == previewAction) { if (action == previewAction) {
m_content->setPreviewVisible(isChecked);
InformationPanelSettings::setPreviewsShown(isChecked); InformationPanelSettings::setPreviewsShown(isChecked);
m_content->refreshPreview();
} else if (action == configureAction) { } else if (action == configureAction) {
FileMetaDataConfigurationDialog* dialog = new FileMetaDataConfigurationDialog(this); FileMetaDataConfigurationDialog* dialog = new FileMetaDataConfigurationDialog(this);
dialog->setDescription(i18nc("@label::textbox", dialog->setDescription(i18nc("@label::textbox",

View file

@ -141,73 +141,80 @@ InformationPanelContent::~InformationPanelContent()
void InformationPanelContent::showItem(const KFileItem& item) void InformationPanelContent::showItem(const KFileItem& item)
{ {
m_item = item;
refreshPreview();
refreshMetaData();
}
void InformationPanelContent::refreshPreview() {
// If there is a preview job, kill it to prevent that we have jobs for // If there is a preview job, kill it to prevent that we have jobs for
// multiple items running, and thus a race condition (bug 250787). // multiple items running, and thus a race condition (bug 250787).
if (m_previewJob) { if (m_previewJob) {
m_previewJob->kill(); m_previewJob->kill();
} }
const QUrl itemUrl = item.url(); if (InformationPanelSettings::previewsShown()) {
const bool isSearchUrl = itemUrl.scheme().contains(QStringLiteral("search")) && item.localPath().isEmpty(); m_preview->show();
setNameLabelText(item.text());
if (isSearchUrl) { const QUrl itemUrl = m_item.url();
// in the case of a search-URL the URL is not readable for humans const bool isSearchUrl = itemUrl.scheme().contains(QStringLiteral("search")) && m_item.localPath().isEmpty();
// (at least not useful to show in the Information Panel) setNameLabelText(m_item.text());
m_preview->setPixmap( if (isSearchUrl) {
QIcon::fromTheme(QStringLiteral("nepomuk")).pixmap(KIconLoader::SizeEnormous, KIconLoader::SizeEnormous) // in the case of a search-URL the URL is not readable for humans
); // (at least not useful to show in the Information Panel)
m_preview->setPixmap(
QIcon::fromTheme(QStringLiteral("nepomuk")).pixmap(KIconLoader::SizeEnormous, KIconLoader::SizeEnormous)
);
} else {
// try to get a preview pixmap from the item...
// Mark the currently shown preview as outdated. This is done
// with a small delay to prevent a flickering when the next preview
// can be shown within a short timeframe. This timer is not started
// for directories, as directory previews might fail and return the
// same icon.
if (!m_item.isDir()) {
m_outdatedPreviewTimer->start();
}
QStringList plugins = KIO::PreviewJob::availablePlugins();
m_previewJob = new KIO::PreviewJob(KFileItemList() << m_item,
QSize(m_preview->width(), m_preview->height()),
&plugins);
m_previewJob->setScaleType(KIO::PreviewJob::Unscaled);
m_previewJob->setIgnoreMaximumSize(m_item.isLocalFile());
if (m_previewJob->uiDelegate()) {
KJobWidgets::setWindow(m_previewJob, this);
}
connect(m_previewJob.data(), &KIO::PreviewJob::gotPreview,
this, &InformationPanelContent::showPreview);
connect(m_previewJob.data(), &KIO::PreviewJob::failed,
this, &InformationPanelContent::showIcon);
const QString mimeType = m_item.mimetype();
const bool usePhonon = mimeType.startsWith(QLatin1String("audio/")) || mimeType.startsWith(QLatin1String("video/"));
if (usePhonon) {
m_phononWidget->show();
m_phononWidget->setUrl(m_item.targetUrl());
m_phononWidget->setVideoSize(m_preview->size());
} else {
m_phononWidget->hide();
}
}
} else { } else {
// try to get a preview pixmap from the item... m_preview->hide();
m_phononWidget->hide();
// Mark the currently shown preview as outdated. This is done
// with a small delay to prevent a flickering when the next preview
// can be shown within a short timeframe. This timer is not started
// for directories, as directory previews might fail and return the
// same icon.
if (!item.isDir()) {
m_outdatedPreviewTimer->start();
}
QStringList plugins = KIO::PreviewJob::availablePlugins();
m_previewJob = new KIO::PreviewJob(KFileItemList() << item,
QSize(m_preview->width(), m_preview->height()),
&plugins);
m_previewJob->setScaleType(KIO::PreviewJob::Unscaled);
m_previewJob->setIgnoreMaximumSize(item.isLocalFile());
if (m_previewJob->uiDelegate()) {
KJobWidgets::setWindow(m_previewJob, this);
}
connect(m_previewJob.data(), &KIO::PreviewJob::gotPreview,
this, &InformationPanelContent::showPreview);
connect(m_previewJob.data(), &KIO::PreviewJob::failed,
this, &InformationPanelContent::showIcon);
} }
}
void InformationPanelContent::refreshMetaData() {
if (m_metaDataWidget) { if (m_metaDataWidget) {
m_metaDataWidget->setDateFormat(static_cast<Baloo::DateFormats>(InformationPanelSettings::dateFormat())); m_metaDataWidget->setDateFormat(static_cast<Baloo::DateFormats>(InformationPanelSettings::dateFormat()));
m_metaDataWidget->show(); m_metaDataWidget->show();
m_metaDataWidget->setItems(KFileItemList() << item); m_metaDataWidget->setItems(KFileItemList() << m_item);
} }
if (InformationPanelSettings::previewsShown()) {
const QString mimeType = item.mimetype();
const bool usePhonon = mimeType.startsWith(QLatin1String("audio/")) || mimeType.startsWith(QLatin1String("video/"));
if (usePhonon) {
m_phononWidget->show();
m_phononWidget->setUrl(item.targetUrl());
if (m_preview->isVisible()) {
m_phononWidget->setVideoSize(m_preview->size());
}
} else {
m_phononWidget->hide();
m_preview->setVisible(true);
}
} else {
m_phononWidget->hide();
}
m_item = item;
} }
void InformationPanelContent::showItems(const KFileItemList& items) void InformationPanelContent::showItems(const KFileItemList& items)
@ -290,10 +297,6 @@ void InformationPanelContent::markOutdatedPreview()
m_preview->setPixmap(disabledPixmap); m_preview->setPixmap(disabledPixmap);
} }
void InformationPanelContent::setPreviewVisible(bool visible) {
m_preview->setVisible(visible);
}
KFileItemList InformationPanelContent::items() { KFileItemList InformationPanelContent::items() {
return m_metaDataWidget->items(); return m_metaDataWidget->items();
} }
@ -303,13 +306,6 @@ void InformationPanelContent::slotHasVideoChanged(bool hasVideo)
m_preview->setVisible(InformationPanelSettings::previewsShown() && !hasVideo); m_preview->setVisible(InformationPanelSettings::previewsShown() && !hasVideo);
} }
void InformationPanelContent::refreshMetaData()
{
if (!m_item.isNull()) {
showItem(m_item);
}
}
void InformationPanelContent::setNameLabelText(const QString& text) void InformationPanelContent::setNameLabelText(const QString& text)
{ {
QTextOption textOption; QTextOption textOption;

View file

@ -68,21 +68,24 @@ public:
void showItem(const KFileItem& item); void showItem(const KFileItem& item);
/** /**
* Shows the meta information for the items \p items. * Shows the meta information for the items \p items and its preview
*/ */
void showItems(const KFileItemList& items); void showItems(const KFileItemList& items);
void setPreviewVisible(bool visible);
KFileItemList items(); KFileItemList items();
/**
* Refreshes the preview display, hiding it if needed
*/
void refreshPreview();
signals: signals:
void urlActivated( const QUrl& url ); void urlActivated( const QUrl& url );
public slots: public slots:
/** /**
* Is invoked after the file meta data configuration dialog has been * Is invoked after the file meta data configuration dialog has been
* closed and refreshes the visibility of the meta data. * closed and refreshes the displayed meta data by the panel.
*/ */
void refreshMetaData(); void refreshMetaData();