X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b786c28e0431e01c5938a824709046fa149a6977..8ffc72e87f4cffa8dce32da06e9a1d51a595765e:/src/panels/information/informationpanelcontent.cpp diff --git a/src/panels/information/informationpanelcontent.cpp b/src/panels/information/informationpanelcontent.cpp index 4ddbf6562..5c1b7ae22 100644 --- a/src/panels/information/informationpanelcontent.cpp +++ b/src/panels/information/informationpanelcontent.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009 by Peter Penz * + * Copyright (C) 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 * @@ -19,59 +19,57 @@ #include "informationpanelcontent.h" -#include +#include +#include +#include +#include +#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include + +#include + +#include +#include #include #include -#include -#include #include -#include -#include +#include #include #include -#include #include #include +#include +#include +#include +#include +#include #include "dolphin_informationpanelsettings.h" -#include "settings/dolphinsettings.h" -#include "metadatawidget.h" #include "phononwidget.h" #include "pixmapviewer.h" -/** - * Helper function for sorting items with qSort() in - * InformationPanelContent::contextMenu(). - */ -bool lessThan(const QAction* action1, const QAction* action2) -{ - return action1->text() < action2->text(); -} - +const int PLAY_ARROW_SIZE = 24; +const int PLAY_ARROW_BORDER_SIZE = 2; InformationPanelContent::InformationPanelContent(QWidget* parent) : - Panel(parent), + QWidget(parent), m_item(), - m_pendingPreview(false), - m_outdatedPreviewTimer(0), - m_nameLabel(0), - m_preview(0), - m_previewSeparator(0), - m_phononWidget(0), - m_metaDataWidget(0), - m_metaDataArea(0) + m_previewJob(nullptr), + m_outdatedPreviewTimer(nullptr), + m_preview(nullptr), + m_phononWidget(nullptr), + m_nameLabel(nullptr), + m_metaDataWidget(nullptr), + m_metaDataArea(nullptr), + m_placesItemModel(nullptr), + m_isVideo(false) { parent->installEventFilter(this); @@ -81,20 +79,10 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : m_outdatedPreviewTimer = new QTimer(this); m_outdatedPreviewTimer->setInterval(300); m_outdatedPreviewTimer->setSingleShot(true); - connect(m_outdatedPreviewTimer, SIGNAL(timeout()), - this, SLOT(markOutdatedPreview())); + connect(m_outdatedPreviewTimer, &QTimer::timeout, + this, &InformationPanelContent::markOutdatedPreview); - QVBoxLayout* layout = new QVBoxLayout; - layout->setSpacing(KDialog::spacingHint()); - - // name - m_nameLabel = new QLabel(parent); - QFont font = m_nameLabel->font(); - font.setBold(true); - m_nameLabel->setFont(font); - m_nameLabel->setAlignment(Qt::AlignHCenter); - m_nameLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - m_nameLabel->setMaximumWidth(KIconLoader::SizeEnormous); + QVBoxLayout* layout = new QVBoxLayout(this); // preview const int minPreviewWidth = KIconLoader::SizeEnormous + KIconLoader::SizeMedium; @@ -104,127 +92,232 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : m_preview->setMinimumHeight(KIconLoader::SizeEnormous); m_phononWidget = new PhononWidget(parent); + m_phononWidget->hide(); m_phononWidget->setMinimumWidth(minPreviewWidth); - connect(m_phononWidget, SIGNAL(playingStarted()), - this, SLOT(slotPlayingStarted())); - connect(m_phononWidget, SIGNAL(playingStopped()), - this, SLOT(slotPlayingStopped())); + m_phononWidget->setAutoPlay(InformationPanelSettings::previewsAutoPlay()); + connect(m_phononWidget, &PhononWidget::hasVideoChanged, + this, &InformationPanelContent::slotHasVideoChanged); - m_previewSeparator = new KSeparator(parent); - - const bool showPreview = InformationPanelSettings::showPreview(); - m_preview->setVisible(showPreview); - m_previewSeparator->setVisible(showPreview); - - m_metaDataWidget = new MetaDataWidget(parent); + // name + m_nameLabel = new QLabel(parent); + QFont font = m_nameLabel->font(); + font.setBold(true); + m_nameLabel->setFont(font); + m_nameLabel->setTextFormat(Qt::PlainText); + m_nameLabel->setAlignment(Qt::AlignHCenter); + m_nameLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); + + const bool previewsShown = InformationPanelSettings::previewsShown(); + m_preview->setVisible(previewsShown); + + m_metaDataWidget = new Baloo::FileMetaDataWidget(parent); + m_metaDataWidget->setDateFormat(static_cast(InformationPanelSettings::dateFormat())); + connect(m_metaDataWidget, &Baloo::FileMetaDataWidget::urlActivated, + this, &InformationPanelContent::urlActivated); + m_metaDataWidget->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); + m_metaDataWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); + + // Configuration + m_configureLabel = new QLabel(i18nc("@label::textbox", + "Select which data should be shown:"), this); + m_configureLabel->setWordWrap(true); + m_configureLabel->setVisible(false); + + m_configureButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel); + m_configureButtons->setVisible(false); + connect(m_configureButtons, &QDialogButtonBox::accepted, this, [this]() { + m_metaDataWidget->setConfigurationMode(Baloo::ConfigurationMode::Accept); + m_configureButtons->setVisible(false); + m_configureLabel->setVisible(false); + emit configurationFinished(); + } + ); + connect(m_configureButtons, &QDialogButtonBox::rejected, this, [this]() { + m_metaDataWidget->setConfigurationMode(Baloo::ConfigurationMode::Cancel); + m_configureButtons->setVisible(false); + m_configureLabel->setVisible(false); + emit configurationFinished(); + } + ); m_metaDataArea = new QScrollArea(parent); - //m_metaDataArea->setWidget(m_metaDataArea); + m_metaDataArea->setWidget(m_metaDataWidget); m_metaDataArea->setWidgetResizable(true); m_metaDataArea->setFrameShape(QFrame::NoFrame); QWidget* viewport = m_metaDataArea->viewport(); viewport->installEventFilter(this); - QPalette palette = viewport->palette(); - palette.setColor(viewport->backgroundRole(), QColor(Qt::transparent)); - viewport->setPalette(palette); - - layout->addWidget(m_nameLabel); - layout->addWidget(new KSeparator(this)); layout->addWidget(m_preview); layout->addWidget(m_phononWidget); - layout->addWidget(m_previewSeparator); - if (m_metaDataWidget != 0) { - layout->addWidget(m_metaDataWidget); - } + layout->addWidget(m_nameLabel); + layout->addWidget(new KSeparator()); + layout->addWidget(m_configureLabel); layout->addWidget(m_metaDataArea); - parent->setLayout(layout); + layout->addWidget(m_configureButtons); + + m_placesItemModel = new PlacesItemModel(this); } InformationPanelContent::~InformationPanelContent() { - InformationPanelSettings::self()->writeConfig(); + InformationPanelSettings::self()->save(); } void InformationPanelContent::showItem(const KFileItem& item) { - m_pendingPreview = false; - - const KUrl itemUrl = item.url(); - if (!applyPlace(itemUrl)) { - // try to get a preview pixmap from the item... - m_pendingPreview = true; - - // 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(); - } + // compares item entries, comparing items only compares urls + if (m_item.entry() != item.entry()) { + m_item = item; + m_preview->stopAnimatedImage(); + refreshMetaData(); + } + + refreshPreview(); +} - KIO::PreviewJob* job = KIO::filePreview(KFileItemList() << item, - m_preview->width(), - m_preview->height(), - 0, - 0, - false, - true); +void InformationPanelContent::refreshPixmapView() +{ + // 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). + if (m_previewJob) { + m_previewJob->kill(); + } - connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)), - this, SLOT(showPreview(const KFileItem&, const QPixmap&))); - connect(job, SIGNAL(failed(const KFileItem&)), - this, SLOT(showIcon(const KFileItem&))); + // try to get a preview pixmap from the item... - setNameLabelText(itemUrl.fileName()); + // 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(); } - if (m_metaDataWidget != 0) { - m_metaDataWidget->setItem(item); + 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); } - if (InformationPanelSettings::showPreview()) { - const QString mimeType = item.mimetype(); - const bool usePhonon = Phonon::BackendCapabilities::isMimeTypeAvailable(mimeType) && - (mimeType != "image/png"); // TODO: workaround, as Phonon - // thinks it supports PNG images - if (usePhonon) { - m_phononWidget->show(); - PhononWidget::Mode mode = mimeType.startsWith(QLatin1String("video")) - ? PhononWidget::Video - : PhononWidget::Audio; - m_phononWidget->setMode(mode); - m_phononWidget->setUrl(item.url()); - if ((mode == PhononWidget::Video) && m_preview->isVisible()) { - m_phononWidget->setVideoSize(m_preview->size()); - } + connect(m_previewJob.data(), &KIO::PreviewJob::gotPreview, + this, &InformationPanelContent::showPreview); + connect(m_previewJob.data(), &KIO::PreviewJob::failed, + this, &InformationPanelContent::showIcon); +} + +void InformationPanelContent::refreshPreview() +{ + // 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). + if (m_previewJob) { + m_previewJob->kill(); + } + + m_preview->setCursor(Qt::ArrowCursor); + bool usePhonon = false; + setNameLabelText(m_item.text()); + if (InformationPanelSettings::previewsShown()) { + + const QUrl itemUrl = m_item.url(); + const bool isSearchUrl = itemUrl.scheme().contains(QLatin1String("search")) && m_item.localPath().isEmpty(); + if (isSearchUrl) { + m_preview->show(); + + // 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("baloo")).pixmap(KIconLoader::SizeEnormous, KIconLoader::SizeEnormous) + ); } else { - m_phononWidget->hide(); - m_preview->setVisible(true); + + refreshPixmapView(); + + const QString mimeType = m_item.mimetype(); + const bool isAnimatedImage = m_preview->isAnimatedImage(itemUrl.toLocalFile()); + m_isVideo = !isAnimatedImage && mimeType.startsWith(QLatin1String("video/")); + usePhonon = m_isVideo || mimeType.startsWith(QLatin1String("audio/")); + + if (usePhonon) { + // change the cursor of the preview + m_preview->setCursor(Qt::PointingHandCursor); + m_preview->installEventFilter(m_phononWidget); + + // if the video is playing, has been paused or stopped + // we don't need to update the preview/phonon widget states + // unless the previewed file has changed, + // or the setting previewshown has changed + if ((m_phononWidget->state() != Phonon::State::PlayingState && + m_phononWidget->state() != Phonon::State::PausedState && + m_phononWidget->state() != Phonon::State::StoppedState) || + m_item.targetUrl() != m_phononWidget->url() || + (!m_preview->isVisible() &&! m_phononWidget->isVisible())) { + + if (InformationPanelSettings::previewsAutoPlay() && m_isVideo) { + // hides the preview now to avoid flickering when the autoplay video starts + m_preview->hide(); + } else { + // the video won't play before the preview is displayed + m_preview->show(); + } + + m_phononWidget->show(); + m_phononWidget->setUrl(m_item.targetUrl(), m_isVideo ? PhononWidget::MediaKind::Video : PhononWidget::MediaKind::Audio); + adjustWidgetSizes(parentWidget()->width()); + } + } else { + if (isAnimatedImage) { + m_preview->setAnimatedImageFileName(itemUrl.toLocalFile()); + } + // When we don't need it, hide the phonon widget first to avoid flickering + m_phononWidget->hide(); + m_preview->show(); + m_preview->removeEventFilter(m_phononWidget); + m_phononWidget->clearUrl(); + } } } else { + m_preview->stopAnimatedImage(); + m_preview->hide(); m_phononWidget->hide(); } +} + +void InformationPanelContent::configureShownProperties() +{ + m_configureLabel->setVisible(true); + m_configureButtons->setVisible(true); + m_metaDataWidget->setConfigurationMode(Baloo::ConfigurationMode::ReStart); +} - m_item = item; +void InformationPanelContent::refreshMetaData() +{ + m_metaDataWidget->setDateFormat(static_cast(InformationPanelSettings::dateFormat())); + m_metaDataWidget->show(); + m_metaDataWidget->setItems(KFileItemList() << m_item); } void InformationPanelContent::showItems(const KFileItemList& items) { - m_pendingPreview = false; + // 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). + if (m_previewJob) { + m_previewJob->kill(); + } - KIconLoader iconLoader; - QPixmap icon = iconLoader.loadIcon("dialog-information", - KIconLoader::NoGroup, - KIconLoader::SizeEnormous); - m_preview->setPixmap(icon); - setNameLabelText(i18ncp("@info", "%1 item selected", "%1 items selected", items.count())); + m_preview->stopAnimatedImage(); - if (m_metaDataWidget != 0) { - m_metaDataWidget->setItems(items); - } + m_preview->setPixmap( + QIcon::fromTheme(QStringLiteral("dialog-information")).pixmap(KIconLoader::SizeEnormous, KIconLoader::SizeEnormous) + ); + setNameLabelText(i18ncp("@label", "%1 item selected", "%1 items selected", items.count())); + + m_metaDataWidget->setItems(items); m_phononWidget->hide(); @@ -233,219 +326,114 @@ void InformationPanelContent::showItems(const KFileItemList& items) bool InformationPanelContent::eventFilter(QObject* obj, QEvent* event) { - if (event->type() == QEvent::Resize) { + switch (event->type()) { + case QEvent::Resize: { QResizeEvent* resizeEvent = static_cast(event); if (obj == m_metaDataArea->viewport()) { // The size of the meta text area has changed. Adjust the fixed // width in a way that no horizontal scrollbar needs to be shown. - //m_metaDataWidget->setFixedWidth(resizeEvent->size().width()); + m_metaDataWidget->setFixedWidth(resizeEvent->size().width()); } else if (obj == parent()) { - // If the text inside the name label or the info label cannot - // get wrapped, then the maximum width of the label is increased - // so that the width of the information panel gets increased. - // To prevent this, the maximum width is adjusted to - // the current width of the panel. - const int maxWidth = resizeEvent->size().width() - KDialog::spacingHint() * 4; - m_nameLabel->setMaximumWidth(maxWidth); - - // The metadata widget also contains a text widget which may return - // a large preferred width. - if (m_metaDataWidget != 0) { - //m_metaDataWidget->setMaximumWidth(maxWidth); - } - - // try to increase the preview as large as possible - m_preview->setSizeHint(QSize(maxWidth, maxWidth)); - - if (m_phononWidget->isVisible() && (m_phononWidget->mode() == PhononWidget::Video)) { - // assure that the size of the video player is the same as the preview size - m_phononWidget->setVideoSize(QSize(maxWidth, maxWidth)); - } + adjustWidgetSizes(resizeEvent->size().width()); } + break; } - return Panel::eventFilter(obj, event); -} - -void InformationPanelContent::configureSettings() -{ - if (m_item.isNull() || - !m_item.nepomukUri().isValid()) { - return; - } - - KMenu popup(this); - - QAction* previewAction = popup.addAction(i18nc("@action:inmenu", "Preview")); - previewAction->setIcon(KIcon("view-preview")); - previewAction->setCheckable(true); - previewAction->setChecked(InformationPanelSettings::showPreview()); - - const bool metaDataAvailable = true; // MetaDataWidget::metaDataAvailable(); TODO - - QAction* ratingAction = popup.addAction(i18nc("@action:inmenu", "Rating")); - ratingAction->setIcon(KIcon("rating")); - ratingAction->setCheckable(true); - ratingAction->setChecked(InformationPanelSettings::showRating()); - ratingAction->setEnabled(metaDataAvailable); - - QAction* commentAction = popup.addAction(i18nc("@action:inmenu", "Comment")); - commentAction->setIcon(KIcon("text-plain")); - commentAction->setCheckable(true); - commentAction->setChecked(InformationPanelSettings::showComment()); - commentAction->setEnabled(metaDataAvailable); - - QAction* tagsAction = popup.addAction(i18nc("@action:inmenu", "Tags")); - tagsAction->setCheckable(true); - tagsAction->setChecked(InformationPanelSettings::showTags()); - tagsAction->setEnabled(metaDataAvailable); - - KConfig config("kmetainformationrc", KConfig::NoGlobals); - KConfigGroup settings = config.group("Show"); - - QList actions; - - // Get all meta information labels that are available for - // the currently shown file item and add them to the popup. - /*Nepomuk::Resource res(m_item.url()); - QHash properties = res.properties(); - QHash::const_iterator it = properties.constBegin(); - while (it != properties.constEnd()) { - Nepomuk::Types::Property prop(it.key()); - const QString key = prop.name(); - - // Meta information provided by Nepomuk that is already - // available from KFileItem should not be configurable. - bool skip = (key == "fileExtension") || - (key == "name") || - (key == "sourceModified") || - (key == "size") || - (key == "mime type"); - if (!skip) { - // Check whether there is already a meta information - // having the same label. In this case don't show it - // twice in the menu. - foreach (const QAction* action, actions) { - if (action->data().toString() == key) { - skip = true; - break; - } - } - } - - if (!skip) { - const QString label = tunedLabel(prop.label()); - QAction* action = new QAction(label, &popup); - action->setCheckable(true); - action->setChecked(settings.readEntry(key, true)); - action->setData(key); - actions.append(action); - } - - ++it; - }*/ - if (!actions.isEmpty()) { - popup.addSeparator(); + case QEvent::Polish: + adjustWidgetSizes(parentWidget()->width()); + break; - // add all items alphabetically sorted to the popup - qSort(actions.begin(), actions.end(), lessThan); - foreach (QAction* action, actions) { - popup.addAction(action); - } - } - - // Open the popup and adjust the settings for the - // selected action. - QAction* action = popup.exec(QCursor::pos()); - if (action == 0) { - return; - } + case QEvent::FontChange: + m_metaDataWidget->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); + break; - const bool isChecked = action->isChecked(); - if (action == previewAction) { - m_preview->setVisible(isChecked); - m_previewSeparator->setVisible(isChecked); - InformationPanelSettings::setShowPreview(isChecked); - } else if (action == ratingAction) { - //m_metaDataWidget->setRatingVisible(isChecked); - InformationPanelSettings::setShowRating(isChecked); - } else if (action == commentAction) { - //m_metaDataWidget->setCommentVisible(isChecked); - InformationPanelSettings::setShowComment(isChecked); - } else if (action == tagsAction) { - //m_metaDataWidget->setTagsVisible(isChecked); - InformationPanelSettings::setShowTags(isChecked); - } else { - settings.writeEntry(action->data().toString(), action->isChecked()); - settings.sync(); + default: + break; } - /*if (m_metaDataWidget != 0) { - const bool visible = m_metaDataWidget->isRatingVisible() || - m_metaDataWidget->isCommentVisible() || - m_metaDataWidget->areTagsVisible(); - m_metaDataSeparator->setVisible(visible); - }*/ - - showItem(m_item); + return QWidget::eventFilter(obj, event); } void InformationPanelContent::showIcon(const KFileItem& item) { m_outdatedPreviewTimer->stop(); - m_pendingPreview = false; - if (!applyPlace(item.url())) { - m_preview->setPixmap(item.pixmap(KIconLoader::SizeEnormous)); - } + QPixmap pixmap = QIcon::fromTheme(item.iconName()).pixmap(KIconLoader::SizeEnormous, KIconLoader::SizeEnormous); + KIconLoader::global()->drawOverlays(item.overlays(), pixmap, KIconLoader::Desktop); + m_preview->setPixmap(pixmap); } void InformationPanelContent::showPreview(const KFileItem& item, - const QPixmap& pixmap) + const QPixmap& pixmap) { m_outdatedPreviewTimer->stop(); - Q_UNUSED(item); - if (m_pendingPreview) { - m_preview->setPixmap(pixmap); - m_pendingPreview = false; + QPixmap p = pixmap; + KIconLoader::global()->drawOverlays(item.overlays(), p, KIconLoader::Desktop); + + if (m_isVideo) { + // adds a play arrow + + // compute relative pixel positions + const int zeroX = static_cast(p.width() / 2 - PLAY_ARROW_SIZE / 2 / devicePixelRatio()); + const int zeroY = static_cast(p.height() / 2 - PLAY_ARROW_SIZE / 2 / devicePixelRatio()); + + QPolygon arrow; + arrow << QPoint(zeroX, zeroY); + arrow << QPoint(zeroX, zeroY + PLAY_ARROW_SIZE); + arrow << QPoint(zeroX + PLAY_ARROW_SIZE, zeroY + PLAY_ARROW_SIZE / 2); + + QPainterPath path; + path.addPolygon(arrow); + + QLinearGradient gradient(QPointF(zeroX, zeroY), + QPointF(zeroX + PLAY_ARROW_SIZE,zeroY + PLAY_ARROW_SIZE)); + + QColor whiteColor = Qt::white; + QColor blackColor = Qt::black; + gradient.setColorAt(0, whiteColor); + gradient.setColorAt(1, blackColor); + + QBrush brush(gradient); + + QPainter painter(&p); + + QPen pen(blackColor, PLAY_ARROW_BORDER_SIZE, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); + painter.setPen(pen); + + painter.setRenderHint(QPainter::Antialiasing); + painter.drawPolygon(arrow); + painter.fillPath(path, brush); } + + m_preview->setPixmap(p); } void InformationPanelContent::markOutdatedPreview() { - KIconEffect iconEffect; - QPixmap disabledPixmap = iconEffect.apply(m_preview->pixmap(), - KIconLoader::Desktop, - KIconLoader::DisabledState); + KIconEffect *iconEffect = KIconLoader::global()->iconEffect(); + QPixmap disabledPixmap = iconEffect->apply(m_preview->pixmap(), + KIconLoader::Desktop, + KIconLoader::DisabledState); m_preview->setPixmap(disabledPixmap); } -void InformationPanelContent::slotPlayingStarted() +KFileItemList InformationPanelContent::items() { - m_preview->setVisible(m_phononWidget->mode() != PhononWidget::Video); + return m_metaDataWidget->items(); } -void InformationPanelContent::slotPlayingStopped() +void InformationPanelContent::slotHasVideoChanged(bool hasVideo) { - m_preview->setVisible(true); -} - -bool InformationPanelContent::applyPlace(const KUrl& url) -{ - KFilePlacesModel* placesModel = DolphinSettings::instance().placesModel(); - int count = placesModel->rowCount(); - - for (int i = 0; i < count; ++i) { - QModelIndex index = placesModel->index(i, 0); - - if (url.equals(placesModel->url(index), KUrl::CompareWithoutTrailingSlash)) { - setNameLabelText(placesModel->text(index)); - m_preview->setPixmap(placesModel->icon(index).pixmap(128, 128)); - return true; - } + m_preview->setVisible(InformationPanelSettings::previewsShown() && !hasVideo); + if (m_preview->isVisible() && m_preview->size().width() != m_preview->pixmap().size().width()) { + // in case the information panel has been resized when the preview was not displayed + // we need to refresh its content + refreshPixmapView(); } +} - return false; +void InformationPanelContent::setPreviewAutoPlay(bool autoPlay) { + m_phononWidget->setAutoPlay(autoPlay); } void InformationPanelContent::setNameLabelText(const QString& text) @@ -453,19 +441,21 @@ void InformationPanelContent::setNameLabelText(const QString& text) QTextOption textOption; textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - QTextLayout textLayout(text); + const QString processedText = Qt::mightBeRichText(text) ? text : KStringHandler::preProcessWrap(text); + + QTextLayout textLayout(processedText); textLayout.setFont(m_nameLabel->font()); textLayout.setTextOption(textOption); QString wrappedText; - wrappedText.reserve(text.length()); + wrappedText.reserve(processedText.length()); // wrap the text to fit into the width of m_nameLabel textLayout.beginLayout(); QTextLine line = textLayout.createLine(); while (line.isValid()) { line.setLineWidth(m_nameLabel->width()); - wrappedText += text.mid(line.textStart(), line.textLength()); + wrappedText += processedText.midRef(line.textStart(), line.textLength()); line = textLayout.createLine(); if (line.isValid()) { @@ -477,4 +467,26 @@ void InformationPanelContent::setNameLabelText(const QString& text) m_nameLabel->setText(wrappedText); } -#include "informationpanelcontent.moc" +void InformationPanelContent::adjustWidgetSizes(int width) +{ + // If the text inside the name label or the info label cannot + // get wrapped, then the maximum width of the label is increased + // so that the width of the information panel gets increased. + // To prevent this, the maximum width is adjusted to + // the current width of the panel. + const int maxWidth = width - style()->layoutSpacing(QSizePolicy::DefaultType, QSizePolicy::DefaultType, Qt::Horizontal) * 4; + m_nameLabel->setMaximumWidth(maxWidth); + + // The metadata widget also contains a text widget which may return + // a large preferred width. + m_metaDataWidget->setMaximumWidth(maxWidth); + + // try to increase the preview as large as possible + m_preview->setSizeHint(QSize(maxWidth, maxWidth)); + + if (m_phononWidget->isVisible()) { + // assure that the size of the video player is the same as the preview size + m_phononWidget->setVideoSize(QSize(maxWidth, maxWidth)); + } +} +