-/***************************************************************************
- * Copyright (C) 2006-2009 by Peter Penz <peter.penz19@gmail.com> *
- * *
- * 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 *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2006-2009 Peter Penz <peter.penz19@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
#include "informationpanel.h"
#include "informationpanelcontent.h"
+
+#include <KDirNotify>
#include <KIO/Job>
-#include <KIO/JobUiDelegate>
#include <KJobWidgets>
-#include <KDirNotify>
+#include <KLocalizedString>
+
+#include <Baloo/FileMetaDataWidget>
+
#include <QApplication>
#include <QShowEvent>
#include <QVBoxLayout>
#include <QTimer>
+#include <QMenu>
+
+#include "dolphin_informationpanelsettings.h"
InformationPanel::InformationPanel(QWidget* parent) :
Panel(parent),
m_initialized(false),
- m_infoTimer(0),
- m_urlChangedTimer(0),
- m_resetUrlTimer(0),
+ m_infoTimer(nullptr),
+ m_urlChangedTimer(nullptr),
+ m_resetUrlTimer(nullptr),
m_shownUrl(),
m_urlCandidate(),
m_invalidUrlCandidate(),
- m_fileItem(),
+ m_hoveredItem(),
m_selection(),
- m_folderStatJob(0),
- m_content(0)
+ m_folderStatJob(nullptr),
+ m_content(nullptr)
{
}
void InformationPanel::setSelection(const KFileItemList& selection)
{
m_selection = selection;
- m_fileItem = KFileItem();
if (!isVisible()) {
return;
m_shownUrl = url();
showItemInfo();
}
+ m_infoTimer->stop();
} else {
if ((count == 1) && !selection.first().url().isEmpty()) {
m_urlCandidate = selection.first().url();
void InformationPanel::requestDelayedItemInfo(const KFileItem& item)
{
- if (!isVisible() || (item.isNull() && m_fileItem.isNull())) {
+ if (!isVisible()) {
return;
}
return;
}
- cancelRequest();
-
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 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();
+ m_hoveredItem = KFileItem();
+ return;
}
+
+ cancelRequest();
+
+ m_hoveredItem = item;
+ m_infoTimer->start();
}
bool InformationPanel::urlChanged()
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
void InformationPanel::contextMenuEvent(QContextMenuEvent* event)
{
- // TODO: Move code from InformationPanelContent::configureSettings() here
- m_content->configureSettings(customContextMenuActions());
+ showContextMenu(event->globalPos());
Panel::contextMenuEvent(event);
}
+void InformationPanel::showContextMenu(const QPoint &pos)
+{
+ QMenu popup(this);
+
+ QAction* previewAction = popup.addAction(i18nc("@action:inmenu", "Preview"));
+ previewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-preview")));
+ previewAction->setCheckable(true);
+ previewAction->setChecked(InformationPanelSettings::previewsShown());
+
+ QAction* previewAutoPlayAction = popup.addAction(i18nc("@action:inmenu", "Auto-Play media files"));
+ previewAutoPlayAction->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start")));
+ previewAutoPlayAction->setCheckable(true);
+ previewAutoPlayAction->setChecked(InformationPanelSettings::previewsAutoPlay());
+
+ QAction* configureAction = popup.addAction(i18nc("@action:inmenu", "Configure..."));
+ configureAction->setIcon(QIcon::fromTheme(QStringLiteral("configure")));
+ if (m_inConfigurationMode) {
+ configureAction->setEnabled(false);
+ }
+
+ QAction* dateformatAction = popup.addAction(i18nc("@action:inmenu", "Condensed Date"));
+ dateformatAction->setIcon(QIcon::fromTheme(QStringLiteral("change-date-symbolic")));
+ dateformatAction->setCheckable(true);
+ dateformatAction->setChecked(InformationPanelSettings::dateFormat() == static_cast<int>(Baloo::DateFormats::ShortFormat));
+
+ popup.addSeparator();
+ const auto actions = customContextMenuActions();
+ for (QAction *action : actions) {
+ popup.addAction(action);
+ }
+
+ // Open the popup and adjust the settings for the
+ // selected action.
+ QAction* action = popup.exec(pos);
+ if (!action) {
+ return;
+ }
+
+ const bool isChecked = action->isChecked();
+ if (action == previewAction) {
+ InformationPanelSettings::setPreviewsShown(isChecked);
+ m_content->refreshPreview();
+ } else if (action == configureAction) {
+ m_inConfigurationMode = true;
+ m_content->configureShownProperties();
+ }
+ if (action == dateformatAction) {
+ int dateFormat = static_cast<int>(isChecked ? Baloo::DateFormats::ShortFormat : Baloo::DateFormats::LongFormat);
+
+ InformationPanelSettings::setDateFormat(dateFormat);
+ m_content->refreshMetaData();
+ } else if (action == previewAutoPlayAction) {
+ InformationPanelSettings::setPreviewsAutoPlay(isChecked);
+ m_content->setPreviewAutoPlay(isChecked);
+ }
+}
+
void InformationPanel::showItemInfo()
{
if (!isVisible()) {
}
cancelRequest();
+ //qDebug() << "showItemInfo" << m_fileItem;
- if (m_fileItem.isNull() && (m_selection.count() > 1)) {
+ if (m_hoveredItem.isNull() && (m_selection.count() > 1)) {
// The information for a selection of items should be shown
m_content->showItems(m_selection);
} else {
// The information for exactly one item should be shown
KFileItem item;
- if (!m_fileItem.isNull()) {
- item = m_fileItem;
+ if (!m_hoveredItem.isNull()) {
+ item = m_hoveredItem;
} 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);
- if (m_folderStatJob->ui()) {
- KJobWidgets::setWindow(m_folderStatJob, this);
- }
- connect(m_folderStatJob, &KIO::Job::result,
- this, &InformationPanel::slotFolderStatFinished);
- } else {
+ if (!item.isNull()) {
+ m_shownUrl = item.url();
m_content->showItem(item);
+ return;
}
+
+ // No item is hovered and no selection has been done: provide
+ // an item for the currently shown directory.
+ m_shownUrl = url();
+ m_folderStatJob = KIO::statDetails(m_shownUrl, KIO::StatJob::SourceSide, KIO::StatDefaultDetails | KIO::StatRecursiveSize, KIO::HideProgressInfo);
+ if (m_folderStatJob->uiDelegate()) {
+ KJobWidgets::setWindow(m_folderStatJob, this);
+ }
+ connect(m_folderStatJob, &KIO::Job::result,
+ this, &InformationPanel::slotFolderStatFinished);
}
}
void InformationPanel::slotFolderStatFinished(KJob* job)
{
- m_folderStatJob = 0;
+ m_folderStatJob = nullptr;
const KIO::UDSEntry entry = static_cast<KIO::StatJob*>(job)->statResult();
m_content->showItem(KFileItem(entry, m_shownUrl));
}
// 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)
{
- if (m_shownUrl == QUrl::fromLocalFile(source)) {
- m_shownUrl = QUrl::fromLocalFile(dest);
- m_fileItem = KFileItem(m_shownUrl);
+ auto sourceUrl = QUrl::fromUserInput(source);
+ if (m_shownUrl == sourceUrl) {
+ auto destUrl = QUrl::fromUserInput(dest);
- if ((m_selection.count() == 1) && (m_selection[0].url() == QUrl::fromLocalFile(source))) {
- m_selection[0] = m_fileItem;
+ if ((m_selection.count() == 1) && (m_selection[0].url() == sourceUrl)) {
+ m_selection[0] = KFileItem(destUrl);
// 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.
+ } else {
+ m_hoveredItem = KFileItem(destUrl);
}
showItemInfo();
void InformationPanel::slotFilesAdded(const QString& directory)
{
- if (m_shownUrl == QUrl::fromLocalFile(directory)) {
+ if (m_shownUrl == QUrl::fromUserInput(directory)) {
// If the 'trash' icon changes because the trash has been emptied or got filled,
// the signal filesAdded("trash:/") will be emitted.
- KFileItem item(QUrl::fromLocalFile(directory));
- requestDelayedItemInfo(item);
+ requestDelayedItemInfo(KFileItem());
+ }
+}
+
+void InformationPanel::slotFilesItemChanged(const KFileItemList &changedFileItems)
+{
+ const auto item = changedFileItems.findByUrl(m_shownUrl);
+ if (!item.isNull()) {
+ showItemInfo();
}
}
void InformationPanel::slotFilesChanged(const QStringList& files)
{
- foreach (const QString& fileName, files) {
- if (m_shownUrl == QUrl::fromLocalFile(fileName)) {
+ for (const QString& fileName : files) {
+ if (m_shownUrl == QUrl::fromUserInput(fileName)) {
showItemInfo();
break;
}
void InformationPanel::slotFilesRemoved(const QStringList& files)
{
- foreach (const QString& fileName, files) {
- if (m_shownUrl == QUrl::fromLocalFile(fileName)) {
+ for (const QString& fileName : files) {
+ if (m_shownUrl == QUrl::fromUserInput(fileName)) {
// the currently shown item has been removed, show
// the parent directory as fallback
markUrlAsInvalid();
void InformationPanel::slotEnteredDirectory(const QString& directory)
{
- if (m_shownUrl == QUrl::fromLocalFile(directory)) {
- KFileItem item(QUrl::fromLocalFile(directory));
- requestDelayedItemInfo(item);
- }
+ Q_UNUSED(directory)
}
void InformationPanel::slotLeftDirectory(const QString& directory)
{
- if (m_shownUrl == QUrl::fromLocalFile(directory)) {
+ if (m_shownUrl == QUrl::fromUserInput(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
void InformationPanel::cancelRequest()
{
delete m_folderStatJob;
- m_folderStatJob = 0;
+ m_folderStatJob = nullptr;
m_infoTimer->stop();
m_resetUrlTimer->stop();
m_content = new InformationPanelContent(this);
connect(m_content, &InformationPanelContent::urlActivated, this, &InformationPanel::urlActivated);
+ connect(m_content, &InformationPanelContent::configurationFinished, this, [this]() { m_inConfigurationMode = false; });
+ connect(m_content, &InformationPanelContent::contextMenuRequested, this, &InformationPanel::showContextMenu);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);