From 4af3a2dcb43d053865af282c2492cc60c4b438d2 Mon Sep 17 00:00:00 2001 From: Sebastian Trueg Date: Tue, 20 Mar 2007 09:01:22 +0000 Subject: [PATCH] Improved KMetaData integration. The Dolphin info sidebar now uses KMetaData to allow file rating, commenting, and tagging. This commit is indended to show what can be done with KMetaData in an easy way. The GUI is not perfect yet. svn path=/trunk/KDE/kdebase/apps/; revision=644510 --- src/CMakeLists.txt | 11 +- src/dolphinapplication.cpp | 7 - src/dolphinapplication.h | 6 - src/dolphinmainwindow.cpp | 4 +- src/infosidebarpage.cpp | 105 +++---------- src/infosidebarpage.h | 22 +-- src/metadataloader.cpp | 73 --------- src/metadatawidget.cpp | 165 +++++++++++++++++++++ src/{metadataloader.h => metadatawidget.h} | 63 +++++--- 9 files changed, 232 insertions(+), 224 deletions(-) delete mode 100644 src/metadataloader.cpp create mode 100644 src/metadatawidget.cpp rename src/{metadataloader.h => metadatawidget.h} (55%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b3edb92c26..3c437e1394 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,7 +33,7 @@ set(dolphin_SRCS iconsviewsettingspage.cpp infosidebarpage.cpp main.cpp - metadataloader.cpp + metadatawidget.cpp protocolcombo.cpp pixmapviewer.cpp renamedialog.cpp @@ -68,13 +68,14 @@ qt4_add_dbus_adaptor(dolphin_SRCS kde4_add_executable(dolphin ${dolphin_SRCS}) # find Nepomuk's libkmetadata find_path(KMETADATA_INCLUDE_DIR NAMES kmetadata/kmetadata.h PATHS ${KDE4_INCLUDE_DIR}) -find_library(KMETADATA_LIBRARY NAMES kmetadata PATHS ${KDE4_LIB_DIR}) -if(KMETADATA_INCLUDE_DIR AND KMETADATA_LIBRARY) -set(KDE4_KMETADATA kmetadata) +find_library(KMETADATA_LIBRARY NAMES kmetadata kmetadatatools PATHS ${KDE4_LIB_DIR}) +find_library(KMETADATA_TOOLS_LIBRARY NAMES kmetadatatools PATHS ${KDE4_LIB_DIR}) +if(KMETADATA_INCLUDE_DIR AND KMETADATA_LIBRARY AND KMETADATA_TOOLS_LIBRARY) +set(KDE4_KMETADATA kmetadata kmetadatatools) set(HAVE_KMETADATA 1) else(KMETADATA_INCLUDE_DIR AND KMETADATA_LIBRARY) set(KDE4_KMETADATA "") -endif(KMETADATA_INCLUDE_DIR AND KMETADATA_LIBRARY) +endif(KMETADATA_INCLUDE_DIR AND KMETADATA_LIBRARY AND KMETADATA_TOOLS_LIBRARY) configure_file(config-kmetadata.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kmetadata.h ) target_link_libraries(dolphin ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} ${KDE4_KMETADATA} konq) diff --git a/src/dolphinapplication.cpp b/src/dolphinapplication.cpp index b426ec1b82..59e870adb4 100644 --- a/src/dolphinapplication.cpp +++ b/src/dolphinapplication.cpp @@ -20,7 +20,6 @@ #include "dolphinapplication.h" #include "dolphinmainwindow.h" -#include "metadataloader.h" #include #include @@ -56,12 +55,6 @@ DolphinMainWindow* DolphinApplication::createMainWindow() return mainWindow; } -MetadataLoader* DolphinApplication::metadataLoader() -{ - static MetadataLoader loader; - return &loader; -} - int DolphinApplication::openWindow(const QString& url) { DolphinMainWindow* win = createMainWindow(); diff --git a/src/dolphinapplication.h b/src/dolphinapplication.h index ad95f23920..fa6a1ceeef 100644 --- a/src/dolphinapplication.h +++ b/src/dolphinapplication.h @@ -25,7 +25,6 @@ #include class DolphinMainWindow; -class MetadataLoader; /** * @brief Holds the application data which can be accessed. @@ -52,11 +51,6 @@ public: DolphinMainWindow* createMainWindow(); void refreshMainWindows(); - /** - * Returns the metadata loader. - */ - MetadataLoader* metadataLoader(); - public slots: int openWindow(const QString& url); diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index f305468c84..a2bb16b8ab 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -29,7 +29,7 @@ #include "dolphinsettingsdialog.h" #include "dolphinstatusbar.h" #include "infosidebarpage.h" -#include "metadataloader.h" +#include "metadatawidget.h" #include "mainwindowadaptor.h" #include "treeviewsidebarpage.h" #include "urlnavigator.h" @@ -1058,7 +1058,7 @@ void DolphinMainWindow::init() resize(640, 480); } #ifdef HAVE_KMETADATA - if (!DolphinApplication::app()->metadataLoader()->storageUp()) + if ( !MetaDataWidget::metaDataAvailable() ) activeView()->statusBar()->setMessage(i18n("Failed to contact Nepomuk service, annotation and tagging are disabled."), DolphinStatusBar::Error); #endif } diff --git a/src/infosidebarpage.cpp b/src/infosidebarpage.cpp index 61a7b06438..e00c6b8f7d 100644 --- a/src/infosidebarpage.cpp +++ b/src/infosidebarpage.cpp @@ -17,6 +17,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ +#include + #include "infosidebarpage.h" #include @@ -42,13 +44,14 @@ #include #include #include +#include #include #include "dolphinmainwindow.h" #include "dolphinapplication.h" #include "pixmapviewer.h" #include "dolphinsettings.h" -#include "metadataloader.h" +#include "metadatawidget.h" InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent) : SidebarPage(mainWindow, parent), @@ -57,8 +60,7 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent) m_timer(0), m_preview(0), m_name(0), - m_infos(0), - m_metadata(DolphinApplication::app()->metadataLoader()) + m_infos(0) { const int spacing = KDialog::spacingHint(); @@ -91,18 +93,10 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent) KSeparator* sep2 = new KSeparator(this); - // annotation - KSeparator* sep3 = 0; - if (m_metadata->storageUp()) { - m_annotationLabel = new QLabel(this); - m_annotationLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - m_annotationLabel->setTextFormat(Qt::RichText); - m_annotationLabel->setWordWrap(true); - m_annotationButton = new QPushButton("", this); - m_annotationButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - connect(m_annotationButton, SIGNAL(released()), this, SLOT(changeAnnotation())); - sep3 = new KSeparator(this); - } + if ( MetaDataWidget::metaDataAvailable() ) + m_metadataWidget = new MetaDataWidget( this ); + else + m_metadataWidget = 0; // actions m_actionBox = new KVBox(this); @@ -118,10 +112,9 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent) layout->addWidget(sep1); layout->addWidget(m_infos); layout->addWidget(sep2); - if (m_metadata->storageUp()) { - layout->addWidget(m_annotationLabel); - layout->addWidget(m_annotationButton); - layout->addWidget(sep3); + if ( m_metadataWidget ) { + layout->addWidget( m_metadataWidget ); + layout->addWidget( new KSeparator( this ) ); } layout->addWidget(m_actionBox); layout->addWidget(dummy); @@ -309,7 +302,8 @@ void InfoSidebarPage::createMetaInfo() if (fileItem.isDir()) { addInfoLine(i18n("Type:"), i18n("Directory")); } - showAnnotation(m_shownUrl); + if ( MetaDataWidget::metaDataAvailable() ) + m_metadataWidget->setFile( fileItem.url() ); } else if (view->selectedItems().count() == 1) { KFileItem* fileItem = view->selectedItems()[0]; @@ -329,10 +323,11 @@ void InfoSidebarPage::createMetaInfo() } } } - showAnnotation(fileItem->url()); + if ( MetaDataWidget::metaDataAvailable() ) + m_metadataWidget->setFile( fileItem->url() ); } else { - showAnnotations(view->selectedItems().urlList()); + m_metadataWidget->setFiles( view->selectedItems().urlList() ); unsigned long int totSize = 0; foreach(KFileItem* item, view->selectedItems()) { totSize += item->size(); //FIXME what to do with directories ? (same with the one-item-selected-code), item->size() does not return the size of the content : not very instinctive for users @@ -516,73 +511,7 @@ void InfoSidebarPage::insertActions() } } -void InfoSidebarPage::showAnnotation(const KUrl& file) -{ - if(m_metadata->storageUp()) { - QString text = m_metadata->annotation(file); - if (!text.isEmpty()) { - m_annotationLabel->show(); - m_annotationLabel->setText(QString("%1 :
%2").arg(i18n("Annotation")).arg(text)); - m_annotationButton->setText(i18n("Change annotation")); - } else { - m_annotationLabel->hide(); - m_annotationButton->setText(i18n("Annotate file")); - } - } -} -void InfoSidebarPage::showAnnotations(const KUrl::List& files) -{ - if (m_metadata->storageUp()) { - bool hasAnnotation = false; - unsigned int annotateNum = 0; - QString firsts = QString("%1 :
").arg(i18n("Annotations")); - foreach (KUrl file, files) { - QString annotation = m_metadata->annotation(file); - if (!annotation.isEmpty()) { - hasAnnotation = true; - if (annotateNum < 3) { - // don't show more than 3 annotations - firsts += m_annotationLabel->fontMetrics().elidedText(QString("%1 : %2
").arg(file.fileName()).arg(annotation), Qt::ElideRight, width());//FIXME not really the good method, does not handle resizing ... - annotateNum++; - } - } - } - if (hasAnnotation) { - m_annotationLabel->show(); - m_annotationLabel->setText(firsts); - } - else { - m_annotationLabel->hide(); - } - m_annotationButton->setText(hasAnnotation ? i18n("Change annotations") : i18n("Annotate files")); - } -} - -void InfoSidebarPage::changeAnnotation() -{ - bool ok = false; - KUrl::List files(mainWindow()->activeView()->selectedItems().urlList()); - QString name, old; - if (files.isEmpty()) { - files << m_shownUrl; - } - else if (files.count() == 1) { - name = files[0].url(); - old = m_metadata->annotation(files[0]); - } - else { - name = QString("%1 files").arg(files.count()); - old = QString(); - } - QString text = QInputDialog::getText(this, "Annotate", QString("Set annotation for %1").arg(name), QLineEdit::Normal, old, &ok);//FIXME temporary, must move to a real dialog - if(ok) { - foreach(KUrl file, files) { - m_metadata->setAnnotation(file, text); - } - showAnnotation(files[0]); - } -} ServiceButton::ServiceButton(const QIcon& icon, const QString& text, diff --git a/src/infosidebarpage.h b/src/infosidebarpage.h index ffc73bec45..6664f56fce 100644 --- a/src/infosidebarpage.h +++ b/src/infosidebarpage.h @@ -48,7 +48,7 @@ class QLabel; class KVBox; class Q3Grid; class PixmapViewer; -class MetadataLoader; +class MetaDataWidget; /** * @brief Prototype for a information sidebar. @@ -114,12 +114,6 @@ private slots: */ void startService(int index); - /** - * Opens a dialog to change the annotation of the currently selected - * file(s). - */ - void changeAnnotation(); - private: /** * Connects to signals from the currently active Dolphin view to get @@ -157,16 +151,6 @@ private: */ void insertActions(); - /** - * Show the annotation of a file in the sidebar. - */ - void showAnnotation(const KUrl& file); - - /** - * Show the annotations of multiple files in the sidebar. - */ - void showAnnotations(const KUrl::List& files); - bool m_multipleSelection; bool m_pendingPreview; QTimer* m_timer; @@ -183,9 +167,7 @@ private: Q3PtrList m_actionWidgets; // TODO: use children() from QObject instead Q3ValueVector m_actionsVector; - QLabel* m_annotationLabel; - QPushButton* m_annotationButton;//Move to sthing sexy visually - MetadataLoader* m_metadata; + MetaDataWidget* m_metadataWidget; }; // TODO #1: move to SidebarPage? diff --git a/src/metadataloader.cpp b/src/metadataloader.cpp deleted file mode 100644 index 2914720a8c..0000000000 --- a/src/metadataloader.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2006 by Oscar Blumberg * - * o.blumberg@robertlan.eu.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 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 - -#include "metadataloader.h" - -#ifdef HAVE_KMETADATA -#include -#endif - -#include -#include - -MetadataLoader::MetadataLoader() -{ -#ifdef HAVE_KMETADATA - if (Nepomuk::KMetaData::ResourceManager::instance()->init()) { - m_up = false; - Nepomuk::KMetaData::ResourceManager::instance()->setAutoSync(false); - } - else { - m_up = true; - } -#else - m_up = false; -#endif -} - -MetadataLoader::~MetadataLoader() -{ -} - -bool MetadataLoader::storageUp() { - return m_up; -} - -QString MetadataLoader::annotation(const KUrl& file) -{ -#ifdef HAVE_KMETADATA - if(m_up) - return Nepomuk::KMetaData::File(file.url()).getComment(); - else -#endif - return QString(); -} - -void MetadataLoader::setAnnotation(const KUrl& file, const QString& annotation) -{ -#ifdef HAVE_KMETADATA - if (m_up) { - Nepomuk::KMetaData::File(file.url()).setComment(annotation); - } -#endif -} - diff --git a/src/metadatawidget.cpp b/src/metadatawidget.cpp new file mode 100644 index 0000000000..a057d0bbaf --- /dev/null +++ b/src/metadatawidget.cpp @@ -0,0 +1,165 @@ +/*************************************************************************** + * Copyright (C) 2007 by Sebastian Trueg * + * * + * 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 + +#include "metadatawidget.h" + +#include + +#include +#include +#include + +#ifdef HAVE_KMETADATA +#include +#include +#include +#include +#include +#endif + + +bool MetaDataWidget::metaDataAvailable() +{ +#ifdef HAVE_KMETADATA + return !Nepomuk::KMetaData::ResourceManager::instance()->init(); +#else + return false; +#endif +} + + +class MetaDataWidget::Private +{ +public: + void loadComment( const QString& comment ) { + editComment->blockSignals( true ); + if ( comment.isEmpty() ) { + editComment->setFontItalic( true ); + editComment->setText( i18n( "Click to add comment..." ) ); + } + else { + editComment->setFontItalic( false ); + editComment->setText( comment ); + } + editComment->blockSignals( false ); + } + + KUrl fileUrl; + +#ifdef HAVE_KMETADATA + Nepomuk::KMetaData::File file; + + QTextEdit* editComment; + KRatingWidget* ratingWidget; + Nepomuk::KMetaData::TagWidget* tagWidget; +#endif +}; + + +MetaDataWidget::MetaDataWidget( QWidget* parent ) + : QWidget( parent ) +{ + d = new Private; + +#ifdef HAVE_KMETADATA + d->editComment = new QTextEdit( this ); + d->tagWidget = new Nepomuk::KMetaData::TagWidget( this ); + d->ratingWidget = new KRatingWidget( this ); + connect( d->ratingWidget, SIGNAL(ratingChanged(int)), this, SLOT(slotRatingChanged(int)) ); + connect( d->editComment, SIGNAL( textChanged() ), this, SLOT( slotCommentChanged() ) ); + + QVBoxLayout* lay = new QVBoxLayout( this ); + lay->setMargin( 0 ); + QHBoxLayout* hbox = new QHBoxLayout; + hbox->addWidget( new QLabel( i18n( "Rating:" ), this ) ); + hbox->addStretch( 1 ); + hbox->addWidget( d->ratingWidget ); + lay->addLayout( hbox ); + lay->addWidget( d->editComment ); + hbox = new QHBoxLayout; + hbox->addWidget( new QLabel( i18n( "Tags:" ), this ) ); + hbox->addWidget( d->tagWidget, 1 ); + lay->addLayout( hbox ); + + d->editComment->installEventFilter( this ); + d->editComment->viewport()->installEventFilter( this ); +#endif +} + + +MetaDataWidget::~MetaDataWidget() +{ + delete d; +} + + +void MetaDataWidget::setFile( const KUrl& url ) +{ +#ifdef HAVE_KMETADATA + d->fileUrl = url; + d->file = Nepomuk::KMetaData::File( url.url() ); + d->file.setLocation( url.url() ); + d->ratingWidget->setRating( d->file.getRating() ); + d->tagWidget->setTaggedResource( d->file ); + d->loadComment( d->file.getComment() ); +#endif +} + + +void MetaDataWidget::setFiles( const KUrl::List urls ) +{ + // FIXME: support multiple files + setFile( urls.first() ); +} + + +void MetaDataWidget::slotCommentChanged() +{ + d->file.setComment( d->editComment->toPlainText() ); +} + + +void MetaDataWidget::slotRatingChanged( int r ) +{ + d->file.setRating( r ); +} + + +bool MetaDataWidget::eventFilter( QObject* obj, QEvent* event ) +{ + if ( obj == d->editComment->viewport() + || obj == d->editComment ) { + if ( event->type() == QEvent::FocusOut ) { + // make sure the info text is displayed again + d->loadComment( d->editComment->toPlainText() ); + } + else if ( event->type() == QEvent::FocusIn ) { + qDebug() << "JKGHLKGLKHÖLKJHLÖ" << endl; + d->editComment->setFontItalic( false ); + if ( d->file.getComment().isEmpty() ) + d->editComment->setText( QString() ); + } + } + + return QWidget::eventFilter( obj, event ); +} + +#include "metadatawidget.moc" diff --git a/src/metadataloader.h b/src/metadatawidget.h similarity index 55% rename from src/metadataloader.h rename to src/metadatawidget.h index 5bc2686ce8..0b544e23d4 100644 --- a/src/metadataloader.h +++ b/src/metadatawidget.h @@ -1,6 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Oscar Blumberg * - * o.blumberg@robertlan.eu.org * + * Copyright (C) 2007 by Sebastian Trueg * * * * 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 * @@ -15,35 +14,53 @@ * 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 * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#ifndef METADATALOADER_H -#define METADATALOADER_H +#ifndef METADATA_WIDGET_H +#define METADATA_WIDGET_H -class KUrl; -class QString; +#include -/** - * @brief Load metadata for specific files. - * This class uses the KMetaData API to load metadata from the NEPOMUK storage. - * - * @author Oscar Blumberg - */ -class MetadataLoader +#include + + +class MetaDataWidget : public QWidget { -friend class DolphinApplication; -public: - ~MetadataLoader(); - bool storageUp(); + Q_OBJECT - QString annotation(const KUrl& file); - void setAnnotation(const KUrl& file, const QString& annotation); +public: + MetaDataWidget( QWidget* parent = 0 ); + ~MetaDataWidget(); + + /** + * \return true if the KMetaData system could be found and initialized. + * false if KMetaData was not available at compile time or if it has not + * been initialized properly. + */ + static bool metaDataAvailable(); + +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(); + void slotRatingChanged( int r ); + +protected: + bool eventFilter( QObject* obj, QEvent* event ); private: - MetadataLoader(); - bool m_up; + class Private; + Private* d; }; - #endif