┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels/information/kmetadataconfigurationdialog.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-10-28 07:18:00 +0000
committerPeter Penz <[email protected]>2009-10-28 07:18:00 +0000
commit73007f7d632bdd5565b8394043bb2de07bebb336 (patch)
tree26f09ea9ceb47bed3b93fd7be1916e560ef7b3da /src/panels/information/kmetadataconfigurationdialog.cpp
parent1201c618842c8c03825be82478f923874d24f690 (diff)
After some discussions at http://reviewboard.kde.org/r/1938 it turned out that moving KMetaDataWidget and KMetaDataConfigurationDialog to kdelibs should be postponed to KDE 4.5. The main reason is that adding application specific properties is not possible with the current API in a generic way. Also the topic how to hide properties application specific is an open point...
So now all adjustments from the review have been adapted to the Dolphin code. After KDE 4.4 has been released some refactoring will be done so that the open topics above are handled in a nice way. svn path=/trunk/KDE/kdebase/apps/; revision=1041547
Diffstat (limited to 'src/panels/information/kmetadataconfigurationdialog.cpp')
-rw-r--r--src/panels/information/kmetadataconfigurationdialog.cpp283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/panels/information/kmetadataconfigurationdialog.cpp b/src/panels/information/kmetadataconfigurationdialog.cpp
new file mode 100644
index 000000000..bbe437139
--- /dev/null
+++ b/src/panels/information/kmetadataconfigurationdialog.cpp
@@ -0,0 +1,283 @@
+/*****************************************************************************
+ * Copyright (C) 2009 by Peter Penz <[email protected]> *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ * This library 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 *
+ * Library General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Library General Public License *
+ * along with this library; see the file COPYING.LIB. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ *****************************************************************************/
+
+#include "kmetadataconfigurationdialog.h"
+#include "kmetadatawidget.h"
+#include <klocale.h>
+
+#include <config-nepomuk.h>
+#ifdef HAVE_NEPOMUK
+ #define DISABLE_NEPOMUK_LEGACY
+ #include <nepomuk/resource.h>
+ #include <nepomuk/resourcemanager.h>
+ #include <nepomuk/property.h>
+ #include <nepomuk/variant.h>
+#endif
+
+#include <QLabel>
+#include <QListWidget>
+#include <QVBoxLayout>
+
+class KMetaDataConfigurationDialog::Private
+{
+public:
+ Private(KMetaDataConfigurationDialog* parent, KMetaDataWidget* metaDataWidget);
+ ~Private();
+
+ void init();
+ void loadMetaData();
+ QString tunedLabel(const QString& label) const;
+
+ int m_visibleDataTypes;
+ KMetaDataWidget* m_metaDataWidget;
+ QListWidget* m_metaDataList;
+
+private:
+ KMetaDataConfigurationDialog* const q;
+};
+
+KMetaDataConfigurationDialog::Private::Private(KMetaDataConfigurationDialog* parent,
+ KMetaDataWidget* metaDataWidget) :
+ q(parent)
+{
+ m_visibleDataTypes = 0;
+ m_metaDataWidget = metaDataWidget;
+
+ q->setCaption(i18nc("@title:window", "Configure Shown Data"));
+ q->setButtons(KDialog::Ok | KDialog::Cancel);
+ q->setDefaultButton(KDialog::Ok);
+
+ QWidget* mainWidget = new QWidget(q);
+ QVBoxLayout* topLayout = new QVBoxLayout(mainWidget);
+
+ QLabel* label = new QLabel(i18nc("@label:textbox",
+ "Configure which data should "
+ "be shown."), q);
+
+ m_metaDataList = new QListWidget(q);
+ m_metaDataList->setSelectionMode(QAbstractItemView::NoSelection);
+
+ topLayout->addWidget(label);
+ topLayout->addWidget(m_metaDataList);
+
+ q->setMainWidget(mainWidget);
+
+ loadMetaData();
+
+ const KConfigGroup dialogConfig(KGlobal::config(), "Nepomuk KMetaDataConfigurationDialog");
+ q->restoreDialogSize(dialogConfig);
+}
+
+KMetaDataConfigurationDialog::Private::~Private()
+{
+ KConfigGroup dialogConfig(KGlobal::config(), "Nepomuk KMetaDataConfigurationDialog");
+ q->saveDialogSize(dialogConfig, KConfigBase::Persistent);
+}
+
+void KMetaDataConfigurationDialog::Private::loadMetaData()
+{
+ KConfig config("kmetainformationrc", KConfig::NoGlobals);
+ KConfigGroup settings = config.group("Show");
+
+ // Add fixed meta data items where the visibility does not
+ // depend on the currently used URL.
+ KMetaDataWidget::MetaDataTypes visibleDataTypes = KMetaDataWidget::TypeData |
+ KMetaDataWidget::SizeData |
+ KMetaDataWidget::ModifiedData |
+ KMetaDataWidget::OwnerData |
+ KMetaDataWidget::PermissionsData |
+ KMetaDataWidget::RatingData |
+ KMetaDataWidget::TagsData |
+ KMetaDataWidget::CommentData;
+ if (m_metaDataWidget != 0) {
+ visibleDataTypes = m_metaDataWidget->visibleDataTypes();
+ }
+
+ typedef QPair<QString, QString> FixedItem;
+ QList<FixedItem> fixedItems;
+ if (visibleDataTypes & KMetaDataWidget::TypeData) {
+ fixedItems.append(FixedItem("type", i18nc("@item::inlistbox", "Type")));
+ }
+ if (visibleDataTypes & KMetaDataWidget::SizeData) {
+ fixedItems.append(FixedItem("size", i18nc("@item::inlistbox", "Size")));
+ }
+ if (visibleDataTypes & KMetaDataWidget::ModifiedData) {
+ fixedItems.append(FixedItem("modified", i18nc("@item::inlistbox", "Modified")));
+ }
+ if (visibleDataTypes & KMetaDataWidget::OwnerData) {
+ fixedItems.append(FixedItem("owner", i18nc("@item::inlistbox", "Owner")));
+ }
+ if (visibleDataTypes & KMetaDataWidget::PermissionsData) {
+ fixedItems.append(FixedItem("permissions", i18nc("@item::inlistbox", "Permissions")));
+ }
+#ifdef HAVE_NEPOMUK
+ if (Nepomuk::ResourceManager::instance()->init() == 0) {
+ if (visibleDataTypes & KMetaDataWidget::RatingData) {
+ fixedItems.append(FixedItem("rating", i18nc("@item::inlistbox", "Rating")));
+ }
+ if (visibleDataTypes & KMetaDataWidget::TagsData) {
+ fixedItems.append(FixedItem("tags", i18nc("@item::inlistbox", "Tags")));
+ }
+ if (visibleDataTypes & KMetaDataWidget::CommentData) {
+ fixedItems.append(FixedItem("comment", i18nc("@item::inlistbox", "Comment")));
+ }
+ }
+#endif
+
+ foreach (const FixedItem& fixedItem, fixedItems) {
+ const QString key = fixedItem.first;
+ const QString label = fixedItem.second;
+ QListWidgetItem* item = new QListWidgetItem(label, m_metaDataList);
+ item->setData(Qt::UserRole, key);
+ const bool show = settings.readEntry(key, true);
+ item->setCheckState(show ? Qt::Checked : Qt::Unchecked);
+ }
+
+#ifdef HAVE_NEPOMUK
+ if (Nepomuk::ResourceManager::instance()->init() != 0) {
+ return;
+ }
+
+ // Get all meta information labels that are available for
+ // the currently shown file item and add them to the list.
+ if (m_metaDataWidget == 0) {
+ // TODO: in this case all available meta data from the system
+ // should be added.
+ return;
+ }
+
+ const KFileItemList items = m_metaDataWidget->items();
+ if (items.count() != 1) {
+ // TODO: handle als usecases for more than one item:
+ return;
+ }
+ Nepomuk::Resource res(items.first().nepomukUri());
+
+ QHash<QUrl, Nepomuk::Variant> properties = res.properties();
+ QHash<QUrl, Nepomuk::Variant>::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 as "fixed item" (see above)
+ // should not be shown as second entry.
+ static const char* hiddenProperties[] = {
+ "contentSize", // = fixed item "size"
+ "description", // = fixed item "comment"
+ "fileExtension", // ~ fixed item "type"
+ "hasTag", // = fixed item "tags"
+ "name", // not shown as part of the meta data widget
+ "lastModified", // = fixed item "modified"
+ "size", // = fixed item "size"
+ "mimeType", // = fixed item "type"
+ "numericRating", // = fixed item "rating"
+ 0 // mandatory last entry
+ };
+ bool skip = false;
+ int i = 0;
+ while (hiddenProperties[i] != 0) {
+ if (key == hiddenProperties[i]) {
+ skip = true;
+ break;
+ }
+ ++i;
+ }
+
+ if (!skip) {
+ // TODO #1: use Nepomuk::formatValue(res, prop) if available
+ // instead of it.value().toString()
+ // TODO #2: using tunedLabel() is a workaround for KDE 4.3 (4.4?) until
+ // we get translated labels
+ const QString label = tunedLabel(prop.label());
+ QListWidgetItem* item = new QListWidgetItem(label, m_metaDataList);
+ item->setData(Qt::UserRole, key);
+ const bool show = settings.readEntry(key, true);
+ item->setCheckState(show ? Qt::Checked : Qt::Unchecked);
+ }
+
+ ++it;
+ }
+#endif
+}
+
+QString KMetaDataConfigurationDialog::Private::tunedLabel(const QString& label) const
+{
+ QString tunedLabel;
+ const int labelLength = label.length();
+ if (labelLength > 0) {
+ tunedLabel.reserve(labelLength);
+ tunedLabel = label[0].toUpper();
+ for (int i = 1; i < labelLength; ++i) {
+ if (label[i].isUpper() && !label[i - 1].isSpace() && !label[i - 1].isUpper()) {
+ tunedLabel += ' ';
+ tunedLabel += label[i].toLower();
+ } else {
+ tunedLabel += label[i];
+ }
+ }
+ }
+ return tunedLabel;
+}
+
+KMetaDataConfigurationDialog::KMetaDataConfigurationDialog(QWidget* parent,
+ Qt::WFlags flags) :
+ KDialog(parent, flags),
+ d(new Private(this, 0))
+{
+}
+
+KMetaDataConfigurationDialog::KMetaDataConfigurationDialog(KMetaDataWidget* metaDataWidget,
+ QWidget* parent,
+ Qt::WFlags flags) :
+ KDialog(parent, flags),
+ d(new Private(this, metaDataWidget))
+{
+}
+
+KMetaDataConfigurationDialog::~KMetaDataConfigurationDialog()
+{
+}
+
+void KMetaDataConfigurationDialog::slotButtonClicked(int button)
+{
+ if (button == KDialog::Ok) {
+ KConfig config("kmetainformationrc", KConfig::NoGlobals);
+ KConfigGroup showGroup = config.group("Show");
+
+ const int count = d->m_metaDataList->count();
+ for (int i = 0; i < count; ++i) {
+ QListWidgetItem* item = d->m_metaDataList->item(i);
+ const bool show = (item->checkState() == Qt::Checked);
+ const QString key = item->data(Qt::UserRole).toString();
+ showGroup.writeEntry(key, show);
+ }
+
+ showGroup.sync();
+
+ if (d->m_metaDataWidget != 0) {
+ // trigger an update
+ d->m_metaDataWidget->setVisibleDataTypes(d->m_metaDataWidget->visibleDataTypes());
+ }
+ accept();
+ } else {
+ KDialog::slotButtonClicked(button);
+ }
+}
+
+#include "kmetadataconfigurationdialog.moc"