mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 16:31:21 +00:00
Start of refactoring so that the metadata widget can be moved outside of Dolphin for other applications. The temporary removed code will be integrated again within the next 10 days (-> currently no meta data is shown and cannot be updated).
svn path=/trunk/KDE/kdebase/apps/; revision=1033585
This commit is contained in:
parent
ec6144e5cf
commit
eaeee9f7d6
|
@ -111,11 +111,9 @@ set(dolphin_SRCS
|
||||||
filterbar.cpp
|
filterbar.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
pixmapviewer.cpp
|
pixmapviewer.cpp
|
||||||
panels/information/commentwidget.cpp
|
|
||||||
panels/information/informationpanel.cpp
|
panels/information/informationpanel.cpp
|
||||||
panels/information/informationpanelcontent.cpp
|
panels/information/informationpanelcontent.cpp
|
||||||
panels/information/metadatawidget.cpp
|
panels/information/metadatawidget.cpp
|
||||||
panels/information/metatextlabel.cpp
|
|
||||||
panels/information/phononwidget.cpp
|
panels/information/phononwidget.cpp
|
||||||
panels/folders/ktreeview.cpp
|
panels/folders/ktreeview.cpp
|
||||||
panels/places/placespanel.cpp
|
panels/places/placespanel.cpp
|
||||||
|
@ -154,13 +152,10 @@ kde4_add_kcfg_files(dolphin_SRCS
|
||||||
if(Nepomuk_FOUND)
|
if(Nepomuk_FOUND)
|
||||||
set(dolphin_SRCS
|
set(dolphin_SRCS
|
||||||
${dolphin_SRCS}
|
${dolphin_SRCS}
|
||||||
|
panels/information/commentwidget.cpp
|
||||||
panels/information/nepomukmassupdatejob.cpp
|
panels/information/nepomukmassupdatejob.cpp
|
||||||
panels/information/tagcloud.cpp
|
panels/information/taggingwidget.cpp
|
||||||
panels/information/resourcetaggingwidget.cpp
|
|
||||||
panels/information/taggingpopup.cpp
|
|
||||||
panels/information/newtagdialog.cpp
|
|
||||||
)
|
)
|
||||||
kde4_add_ui_files(dolphin_SRCS panels/information/newtagdialog.ui)
|
|
||||||
|
|
||||||
endif(Nepomuk_FOUND)
|
endif(Nepomuk_FOUND)
|
||||||
|
|
||||||
|
|
|
@ -24,14 +24,6 @@
|
||||||
|
|
||||||
#include "kcategorizedview.h"
|
#include "kcategorizedview.h"
|
||||||
|
|
||||||
#include <config-nepomuk.h>
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
#include <nepomuk/global.h>
|
|
||||||
#include <nepomuk/resource.h>
|
|
||||||
#include <nepomuk/tag.h>
|
|
||||||
#include <Soprano/Vocabulary/Xesam>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <kdatetime.h>
|
#include <kdatetime.h>
|
||||||
#include <kdirmodel.h>
|
#include <kdirmodel.h>
|
||||||
#include <kfileitem.h>
|
#include <kfileitem.h>
|
||||||
|
|
|
@ -40,10 +40,6 @@ static DolphinView::Sorting sortingTypeTable[] =
|
||||||
DolphinView::SortByOwner, // DolphinModel::Owner
|
DolphinView::SortByOwner, // DolphinModel::Owner
|
||||||
DolphinView::SortByGroup, // DolphinModel::Group
|
DolphinView::SortByGroup, // DolphinModel::Group
|
||||||
DolphinView::SortByType // DolphinModel::Type
|
DolphinView::SortByType // DolphinModel::Type
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
, DolphinView::SortByRating
|
|
||||||
, DolphinView::SortByTags
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DolphinSortFilterProxyModel::DolphinSortFilterProxyModel(QObject* parent) :
|
DolphinSortFilterProxyModel::DolphinSortFilterProxyModel(QObject* parent) :
|
||||||
|
|
|
@ -262,31 +262,6 @@ QActionGroup* DolphinViewActionHandler::createSortByActionGroup()
|
||||||
sortByType->setData(QVariant::fromValue(DolphinView::SortByType));
|
sortByType->setData(QVariant::fromValue(DolphinView::SortByType));
|
||||||
sortByActionGroup->addAction(sortByType);
|
sortByActionGroup->addAction(sortByType);
|
||||||
|
|
||||||
// TODO: Hid "sort by rating" and "sort by tags" as without caching the performance
|
|
||||||
// is too slow currently (Nepomuk will support caching in future releases).
|
|
||||||
//
|
|
||||||
// KToggleAction* sortByRating = m_actionCollection->add<KToggleAction>("sort_by_rating");
|
|
||||||
// sortByRating->setData(QVariant::fromValue(DolphinView::SortByRating));
|
|
||||||
// sortByRating->setText(i18nc("@action:inmenu Sort By", "Rating"));
|
|
||||||
// sortByActionGroup->addAction(sortByRating);
|
|
||||||
//
|
|
||||||
// KToggleAction* sortByTags = m_actionCollection->add<KToggleAction>("sort_by_tags");
|
|
||||||
// sortByTags->setData(QVariant::fromValue(DolphinView::SortByTags));
|
|
||||||
// sortByTags->setText(i18nc("@action:inmenu Sort By", "Tags"));
|
|
||||||
// sortByActionGroup->addAction(sortByTags);
|
|
||||||
//
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
// if (!MetaDataWidget::metaDataAvailable()) {
|
|
||||||
// sortByRating->setEnabled(false);
|
|
||||||
// sortByTags->setEnabled(false);
|
|
||||||
// }
|
|
||||||
#else
|
|
||||||
// sortByRating->setEnabled(false);
|
|
||||||
// sortByTags->setEnabled(false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return sortByActionGroup;
|
return sortByActionGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -500,14 +475,6 @@ void DolphinViewActionHandler::slotSortingChanged(DolphinView::Sorting sorting)
|
||||||
case DolphinView::SortByType:
|
case DolphinView::SortByType:
|
||||||
action = m_actionCollection->action("sort_by_type");
|
action = m_actionCollection->action("sort_by_type");
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
case DolphinView::SortByRating:
|
|
||||||
action = m_actionCollection->action("sort_by_rating");
|
|
||||||
break;
|
|
||||||
case DolphinView::SortByTags:
|
|
||||||
action = m_actionCollection->action("sort_by_tags");
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Copyright (C) 2008 by Sebastian Trueg <trueg@kde.org> *
|
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* 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 *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
@ -17,111 +17,15 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "commentwidget.h"
|
#include "commentwidget_p.h"
|
||||||
|
|
||||||
#include <QtGui/QLabel>
|
CommentWidget::CommentWidget(QWidget* parent) :
|
||||||
#include <QtGui/QTextEdit>
|
QWidget(parent)
|
||||||
#include <QtGui/QLayout>
|
|
||||||
#include <QtGui/QCursor>
|
|
||||||
#include <QtCore/QEvent>
|
|
||||||
|
|
||||||
#include <KLocale>
|
|
||||||
|
|
||||||
|
|
||||||
class CommentWidget::Private
|
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
Private( CommentWidget* parent )
|
|
||||||
: q( parent ) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void update();
|
|
||||||
void _k_slotEnableEditing();
|
|
||||||
|
|
||||||
QTextEdit* textEdit;
|
|
||||||
QLabel* addComment;
|
|
||||||
|
|
||||||
QString comment;
|
|
||||||
|
|
||||||
private:
|
|
||||||
CommentWidget* q;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void CommentWidget::Private::update()
|
|
||||||
{
|
|
||||||
textEdit->setText( comment );
|
|
||||||
const bool hasComment = !comment.isEmpty();
|
|
||||||
textEdit->setVisible(hasComment);
|
|
||||||
addComment->setVisible(!hasComment);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CommentWidget::Private::_k_slotEnableEditing()
|
|
||||||
{
|
|
||||||
textEdit->show();
|
|
||||||
textEdit->setFocus();
|
|
||||||
addComment->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CommentWidget::CommentWidget( QWidget* parent )
|
|
||||||
: QWidget( parent ),
|
|
||||||
d( new Private( this ) )
|
|
||||||
{
|
|
||||||
d->textEdit = new QTextEdit( this );
|
|
||||||
d->textEdit->installEventFilter( this );
|
|
||||||
d->textEdit->setMinimumHeight( 100 );
|
|
||||||
d->textEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
|
|
||||||
|
|
||||||
d->addComment = new QLabel( this );
|
|
||||||
d->addComment->setText( "<p align=center><a style=\"font-size:small;\" href=\"addComment\">" + i18nc( "@label", "Add Comment..." ) + "</a>" );
|
|
||||||
|
|
||||||
QVBoxLayout* layout = new QVBoxLayout( this );
|
|
||||||
layout->setMargin( 0 );
|
|
||||||
layout->addWidget( d->textEdit );
|
|
||||||
layout->addWidget( d->addComment );
|
|
||||||
d->update();
|
|
||||||
connect( d->addComment, SIGNAL( linkActivated( const QString& ) ), this, SLOT( _k_slotEnableEditing() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CommentWidget::~CommentWidget()
|
CommentWidget::~CommentWidget()
|
||||||
{
|
{
|
||||||
delete d;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "commentwidget_p.moc"
|
||||||
void CommentWidget::setComment( const QString& comment )
|
|
||||||
{
|
|
||||||
d->comment = comment;
|
|
||||||
d->update();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString CommentWidget::comment() const
|
|
||||||
{
|
|
||||||
return d->comment;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString CommentWidget::editorText() const
|
|
||||||
{
|
|
||||||
return d->textEdit->toPlainText();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CommentWidget::eventFilter( QObject* watched, QEvent* event )
|
|
||||||
{
|
|
||||||
if ( watched == d->textEdit && event->type() == QEvent::FocusOut ) {
|
|
||||||
const QString currentComment = editorText();
|
|
||||||
if ( currentComment != d->comment ) {
|
|
||||||
d->comment = currentComment;
|
|
||||||
emit commentChanged( currentComment );
|
|
||||||
}
|
|
||||||
d->update();
|
|
||||||
}
|
|
||||||
return QWidget::eventFilter( watched, event );
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "commentwidget.moc"
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Copyright (C) 2008 by Sebastian Trueg <trueg@kde.org> *
|
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* 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 *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
@ -17,34 +17,18 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef _NEPOMUK_COMMENT_WIDGET_H_
|
#ifndef COMMENT_WIDGET
|
||||||
#define _NEPOMUK_COMMENT_WIDGET_H_
|
#define COMMENT_WIDGET
|
||||||
|
|
||||||
#include <QtGui/QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
class CommentWidget : public QWidget
|
class CommentWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CommentWidget( QWidget* parent = 0 );
|
CommentWidget(QWidget* parent);
|
||||||
virtual ~CommentWidget();
|
virtual ~CommentWidget();
|
||||||
|
|
||||||
void setComment( const QString& comment );
|
|
||||||
QString comment() const;
|
|
||||||
|
|
||||||
QString editorText() const;
|
|
||||||
|
|
||||||
virtual bool eventFilter( QObject* watched, QEvent* event );
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void commentChanged( const QString& );
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Private;
|
|
||||||
Private* const d;
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT( d, void _k_slotEnableEditing() )
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -48,7 +48,6 @@
|
||||||
#include "dolphin_informationpanelsettings.h"
|
#include "dolphin_informationpanelsettings.h"
|
||||||
#include "settings/dolphinsettings.h"
|
#include "settings/dolphinsettings.h"
|
||||||
#include "metadatawidget.h"
|
#include "metadatawidget.h"
|
||||||
#include "metatextlabel.h"
|
|
||||||
#include "phononwidget.h"
|
#include "phononwidget.h"
|
||||||
#include "pixmapviewer.h"
|
#include "pixmapviewer.h"
|
||||||
|
|
||||||
|
@ -79,9 +78,7 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) :
|
||||||
m_previewSeparator(0),
|
m_previewSeparator(0),
|
||||||
m_phononWidget(0),
|
m_phononWidget(0),
|
||||||
m_metaDataWidget(0),
|
m_metaDataWidget(0),
|
||||||
m_metaDataSeparator(0),
|
m_metaDataArea(0)
|
||||||
m_metaTextArea(0),
|
|
||||||
m_metaTextLabel(0)
|
|
||||||
{
|
{
|
||||||
parent->installEventFilter(this);
|
parent->installEventFilter(this);
|
||||||
|
|
||||||
|
@ -126,34 +123,14 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) :
|
||||||
m_preview->setVisible(showPreview);
|
m_preview->setVisible(showPreview);
|
||||||
m_previewSeparator->setVisible(showPreview);
|
m_previewSeparator->setVisible(showPreview);
|
||||||
|
|
||||||
if (MetaDataWidget::metaDataAvailable()) {
|
m_metaDataWidget = new MetaDataWidget(parent);
|
||||||
// rating, comment and tags
|
|
||||||
m_metaDataWidget = new MetaDataWidget(parent);
|
|
||||||
m_metaDataWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
||||||
m_metaDataWidget->setMaximumWidth(KIconLoader::SizeEnormous);
|
|
||||||
|
|
||||||
const bool showRating = InformationPanelSettings::showRating();
|
m_metaDataArea = new QScrollArea(parent);
|
||||||
const bool showComment = InformationPanelSettings::showComment();
|
//m_metaDataArea->setWidget(m_metaDataArea);
|
||||||
const bool showTags = InformationPanelSettings::showTags();
|
m_metaDataArea->setWidgetResizable(true);
|
||||||
|
m_metaDataArea->setFrameShape(QFrame::NoFrame);
|
||||||
|
|
||||||
m_metaDataWidget->setRatingVisible(showRating);
|
QWidget* viewport = m_metaDataArea->viewport();
|
||||||
m_metaDataWidget->setCommentVisible(showComment);
|
|
||||||
m_metaDataWidget->setTagsVisible(showTags);
|
|
||||||
|
|
||||||
m_metaDataSeparator = new KSeparator(this);
|
|
||||||
m_metaDataSeparator->setVisible(showRating || showComment || showTags);
|
|
||||||
}
|
|
||||||
|
|
||||||
// general meta text information
|
|
||||||
m_metaTextLabel = new MetaTextLabel(parent);
|
|
||||||
m_metaTextLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
||||||
|
|
||||||
m_metaTextArea = new QScrollArea(parent);
|
|
||||||
m_metaTextArea->setWidget(m_metaTextLabel);
|
|
||||||
m_metaTextArea->setWidgetResizable(true);
|
|
||||||
m_metaTextArea->setFrameShape(QFrame::NoFrame);
|
|
||||||
|
|
||||||
QWidget* viewport = m_metaTextArea->viewport();
|
|
||||||
viewport->installEventFilter(this);
|
viewport->installEventFilter(this);
|
||||||
|
|
||||||
QPalette palette = viewport->palette();
|
QPalette palette = viewport->palette();
|
||||||
|
@ -167,9 +144,8 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) :
|
||||||
layout->addWidget(m_previewSeparator);
|
layout->addWidget(m_previewSeparator);
|
||||||
if (m_metaDataWidget != 0) {
|
if (m_metaDataWidget != 0) {
|
||||||
layout->addWidget(m_metaDataWidget);
|
layout->addWidget(m_metaDataWidget);
|
||||||
layout->addWidget(m_metaDataSeparator);
|
|
||||||
}
|
}
|
||||||
layout->addWidget(m_metaTextArea);
|
layout->addWidget(m_metaDataArea);
|
||||||
parent->setLayout(layout);
|
parent->setLayout(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,49 +188,32 @@ void InformationPanelContent::showItem(const KFileItem& item)
|
||||||
setNameLabelText(itemUrl.fileName());
|
setNameLabelText(itemUrl.fileName());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_metaTextLabel->clear();
|
/* TODO: move to MetaDataWidget
|
||||||
if (item.isDir()) {
|
if (!item.isDir() && item.nepomukUri().isValid()) {
|
||||||
m_metaTextLabel->add(i18nc("@label", "Type:"), i18nc("@label", "Folder"));
|
KConfig config("kmetainformationrc", KConfig::NoGlobals);
|
||||||
m_metaTextLabel->add(i18nc("@label", "Modified:"), item.timeString());
|
KConfigGroup settings = config.group("Show");
|
||||||
} else {
|
initMetaInfoSettings(settings);
|
||||||
m_metaTextLabel->add(i18nc("@label", "Type:"), item.mimeComment());
|
|
||||||
|
|
||||||
m_metaTextLabel->add(i18nc("@label", "Size:"), KIO::convertSize(item.size()));
|
Nepomuk::Resource res(item.url());
|
||||||
m_metaTextLabel->add(i18nc("@label", "Modified:"), item.timeString());
|
|
||||||
|
|
||||||
#ifdef HAVE_NEPOMUK
|
QHash<QUrl, Nepomuk::Variant> properties = res.properties();
|
||||||
if ( item.nepomukUri().isValid() ) {
|
QHash<QUrl, Nepomuk::Variant>::const_iterator it = properties.constBegin();
|
||||||
KConfig config("kmetainformationrc", KConfig::NoGlobals);
|
while (it != properties.constEnd()) {
|
||||||
KConfigGroup settings = config.group("Show");
|
Nepomuk::Types::Property prop(it.key());
|
||||||
initMetaInfoSettings(settings);
|
if (settings.readEntry(prop.name(), true)) {
|
||||||
|
// TODO #1: use Nepomuk::formatValue(res, prop) if available
|
||||||
Nepomuk::Resource res(item.url());
|
// instead of it.value().toString()
|
||||||
|
// TODO #2: using tunedLabel() is a workaround for KDE 4.3 until
|
||||||
QHash<QUrl, Nepomuk::Variant> properties = res.properties();
|
// we get translated labels
|
||||||
QHash<QUrl, Nepomuk::Variant>::const_iterator it = properties.constBegin();
|
m_metaTextLabel->add(tunedLabel(prop.label()) + ':', it.value().toString());
|
||||||
while (it != properties.constEnd()) {
|
|
||||||
Nepomuk::Types::Property prop(it.key());
|
|
||||||
if (settings.readEntry(prop.name(), true)) {
|
|
||||||
// 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 until
|
|
||||||
// we get translated labels
|
|
||||||
m_metaTextLabel->add(tunedLabel(prop.label()) + ':', it.value().toString());
|
|
||||||
}
|
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
|
++it;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (m_metaDataWidget != 0) {
|
if (m_metaDataWidget != 0) {
|
||||||
if ( item.nepomukUri().isValid() ) {
|
m_metaDataWidget->setItem(item);
|
||||||
m_metaDataWidget->setFile(item.nepomukUri());
|
|
||||||
m_metaDataWidget->show();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_metaDataWidget->hide();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InformationPanelSettings::showPreview()) {
|
if (InformationPanelSettings::showPreview()) {
|
||||||
|
@ -295,26 +254,9 @@ void InformationPanelContent::showItems(const KFileItemList& items)
|
||||||
setNameLabelText(i18ncp("@info", "%1 item selected", "%1 items selected", items.count()));
|
setNameLabelText(i18ncp("@info", "%1 item selected", "%1 items selected", items.count()));
|
||||||
|
|
||||||
if (m_metaDataWidget != 0) {
|
if (m_metaDataWidget != 0) {
|
||||||
KUrl::List urls;
|
m_metaDataWidget->setItems(items);
|
||||||
foreach (const KFileItem& item, items) {
|
|
||||||
if ( item.nepomukUri().isValid() )
|
|
||||||
urls.append(item.nepomukUri());
|
|
||||||
}
|
|
||||||
m_metaDataWidget->setFiles(urls);
|
|
||||||
m_metaDataWidget->setVisible(!urls.isEmpty());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
quint64 totalSize = 0;
|
|
||||||
foreach (const KFileItem& item, items) {
|
|
||||||
// Only count the size of files, not dirs to match what
|
|
||||||
// DolphinViewContainer::selectionStatusBarText() does.
|
|
||||||
if (!item.isDir() && !item.isLink()) {
|
|
||||||
totalSize += item.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_metaTextLabel->clear();
|
|
||||||
m_metaTextLabel->add(i18nc("@label", "Total size:"), KIO::convertSize(totalSize));
|
|
||||||
|
|
||||||
m_phononWidget->hide();
|
m_phononWidget->hide();
|
||||||
|
|
||||||
m_item = KFileItem();
|
m_item = KFileItem();
|
||||||
|
@ -324,10 +266,10 @@ bool InformationPanelContent::eventFilter(QObject* obj, QEvent* event)
|
||||||
{
|
{
|
||||||
if (event->type() == QEvent::Resize) {
|
if (event->type() == QEvent::Resize) {
|
||||||
QResizeEvent* resizeEvent = static_cast<QResizeEvent*>(event);
|
QResizeEvent* resizeEvent = static_cast<QResizeEvent*>(event);
|
||||||
if (obj == m_metaTextArea->viewport()) {
|
if (obj == m_metaDataArea->viewport()) {
|
||||||
// The size of the meta text area has changed. Adjust the fixed
|
// The size of the meta text area has changed. Adjust the fixed
|
||||||
// width in a way that no horizontal scrollbar needs to be shown.
|
// width in a way that no horizontal scrollbar needs to be shown.
|
||||||
m_metaTextLabel->setFixedWidth(resizeEvent->size().width());
|
//m_metaDataWidget->setFixedWidth(resizeEvent->size().width());
|
||||||
} else if (obj == parent()) {
|
} else if (obj == parent()) {
|
||||||
// If the text inside the name label or the info label cannot
|
// If the text inside the name label or the info label cannot
|
||||||
// get wrapped, then the maximum width of the label is increased
|
// get wrapped, then the maximum width of the label is increased
|
||||||
|
@ -340,7 +282,7 @@ bool InformationPanelContent::eventFilter(QObject* obj, QEvent* event)
|
||||||
// The metadata widget also contains a text widget which may return
|
// The metadata widget also contains a text widget which may return
|
||||||
// a large preferred width.
|
// a large preferred width.
|
||||||
if (m_metaDataWidget != 0) {
|
if (m_metaDataWidget != 0) {
|
||||||
m_metaDataWidget->setMaximumWidth(maxWidth);
|
//m_metaDataWidget->setMaximumWidth(maxWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to increase the preview as large as possible
|
// try to increase the preview as large as possible
|
||||||
|
@ -370,7 +312,7 @@ void InformationPanelContent::configureSettings()
|
||||||
previewAction->setCheckable(true);
|
previewAction->setCheckable(true);
|
||||||
previewAction->setChecked(InformationPanelSettings::showPreview());
|
previewAction->setChecked(InformationPanelSettings::showPreview());
|
||||||
|
|
||||||
const bool metaDataAvailable = MetaDataWidget::metaDataAvailable();
|
const bool metaDataAvailable = true; // MetaDataWidget::metaDataAvailable(); TODO
|
||||||
|
|
||||||
QAction* ratingAction = popup.addAction(i18nc("@action:inmenu", "Rating"));
|
QAction* ratingAction = popup.addAction(i18nc("@action:inmenu", "Rating"));
|
||||||
ratingAction->setIcon(KIcon("rating"));
|
ratingAction->setIcon(KIcon("rating"));
|
||||||
|
@ -458,25 +400,25 @@ void InformationPanelContent::configureSettings()
|
||||||
m_previewSeparator->setVisible(isChecked);
|
m_previewSeparator->setVisible(isChecked);
|
||||||
InformationPanelSettings::setShowPreview(isChecked);
|
InformationPanelSettings::setShowPreview(isChecked);
|
||||||
} else if (action == ratingAction) {
|
} else if (action == ratingAction) {
|
||||||
m_metaDataWidget->setRatingVisible(isChecked);
|
//m_metaDataWidget->setRatingVisible(isChecked);
|
||||||
InformationPanelSettings::setShowRating(isChecked);
|
InformationPanelSettings::setShowRating(isChecked);
|
||||||
} else if (action == commentAction) {
|
} else if (action == commentAction) {
|
||||||
m_metaDataWidget->setCommentVisible(isChecked);
|
//m_metaDataWidget->setCommentVisible(isChecked);
|
||||||
InformationPanelSettings::setShowComment(isChecked);
|
InformationPanelSettings::setShowComment(isChecked);
|
||||||
} else if (action == tagsAction) {
|
} else if (action == tagsAction) {
|
||||||
m_metaDataWidget->setTagsVisible(isChecked);
|
//m_metaDataWidget->setTagsVisible(isChecked);
|
||||||
InformationPanelSettings::setShowTags(isChecked);
|
InformationPanelSettings::setShowTags(isChecked);
|
||||||
} else {
|
} else {
|
||||||
settings.writeEntry(action->data().toString(), action->isChecked());
|
settings.writeEntry(action->data().toString(), action->isChecked());
|
||||||
settings.sync();
|
settings.sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_metaDataWidget != 0) {
|
/*if (m_metaDataWidget != 0) {
|
||||||
const bool visible = m_metaDataWidget->isRatingVisible() ||
|
const bool visible = m_metaDataWidget->isRatingVisible() ||
|
||||||
m_metaDataWidget->isCommentVisible() ||
|
m_metaDataWidget->isCommentVisible() ||
|
||||||
m_metaDataWidget->areTagsVisible();
|
m_metaDataWidget->areTagsVisible();
|
||||||
m_metaDataSeparator->setVisible(visible);
|
m_metaDataSeparator->setVisible(visible);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
showItem(m_item);
|
showItem(m_item);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -136,10 +136,7 @@ private:
|
||||||
KSeparator* m_previewSeparator;
|
KSeparator* m_previewSeparator;
|
||||||
PhononWidget* m_phononWidget;
|
PhononWidget* m_phononWidget;
|
||||||
MetaDataWidget* m_metaDataWidget;
|
MetaDataWidget* m_metaDataWidget;
|
||||||
KSeparator* m_metaDataSeparator;
|
QScrollArea* m_metaDataArea;
|
||||||
|
|
||||||
QScrollArea* m_metaTextArea;
|
|
||||||
MetaTextLabel* m_metaTextLabel;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INFORMATIONPANELCONTENT_H
|
#endif // INFORMATIONPANELCONTENT_H
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Copyright (C) 2007 by Sebastian Trueg <trueg@kde.org> *
|
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* 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 *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
@ -19,341 +19,181 @@
|
||||||
|
|
||||||
#include "metadatawidget.h"
|
#include "metadatawidget.h"
|
||||||
|
|
||||||
#include "commentwidget.h"
|
#include <kfileitem.h>
|
||||||
|
#include <klocale.h>
|
||||||
|
|
||||||
#include <config-nepomuk.h>
|
#include <config-nepomuk.h>
|
||||||
|
|
||||||
#include <klocale.h>
|
|
||||||
#include <KMessageBox>
|
|
||||||
|
|
||||||
#include <QtCore/QEvent>
|
|
||||||
#include <QtCore/QMutex>
|
|
||||||
#include <QtCore/QMutexLocker>
|
|
||||||
#include <QtCore/QThread>
|
|
||||||
#include <QtGui/QLabel>
|
|
||||||
#include <QtGui/QGridLayout>
|
|
||||||
#include <QtGui/QTextEdit>
|
|
||||||
|
|
||||||
#ifdef HAVE_NEPOMUK
|
#ifdef HAVE_NEPOMUK
|
||||||
#include "nepomukmassupdatejob.h"
|
#include "commentwidget_p.h"
|
||||||
#include <nepomuk/kmetadatatagwidget.h>
|
#include "nepomukmassupdatejob_p.h"
|
||||||
#include <nepomuk/resourcemanager.h>
|
#include "taggingwidget_p.h"
|
||||||
#include <nepomuk/resource.h>
|
#endif
|
||||||
#include <nepomuk/variant.h>
|
|
||||||
#include <nepomuk/kratingwidget.h>
|
#include <nepomuk/kratingwidget.h>
|
||||||
#include <Soprano/Vocabulary/Xesam>
|
|
||||||
#include "resourcetaggingwidget.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
bool MetaDataWidget::metaDataAvailable()
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
return !Nepomuk::ResourceManager::instance()->init();
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QList>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
class MetaDataWidget::Private
|
class MetaDataWidget::Private
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
#ifdef HAVE_NEPOMUK
|
struct Row
|
||||||
CommentWidget* commentWidget;
|
|
||||||
KRatingWidget* ratingWidget;
|
|
||||||
Nepomuk::ResourceTaggingWidget* tagWidget;
|
|
||||||
|
|
||||||
// shared data between the GUI-thread and
|
|
||||||
// the loader-thread (see LoadFilesThread):
|
|
||||||
QMutex mutex;
|
|
||||||
struct SharedData
|
|
||||||
{
|
{
|
||||||
int rating;
|
QLabel* label;
|
||||||
QString comment;
|
QWidget* infoWidget;
|
||||||
QList<Nepomuk::Resource> fileRes;
|
|
||||||
QMap<KUrl, Nepomuk::Resource> files;
|
|
||||||
} sharedData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads the meta data of files and writes
|
|
||||||
* the result into a shared data pool that
|
|
||||||
* can be used by the widgets in the GUI thread.
|
|
||||||
*/
|
|
||||||
class LoadFilesThread : public QThread
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
LoadFilesThread(SharedData* sharedData, QMutex* mutex);
|
|
||||||
~LoadFilesThread();
|
|
||||||
void loadFiles(const KUrl::List& urls);
|
|
||||||
virtual void run();
|
|
||||||
|
|
||||||
private:
|
|
||||||
SharedData* m_sharedData;
|
|
||||||
QMutex* m_mutex;
|
|
||||||
KUrl::List m_urls;
|
|
||||||
bool m_canceled;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
LoadFilesThread* loadFilesThread;
|
Private(MetaDataWidget* parent);
|
||||||
|
~Private();
|
||||||
|
|
||||||
|
void addRow(QLabel* label, QWidget* infoWidget);
|
||||||
|
void setRowVisible(QWidget* infoWidget, bool visible);
|
||||||
|
|
||||||
|
QList<Row> m_rows;
|
||||||
|
|
||||||
|
QGridLayout* m_gridLayout;
|
||||||
|
|
||||||
|
QLabel* m_typeInfo;
|
||||||
|
QLabel* m_sizeLabel;
|
||||||
|
QLabel* m_sizeInfo;
|
||||||
|
QLabel* m_modifiedInfo;
|
||||||
|
QLabel* m_ownerInfo;
|
||||||
|
QLabel* m_permissionsInfo;
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
KRatingWidget* m_ratingWidget;
|
||||||
|
TaggingWidget* m_taggingWidget;
|
||||||
|
CommentWidget* m_commentWidget;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
MetaDataWidget* const q;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MetaDataWidget::Private::Private(MetaDataWidget* parent) :
|
||||||
|
m_rows(),
|
||||||
|
m_gridLayout(0),
|
||||||
|
m_typeInfo(0),
|
||||||
|
m_sizeLabel(0),
|
||||||
|
m_sizeInfo(0),
|
||||||
|
m_modifiedInfo(0),
|
||||||
|
m_ownerInfo(0),
|
||||||
|
m_permissionsInfo(0),
|
||||||
#ifdef HAVE_NEPOMUK
|
#ifdef HAVE_NEPOMUK
|
||||||
|
m_ratingWidget(0),
|
||||||
MetaDataWidget::Private::LoadFilesThread::LoadFilesThread(
|
m_taggingWidget(0),
|
||||||
MetaDataWidget::Private::SharedData* sharedData,
|
m_commentWidget(0),
|
||||||
QMutex* mutex) :
|
|
||||||
m_sharedData(sharedData),
|
|
||||||
m_mutex(mutex),
|
|
||||||
m_urls(),
|
|
||||||
m_canceled(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaDataWidget::Private::LoadFilesThread::~LoadFilesThread()
|
|
||||||
{
|
|
||||||
// this thread may very well be deleted during execution. We need
|
|
||||||
// to protect it from crashes here
|
|
||||||
m_canceled = true;
|
|
||||||
wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaDataWidget::Private::LoadFilesThread::loadFiles(const KUrl::List& urls)
|
|
||||||
{
|
|
||||||
QMutexLocker locker( m_mutex );
|
|
||||||
m_urls = urls;
|
|
||||||
m_canceled = false;
|
|
||||||
start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaDataWidget::Private::LoadFilesThread::run()
|
|
||||||
{
|
|
||||||
QMutexLocker locker( m_mutex );
|
|
||||||
const KUrl::List urls = m_urls;
|
|
||||||
locker.unlock();
|
|
||||||
|
|
||||||
bool first = true;
|
|
||||||
QList<Nepomuk::Resource> fileRes;
|
|
||||||
QMap<KUrl, Nepomuk::Resource> files;
|
|
||||||
unsigned int rating = 0;
|
|
||||||
QString comment;
|
|
||||||
Q_FOREACH( const KUrl &url, urls ) {
|
|
||||||
if ( m_canceled )
|
|
||||||
return;
|
|
||||||
Nepomuk::Resource file( url, Soprano::Vocabulary::Xesam::File() );
|
|
||||||
files.insert( url, file );
|
|
||||||
fileRes.append( file );
|
|
||||||
|
|
||||||
if ( !first && rating != file.rating() ) {
|
|
||||||
rating = 0; // reset rating
|
|
||||||
}
|
|
||||||
else if ( first ) {
|
|
||||||
rating = file.rating();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !first && comment != file.description() ) {
|
|
||||||
comment.clear();
|
|
||||||
}
|
|
||||||
else if ( first ) {
|
|
||||||
comment = file.description();
|
|
||||||
}
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
locker.relock();
|
|
||||||
m_sharedData->rating = rating;
|
|
||||||
m_sharedData->comment = comment;
|
|
||||||
m_sharedData->fileRes = fileRes;
|
|
||||||
m_sharedData->files = files;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
q(parent)
|
||||||
|
{
|
||||||
|
m_gridLayout = new QGridLayout(parent);
|
||||||
|
|
||||||
|
m_typeInfo = new QLabel(parent);
|
||||||
|
m_sizeLabel = new QLabel(parent);
|
||||||
|
m_sizeInfo = new QLabel(parent);
|
||||||
|
m_modifiedInfo = new QLabel(parent);
|
||||||
|
m_ownerInfo = new QLabel(parent);
|
||||||
|
m_permissionsInfo = new QLabel(parent);
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
m_ratingWidget = new KRatingWidget(parent);
|
||||||
|
m_taggingWidget = new TaggingWidget(parent);
|
||||||
|
m_commentWidget = new CommentWidget(parent);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
addRow(new QLabel(i18nc("@label", "Type:"), parent), m_typeInfo);
|
||||||
|
addRow(m_sizeLabel, m_sizeInfo);
|
||||||
|
addRow(new QLabel(i18nc("@label", "Modified:"), parent), m_modifiedInfo);
|
||||||
|
addRow(new QLabel(i18nc("@label", "Owner:"), parent), m_ownerInfo);
|
||||||
|
addRow(new QLabel(i18nc("@label", "Permissions:"), parent), m_permissionsInfo);
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
addRow(new QLabel(i18nc("@label", "Rating:"), parent), m_ratingWidget);
|
||||||
|
addRow(new QLabel(i18nc("@label", "Tags:"), parent), m_taggingWidget);
|
||||||
|
addRow(new QLabel(i18nc("@label", "Comment:"), parent), m_commentWidget);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaDataWidget::Private::~Private()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void MetaDataWidget::Private::addRow(QLabel* label, QWidget* infoWidget)
|
||||||
|
{
|
||||||
|
Row row;
|
||||||
|
row.label = label;
|
||||||
|
row.infoWidget = infoWidget;
|
||||||
|
m_rows.append(row);
|
||||||
|
|
||||||
|
QPalette palette = label->palette();
|
||||||
|
QColor textColor = palette.color(QPalette::Text);
|
||||||
|
textColor.setAlpha(128);
|
||||||
|
palette.setColor(QPalette::WindowText, textColor);
|
||||||
|
label->setPalette(palette);
|
||||||
|
|
||||||
|
const int rowIndex = m_rows.count();
|
||||||
|
m_gridLayout->addWidget(label, rowIndex, 0, Qt::AlignLeft);
|
||||||
|
m_gridLayout->addWidget(infoWidget, rowIndex, 1, Qt::AlignRight);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MetaDataWidget::Private::setRowVisible(QWidget* infoWidget, bool visible)
|
||||||
|
{
|
||||||
|
foreach (const Row& row, m_rows) {
|
||||||
|
if (row.infoWidget == infoWidget) {
|
||||||
|
row.label->setVisible(visible);
|
||||||
|
row.infoWidget->setVisible(visible);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MetaDataWidget::MetaDataWidget(QWidget* parent) :
|
MetaDataWidget::MetaDataWidget(QWidget* parent) :
|
||||||
QWidget(parent)
|
QWidget(parent),
|
||||||
|
d(new Private(this))
|
||||||
{
|
{
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
d = new Private;
|
|
||||||
d->commentWidget = new CommentWidget(this);
|
|
||||||
d->commentWidget->setFocusPolicy(Qt::ClickFocus);
|
|
||||||
d->ratingWidget = new KRatingWidget(this);
|
|
||||||
d->ratingWidget->setAlignment( Qt::AlignCenter );
|
|
||||||
d->tagWidget = new Nepomuk::ResourceTaggingWidget(this);
|
|
||||||
connect(d->ratingWidget, SIGNAL(ratingChanged(unsigned int)), this, SLOT(slotRatingChanged(unsigned int)));
|
|
||||||
connect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
|
|
||||||
connect(d->tagWidget, SIGNAL(tagClicked(const Nepomuk::Tag&)), this, SLOT(slotTagClicked( const Nepomuk::Tag&)));
|
|
||||||
|
|
||||||
d->sharedData.rating = 0;
|
|
||||||
d->loadFilesThread = new Private::LoadFilesThread(&d->sharedData, &d->mutex);
|
|
||||||
connect(d->loadFilesThread, SIGNAL(finished()), this, SLOT(slotLoadingFinished()));
|
|
||||||
|
|
||||||
QVBoxLayout* lay = new QVBoxLayout(this);
|
|
||||||
lay->setMargin(0);
|
|
||||||
lay->addWidget(d->ratingWidget);
|
|
||||||
lay->addWidget(d->commentWidget);
|
|
||||||
lay->addWidget( d->tagWidget );
|
|
||||||
#else
|
|
||||||
d = 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MetaDataWidget::~MetaDataWidget()
|
MetaDataWidget::~MetaDataWidget()
|
||||||
{
|
{
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
delete d->loadFilesThread;
|
|
||||||
#endif
|
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetaDataWidget::setRatingVisible(bool visible)
|
void MetaDataWidget::setItem(const KFileItem& item)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_NEPOMUK
|
// update values for "type", "size", "modified",
|
||||||
d->ratingWidget->setVisible(visible);
|
// "owner" and "permissions" synchronously
|
||||||
#else
|
d->m_sizeLabel->setText(i18nc("@label", "Size:"));
|
||||||
Q_UNUSED(visible);
|
if (item.isDir()) {
|
||||||
#endif
|
d->m_typeInfo->setText(i18nc("@label", "Folder"));
|
||||||
}
|
d->setRowVisible(d->m_sizeInfo, false);
|
||||||
|
} else {
|
||||||
|
d->m_typeInfo->setText(item.mimeComment());
|
||||||
bool MetaDataWidget::isRatingVisible() const
|
d->m_sizeInfo->setText(KIO::convertSize(item.size()));
|
||||||
{
|
d->setRowVisible(d->m_sizeInfo, true);
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
return d->ratingWidget->isVisible();
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MetaDataWidget::setCommentVisible(bool visible)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
d->commentWidget->setVisible(visible);
|
|
||||||
#else
|
|
||||||
Q_UNUSED(visible);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool MetaDataWidget::isCommentVisible() const
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
return d->commentWidget->isVisible();
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MetaDataWidget::setTagsVisible(bool visible)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
d->tagWidget->setVisible(visible);
|
|
||||||
#else
|
|
||||||
Q_UNUSED(visible);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool MetaDataWidget::areTagsVisible() const
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
return d->tagWidget->isVisible();
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MetaDataWidget::setFile(const KUrl& url)
|
|
||||||
{
|
|
||||||
KUrl::List urls;
|
|
||||||
urls.append( url );
|
|
||||||
setFiles( urls );
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaDataWidget::setFiles(const KUrl::List& urls)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
// Assure that the currently edited text is stored before
|
|
||||||
// loading the meta data for new files.
|
|
||||||
const QString currentComment = d->commentWidget->editorText();
|
|
||||||
if ( currentComment != d->commentWidget->comment() ) {
|
|
||||||
slotCommentChanged( currentComment );
|
|
||||||
}
|
}
|
||||||
|
d->m_modifiedInfo->setText(item.timeString());
|
||||||
|
d->m_ownerInfo->setText(item.user());
|
||||||
|
d->m_permissionsInfo->setText(item.permissionsString());
|
||||||
|
|
||||||
d->loadFilesThread->loadFiles( urls );
|
setItems(KFileItemList() << item);
|
||||||
#else
|
|
||||||
Q_UNUSED( urls );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MetaDataWidget::setItems(const KFileItemList& items)
|
||||||
void MetaDataWidget::slotCommentChanged( const QString& s )
|
|
||||||
{
|
{
|
||||||
#ifdef HAVE_NEPOMUK
|
if (items.count() > 1) {
|
||||||
disconnect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
|
// calculate the size of all items and show this
|
||||||
|
// information to the user
|
||||||
|
d->m_sizeLabel->setText(i18nc("@label", "Total Size:"));
|
||||||
|
d->setRowVisible(d->m_sizeInfo, true);
|
||||||
|
|
||||||
QMutexLocker locker( &d->mutex );
|
quint64 totalSize = 0;
|
||||||
Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::commentResources( d->sharedData.files.values(), s );
|
foreach (const KFileItem& item, items) {
|
||||||
locker.unlock();
|
if (!item.isDir() && !item.isLink()) {
|
||||||
connect( job, SIGNAL( result( KJob* ) ),
|
totalSize += item.size();
|
||||||
this, SLOT( metadataUpdateDone() ) );
|
}
|
||||||
setEnabled( false ); // no updates during execution
|
}
|
||||||
job->start();
|
d->m_sizeInfo->setText(KIO::convertSize(totalSize));
|
||||||
|
}
|
||||||
connect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
|
|
||||||
#else
|
|
||||||
Q_UNUSED( s );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MetaDataWidget::slotRatingChanged(unsigned int rating)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
QMutexLocker locker( &d->mutex );
|
|
||||||
Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::rateResources( d->sharedData.files.values(), rating );
|
|
||||||
locker.unlock();
|
|
||||||
connect( job, SIGNAL( result( KJob* ) ),
|
|
||||||
this, SLOT( metadataUpdateDone() ) );
|
|
||||||
setEnabled( false ); // no updates during execution
|
|
||||||
job->start();
|
|
||||||
#else
|
|
||||||
Q_UNUSED( rating );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MetaDataWidget::metadataUpdateDone()
|
|
||||||
{
|
|
||||||
setEnabled( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool MetaDataWidget::eventFilter(QObject* obj, QEvent* event)
|
|
||||||
{
|
|
||||||
return QWidget::eventFilter(obj, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MetaDataWidget::slotTagClicked( const Nepomuk::Tag& tag )
|
|
||||||
{
|
|
||||||
Q_UNUSED( tag );
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
d->tagWidget->showTagPopup( QCursor::pos() );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaDataWidget::slotLoadingFinished()
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
QMutexLocker locker( &d->mutex );
|
|
||||||
d->ratingWidget->setRating( d->sharedData.rating );
|
|
||||||
d->commentWidget->setComment( d->sharedData.comment );
|
|
||||||
d->tagWidget->setResources( d->sharedData.fileRes );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "metadatawidget.moc"
|
#include "metadatawidget.moc"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Copyright (C) 2007 by Sebastian Trueg <trueg@kde.org> *
|
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* 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 *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
@ -17,61 +17,27 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef METADATA_WIDGET_H
|
#ifndef METADATAWIDGET_H
|
||||||
#define METADATA_WIDGET_H
|
#define METADATAWIDGET_H
|
||||||
|
|
||||||
#include <QtGui/QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
#include <kurl.h>
|
class KFileItem;
|
||||||
|
class KFileItemList;
|
||||||
namespace Nepomuk {
|
|
||||||
class Tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
class MetaDataWidget : public QWidget
|
class MetaDataWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MetaDataWidget(QWidget* parent = 0);
|
explicit MetaDataWidget(QWidget* parent = 0);
|
||||||
virtual ~MetaDataWidget();
|
virtual ~MetaDataWidget();
|
||||||
|
|
||||||
/**
|
void setItem(const KFileItem& item);
|
||||||
* \return true if the KMetaData system could be found and initialized.
|
void setItems(const KFileItemList& items);
|
||||||
* false if KMetaData was not available at compile time or if it has not
|
|
||||||
* been initialized properly.
|
|
||||||
*/
|
|
||||||
static bool metaDataAvailable();
|
|
||||||
|
|
||||||
void setRatingVisible(bool visible);
|
|
||||||
bool isRatingVisible() const;
|
|
||||||
|
|
||||||
void setCommentVisible(bool visible);
|
|
||||||
bool isCommentVisible() const;
|
|
||||||
|
|
||||||
void setTagsVisible(bool visible);
|
|
||||||
bool areTagsVisible() const;
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void setFile(const KUrl& url);
|
|
||||||
void setFiles(const KUrl::List& urls);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
/**
|
|
||||||
* This signal gets emitted if the metadata for the set file was changed on the
|
|
||||||
* outside. NOT IMPLEMENTED YET.
|
|
||||||
*/
|
|
||||||
void metaDataChanged();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void slotCommentChanged(const QString&);
|
|
||||||
void slotRatingChanged(unsigned int rating);
|
|
||||||
void metadataUpdateDone();
|
|
||||||
void slotTagClicked( const Nepomuk::Tag& );
|
|
||||||
void slotLoadingFinished();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool eventFilter(QObject* obj, QEvent* event);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Private;
|
class Private;
|
||||||
|
|
|
@ -1,159 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at> *
|
|
||||||
* *
|
|
||||||
* 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 *
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#include "metatextlabel.h"
|
|
||||||
|
|
||||||
#include <kglobalsettings.h>
|
|
||||||
#include <klocale.h>
|
|
||||||
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QTextLayout>
|
|
||||||
#include <QTextLine>
|
|
||||||
#include <kdebug.h>
|
|
||||||
|
|
||||||
MetaTextLabel::MetaTextLabel(QWidget* parent) :
|
|
||||||
QWidget(parent),
|
|
||||||
m_metaInfos()
|
|
||||||
{
|
|
||||||
setFont(KGlobalSettings::smallestReadableFont());
|
|
||||||
setMinimumHeight(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaTextLabel::~MetaTextLabel()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaTextLabel::clear()
|
|
||||||
{
|
|
||||||
setMinimumHeight(0);
|
|
||||||
m_metaInfos.clear();
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaTextLabel::add(const QString& labelText, const QString& infoText)
|
|
||||||
{
|
|
||||||
MetaInfo metaInfo;
|
|
||||||
metaInfo.label = labelText;
|
|
||||||
metaInfo.info = infoText;
|
|
||||||
|
|
||||||
// add the meta information alphabetically sorted
|
|
||||||
bool inserted = false;
|
|
||||||
const int count = m_metaInfos.size();
|
|
||||||
for (int i = 0; i < count; ++i) {
|
|
||||||
if (m_metaInfos[i].label > labelText) {
|
|
||||||
m_metaInfos.insert(i, metaInfo);
|
|
||||||
inserted = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!inserted) {
|
|
||||||
m_metaInfos.append(metaInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
setMinimumHeight(minimumHeight() + requiredHeight(metaInfo));
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaTextLabel::paintEvent(QPaintEvent* event)
|
|
||||||
{
|
|
||||||
QWidget::paintEvent(event);
|
|
||||||
|
|
||||||
QPainter painter(this);
|
|
||||||
|
|
||||||
const QColor infoColor = palette().color(QPalette::Foreground);
|
|
||||||
QColor labelColor = infoColor;
|
|
||||||
labelColor.setAlpha(128);
|
|
||||||
|
|
||||||
int y = 0;
|
|
||||||
const int infoWidth = infoTextWidth();
|
|
||||||
const int labelWidth = labelTextWidth();
|
|
||||||
const int infoX = infoWidth;
|
|
||||||
const int maxHeight = maxHeightPerLine();
|
|
||||||
|
|
||||||
foreach (const MetaInfo& metaInfo, m_metaInfos) {
|
|
||||||
// draw label (e. g. "Date:")
|
|
||||||
painter.setPen(labelColor);
|
|
||||||
painter.drawText(0, y, labelWidth, maxHeight,
|
|
||||||
Qt::AlignTop | Qt::AlignRight | Qt::TextWordWrap,
|
|
||||||
metaInfo.label);
|
|
||||||
|
|
||||||
// draw information (e. g. "2008-11-09 20:12")
|
|
||||||
painter.setPen(infoColor);
|
|
||||||
painter.drawText(infoX, y, infoWidth, maxHeight,
|
|
||||||
Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap,
|
|
||||||
metaInfo.info);
|
|
||||||
|
|
||||||
y += requiredHeight(metaInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetaTextLabel::resizeEvent(QResizeEvent* event)
|
|
||||||
{
|
|
||||||
QWidget::resizeEvent(event);
|
|
||||||
|
|
||||||
int minimumHeight = 0;
|
|
||||||
foreach (const MetaInfo& metaInfo, m_metaInfos) {
|
|
||||||
minimumHeight += requiredHeight(metaInfo);
|
|
||||||
}
|
|
||||||
setMinimumHeight(minimumHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
int MetaTextLabel::requiredHeight(const MetaInfo& info) const
|
|
||||||
{
|
|
||||||
const int labelTextHeight = requiredHeight(info.label, labelTextWidth());
|
|
||||||
const int infoTextHeight = requiredHeight(info.info, infoTextWidth());
|
|
||||||
return qMax(labelTextHeight, infoTextHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
int MetaTextLabel::requiredHeight(const QString& text, int width) const
|
|
||||||
{
|
|
||||||
QTextOption textOption;
|
|
||||||
textOption.setWrapMode(QTextOption::WordWrap);
|
|
||||||
|
|
||||||
qreal height = 0;
|
|
||||||
const int leading = fontMetrics().leading();
|
|
||||||
|
|
||||||
QTextLayout textLayout(text);
|
|
||||||
textLayout.setFont(font());
|
|
||||||
textLayout.setTextOption(textOption);
|
|
||||||
|
|
||||||
textLayout.beginLayout();
|
|
||||||
QTextLine line = textLayout.createLine();
|
|
||||||
while (line.isValid()) {
|
|
||||||
line.setLineWidth(width);
|
|
||||||
height += leading;
|
|
||||||
height += line.height();
|
|
||||||
line = textLayout.createLine();
|
|
||||||
}
|
|
||||||
textLayout.endLayout();
|
|
||||||
|
|
||||||
int adjustedHeight = static_cast<int>(height);
|
|
||||||
if (adjustedHeight > maxHeightPerLine()) {
|
|
||||||
adjustedHeight = maxHeightPerLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
return adjustedHeight + Spacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
int MetaTextLabel::maxHeightPerLine() const
|
|
||||||
{
|
|
||||||
return fontMetrics().height() * 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "metatextlabel.moc"
|
|
|
@ -1,85 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at> *
|
|
||||||
* *
|
|
||||||
* 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 *
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef METATEXTLABEL_H
|
|
||||||
#define METATEXTLABEL_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Displays general meta in several lines.
|
|
||||||
*
|
|
||||||
* Each line contains a label and the meta information.
|
|
||||||
*/
|
|
||||||
class MetaTextLabel : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit MetaTextLabel(QWidget* parent = 0);
|
|
||||||
virtual ~MetaTextLabel();
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
void add(const QString& labelText, const QString& infoText);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void paintEvent(QPaintEvent* event);
|
|
||||||
virtual void resizeEvent(QResizeEvent* event);
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum { Spacing = 2 };
|
|
||||||
|
|
||||||
struct MetaInfo
|
|
||||||
{
|
|
||||||
QString label;
|
|
||||||
QString info;
|
|
||||||
};
|
|
||||||
|
|
||||||
QList<MetaInfo> m_metaInfos;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the required height in pixels for the
|
|
||||||
* label text and information text provided by \a info.
|
|
||||||
*/
|
|
||||||
int requiredHeight(const MetaInfo& info) const;
|
|
||||||
|
|
||||||
/** Helper method for requiredHeight(const MetaInfo& info). */
|
|
||||||
int requiredHeight(const QString& text, int width) const;
|
|
||||||
int labelTextWidth() const;
|
|
||||||
int infoTextWidth() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the maximum height in pixels for the text of
|
|
||||||
* one added line. The returned value does not contain
|
|
||||||
* any additional spacing between texts.
|
|
||||||
*/
|
|
||||||
int maxHeightPerLine() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline int MetaTextLabel::labelTextWidth() const
|
|
||||||
{
|
|
||||||
return width() / 2 - 2 * Spacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int MetaTextLabel::infoTextWidth() const
|
|
||||||
{
|
|
||||||
return width() / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -17,7 +17,7 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "nepomukmassupdatejob.h"
|
#include "nepomukmassupdatejob_p.h"
|
||||||
|
|
||||||
#include <klocale.h>
|
#include <klocale.h>
|
||||||
#include <kdebug.h>
|
#include <kdebug.h>
|
||||||
|
@ -160,4 +160,4 @@ Nepomuk::MassUpdateJob* Nepomuk::MassUpdateJob::commentResources( const QList<Ne
|
||||||
return job;
|
return job;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "nepomukmassupdatejob.moc"
|
#include "nepomukmassupdatejob_p.moc"
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2008 by Sebastian Trueg <trueg at kde.org>
|
|
||||||
|
|
||||||
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, 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "newtagdialog.h"
|
|
||||||
|
|
||||||
#include <nepomuk/tag.h>
|
|
||||||
|
|
||||||
#include <KDebug>
|
|
||||||
#include <KLocale>
|
|
||||||
#include <KTitleWidget>
|
|
||||||
|
|
||||||
|
|
||||||
NewTagDialog::NewTagDialog( QWidget* parent )
|
|
||||||
: KDialog( parent )
|
|
||||||
{
|
|
||||||
setCaption( i18nc( "@title:window", "Create New Tag" ) );
|
|
||||||
setButtons( Ok|Cancel );
|
|
||||||
enableButtonOk( false );
|
|
||||||
|
|
||||||
setupUi( mainWidget() );
|
|
||||||
|
|
||||||
connect( m_editTagLabel, SIGNAL( textChanged(const QString&) ),
|
|
||||||
this, SLOT( slotLabelChanged(const QString&) ) );
|
|
||||||
|
|
||||||
// TODO: use KGlobal::config() if NewTagDialog will be moved to kdelibs (KDE 4.2?)
|
|
||||||
KConfigGroup group(KSharedConfig::openConfig("dolphinrc"), "NewTagDialog");
|
|
||||||
restoreDialogSize(group);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NewTagDialog::~NewTagDialog()
|
|
||||||
{
|
|
||||||
// TODO: use KGlobal::config() if NewTagDialog will be moved to kdelibs (KDE 4.2?)
|
|
||||||
KConfigGroup group(KSharedConfig::openConfig("dolphinrc"), "NewTagDialog");
|
|
||||||
saveDialogSize(group, KConfigBase::Persistent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QSize NewTagDialog::sizeHint() const
|
|
||||||
{
|
|
||||||
return QSize(400, 256);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NewTagDialog::slotLabelChanged( const QString& text )
|
|
||||||
{
|
|
||||||
enableButtonOk( !text.isEmpty() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Nepomuk::Tag NewTagDialog::createTag( QWidget* parent )
|
|
||||||
{
|
|
||||||
QPointer<NewTagDialog> dlg = new NewTagDialog( parent );
|
|
||||||
dlg->m_labelTitle->setText( i18nc( "@title:window", "Create New Tag" ) );
|
|
||||||
dlg->m_labelTitle->setComment( i18nc( "@title:window subtitle to previous message", "with optional icon and description" ) );
|
|
||||||
dlg->m_labelTitle->setPixmap( KIcon( "nepomuk" ).pixmap( 32, 32 ) );
|
|
||||||
|
|
||||||
dlg->m_editTagLabel->setFocus();
|
|
||||||
|
|
||||||
if ( dlg->exec() ) {
|
|
||||||
QString name = dlg->m_editTagLabel->text();
|
|
||||||
QString comment = dlg->m_editTagComment->text();
|
|
||||||
QString icon = dlg->m_buttonTagIcon->icon();
|
|
||||||
delete dlg;
|
|
||||||
|
|
||||||
Nepomuk::Tag newTag( name );
|
|
||||||
newTag.setLabel( name );
|
|
||||||
newTag.addIdentifier( name );
|
|
||||||
if ( !comment.isEmpty() ) {
|
|
||||||
newTag.setDescription( comment );
|
|
||||||
}
|
|
||||||
if ( !icon.isEmpty() ) {
|
|
||||||
newTag.addSymbol( icon );
|
|
||||||
}
|
|
||||||
return newTag;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
delete dlg;
|
|
||||||
return Nepomuk::Tag();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "newtagdialog.moc"
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2008 by Sebastian Trueg <trueg at kde.org>
|
|
||||||
|
|
||||||
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, 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NEW_TAG_DIALOG_H_
|
|
||||||
#define _NEW_TAG_DIALOG_H_
|
|
||||||
|
|
||||||
#include <KDialog>
|
|
||||||
#include "ui_newtagdialog.h"
|
|
||||||
|
|
||||||
namespace Nepomuk {
|
|
||||||
class Tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
class NewTagDialog : public KDialog, public Ui_NewTagDialog
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
~NewTagDialog();
|
|
||||||
|
|
||||||
virtual QSize sizeHint() const;
|
|
||||||
|
|
||||||
static Nepomuk::Tag createTag( QWidget* parent = 0 );
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void slotLabelChanged( const QString& text );
|
|
||||||
|
|
||||||
private:
|
|
||||||
NewTagDialog( QWidget* parent = 0 );
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,107 +0,0 @@
|
||||||
<ui version="4.0" >
|
|
||||||
<class>NewTagDialog</class>
|
|
||||||
<widget class="QWidget" name="NewTagDialog" >
|
|
||||||
<property name="geometry" >
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>390</width>
|
|
||||||
<height>149</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" >
|
|
||||||
<item>
|
|
||||||
<widget class="KTitleWidget" native="1" name="m_labelTitle" />
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" >
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" >
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<property name="orientation" >
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType" >
|
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" >
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>5</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_2" >
|
|
||||||
<property name="text" >
|
|
||||||
<string comment="@label Tag name">Name:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="KLineEdit" name="m_editTagLabel" />
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="KIconButton" name="m_buttonTagIcon" >
|
|
||||||
<property name="sizePolicy" >
|
|
||||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<property name="orientation" >
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType" >
|
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" >
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label" >
|
|
||||||
<property name="text" >
|
|
||||||
<string comment="@label">Detailed description (optional):</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="KLineEdit" name="m_editTagComment" />
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<customwidgets>
|
|
||||||
<customwidget>
|
|
||||||
<class>KIconButton</class>
|
|
||||||
<extends>QPushButton</extends>
|
|
||||||
<header>kicondialog.h</header>
|
|
||||||
</customwidget>
|
|
||||||
<customwidget>
|
|
||||||
<class>KLineEdit</class>
|
|
||||||
<extends>QLineEdit</extends>
|
|
||||||
<header>klineedit.h</header>
|
|
||||||
</customwidget>
|
|
||||||
<customwidget>
|
|
||||||
<class>KTitleWidget</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>ktitlewidget.h</header>
|
|
||||||
</customwidget>
|
|
||||||
</customwidgets>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
|
@ -1,206 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the Nepomuk KDE project.
|
|
||||||
Copyright (C) 2007 Sebastian Trueg <trueg@kde.org>
|
|
||||||
|
|
||||||
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 "resourcetaggingwidget.h"
|
|
||||||
#include "tagcloud.h"
|
|
||||||
#include "taggingpopup.h"
|
|
||||||
#include "nepomukmassupdatejob.h"
|
|
||||||
|
|
||||||
#include <QtGui/QVBoxLayout>
|
|
||||||
#include <QtGui/QContextMenuEvent>
|
|
||||||
#include <QtGui/QCursor>
|
|
||||||
#include <QtGui/QLabel>
|
|
||||||
#include <QtCore/QSet>
|
|
||||||
|
|
||||||
#include <KLocale>
|
|
||||||
|
|
||||||
namespace Nepomuk {
|
|
||||||
inline uint qHash( const Tag& res )
|
|
||||||
{
|
|
||||||
return qHash( res.resourceUri().toString() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Nepomuk::ResourceTaggingWidget::Private
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QList<Nepomuk::Resource> resources;
|
|
||||||
|
|
||||||
TagCloud* resourceTagCloud;
|
|
||||||
TaggingPopup* popup;
|
|
||||||
|
|
||||||
QList<Tag> resourceTags;
|
|
||||||
|
|
||||||
bool tagsChanged;
|
|
||||||
|
|
||||||
void showTaggingPopup( const QPoint& );
|
|
||||||
void updateResources();
|
|
||||||
void _k_slotShowTaggingPopup();
|
|
||||||
void _k_metadataUpdateDone();
|
|
||||||
static QList<Tag> intersectTags( const QList<Resource>& );
|
|
||||||
|
|
||||||
ResourceTaggingWidget* q;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::Private::showTaggingPopup( const QPoint& pos )
|
|
||||||
{
|
|
||||||
popup->showAllTags();
|
|
||||||
resourceTags = intersectTags( resources );
|
|
||||||
Q_FOREACH( const Tag &tag, resourceTags ) {
|
|
||||||
popup->setTagSelected( tag, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
tagsChanged = false;
|
|
||||||
popup->exec( pos );
|
|
||||||
|
|
||||||
if( tagsChanged ) {
|
|
||||||
updateResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
resourceTagCloud->showTags( resourceTags );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::Private::updateResources()
|
|
||||||
{
|
|
||||||
MassUpdateJob* job = MassUpdateJob::tagResources( resources, resourceTags );
|
|
||||||
connect( job, SIGNAL( result( KJob* ) ),
|
|
||||||
q, SLOT( _k_metadataUpdateDone() ) );
|
|
||||||
q->setEnabled( false ); // no updates during execution
|
|
||||||
job->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::Private::_k_slotShowTaggingPopup()
|
|
||||||
{
|
|
||||||
showTaggingPopup( QCursor::pos() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::Private::_k_metadataUpdateDone()
|
|
||||||
{
|
|
||||||
q->setEnabled( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QList<Nepomuk::Tag> Nepomuk::ResourceTaggingWidget::Private::intersectTags( const QList<Resource>& res )
|
|
||||||
{
|
|
||||||
if ( res.count() == 1 ) {
|
|
||||||
return res.first().tags();
|
|
||||||
}
|
|
||||||
else if ( !res.isEmpty() ) {
|
|
||||||
// determine the tags used for all resources
|
|
||||||
QSet<Tag> tags = QSet<Tag>::fromList( res.first().tags() );
|
|
||||||
QList<Resource>::const_iterator it = res.begin();
|
|
||||||
for ( ++it; it != res.end(); ++it ) {
|
|
||||||
tags.intersect( QSet<Tag>::fromList( (*it).tags() ) );
|
|
||||||
}
|
|
||||||
return tags.values();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return QList<Tag>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Nepomuk::ResourceTaggingWidget::ResourceTaggingWidget( QWidget* parent )
|
|
||||||
: QWidget( parent ),
|
|
||||||
d( new Private() )
|
|
||||||
{
|
|
||||||
d->q = this;
|
|
||||||
|
|
||||||
QVBoxLayout* layout = new QVBoxLayout( this );
|
|
||||||
layout->setMargin( 0 );
|
|
||||||
d->resourceTagCloud = new TagCloud( this );
|
|
||||||
layout->addWidget( d->resourceTagCloud );
|
|
||||||
QLabel* changeTagsLabel = new QLabel( "<p align=center><a style=\"font-size:small;\" href=\"dummy\">" + i18nc( "@label", "Change Tags..." ) + "</a>", this );
|
|
||||||
connect( changeTagsLabel, SIGNAL( linkActivated( const QString ) ),
|
|
||||||
this, SLOT( _k_slotShowTaggingPopup() ) );
|
|
||||||
layout->addWidget( changeTagsLabel );
|
|
||||||
|
|
||||||
// the popup tag cloud
|
|
||||||
d->popup = new TaggingPopup;
|
|
||||||
d->popup->setSelectionEnabled( true );
|
|
||||||
d->popup->setNewTagButtonEnabled( true );
|
|
||||||
|
|
||||||
connect( d->popup, SIGNAL( tagToggled( const Nepomuk::Tag&, bool ) ),
|
|
||||||
this, SLOT( slotTagToggled( const Nepomuk::Tag&, bool ) ) );
|
|
||||||
connect( d->popup, SIGNAL( tagAdded( const Nepomuk::Tag& ) ),
|
|
||||||
this, SLOT( slotTagAdded( const Nepomuk::Tag& ) ) );
|
|
||||||
|
|
||||||
connect( d->resourceTagCloud, SIGNAL( tagClicked( const Nepomuk::Tag& ) ),
|
|
||||||
this, SIGNAL( tagClicked( const Nepomuk::Tag& ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Nepomuk::ResourceTaggingWidget::~ResourceTaggingWidget()
|
|
||||||
{
|
|
||||||
delete d->popup;
|
|
||||||
delete d;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::setResource( const Nepomuk::Resource& res )
|
|
||||||
{
|
|
||||||
setResources( QList<Resource>() << res );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::setResources( const QList<Nepomuk::Resource>& resList )
|
|
||||||
{
|
|
||||||
d->resources = resList;
|
|
||||||
d->resourceTagCloud->showTags( d->intersectTags( resList ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::slotTagToggled( const Nepomuk::Tag& tag, bool enabled )
|
|
||||||
{
|
|
||||||
if ( enabled ) {
|
|
||||||
d->resourceTags.append( tag );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
d->resourceTags.removeAll( tag );
|
|
||||||
}
|
|
||||||
d->tagsChanged = true;
|
|
||||||
d->popup->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::slotTagAdded( const Nepomuk::Tag& tag )
|
|
||||||
{
|
|
||||||
// assign it right away
|
|
||||||
d->resourceTags.append( tag );
|
|
||||||
d->updateResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::contextMenuEvent( QContextMenuEvent* e )
|
|
||||||
{
|
|
||||||
d->showTaggingPopup( e->globalPos() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::ResourceTaggingWidget::showTagPopup( const QPoint& pos )
|
|
||||||
{
|
|
||||||
d->showTaggingPopup( pos );
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "resourcetaggingwidget.moc"
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the Nepomuk KDE project.
|
|
||||||
Copyright (C) 2007 Sebastian Trueg <trueg@kde.org>
|
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NEPOMUK_RESOURCE_TAGGING_WIDGET_H_
|
|
||||||
#define _NEPOMUK_RESOURCE_TAGGING_WIDGET_H_
|
|
||||||
|
|
||||||
#include <QtGui/QWidget>
|
|
||||||
|
|
||||||
#include <nepomuk/tag.h>
|
|
||||||
|
|
||||||
class QContextMenuEvent;
|
|
||||||
|
|
||||||
namespace Nepomuk {
|
|
||||||
class ResourceTaggingWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
ResourceTaggingWidget( QWidget* parent = 0 );
|
|
||||||
~ResourceTaggingWidget();
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void tagClicked( const Nepomuk::Tag& tag );
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void setResource( const Nepomuk::Resource& );
|
|
||||||
void setResources( const QList<Nepomuk::Resource>& );
|
|
||||||
void showTagPopup( const QPoint& pos );
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void slotTagToggled( const Nepomuk::Tag& tag, bool enabled );
|
|
||||||
void slotTagAdded( const Nepomuk::Tag& tag );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void contextMenuEvent( QContextMenuEvent* e );
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Private;
|
|
||||||
Private* const d;
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT( d, void _k_slotShowTaggingPopup() )
|
|
||||||
Q_PRIVATE_SLOT( d, void _k_metadataUpdateDone() )
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,142 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the Nepomuk KDE project.
|
|
||||||
Copyright (C) 2007 Sebastian Trueg <trueg@kde.org>
|
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NEPOMUK_TAG_CLOUD_H_
|
|
||||||
#define _NEPOMUK_TAG_CLOUD_H_
|
|
||||||
|
|
||||||
#include <QtGui/QFrame>
|
|
||||||
#include <QtCore/QList>
|
|
||||||
|
|
||||||
#include <nepomuk/tag.h>
|
|
||||||
|
|
||||||
#include <Soprano/Statement>
|
|
||||||
|
|
||||||
class QResizeEvent;
|
|
||||||
class QPaintEvent;
|
|
||||||
class QMouseEvent;
|
|
||||||
class QEvent;
|
|
||||||
|
|
||||||
namespace Nepomuk {
|
|
||||||
class TagCloud : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
TagCloud( QWidget* parent = 0 );
|
|
||||||
~TagCloud();
|
|
||||||
|
|
||||||
enum Sorting {
|
|
||||||
SortAlpabetically,
|
|
||||||
SortByWeight,
|
|
||||||
SortRandom
|
|
||||||
};
|
|
||||||
|
|
||||||
int heightForWidth( int w ) const;
|
|
||||||
QSize sizeHint() const;
|
|
||||||
QSize minimumSizeHint() const;
|
|
||||||
|
|
||||||
bool zoomEnabled() const;
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
/**
|
|
||||||
* Set the maximum used font size. The default is 0
|
|
||||||
* which means to calculate proper values from the KDE
|
|
||||||
* defaults.
|
|
||||||
*/
|
|
||||||
void setMaxFontSize( int size );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the minimum used font size. The default is 0
|
|
||||||
* which means to calculate proper values from the KDE
|
|
||||||
* defaults.
|
|
||||||
*/
|
|
||||||
void setMinFontSize( int size );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the maximum number of displayed tags. The default is 0
|
|
||||||
* which means to display all tags.
|
|
||||||
*
|
|
||||||
* NOT IMPLEMENTED YET
|
|
||||||
*/
|
|
||||||
void setMaxNumberDisplayedTags( int n );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allow selection of tags, i.e. enabling and disabling of tags.
|
|
||||||
*/
|
|
||||||
void setSelectionEnabled( bool enabled );
|
|
||||||
|
|
||||||
void setNewTagButtonEnabled( bool enabled );
|
|
||||||
void setContextMenuEnabled( bool enabled );
|
|
||||||
void setAlignment( Qt::Alignment alignment );
|
|
||||||
|
|
||||||
void setZoomEnabled( bool zoom );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default: SortAlpabetically
|
|
||||||
*/
|
|
||||||
void setSorting( Sorting );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Will reset tags set via showTags()
|
|
||||||
*/
|
|
||||||
void showAllTags();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the tags to be shown in the tag cloud.
|
|
||||||
* If the new tag button is enabled (setEnableNewTagButton())
|
|
||||||
* new tags will automatically be added to the list of shown tags.
|
|
||||||
*/
|
|
||||||
void showTags( const QList<Tag>& tags );
|
|
||||||
|
|
||||||
void showResourceTags( const Resource& resource );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Select or deselect a tag. This does only make sense
|
|
||||||
* if selection is enabled and \p tag is actually
|
|
||||||
* displayed.
|
|
||||||
*
|
|
||||||
* \sa setSelectionEnabled
|
|
||||||
*/
|
|
||||||
void setTagSelected( const Tag& tag, bool selected );
|
|
||||||
|
|
||||||
void setCustomNewTagAction( QAction* action );
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void tagClicked( const Nepomuk::Tag& tag );
|
|
||||||
void tagAdded( const Nepomuk::Tag& tag );
|
|
||||||
void tagToggled( const Nepomuk::Tag& tag, bool enabled );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void resizeEvent( QResizeEvent* e );
|
|
||||||
void paintEvent( QPaintEvent* e );
|
|
||||||
void mousePressEvent( QMouseEvent* );
|
|
||||||
void mouseMoveEvent( QMouseEvent* );
|
|
||||||
void leaveEvent( QEvent* );
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void slotStatementAdded( const Soprano::Statement& s );
|
|
||||||
void slotStatementRemoved( const Soprano::Statement& s );
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Private;
|
|
||||||
Private* const d;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,147 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the Nepomuk KDE project.
|
|
||||||
Copyright (C) 2007 Sebastian Trueg <trueg@kde.org>
|
|
||||||
|
|
||||||
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 "taggingpopup.h"
|
|
||||||
|
|
||||||
#include <QtCore/QEventLoop>
|
|
||||||
#include <QtCore/QPointer>
|
|
||||||
#include <QtGui/QApplication>
|
|
||||||
#include <QtGui/QDesktopWidget>
|
|
||||||
#include <QtGui/QMouseEvent>
|
|
||||||
|
|
||||||
#include <KDebug>
|
|
||||||
#include <KDialog>
|
|
||||||
|
|
||||||
|
|
||||||
class Nepomuk::TaggingPopup::Private
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Private( TaggingPopup* parent )
|
|
||||||
: eventLoop( 0 ),
|
|
||||||
m_parent( parent ) {
|
|
||||||
}
|
|
||||||
|
|
||||||
QEventLoop* eventLoop;
|
|
||||||
QPoint popupPos;
|
|
||||||
|
|
||||||
QRect geometryForPopupPos( const QPoint& p ) {
|
|
||||||
QSize size = m_parent->sizeHint();
|
|
||||||
|
|
||||||
// we want a little margin
|
|
||||||
const int margin = KDialog::marginHint();
|
|
||||||
size.setHeight( size.height() + margin*2 );
|
|
||||||
size.setWidth( size.width() + margin*2 );
|
|
||||||
|
|
||||||
QRect screen = QApplication::desktop()->screenGeometry( QApplication::desktop()->screenNumber( p ) );
|
|
||||||
|
|
||||||
// calculate popup position
|
|
||||||
QPoint pos( p.x() - size.width()/2, p.y() - size.height()/2 );
|
|
||||||
|
|
||||||
// ensure we do not leave the desktop
|
|
||||||
if ( pos.x() + size.width() > screen.right() ) {
|
|
||||||
pos.setX( screen.right() - size.width() );
|
|
||||||
}
|
|
||||||
else if ( pos.x() < screen.left() ) {
|
|
||||||
pos.setX( screen.left() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( pos.y() + size.height() > screen.bottom() ) {
|
|
||||||
pos.setY( screen.bottom() - size.height() );
|
|
||||||
}
|
|
||||||
else if ( pos.y() < screen.top() ) {
|
|
||||||
pos.setY( screen.top() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return QRect( pos, size );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
TaggingPopup* m_parent;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Nepomuk::TaggingPopup::TaggingPopup( QWidget* parent )
|
|
||||||
: TagCloud( parent ),
|
|
||||||
d( new Private( this ) )
|
|
||||||
{
|
|
||||||
setFrameStyle( QFrame::StyledPanel );
|
|
||||||
setWindowFlags( Qt::Popup );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Nepomuk::TaggingPopup::~TaggingPopup()
|
|
||||||
{
|
|
||||||
delete d;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::TaggingPopup::popup( const QPoint& p )
|
|
||||||
{
|
|
||||||
setGeometry( d->geometryForPopupPos( p ) );
|
|
||||||
d->popupPos = p;
|
|
||||||
|
|
||||||
show();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::TaggingPopup::exec( const QPoint& pos )
|
|
||||||
{
|
|
||||||
QEventLoop eventLoop;
|
|
||||||
d->eventLoop = &eventLoop;
|
|
||||||
popup( pos );
|
|
||||||
|
|
||||||
QPointer<QObject> guard = this;
|
|
||||||
(void) eventLoop.exec();
|
|
||||||
if ( !guard.isNull() )
|
|
||||||
d->eventLoop = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::TaggingPopup::mousePressEvent( QMouseEvent* e )
|
|
||||||
{
|
|
||||||
if ( !rect().contains( e->pos() ) ) {
|
|
||||||
hide();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
TagCloud::mousePressEvent( e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Nepomuk::TaggingPopup::hideEvent( QHideEvent* e )
|
|
||||||
{
|
|
||||||
Q_UNUSED( e );
|
|
||||||
if ( d->eventLoop ) {
|
|
||||||
d->eventLoop->exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Nepomuk::TaggingPopup::event( QEvent* e )
|
|
||||||
{
|
|
||||||
if ( e->type() == QEvent::LayoutRequest ) {
|
|
||||||
if ( isVisible() ) {
|
|
||||||
setGeometry( d->geometryForPopupPos( d->popupPos ) );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TagCloud::event( e );
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of the Nepomuk KDE project.
|
|
||||||
Copyright (C) 2007 Sebastian Trueg <trueg@kde.org>
|
|
||||||
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _NEPOMUK_TAGGING_POPUP_H_
|
|
||||||
#define _NEPOMUK_TAGGING_POPUP_H_
|
|
||||||
|
|
||||||
#include "tagcloud.h"
|
|
||||||
|
|
||||||
class QMouseEvent;
|
|
||||||
class QHideEvent;
|
|
||||||
|
|
||||||
namespace Nepomuk {
|
|
||||||
class TaggingPopup : public TagCloud
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TaggingPopup( QWidget* parent = 0 );
|
|
||||||
~TaggingPopup();
|
|
||||||
|
|
||||||
void popup( const QPoint& pos );
|
|
||||||
void exec( const QPoint& pos );
|
|
||||||
|
|
||||||
bool event( QEvent* e );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void mousePressEvent( QMouseEvent* e );
|
|
||||||
void hideEvent( QHideEvent* e );
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Private;
|
|
||||||
Private* const d;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
31
src/panels/information/taggingwidget.cpp
Normal file
31
src/panels/information/taggingwidget.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
||||||
|
* *
|
||||||
|
* 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 *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "taggingwidget_p.h"
|
||||||
|
|
||||||
|
TaggingWidget::TaggingWidget(QWidget* parent) :
|
||||||
|
QWidget(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TaggingWidget::~TaggingWidget()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "taggingwidget_p.moc"
|
34
src/panels/information/taggingwidget_p.h
Normal file
34
src/panels/information/taggingwidget_p.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
|
||||||
|
* *
|
||||||
|
* 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 *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TAGGING_WIDGET
|
||||||
|
#define TAGGING_WIDGET
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class TaggingWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
TaggingWidget(QWidget* parent);
|
||||||
|
virtual ~TaggingWidget();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -29,10 +29,6 @@
|
||||||
#include <kstandarddirs.h>
|
#include <kstandarddirs.h>
|
||||||
#include <kurl.h>
|
#include <kurl.h>
|
||||||
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
#include <nepomuk/resourcemanager.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <QDate>
|
#include <QDate>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
@ -46,14 +42,6 @@ ViewProperties::ViewProperties(const KUrl& url) :
|
||||||
m_autoSave(true),
|
m_autoSave(true),
|
||||||
m_node(0)
|
m_node(0)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
static bool checkedNepomukSupport = false;
|
|
||||||
if (!checkedNepomukSupport) {
|
|
||||||
m_nepomukSupport = !Nepomuk::ResourceManager::instance()->init();
|
|
||||||
checkedNepomukSupport = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
KUrl cleanUrl(url);
|
KUrl cleanUrl(url);
|
||||||
cleanUrl.cleanPath();
|
cleanUrl.cleanPath();
|
||||||
m_filepath = cleanUrl.toLocalFile();
|
m_filepath = cleanUrl.toLocalFile();
|
||||||
|
|
Loading…
Reference in a new issue