X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/3775e23908dfab10234533830a6c4332e93a2d3c..8eb9b508ca87fb1d634d8b8ba62c054ed04466d2:/src/panels/information/informationpanel.cpp diff --git a/src/panels/information/informationpanel.cpp b/src/panels/information/informationpanel.cpp index affd0b1d3..81afc1487 100644 --- a/src/panels/information/informationpanel.cpp +++ b/src/panels/information/informationpanel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 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 * @@ -19,106 +19,31 @@ #include "informationpanel.h" -#include - -#include +#include "informationpanelcontent.h" +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_NEPOMUK -#include -#include -#include -#endif - -#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 "metatextlabel.h" -#include "phononwidget.h" -#include "pixmapviewer.h" - -/** - * Helper function for sorting items with qSort() in - * InformationPanel::contextMenu(). - */ -bool lessThan(const QAction* action1, const QAction* action2) -{ - return action1->text() < action2->text(); -} - - InformationPanel::InformationPanel(QWidget* parent) : Panel(parent), m_initialized(false), - m_pendingPreview(false), m_infoTimer(0), - m_outdatedPreviewTimer(0), + m_urlChangedTimer(0), + m_resetUrlTimer(0), m_shownUrl(), m_urlCandidate(), + m_invalidUrlCandidate(), m_fileItem(), m_selection(), - m_nameLabel(0), - m_preview(0), - m_previewSeparator(0), - m_phononWidget(0), - m_metaDataWidget(0), - m_metaDataSeparator(0), - m_metaTextArea(0), - m_metaTextLabel(0) + m_folderStatJob(0), + m_content(0) { } InformationPanel::~InformationPanel() { - InformationPanelSettings::self()->writeConfig(); -} - -QSize InformationPanel::sizeHint() const -{ - QSize size = Panel::sizeHint(); - size.setWidth(minimumSizeHint().width()); - return size; -} - -void InformationPanel::setUrl(const KUrl& url) -{ - Panel::setUrl(url); - if (url.isValid() && !isEqualToShownUrl(url)) { - if (isVisible()) { - cancelRequest(); - m_shownUrl = url; - showItemInfo(); - } else { - m_shownUrl = url; - } - } } void InformationPanel::setSelection(const KFileItemList& selection) @@ -136,6 +61,7 @@ void InformationPanel::setSelection(const KFileItemList& selection) } m_selection = selection; + m_fileItem = KFileItem(); const int count = selection.count(); if (count == 0) { @@ -153,30 +79,60 @@ void InformationPanel::setSelection(const KFileItemList& selection) void InformationPanel::requestDelayedItemInfo(const KFileItem& item) { - if (!isVisible()) { + if (!isVisible() || (item.isNull() && m_fileItem.isNull())) { + 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_pendingPreview = false; - m_infoTimer->start(); - } - } else { - const KUrl url = item.url(); - if (url.isValid() && !isEqualToShownUrl(url)) { - m_urlCandidate = item.url(); - m_fileItem = item; + m_fileItem = KFileItem(); 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()) { + 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); @@ -187,6 +143,8 @@ void InformationPanel::showEvent(QShowEvent* event) // Information Panel init(); } + + m_shownUrl = url(); showItemInfo(); } } @@ -194,164 +152,17 @@ void InformationPanel::showEvent(QShowEvent* event) void InformationPanel::resizeEvent(QResizeEvent* event) { if (isVisible()) { - // 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 = event->size().width() - KDialog::spacingHint() * 4; - m_nameLabel->setMaximumWidth(maxWidth); - - // try to increase the preview as large as possible - m_preview->setSizeHint(QSize(maxWidth, maxWidth)); - m_urlCandidate = m_shownUrl; // reset the URL candidate if a resizing is done + m_urlCandidate = m_shownUrl; m_infoTimer->start(); - - 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)); - } } Panel::resizeEvent(event); } -bool InformationPanel::eventFilter(QObject* obj, QEvent* event) -{ - // Check whether the size of the meta text area has changed and adjust - // the fixed width in a way that no horizontal scrollbar needs to be shown. - if ((obj == m_metaTextArea->viewport()) && (event->type() == QEvent::Resize)) { - QResizeEvent* resizeEvent = static_cast(event); - m_metaTextLabel->setFixedWidth(resizeEvent->size().width()); - } - return Panel::eventFilter(obj, event); -} - void InformationPanel::contextMenuEvent(QContextMenuEvent* event) { + // TODO: Move code from InformationPanelContent::configureSettings() here + m_content->configureSettings(customContextMenuActions()); Panel::contextMenuEvent(event); - -#ifdef HAVE_NEPOMUK - if (showMultipleSelectionInfo()) { - 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 = MetaDataWidget::metaDataAvailable(); - - 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"); - initMetaInfoSettings(settings); - - 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(fileItem().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.label(); - - // 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 = key; // TODO - QAction* action = new QAction(label, &popup); - action->setCheckable(true); - action->setChecked(settings.readEntry(key, true)); - action->setData(key); - actions.append(action); - } - - ++it; - } - - if (actions.count() > 0) { - popup.addSeparator(); - - // 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; - } - - const bool isChecked = action->isChecked(); - if (action == previewAction) { - m_preview->setVisible(isChecked); - m_previewSeparator->setVisible(isChecked); - InformationPanelSettings::setShowPreview(isChecked); - updatePhononWidget(); - } 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(); - showMetaInfo(); - } - - if (m_metaDataWidget != 0) { - const bool visible = m_metaDataWidget->isRatingVisible() || - m_metaDataWidget->isCommentVisible() || - m_metaDataWidget->areTagsVisible(); - m_metaDataSeparator->setVisible(visible); - } -#endif } void InformationPanel::showItemInfo() @@ -362,103 +173,73 @@ void InformationPanel::showItemInfo() cancelRequest(); - if (showMultipleSelectionInfo()) { - 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", m_selection.count())); - m_shownUrl = KUrl(); + if (m_fileItem.isNull() && (m_selection.count() > 1)) { + // The information for a selection of items should be shown + m_content->showItems(m_selection); } else { - const KFileItem item = fileItem(); - 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. - m_outdatedPreviewTimer->start(); - - KIO::PreviewJob* job = KIO::filePreview(KFileItemList() << item, - m_preview->width(), - m_preview->height(), - 0, - 0, - false, - true); - - 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&))); - - setNameLabelText(itemUrl.fileName()); + // 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(); + } + + 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); } } +} - showMetaInfo(); +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(); } -void InformationPanel::markOutdatedPreview() -{ - KIconEffect iconEffect; - QPixmap disabledPixmap = iconEffect.apply(m_preview->pixmap(), - KIconLoader::Desktop, - KIconLoader::DisabledState); - m_preview->setPixmap(disabledPixmap); -} - -void InformationPanel::showIcon(const KFileItem& item) -{ - m_outdatedPreviewTimer->stop(); - m_pendingPreview = false; - if (!applyPlace(item.url())) { - m_preview->setPixmap(item.pixmap(KIconLoader::SizeEnormous)); - } -} - -void InformationPanel::showPreview(const KFileItem& item, - const QPixmap& pixmap) +void InformationPanel::reset() { - m_outdatedPreviewTimer->stop(); + if (m_invalidUrlCandidate == m_shownUrl) { + m_invalidUrlCandidate = KUrl(); - Q_UNUSED(item); - if (m_pendingPreview) { - m_preview->setPixmap(pixmap); - m_pendingPreview = false; + // The current URL is still invalid. Reset + // the content to show the directory URL. + m_selection.clear(); + m_shownUrl = url(); + m_fileItem = KFileItem(); + showItemInfo(); } } void InformationPanel::slotFileRenamed(const QString& source, const QString& dest) { - const KUrl sourceUrl = KUrl(source); - - // Verify whether the renamed item is selected. If this is the case, the - // selection must be updated with the renamed item. - bool isSelected = false; - for (int i = m_selection.size() - 1; i >= 0; --i) { - if (m_selection[i].url() == sourceUrl) { - m_selection.removeAt(i); - isSelected = true; - break; - } - } - - if ((m_shownUrl == sourceUrl) || isSelected) { + if (m_shownUrl == KUrl(source)) { m_shownUrl = KUrl(dest); m_fileItem = KFileItem(KFileItem::Unknown, KFileItem::Unknown, m_shownUrl); - if (isSelected) { - m_selection.append(m_fileItem); + + 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(); } } @@ -489,7 +270,7 @@ void InformationPanel::slotFilesRemoved(const QStringList& files) if (m_shownUrl == KUrl(fileName)) { // the currently shown item has been removed, show // the parent directory as fallback - reset(); + markUrlAsInvalid(); break; } } @@ -510,127 +291,23 @@ void InformationPanel::slotLeftDirectory(const QString& directory) // has been unmounted. In this case no directory change will be // done in Dolphin, but the Information Panel must be updated to // indicate an invalid directory. - reset(); + markUrlAsInvalid(); } } -void InformationPanel::slotPlayingStarted() -{ - m_preview->setVisible(m_phononWidget->mode() != PhononWidget::Video); -} - -void InformationPanel::slotPlayingStopped() -{ - m_preview->setVisible(true); -} - -bool InformationPanel::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; - } - } - - return false; -} - void InformationPanel::cancelRequest() { - m_infoTimer->stop(); -} - -void InformationPanel::showMetaInfo() -{ - m_metaTextLabel->clear(); - - if (showMultipleSelectionInfo()) { - if (m_metaDataWidget != 0) { - KUrl::List urls; - foreach (const KFileItem& item, m_selection) { - urls.append(item.targetUrl()); - } - m_metaDataWidget->setFiles(urls); - } - - quint64 totalSize = 0; - foreach (const KFileItem& item, m_selection) { - // Only count the size of files, not dirs to match what - // DolphinViewContainer::selectionStatusBarText() does. - if (!item.isDir() && !item.isLink()) { - totalSize += item.size(); - } - } - m_metaTextLabel->add(i18nc("@label", "Total size:"), KIO::convertSize(totalSize)); - } else { - const KFileItem item = fileItem(); - if (item.isDir()) { - m_metaTextLabel->add(i18nc("@label", "Type:"), i18nc("@label", "Folder")); - m_metaTextLabel->add(i18nc("@label", "Modified:"), item.timeString()); - } else { - m_metaTextLabel->add(i18nc("@label", "Type:"), item.mimeComment()); - - m_metaTextLabel->add(i18nc("@label", "Size:"), KIO::convertSize(item.size())); - m_metaTextLabel->add(i18nc("@label", "Modified:"), item.timeString()); - -#ifdef HAVE_NEPOMUK - KConfig config("kmetainformationrc", KConfig::NoGlobals); - KConfigGroup settings = config.group("Show"); - initMetaInfoSettings(settings); - - Nepomuk::Resource res(item.url()); - - QHash properties = res.properties(); - QHash::const_iterator it = properties.constBegin(); - while (it != properties.constEnd()) { - Nepomuk::Types::Property prop(it.key()); - const QString label = prop.label(); - if (settings.readEntry(label, true)) { - // TODO: use Nepomuk::formatValue(res, prop) if available - // instead of it.value().toString() - m_metaTextLabel->add(label, it.value().toString()); - } - ++it; - } -#endif - } - - if (m_metaDataWidget != 0) { - m_metaDataWidget->setFile(item.targetUrl()); - } - } - - updatePhononWidget(); -} - -KFileItem InformationPanel::fileItem() const -{ - if (!m_fileItem.isNull()) { - return m_fileItem; - } + delete m_folderStatJob; + m_folderStatJob = 0; - if (!m_selection.isEmpty()) { - Q_ASSERT(m_selection.count() == 1); - return m_selection.first(); - } - - // no item is hovered and no selection has been done: provide - // an item for the directory represented by m_shownUrl - KFileItem item(KFileItem::Unknown, KFileItem::Unknown, m_shownUrl); - item.refresh(); - return item; -} + 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 @@ -638,90 +315,10 @@ bool InformationPanel::isEqualToShownUrl(const KUrl& url) const return m_shownUrl.equals(url, KUrl::CompareWithoutTrailingSlash); } -void InformationPanel::setNameLabelText(const QString& text) +void InformationPanel::markUrlAsInvalid() { - QTextOption textOption; - textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - - QTextLayout textLayout(text); - textLayout.setFont(m_nameLabel->font()); - textLayout.setTextOption(textOption); - - QString wrappedText; - wrappedText.reserve(text.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()); - - line = textLayout.createLine(); - if (line.isValid()) { - wrappedText += QChar::LineSeparator; - } - } - textLayout.endLayout(); - - m_nameLabel->setText(wrappedText); -} - -void InformationPanel::reset() -{ - m_selection.clear(); - m_shownUrl = url(); - m_fileItem = KFileItem(); - showItemInfo(); -} - -void InformationPanel::initMetaInfoSettings(KConfigGroup& group) -{ - if (!group.readEntry("initialized", false)) { - // The resource file is read the first time. Assure - // that some meta information is disabled per default. - group.writeEntry("fileExtension", false); - group.writeEntry("url", false); - group.writeEntry("sourceModified", false); - group.writeEntry("parentUrl", false); - group.writeEntry("size", false); - group.writeEntry("mime type", false); - group.writeEntry("depth", false); - group.writeEntry("name", false); - - // mark the group as initialized - group.writeEntry("initialized", true); - } -} - -void InformationPanel::updatePhononWidget() -{ - const bool multipleSelections = showMultipleSelectionInfo(); - const bool showPreview = InformationPanelSettings::showPreview(); - - if (multipleSelections || !showPreview) { - m_phononWidget->hide(); - } else if (!multipleSelections && showPreview) { - const KFileItem item = fileItem(); - 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()); - } - } else { - m_phononWidget->hide(); - m_preview->setVisible(true); - } - } + m_invalidUrlCandidate = m_shownUrl; + m_resetUrlTimer->start(); } void InformationPanel::init() @@ -732,91 +329,20 @@ void InformationPanel::init() connect(m_infoTimer, SIGNAL(timeout()), this, SLOT(slotInfoTimeout())); - // Initialize timer for disabling an outdated preview with a small - // delay. This prevents flickering if the new preview can be generated - // within a very small timeframe. - m_outdatedPreviewTimer = new QTimer(this); - m_outdatedPreviewTimer->setInterval(300); - m_outdatedPreviewTimer->setSingleShot(true); - connect(m_outdatedPreviewTimer, SIGNAL(timeout()), - this, SLOT(markOutdatedPreview())); - - QVBoxLayout* layout = new QVBoxLayout; - layout->setSpacing(KDialog::spacingHint()); - - // name - m_nameLabel = new QLabel(this); - 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); - - // preview - const int minPreviewWidth = KIconLoader::SizeEnormous + KIconLoader::SizeMedium; - - m_preview = new PixmapViewer(this); - m_preview->setMinimumWidth(minPreviewWidth); - m_preview->setMinimumHeight(KIconLoader::SizeEnormous); - - m_phononWidget = new PhononWidget(this); - m_phononWidget->setMinimumWidth(minPreviewWidth); - connect(m_phononWidget, SIGNAL(playingStarted()), - this, SLOT(slotPlayingStarted())); - connect(m_phononWidget, SIGNAL(playingStopped()), - this, SLOT(slotPlayingStopped())); - - m_previewSeparator = new KSeparator(this); - - const bool showPreview = InformationPanelSettings::showPreview(); - m_preview->setVisible(showPreview); - m_previewSeparator->setVisible(showPreview); - - if (MetaDataWidget::metaDataAvailable()) { - // rating, comment and tags - m_metaDataWidget = new MetaDataWidget(this); - m_metaDataWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - - const bool showRating = InformationPanelSettings::showRating(); - const bool showComment = InformationPanelSettings::showComment(); - const bool showTags = InformationPanelSettings::showTags(); - - m_metaDataWidget->setRatingVisible(showRating); - m_metaDataWidget->setCommentVisible(showComment); - m_metaDataWidget->setTagsVisible(showTags); - - m_metaDataSeparator = new KSeparator(this); - m_metaDataSeparator->setVisible(showRating || showComment || showTags); - } + m_urlChangedTimer = new QTimer(this); + m_urlChangedTimer->setInterval(200); + m_urlChangedTimer->setSingleShot(true); + connect(m_urlChangedTimer, SIGNAL(timeout()), + this, SLOT(showItemInfo())); - // general meta text information - m_metaTextLabel = new MetaTextLabel(this); - m_metaTextLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - - m_metaTextArea = new QScrollArea(this); - m_metaTextArea->setWidget(m_metaTextLabel); - m_metaTextArea->setWidgetResizable(true); - m_metaTextArea->setFrameShape(QFrame::NoFrame); - - QWidget* viewport = m_metaTextArea->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_metaDataSeparator); - } - layout->addWidget(m_metaTextArea); - setLayout(layout); + m_resetUrlTimer = new QTimer(this); + m_resetUrlTimer->setInterval(1000); + m_resetUrlTimer->setSingleShot(true); + connect(m_resetUrlTimer, SIGNAL(timeout()), + this, SLOT(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); @@ -827,6 +353,12 @@ void InformationPanel::init() connect(dirNotify, SIGNAL(enteredDirectory(QString)), SLOT(slotEnteredDirectory(QString))); connect(dirNotify, SIGNAL(leftDirectory(QString)), SLOT(slotLeftDirectory(QString))); + 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; }