* Starts to add Nepomuk supports to dolphin (currently, only annotations are supported)

* Little changes in InfoSidebarPage (no more multiple label for infos & Q3Layout>QLayout)
* Support infos for multiple files (only total size, what else ?)

svn path=/trunk/KDE/kdebase/apps/; revision=636272
This commit is contained in:
Oscar Blumberg 2007-02-22 16:45:53 +00:00
parent bf50ced734
commit cefcbf0ef0
8 changed files with 280 additions and 79 deletions

View file

@ -33,6 +33,7 @@ set(dolphin_SRCS
iconsviewsettingspage.cpp
infosidebarpage.cpp
main.cpp
metadataloader.cpp
protocolcombo.cpp
pixmapviewer.cpp
renamedialog.cpp
@ -64,7 +65,7 @@ qt4_add_dbus_adaptor(dolphin_SRCS
dolphinmainwindow.h DolphinMainWindow)
kde4_add_executable(dolphin ${dolphin_SRCS})
target_link_libraries(dolphin ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} konq )
target_link_libraries(dolphin ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} konq kmetadata)
install(TARGETS dolphin DESTINATION ${BIN_INSTALL_DIR})

View file

@ -20,6 +20,7 @@
#include "dolphinapplication.h"
#include "dolphinmainwindow.h"
#include "metadataloader.h"
#include <applicationadaptor.h>
#include <kurl.h>
@ -55,6 +56,12 @@ DolphinMainWindow* DolphinApplication::createMainWindow()
return mainWindow;
}
MetadataLoader* DolphinApplication::metadataLoader()
{
static MetadataLoader loader;
return &loader;
}
int DolphinApplication::openWindow(const QString& url)
{
DolphinMainWindow* win = createMainWindow();
@ -62,6 +69,7 @@ int DolphinApplication::openWindow(const QString& url)
win->activeView()->setUrl(KUrl(url));
}
win->show();
//TODO find how to raise a window (as if we've launched a new dolphin process)
return win->getId();
}

View file

@ -25,6 +25,7 @@
#include <kuniqueapplication.h>
class DolphinMainWindow;
class MetadataLoader;
/**
* @brief Holds the application data which can be accessed.
@ -51,6 +52,11 @@ public:
DolphinMainWindow* createMainWindow();
void refreshMainWindows();
/**
* Returns the metadata loader.
*/
MetadataLoader* metadataLoader();
public slots:
int openWindow(const QString& url);

View file

@ -36,6 +36,7 @@
#include "dolphin_generalsettings.h"
#include "viewpropertiesdialog.h"
#include "viewproperties.h"
#include "metadataloader.h"
#include "mainwindowadaptor.h"
#include <kaction.h>
@ -952,6 +953,9 @@ void DolphinMainWindow::init()
// assure a proper default size if Dolphin runs the first time
resize(640, 480);
}
if (!DolphinApplication::app()->metadataLoader()->storageUp())
activeView()->statusBar()->setMessage(i18n("Failed to contact Nepomuk service, annotation and tagging are disabled."), DolphinStatusBar::Error);
}
void DolphinMainWindow::loadSettings()

View file

@ -36,6 +36,7 @@
#include <Q3ValueList>
#include <QEvent>
#include <Q3VBoxLayout>
#include <QInputDialog>
#include <kbookmarkmanager.h>
#include <klocale.h>
@ -48,8 +49,10 @@
#include <kvbox.h>
#include "dolphinmainwindow.h"
#include "dolphinapplication.h"
#include "pixmapviewer.h"
#include "dolphinsettings.h"
#include "metadataloader.h"
InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent) :
SidebarPage(mainWindow, parent),
@ -58,9 +61,8 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent)
m_timer(0),
m_preview(0),
m_name(0),
m_currInfoLineIdx(0),
m_infoGrid(0),
m_actionBox(0)
m_infos(0),
m_metadata(DolphinApplication::app()->metadataLoader())
{
const int spacing = KDialog::spacingHint();
@ -68,7 +70,7 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent)
connect(m_timer, SIGNAL(timeout()),
this, SLOT(slotTimeout()));
Q3VBoxLayout* layout = new Q3VBoxLayout(this);
QVBoxLayout* layout = new QVBoxLayout;
layout->setSpacing(spacing);
// preview
@ -88,12 +90,27 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent)
sep1->setFixedHeight(1);
// general information
m_infoGrid = new Q3Grid(2, this);
m_infoGrid->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
m_infos = new QLabel(this);
m_infos->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
m_infos->setTextFormat(Qt::RichText);
// annotation
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()));
}
QWidget* sep2 = new Q3HGroupBox(this); // TODO: check whether default widget exist for this?
sep2->setFixedHeight(1);
QWidget* sep3 = new Q3HGroupBox(this); // TODO: check whether default widget exist for this?
sep3->setFixedHeight(1);
// actions
m_actionBox = new KVBox(this);
m_actionBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
@ -106,11 +123,16 @@ InfoSidebarPage::InfoSidebarPage(DolphinMainWindow* mainWindow, QWidget* parent)
layout->addWidget(m_preview);
layout->addWidget(m_name);
layout->addWidget(sep1);
layout->addWidget(m_infoGrid);
layout->addWidget(m_infos);
layout->addWidget(sep2);
if (m_metadata->storageUp()) {
layout->addWidget(m_annotationLabel);
layout->addWidget(m_annotationButton);
layout->addWidget(sep3);
}
layout->addWidget(m_actionBox);
layout->addWidget(dummy);
setLayout(layout);
connect(mainWindow, SIGNAL(selectionChanged()),
this, SLOT(showItemInfo()));
@ -281,10 +303,6 @@ void InfoSidebarPage::cancelRequest()
void InfoSidebarPage::createMetaInfo()
{
// To prevent a flickering it's important to reuse available
// labels instead of deleting them and recreate them afterwards.
// The methods beginInfoLines(), addInfoLine() and endInfoLines()
// take care of this.
beginInfoLines();
DolphinView* view = mainWindow()->activeView();
if (!view->hasSelection()) {
@ -294,56 +312,47 @@ void InfoSidebarPage::createMetaInfo()
if (fileItem.isDir()) {
addInfoLine(i18n("Type:"), i18n("Directory"));
}
else {
addInfoLine(i18n("Type:"), fileItem.mimeComment());
showAnnotation(m_shownUrl);
}
else if (view->selectedItems().count() == 1) {
KFileItem* fileItem = view->selectedItems()[0];
addInfoLine(i18n("Type:"), fileItem->mimeComment());
QString sizeText(KIO::convertSize(fileItem.size()));
addInfoLine(i18n("Size:"), sizeText);
addInfoLine(i18n("Modified:"), fileItem.timeString());
QString sizeText(KIO::convertSize(fileItem->size()));
addInfoLine(i18n("Size:"), sizeText);
addInfoLine(i18n("Modified:"), fileItem->timeString());
const KFileMetaInfo& metaInfo = fileItem.metaInfo();
if (metaInfo.isValid()) {
QStringList keys = metaInfo.supportedKeys();
for (QStringList::Iterator it = keys.begin(); it != keys.end(); ++it) {
if (showMetaInfo(*it)) {
KFileMetaInfoItem metaInfoItem = metaInfo.item(*it);
addInfoLine(*it, metaInfoItem.string());
}
const KFileMetaInfo& metaInfo = fileItem->metaInfo();
if (metaInfo.isValid()) {
QStringList keys = metaInfo.supportedKeys();
for (QStringList::Iterator it = keys.begin(); it != keys.end(); ++it) {
if (showMetaInfo(*it)) {
KFileMetaInfoItem metaInfoItem = metaInfo.item(*it);
addInfoLine(*it, metaInfoItem.string());
}
}
}
showAnnotation(fileItem->url());
}
else {
showAnnotations(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
}
addInfoLine(i18n("Total size:"), KIO::convertSize(totSize));
}
endInfoLines();
}
void InfoSidebarPage::beginInfoLines()
{
m_currInfoLineIdx = 0;
m_infoLines = QString("");
}
void InfoSidebarPage::endInfoLines()
{
if (m_currInfoLineIdx <= 0) {
return;
}
// remove labels which have not been used
if (m_currInfoLineIdx < static_cast<int>(m_infoWidgets.count())) {
Q3PtrListIterator<QLabel> deleteIter(m_infoWidgets);
deleteIter += m_currInfoLineIdx;
QWidget* widget = 0;
int removeCount = 0;
while ((widget = deleteIter.current()) != 0) {
widget->close();
widget->deleteLater();
++deleteIter;
++removeCount;
}
for (int i = 0; i < removeCount; ++i) {
m_infoWidgets.removeLast();
}
}
m_infos->setText(m_infoLines);
}
bool InfoSidebarPage::showMetaInfo(const QString& key) const
@ -386,34 +395,9 @@ bool InfoSidebarPage::showMetaInfo(const QString& key) const
void InfoSidebarPage::addInfoLine(const QString& labelText, const QString& infoText)
{
QString labelStr("<b>");
labelStr.append(labelText);
labelStr.append("</b>&nbsp;");
const int count = m_infoWidgets.count();
if (m_currInfoLineIdx < count - 1) {
// reuse available labels
m_infoWidgets.at(m_currInfoLineIdx++)->setText(labelStr);
m_infoWidgets.at(m_currInfoLineIdx++)->setText(infoText);
}
else {
// no labels are available anymore, hence create 2 new ones
QLabel* label = new QLabel(labelStr, m_infoGrid);
label->setTextFormat(Qt::RichText);
label->setAlignment(Qt::AlignRight |
Qt::AlignTop);
label->show();
m_infoWidgets.append(label);
QLabel* info = new QLabel(infoText, m_infoGrid);
info->setTextFormat(Qt::RichText);
info->setAlignment(Qt::AlignTop);
info->setWordWrap(true);
info->show();
m_infoWidgets.append(info);
m_currInfoLineIdx += 2;
}
if (!m_infoLines.isEmpty())
m_infoLines += "<br/>";
m_infoLines += QString("<b>%1</b> %2").arg(labelText).arg(infoText);
}
void InfoSidebarPage::insertActions()
@ -535,6 +519,72 @@ void InfoSidebarPage::insertActions()
}
}
void InfoSidebarPage::showAnnotation(const KUrl& file)
{
if(m_metadata->storageUp()) {
QString text = m_metadata->getAnnotation(file);
if (!text.isEmpty()) {
m_annotationLabel->show();
m_annotationLabel->setText(QString("<b>%1</b> :<br/>%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)
{
static unsigned int maxShownAnnot = 3;
if (m_metadata->storageUp()) {
bool hasAnnotation = false;
unsigned int annotateNum = 0;
QString firsts("<b>%1 :</b><br/>");
firsts.arg(i18n("Annotations"));
foreach (KUrl file, files) {
QString annotation = m_metadata->getAnnotation(file);
if (!annotation.isEmpty()) {
hasAnnotation = true;
if(annotateNum < maxShownAnnot) {
firsts += m_annotationLabel->fontMetrics().elidedText(QString("<b>%1</b> : %2<br/>").arg(file.fileName()).arg(annotation), Qt::ElideRight, width());
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->getAnnotation(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,
QWidget* parent,

View file

@ -48,6 +48,7 @@ class QLabel;
class KVBox;
class Q3Grid;
class PixmapViewer;
class MetadataLoader;
/**
* @brief Prototype for a information sidebar.
@ -113,6 +114,12 @@ 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
@ -149,6 +156,16 @@ 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;
@ -158,13 +175,16 @@ private:
PixmapViewer* m_preview;
QLabel* m_name;
int m_currInfoLineIdx;
Q3Grid* m_infoGrid;
Q3PtrList<QLabel> m_infoWidgets; // TODO: use children() from QObject instead
QString m_infoLines;
QLabel* m_infos;
KVBox* m_actionBox;
Q3PtrList<QWidget> m_actionWidgets; // TODO: use children() from QObject instead
Q3ValueVector<KDEDesktopMimeType::Service> m_actionsVector;
QLabel* m_annotationLabel;
QPushButton* m_annotationButton;//Move to sthing sexy visually
MetadataLoader* m_metadata;
};
// TODO #1: move to SidebarPage?

58
src/metadataloader.cpp Normal file
View file

@ -0,0 +1,58 @@
/***************************************************************************
* 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 "metadataloader.h"
#include <kmetadata/kmetadata.h>
#include <kurl.h>
#include <QString>
MetadataLoader::MetadataLoader()
{
if (Nepomuk::KMetaData::ResourceManager::instance()->init()) {
m_up = false;
Nepomuk::KMetaData::ResourceManager::instance()->setAutoSync(false);
} else {
m_up = true;
}
}
MetadataLoader::~MetadataLoader()
{
}
bool MetadataLoader::storageUp() {
return m_up;
}
QString MetadataLoader::getAnnotation(const KUrl& file)
{
if(m_up)
return Nepomuk::KMetaData::File(file.url()).getAnnotation();
else
return QString();
}
void MetadataLoader::setAnnotation(const KUrl& file, const QString& annotation)
{
if(m_up)
Nepomuk::KMetaData::File(file.url()).setAnnotation(annotation);
}

54
src/metadataloader.h Normal file
View file

@ -0,0 +1,54 @@
/***************************************************************************
* 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 *
***************************************************************************/
#ifndef METADATALOADER_H
#define METADATALOADER_H
namespace Nempomuk {
namespace Backbone {
class Registry;
}
}
class KUrl;
class QString;
/**
* @brief Load metadata for specific files.
* This class uses the KMetaData API to load metadata from the NEPOMUK storage.
*
* @author Oscar Blumberg <o.blumberg@robertlan.eu.org>
*/
class MetadataLoader
{
friend class DolphinApplication;
public:
~MetadataLoader();
bool storageUp();
QString getAnnotation(const KUrl& file);
void setAnnotation(const KUrl& file, const QString& annotation);
private:
MetadataLoader();
bool m_up;
};
#endif