X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/2b6cceb0f6a46c47ad55f36379e38cb143f28d36..ed68687614472e18904c4a3f613d01df2f5bb90e:/src/panels/information/informationpanelcontent.cpp diff --git a/src/panels/information/informationpanelcontent.cpp b/src/panels/information/informationpanelcontent.cpp index bd24e568d..b18e6b26e 100644 --- a/src/panels/information/informationpanelcontent.cpp +++ b/src/panels/information/informationpanelcontent.cpp @@ -21,13 +21,16 @@ #include #include +#include #include +#include #include #include #include #include #include #include +#include #include #include @@ -39,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -46,8 +50,7 @@ #include "dolphin_informationpanelsettings.h" #include "settings/dolphinsettings.h" -#include "kmetadatawidget.h" -#include "kmetadataconfigurationdialog.h" +#include "settings/filemetadataconfigurationdialog.h" #include "phononwidget.h" #include "pixmapviewer.h" @@ -73,7 +76,7 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : connect(m_outdatedPreviewTimer, SIGNAL(timeout()), this, SLOT(markOutdatedPreview())); - QVBoxLayout* layout = new QVBoxLayout; + QVBoxLayout* layout = new QVBoxLayout(this); layout->setSpacing(KDialog::spacingHint()); // preview @@ -101,7 +104,8 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : const bool showPreview = InformationPanelSettings::showPreview(); m_preview->setVisible(showPreview); - m_metaDataWidget = new KMetaDataWidget(parent); + m_metaDataWidget = new KFileMetaDataWidget(parent); + m_metaDataWidget->setFont(KGlobalSettings::smallestReadableFont()); m_metaDataWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); connect(m_metaDataWidget, SIGNAL(urlActivated(KUrl)), this, SIGNAL(urlActivated(KUrl))); @@ -113,9 +117,7 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : containerLayout->setContentsMargins(0, 0, 0, 0); containerLayout->setSpacing(0); containerLayout->addWidget(m_metaDataWidget); - QWidget* stretchWidget = new QWidget(metaDataWidgetContainer); - stretchWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - containerLayout->addWidget(stretchWidget); + containerLayout->addStretch(); m_metaDataArea = new QScrollArea(parent); m_metaDataArea->setWidget(metaDataWidgetContainer); @@ -134,7 +136,6 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : layout->addWidget(m_nameLabel); layout->addWidget(new KSeparator()); layout->addWidget(m_metaDataArea); - parent->setLayout(layout); } InformationPanelContent::~InformationPanelContent() @@ -147,8 +148,9 @@ void InformationPanelContent::showItem(const KFileItem& item) m_pendingPreview = false; const KUrl itemUrl = item.url(); - const bool isNepomukSearchUrl = (itemUrl.protocol() == "nepomuksearch") && item.nepomukUri().isEmpty(); + const bool isNepomukSearchUrl = itemUrl.protocol().startsWith("nepomuk") && item.nepomukUri().isEmpty(); if (!applyPlace(itemUrl)) { + setNameLabelText(item.text()); if (isNepomukSearchUrl) { // in the case of a Nepomuk query-URL the URL is not readable for humans // (at least not useful to show in the Information Panel) @@ -157,7 +159,6 @@ void InformationPanelContent::showItem(const KFileItem& item) KIconLoader::NoGroup, KIconLoader::SizeEnormous); m_preview->setPixmap(icon); - setNameLabelText(QString()); } else { // try to get a preview pixmap from the item... m_pendingPreview = true; @@ -183,18 +184,12 @@ void InformationPanelContent::showItem(const KFileItem& item) this, SLOT(showPreview(const KFileItem&, const QPixmap&))); connect(job, SIGNAL(failed(const KFileItem&)), this, SLOT(showIcon(const KFileItem&))); - - setNameLabelText(itemUrl.fileName()); } } if (m_metaDataWidget != 0) { - if (isNepomukSearchUrl) { - m_metaDataWidget->hide(); - } else { - m_metaDataWidget->show(); - m_metaDataWidget->setItem(item); - } + m_metaDataWidget->show(); + m_metaDataWidget->setItems(KFileItemList() << item); } if (InformationPanelSettings::showPreview()) { @@ -245,36 +240,27 @@ 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()); } 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); - } + adjustWidgetSizes(resizeEvent->size().width()); + } + break; + } - // try to increase the preview as large as possible - m_preview->setSizeHint(QSize(maxWidth, maxWidth)); + case QEvent::Polish: + adjustWidgetSizes(parentWidget()->width()); + break; - 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)); - } - } + default: + break; } + return Panel::eventFilter(obj, event); } @@ -302,15 +288,15 @@ void InformationPanelContent::configureSettings() m_preview->setVisible(isChecked); InformationPanelSettings::setShowPreview(isChecked); } else if (action == configureAction) { - QPointer dialog = new KMetaDataConfigurationDialog(m_metaDataWidget, this, Qt::Dialog); + FileMetaDataConfigurationDialog* dialog = new FileMetaDataConfigurationDialog(); dialog->setDescription(i18nc("@label::textbox", - "Configure which data should be shown in the Information Panel.")); - dialog->exec(); - delete dialog; - } - - if (!m_item.isNull() && m_item.nepomukUri().isValid()) { - showItem(m_item); + "Select which data should be shown in the information panel.")); + dialog->setItems(m_metaDataWidget->items()); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); + dialog->raise(); + dialog->activateWindow(); + connect(dialog, SIGNAL(destroyed()), this, SLOT(refreshMetaData())); } } @@ -324,7 +310,7 @@ void InformationPanelContent::showIcon(const KFileItem& item) } void InformationPanelContent::showPreview(const KFileItem& item, - const QPixmap& pixmap) + const QPixmap& pixmap) { m_outdatedPreviewTimer->stop(); @@ -354,6 +340,13 @@ void InformationPanelContent::slotPlayingStopped() m_preview->setVisible(true); } +void InformationPanelContent::refreshMetaData() +{ + if (!m_item.isNull() && m_item.nepomukUri().isValid()) { + showItem(m_item); + } +} + bool InformationPanelContent::applyPlace(const KUrl& url) { KFilePlacesModel* placesModel = DolphinSettings::instance().placesModel(); @@ -377,19 +370,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.mid(line.textStart(), line.textLength()); line = textLayout.createLine(); if (line.isValid()) { @@ -401,4 +396,29 @@ void InformationPanelContent::setNameLabelText(const QString& text) m_nameLabel->setText(wrappedText); } +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 - 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)); + } +} + #include "informationpanelcontent.moc"