1 /*****************************************************************************
2 * Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
4 * This library is free software; you can redistribute it and/or *
5 * modify it under the terms of the GNU Library General Public *
6 * License version 2 as published by the Free Software Foundation. *
8 * This library is distributed in the hope that it will be useful, *
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
11 * Library General Public License for more details. *
13 * You should have received a copy of the GNU Library General Public License *
14 * along with this library; see the file COPYING.LIB. If not, write to *
15 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
16 * Boston, MA 02110-1301, USA. *
17 *****************************************************************************/
19 #include "kmetadataconfigurationdialog.h"
22 #include <kfilemetainfo.h>
23 #include <kfilemetainfoitem.h>
24 #include "kmetadatamodel.h"
25 #include "kmetadatawidget.h"
26 #include "knfotranslator_p.h"
29 #include <config-nepomuk.h>
31 #define DISABLE_NEPOMUK_LEGACY
32 #include <nepomuk/resource.h>
33 #include <nepomuk/resourcemanager.h>
34 #include <nepomuk/property.h>
35 #include <nepomuk/variant.h>
39 #include <QListWidget>
40 #include <QVBoxLayout>
42 class KMetaDataConfigurationDialog::Private
45 Private(KMetaDataConfigurationDialog
* parent
, KMetaDataWidget
* metaDataWidget
);
50 void addItem(const KUrl
& uri
);
52 void slotLoadingFinished();
54 int m_visibleDataTypes
;
55 QLabel
* m_descriptionLabel
;
56 KMetaDataWidget
* m_metaDataWidget
;
57 QListWidget
* m_metaDataList
;
60 KMetaDataConfigurationDialog
* const q
;
63 KMetaDataConfigurationDialog::Private::Private(KMetaDataConfigurationDialog
* parent
,
64 KMetaDataWidget
* metaDataWidget
) :
67 m_visibleDataTypes
= 0;
68 m_metaDataWidget
= metaDataWidget
;
70 q
->setCaption(i18nc("@title:window", "Configure Shown Data"));
71 q
->setButtons(KDialog::Ok
| KDialog::Cancel
);
72 q
->setDefaultButton(KDialog::Ok
);
74 QWidget
* mainWidget
= new QWidget(q
);
75 QVBoxLayout
* topLayout
= new QVBoxLayout(mainWidget
);
77 m_descriptionLabel
= new QLabel(i18nc("@label::textbox",
78 "Configure which data should "
80 m_descriptionLabel
->setWordWrap(true);
82 m_metaDataList
= new QListWidget(q
);
83 m_metaDataList
->setSelectionMode(QAbstractItemView::NoSelection
);
84 m_metaDataList
->setSortingEnabled(true);
86 topLayout
->addWidget(m_descriptionLabel
);
87 topLayout
->addWidget(m_metaDataList
);
89 q
->setMainWidget(mainWidget
);
93 const KConfigGroup
dialogConfig(KGlobal::config(), "Nepomuk KMetaDataConfigurationDialog");
94 q
->restoreDialogSize(dialogConfig
);
97 KMetaDataConfigurationDialog::Private::~Private()
99 KConfigGroup
dialogConfig(KGlobal::config(), "Nepomuk KMetaDataConfigurationDialog");
100 q
->saveDialogSize(dialogConfig
, KConfigBase::Persistent
);
103 void KMetaDataConfigurationDialog::Private::loadMetaData()
105 KConfig
config("kmetainformationrc", KConfig::NoGlobals
);
106 KConfigGroup settings
= config
.group("Show");
108 // Add fixed meta data items where the visibility does not
109 // depend on the currently used URL.
110 KMetaDataWidget::MetaDataTypes visibleDataTypes
= KMetaDataWidget::TypeData
|
111 KMetaDataWidget::SizeData
|
112 KMetaDataWidget::ModifiedData
|
113 KMetaDataWidget::OwnerData
|
114 KMetaDataWidget::PermissionsData
|
115 KMetaDataWidget::RatingData
|
116 KMetaDataWidget::TagsData
|
117 KMetaDataWidget::CommentData
;
118 if (m_metaDataWidget
!= 0) {
119 visibleDataTypes
= m_metaDataWidget
->visibleDataTypes();
122 typedef QPair
<QString
, QString
> FixedItem
;
123 QList
<FixedItem
> fixedItems
;
124 if (visibleDataTypes
& KMetaDataWidget::TypeData
) {
125 fixedItems
.append(FixedItem("kfileitem#type", i18nc("@item::inlistbox", "Type")));
127 if (visibleDataTypes
& KMetaDataWidget::SizeData
) {
128 fixedItems
.append(FixedItem("kfileitem#size", i18nc("@item::inlistbox", "Size")));
130 if (visibleDataTypes
& KMetaDataWidget::ModifiedData
) {
131 fixedItems
.append(FixedItem("kfileitem#modified", i18nc("@item::inlistbox", "Modified")));
133 if (visibleDataTypes
& KMetaDataWidget::OwnerData
) {
134 fixedItems
.append(FixedItem("kfileitem#owner", i18nc("@item::inlistbox", "Owner")));
136 if (visibleDataTypes
& KMetaDataWidget::PermissionsData
) {
137 fixedItems
.append(FixedItem("kfileitem#permissions", i18nc("@item::inlistbox", "Permissions")));
140 foreach (const FixedItem
& fixedItem
, fixedItems
) {
141 const QString key
= fixedItem
.first
;
142 const QString label
= fixedItem
.second
;
143 QListWidgetItem
* item
= new QListWidgetItem(label
, m_metaDataList
);
144 item
->setData(Qt::UserRole
, key
);
145 const bool show
= settings
.readEntry(key
, true);
146 item
->setCheckState(show
? Qt::Checked
: Qt::Unchecked
);
150 if ((m_metaDataWidget
== 0) || (m_metaDataWidget
->items().count() != 1)) {
154 // Get all meta information labels that are available for
155 // the currently shown file item and add them to the list.
156 KMetaDataModel
* model
= m_metaDataWidget
->model();
158 const QHash
<KUrl
, Nepomuk::Variant
> data
= model
->data();
159 QHash
<KUrl
, Nepomuk::Variant
>::const_iterator it
= data
.constBegin();
160 while (it
!= data
.constEnd()) {
168 void KMetaDataConfigurationDialog::Private::addItem(const KUrl
& uri
)
170 // Meta information provided by Nepomuk that is already
171 // available from KFileItem as "fixed item" (see above)
172 // should not be shown as second entry.
173 static const char* const hiddenProperties
[] = {
174 "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment", // = fixed item kfileitem#comment
175 "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize", // = fixed item kfileitem#size
176 "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified", // = fixed item kfileitem#modified
177 "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#plainTextContent" // hide this property always
178 "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType", // = fixed item kfileitem#type
179 "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName", // hide this property always
180 "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", // = fixed item kfileitem#type
181 0 // mandatory last entry
185 const QString key
= uri
.url();
186 while (hiddenProperties
[i
] != 0) {
187 if (key
== QLatin1String(hiddenProperties
[i
])) {
188 // the item is hidden
194 // the item is not hidden, add it to the list
195 KConfig
config("kmetainformationrc", KConfig::NoGlobals
);
196 KConfigGroup settings
= config
.group("Show");
198 const QString label
= (m_metaDataWidget
== 0)
199 ? KNfoTranslator::instance().translation(uri
)
200 : m_metaDataWidget
->label(uri
);
202 QListWidgetItem
* item
= new QListWidgetItem(label
, m_metaDataList
);
203 item
->setData(Qt::UserRole
, key
);
204 const bool show
= settings
.readEntry(key
, true);
205 item
->setCheckState(show
? Qt::Checked
: Qt::Unchecked
);
208 KMetaDataConfigurationDialog::KMetaDataConfigurationDialog(QWidget
* parent
,
210 KDialog(parent
, flags
),
211 d(new Private(this, 0))
215 KMetaDataConfigurationDialog::KMetaDataConfigurationDialog(KMetaDataWidget
* metaDataWidget
,
218 KDialog(parent
, flags
),
219 d(new Private(this, metaDataWidget
))
223 KMetaDataConfigurationDialog::~KMetaDataConfigurationDialog()
228 void KMetaDataConfigurationDialog::slotButtonClicked(int button
)
230 if (button
== KDialog::Ok
) {
231 KConfig
config("kmetainformationrc", KConfig::NoGlobals
);
232 KConfigGroup showGroup
= config
.group("Show");
234 const int count
= d
->m_metaDataList
->count();
235 for (int i
= 0; i
< count
; ++i
) {
236 QListWidgetItem
* item
= d
->m_metaDataList
->item(i
);
237 const bool show
= (item
->checkState() == Qt::Checked
);
238 const QString key
= item
->data(Qt::UserRole
).toString();
239 showGroup
.writeEntry(key
, show
);
244 if (d
->m_metaDataWidget
!= 0) {
246 d
->m_metaDataWidget
->setVisibleDataTypes(d
->m_metaDataWidget
->visibleDataTypes());
250 KDialog::slotButtonClicked(button
);
254 void KMetaDataConfigurationDialog::setDescription(const QString
& description
)
256 d
->m_descriptionLabel
->setText(description
);
259 QString
KMetaDataConfigurationDialog::description() const
261 return d
->m_descriptionLabel
->text();
264 #include "kmetadataconfigurationdialog.moc"