┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/tagcloud
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-01-14 19:26:23 +0000
committerPeter Penz <[email protected]>2009-01-14 19:26:23 +0000
commit307285e9635a4bf584d6e5d7478876b90ef870f0 (patch)
treedb36cbbdc7996ab86c38be8f96fe83597d350dfb /src/tagcloud
parent86d9c40ab71df5b8bd5063251337d5ca0c22380a (diff)
Group classes into folders, Dolphin is too big in the meantime for having a flat directory hierarchy. dolphin/src/CMakeLists.txt will be cleaned up later.
svn path=/trunk/KDE/kdebase/apps/; revision=911065
Diffstat (limited to 'src/tagcloud')
-rw-r--r--src/tagcloud/newtagdialog.cpp95
-rw-r--r--src/tagcloud/newtagdialog.h47
-rw-r--r--src/tagcloud/newtagdialog.ui110
-rw-r--r--src/tagcloud/resourcetaggingwidget.cpp193
-rw-r--r--src/tagcloud/resourcetaggingwidget.h63
-rw-r--r--src/tagcloud/tagcloud.cpp1005
-rw-r--r--src/tagcloud/tagcloud.h142
-rw-r--r--src/tagcloud/taggingpopup.cpp147
-rw-r--r--src/tagcloud/taggingpopup.h50
9 files changed, 0 insertions, 1852 deletions
diff --git a/src/tagcloud/newtagdialog.cpp b/src/tagcloud/newtagdialog.cpp
deleted file mode 100644
index 8785d578c..000000000
--- a/src/tagcloud/newtagdialog.cpp
+++ /dev/null
@@ -1,95 +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 )
-{
- NewTagDialog dlg( 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();
-
- 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 {
- return Nepomuk::Tag();
- }
-}
-
-#include "newtagdialog.moc"
diff --git a/src/tagcloud/newtagdialog.h b/src/tagcloud/newtagdialog.h
deleted file mode 100644
index b11cd1611..000000000
--- a/src/tagcloud/newtagdialog.h
+++ /dev/null
@@ -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
diff --git a/src/tagcloud/newtagdialog.ui b/src/tagcloud/newtagdialog.ui
deleted file mode 100644
index d9bd666b5..000000000
--- a/src/tagcloud/newtagdialog.ui
+++ /dev/null
@@ -1,110 +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>
- <property name="icon" >
- <iconset/>
- </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>
diff --git a/src/tagcloud/resourcetaggingwidget.cpp b/src/tagcloud/resourcetaggingwidget.cpp
deleted file mode 100644
index 1e3fffe8f..000000000
--- a/src/tagcloud/resourcetaggingwidget.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- This file is part of the Nepomuk KDE project.
- Copyright (C) 2007 Sebastian Trueg <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-#include "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;
-
- void showTaggingPopup( const QPoint& );
- 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 );
- }
-
- popup->exec( pos );
-
- MassUpdateJob* job = MassUpdateJob::tagResources( resources, resourceTags );
- connect( job, SIGNAL( result( KJob* ) ),
- q, SLOT( _k_metadataUpdateDone() ) );
- q->setEnabled( false ); // no updates during execution
- job->start();
-
- resourceTagCloud->showTags( resourceTags );
-}
-
-
-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->popup->hide();
-}
-
-
-void Nepomuk::ResourceTaggingWidget::slotTagAdded( const Nepomuk::Tag& tag )
-{
- // assign it right away
- d->resourceTags.append( tag );
-// d->resource.addTag( tag );
-}
-
-
-void Nepomuk::ResourceTaggingWidget::contextMenuEvent( QContextMenuEvent* e )
-{
- d->showTaggingPopup( e->globalPos() );
-}
-
-
-void Nepomuk::ResourceTaggingWidget::showTagPopup( const QPoint& pos )
-{
- d->showTaggingPopup( pos );
-}
-
-#include "resourcetaggingwidget.moc"
diff --git a/src/tagcloud/resourcetaggingwidget.h b/src/tagcloud/resourcetaggingwidget.h
deleted file mode 100644
index 4ddcea881..000000000
--- a/src/tagcloud/resourcetaggingwidget.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- This file is part of the Nepomuk KDE project.
- Copyright (C) 2007 Sebastian Trueg <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-#ifndef _NEPOMUK_RESOURCE_TAGGING_WIDGET_H_
-#define _NEPOMUK_RESOURCE_TAGGING_WIDGET_H_
-
-#include <QtGui/QWidget>
-
-#include <nepomuk/tag.h>
-
-class QEvent;
-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
diff --git a/src/tagcloud/tagcloud.cpp b/src/tagcloud/tagcloud.cpp
deleted file mode 100644
index 0074d1796..000000000
--- a/src/tagcloud/tagcloud.cpp
+++ /dev/null
@@ -1,1005 +0,0 @@
-/*
- This file is part of the Nepomuk KDE project.
- Copyright (C) 2007 Sebastian Trueg <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-#include "tagcloud.h"
-#include "newtagdialog.h"
-
-#include <QtGui/QFont>
-#include <QtGui/QFontMetrics>
-#include <QtCore/QList>
-#include <QtGui/QPushButton>
-#include <QtCore/Qt>
-#include <QtCore/QTime>
-#include <QtGui/QPainter>
-#include <QtGui/QMouseEvent>
-#include <QtGui/QPalette>
-#include <QtGui/QInputDialog>
-#include <QtGui/QAction>
-
-#include <KRandomSequence>
-#include <KLocale>
-#include <KColorScheme>
-#include <KDebug>
-
-#include <Soprano/Client/DBusModel>
-#include <Soprano/QueryResultIterator>
-#include <Soprano/Vocabulary/RDF>
-#include <Soprano/Vocabulary/NAO>
-
-#include <nepomuk/resourcemanager.h>
-
-#include <math.h>
-
-
-namespace {
- const int s_hSpacing = 10;
- const int s_vSpacing = 5;
-
- class TagNode {
- public:
- TagNode()
- : weight( 0 ),
- selected( false ) {
- }
-
- // fixed info
- Nepomuk::Tag tag;
- int weight;
-
- // misc
- bool selected;
-
- // info generated by rebuildCloud
- QFont font;
- QRect rect;
- QRect zoomedRect;
- QString text;
- };
-
- bool tagNodeNameLessThan( const TagNode& n1, const TagNode& n2 ) {
- return n1.text < n2.text;
- }
-
- bool tagNodeWeightLessThan( const TagNode& n1, const TagNode& n2 ) {
- return n1.weight < n2.weight;
- }
-
- int rowLength( const QList<TagNode*>& row ) {
- int rowLen = 0;
- for ( int j = 0; j < row.count(); ++j ) {
- rowLen += row[j]->rect.width();
- if ( j < row.count()-1 ) {
- rowLen += s_hSpacing;
- }
- }
- return rowLen;
- }
-
- int rowHeight( const QList<TagNode*>& row ) {
- int h = 0;
- for ( int j = 0; j < row.count(); ++j ) {
- h = qMax( row[j]->rect.height(), h );
- }
- return h;
- }
-
- QSize cloudSize( const QList<QList<TagNode*> >& rows ) {
- int w = 0;
- int h = 0;
- for ( int i = 0; i < rows.count(); ++i ) {
- w = qMax( w, rowLength( rows[i] ) );
- h += rowHeight( rows[i] );
- if ( i < rows.count()-1 ) {
- h += s_vSpacing;
- }
- }
- return QSize( w, h );
- }
-}
-
-
-class Nepomuk::TagCloud::Private
-{
-public:
- Private( TagCloud* parent )
- : maxFontSize( 0 ),
- minFontSize( 0 ),
- maxNumberDisplayedTags( 0 ),
- selectionEnabled( false ),
- newTagButtonEnabled( false ),
- alignment( Qt::AlignCenter ),
- sorting( SortAlpabetically ),
- zoomEnabled( true ),
- showAllTags( false ),
- customNewTagAction( 0 ),
- hoverTag( 0 ),
- cachedHfwWidth( -1 ),
- m_parent( parent ) {
- newTagNode.text = i18nc( "@label", "New Tag..." );
- }
-
- int maxFontSize;
- int minFontSize;
- int maxNumberDisplayedTags;
- bool selectionEnabled;
- bool newTagButtonEnabled;
- Qt::Alignment alignment;
- Sorting sorting;
- bool zoomEnabled;
-
- // The resource whose tags we are showing
- // invalid if we show all tags or a selection
- KUrl resource;
- bool showAllTags;
-
- // the actual nodes
- QList<TagNode> nodes;
-
- // just a helper structure for speeding up things
- QList<QList<TagNode*> > rows;
-
- TagNode newTagNode;
- QAction* customNewTagAction;
-
- TagNode* hoverTag;
-
- QMatrix zoomMatrix;
-
- QSize cachedSizeHint;
- int cachedHfwWidth;
- int cachedHfwHeight;
-
- void invalidateCachedValues() {
- cachedSizeHint = QSize();
- cachedHfwWidth = -1;
- }
-
- int getMinFontSize() const;
- int getMaxFontSize() const;
- void updateNodeWeights();
- void updateNodeFonts();
- void sortNodes();
- void rebuildCloud();
- TagNode* tagAt( const QPoint& pos );
- TagNode* findTagInRow( const QList<TagNode*>& row, const QPoint& pos );
- TagNode* nodeForTag( const Tag& tag );
- int calculateWeight( const Nepomuk::Tag& tag );
-
-private:
- TagCloud* m_parent;
-};
-
-
-int Nepomuk::TagCloud::Private::getMinFontSize() const
-{
- return minFontSize > 0 ? minFontSize : ( 8 * m_parent->font().pointSize() / 10 );
-}
-
-
-int Nepomuk::TagCloud::Private::getMaxFontSize() const
-{
- return maxFontSize > 0 ? maxFontSize : ( 22 * m_parent->font().pointSize() / 10 );
-}
-
-
-int Nepomuk::TagCloud::Private::calculateWeight( const Nepomuk::Tag& tag )
-{
- // stupid SPARQL has no functions such as count!
- Soprano::QueryResultIterator it
- = ResourceManager::instance()->mainModel()->executeQuery( QString( "select ?r where { ?r <%1> <%2> . }" )
- .arg( Soprano::Vocabulary::NAO::hasTag().toString() )
- .arg( QString::fromAscii( tag.resourceUri().toEncoded() ) ),
- Soprano::Query::QueryLanguageSparql );
- int w = 0;
- while ( it.next() ) {
- ++w;
- }
- return w;
-}
-
-
-void Nepomuk::TagCloud::Private::updateNodeWeights()
-{
- bool changedWeights = false;
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); ++it ) {
- TagNode& node = *it;
- int w = calculateWeight( node.tag );
- if ( w != node.weight ) {
- node.weight = w;
- changedWeights = true;
- }
- }
- if ( changedWeights ) {
- updateNodeFonts();
- }
-}
-
-
-void Nepomuk::TagCloud::Private::updateNodeFonts()
-{
- int maxWeight = 0;
- int minWeight = 0;
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); ++it ) {
- TagNode& node = *it;
- minWeight = qMin( minWeight, node.weight );
- maxWeight = qMax( maxWeight, node.weight );
- }
-
- // calculate font sizes
- // ----------------------------------------------
- int usedMinFontSize = getMinFontSize();
- int usedMaxFontSize = getMaxFontSize();
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); ++it ) {
- TagNode& node = *it;
- double normalizedWeight = (double)(node.weight - minWeight) / (double)qMax(maxWeight - minWeight, 1);
- node.font = m_parent->font();
- node.font.setPointSize( usedMinFontSize + (int)((double)(usedMaxFontSize-usedMinFontSize) * normalizedWeight) );
- if( normalizedWeight > 0.8 )
- node.font.setBold( true );
- }
-
- if ( newTagButtonEnabled ) {
- newTagNode.font = m_parent->font();
- newTagNode.font.setPointSize( usedMinFontSize );
- newTagNode.font.setUnderline( true );
- }
-}
-
-
-void Nepomuk::TagCloud::Private::sortNodes()
-{
- if ( sorting == SortAlpabetically ) {
- qSort( nodes.begin(), nodes.end(), tagNodeNameLessThan );
- }
- else if ( sorting == SortByWeight ) {
- qSort( nodes.begin(), nodes.end(), tagNodeWeightLessThan );
- }
- else if ( sorting == SortRandom ) {
- KRandomSequence().randomize( nodes );
- }
-}
-
-
-void Nepomuk::TagCloud::Private::rebuildCloud()
-{
- // - Always try to be quadratic
- // - Always prefer to expand horizontally
- // - If we cannot fit everything into m_parent->contentsRect(), zoom
- // - If alignment & Qt::AlignJustify insert spaces between tags
-
- sortNodes();
-
- QRect contentsRect = m_parent->contentsRect();
-
- // initialize the nodes' sizes
- // ----------------------------------------------
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); ++it ) {
- TagNode& node = *it;
- node.rect = QFontMetrics( node.font ).boundingRect( node.text );
- }
- if ( newTagButtonEnabled ) {
- newTagNode.rect = QFontMetrics( newTagNode.font ).boundingRect( customNewTagAction ? customNewTagAction->text() : newTagNode.text );
- }
-
-
- // and position the nodes
- // ----------------------------------------------
- rows.clear();
- if ( !nodes.isEmpty() || newTagButtonEnabled ) {
- if ( 0 ) { // FIXME: make it configurable
- QRect lineRect;
- QRect totalRect;
- QList<TagNode*> row;
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); /* We do increment it below */ ) {
- TagNode& node = *it;
-
- int usedSpacing = row.isEmpty() ? 0 : s_hSpacing;
- if ( lineRect.width() + usedSpacing + node.rect.width() <= contentsRect.width() ) {
- node.rect.moveBottomLeft( QPoint( lineRect.right() + usedSpacing, lineRect.bottom() ) );
- QRect newLineRect = lineRect.united( node.rect );
- newLineRect.moveTopLeft( lineRect.topLeft() );
- lineRect = newLineRect;
- row.append( &node );
-
- // update all other nodes in this line
- Q_FOREACH( TagNode* n, row ) {
- n->rect.moveBottom( lineRect.bottom() - ( lineRect.height() - n->rect.height() )/2 );
- }
-
- ++it;
- }
- else {
- rows.append( row );
- row.clear();
- int newLineTop = lineRect.bottom() + s_vSpacing;
- lineRect = QRect();
- lineRect.moveTop( newLineTop );
- }
- }
- rows.append( row );
- }
- else {
- // initialize first row
- rows.append( QList<TagNode*>() );
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); ++it ) {
- TagNode& node = *it;
- rows.first().append( &node );
- }
- if ( newTagButtonEnabled ) {
- rows.first().append( &newTagNode );
- }
-
- // calculate the rows
- QList<QList<TagNode*> > bestRows( rows );
- QSize size( rowLength( rows.first() ), rowHeight( rows.first() ) );
- QSize bestSize( size );
- while ( ( size.height() < size.width() ||
- size.width() > contentsRect.width() ) &&
- size.height() <= contentsRect.height() ) {
- // find the longest row
- int maxRow = 0;
- int maxLen = 0;
- for ( int i = 0; i < rows.count(); ++i ) {
- int rowLen = rowLength( rows[i] );
- if ( rowLen > maxLen ) {
- maxLen = rowLen;
- maxRow = i;
- }
- }
-
- // move the last item from the longest row to the next row
- TagNode* node = rows[maxRow].takeLast();
- if ( rows.count() <= maxRow+1 ) {
- rows.append( QList<TagNode*>() );
- }
- rows[maxRow+1].prepend( node );
-
- // update the size
- size = cloudSize( rows );
-
- if ( size.width() < bestSize.width() &&
- ( size.width() > size.height() ||
- bestSize.width() > contentsRect.width() ) &&
- size.height() <= contentsRect.height() ) {
- bestSize = size;
- bestRows = rows;
- }
- }
- rows = bestRows;
-
- // position the tags
- int y = 0;
- for ( QList<QList<TagNode*> >::iterator rowIt = rows.begin(); rowIt != rows.end(); ++rowIt ) {
- QList<TagNode*>& row = *rowIt;
- int h = rowHeight( row );
- int x = 0;
- Q_FOREACH( TagNode* node, row ) {
- node->rect.moveTop( y + ( h - node->rect.height() )/2 );
- node->rect.moveLeft( x );
- x += s_hSpacing + node->rect.width();
- }
- y += h + s_vSpacing;
- }
- }
-
-
- // let's see if we have to zoom
- // ----------------------------------------------
- zoomMatrix = QMatrix();
- int w = contentsRect.width();
- if ( zoomEnabled ) {
- for ( QList<QList<TagNode*> >::iterator rowIt = rows.begin(); rowIt != rows.end(); ++rowIt ) {
- QList<TagNode*>& row = *rowIt;
- w = qMax( w, row.last()->rect.right() );
- }
- if ( w > contentsRect.width() ) {
- double zoomFactor = ( double )contentsRect.width() / ( double )w;
- zoomMatrix.scale( zoomFactor, zoomFactor );
- }
- }
-
- // force horizontal alignment
- // ----------------------------------------------
- for ( QList<QList<TagNode*> >::iterator rowIt = rows.begin(); rowIt != rows.end(); ++rowIt ) {
- QList<TagNode*>& row = *rowIt;
- int space = /*contentsRect.right()*/w - row.last()->rect.right();
- if ( alignment & ( Qt::AlignRight|Qt::AlignHCenter ) ) {
- Q_FOREACH( TagNode* node, row ) {
- node->rect.moveLeft( node->rect.left() + ( alignment & Qt::AlignRight ? space : space/2 ) );
- }
- }
- else if ( alignment & Qt::AlignJustify && row.count() > 1 ) {
- space /= ( row.count()-1 );
- int i = 0;
- Q_FOREACH( TagNode* node, row ) {
- node->rect.moveLeft( node->rect.left() + ( space * i++ ) );
- }
- }
- }
-
- // force vertical alignment
- // ----------------------------------------------
- int verticalSpace = contentsRect.bottom() - rows.last().first()->rect.bottom();
- if ( alignment & ( Qt::AlignBottom|Qt::AlignVCenter ) ) {
- for ( QList<QList<TagNode*> >::iterator rowIt = rows.begin(); rowIt != rows.end(); ++rowIt ) {
- Q_FOREACH( TagNode* node, *rowIt ) {
- node->rect.moveTop( node->rect.top() + ( alignment & Qt::AlignBottom ? verticalSpace : verticalSpace/2 ) );
- }
- }
- }
-
- for( QList<TagNode>::iterator it = nodes.begin(); it != nodes.end(); ++it ) {
- it->zoomedRect = zoomMatrix.mapRect( it->rect );
- }
- newTagNode.zoomedRect = zoomMatrix.mapRect( newTagNode.rect );
- }
-
- m_parent->updateGeometry();
- m_parent->update();
-}
-
-
-// binary search in row
-TagNode* Nepomuk::TagCloud::Private::findTagInRow( const QList<TagNode*>& row, const QPoint& pos )
-{
- int x = m_parent->width() ? row.count() * pos.x() / m_parent->width() : 0;
-
- int i = 0;
- while ( 1 ) {
- if ( x-i >= 0 && x-i < row.count() && row[x-i]->zoomedRect.contains( pos ) ) {
- return row[x-i];
- }
- else if ( x+i >= 0 && x+i < row.count() && row[x+i]->zoomedRect.contains( pos ) ) {
- return row[x+i];
- }
- if ( x-i < 0 && x+i >= row.count() ) {
- return 0;
- }
- ++i;
- }
- return 0;
-}
-
-
-// binary search in cloud
-TagNode* Nepomuk::TagCloud::Private::tagAt( const QPoint& pos )
-{
- int y = m_parent->height() ? rows.count() * pos.y() / m_parent->height() : 0;
-
- int i = 0;
- while ( 1 ) {
- if ( y-i >= 0 && y-i < rows.count() ) {
- if ( TagNode* node = findTagInRow( rows[y-i], pos ) ) {
- return node;
- }
- }
- if ( y+i >= 0 && y+i < rows.count() ) {
- if ( TagNode* node = findTagInRow( rows[y+i], pos ) ) {
- return node;
- }
- }
- if ( y-i < 0 && y+i >= rows.count() ) {
- return 0;
- }
- ++i;
- }
- return 0;
-}
-
-
-TagNode* Nepomuk::TagCloud::Private::nodeForTag( const Tag& tag )
-{
- for ( QList<TagNode>::iterator it = nodes.begin();
- it != nodes.end(); ++it ) {
- TagNode& node = *it;
- if ( tag == node.tag ) {
- return &node;
- }
- }
- return 0;
-}
-
-
-
-Nepomuk::TagCloud::TagCloud( QWidget* parent )
- : QFrame( parent ),
- d( new Private(this) )
-{
- QSizePolicy policy( QSizePolicy::Preferred,
- QSizePolicy::Preferred );
- policy.setHeightForWidth( true );
- setSizePolicy( policy );
- setMouseTracking( true );
-
- // Since signals are delivered in no particular order
- // our slot might be called before the resources are updated
- // Then, we would use invalid cached data.
- // By using queued connections this problem should be solved.
- connect( ResourceManager::instance()->mainModel(),
- SIGNAL( statementAdded( const Soprano::Statement& ) ),
- this,
- SLOT( slotStatementAdded( const Soprano::Statement& ) ),
- Qt::QueuedConnection );
- connect( ResourceManager::instance()->mainModel(),
- SIGNAL( statementRemoved( const Soprano::Statement& ) ),
- this,
- SLOT( slotStatementRemoved( const Soprano::Statement& ) ),
- Qt::QueuedConnection );
-}
-
-
-Nepomuk::TagCloud::~TagCloud()
-{
- delete d;
-}
-
-
-void Nepomuk::TagCloud::setMaxFontSize( int size )
-{
- d->invalidateCachedValues();
- d->maxFontSize = size;
- d->updateNodeFonts();
- d->rebuildCloud();
-}
-
-
-void Nepomuk::TagCloud::setMinFontSize( int size )
-{
- d->invalidateCachedValues();
- d->minFontSize = size;
- d->updateNodeFonts();
- d->rebuildCloud();
-}
-
-
-void Nepomuk::TagCloud::setMaxNumberDisplayedTags( int n )
-{
- d->maxNumberDisplayedTags = n;
- d->rebuildCloud();
-}
-
-
-void Nepomuk::TagCloud::setSelectionEnabled( bool enabled )
-{
- d->selectionEnabled = enabled;
- update();
-}
-
-
-void Nepomuk::TagCloud::setNewTagButtonEnabled( bool enabled )
-{
- d->newTagButtonEnabled = enabled;
- d->rebuildCloud();
-}
-
-
-bool Nepomuk::TagCloud::zoomEnabled() const
-{
- return d->zoomEnabled;
-}
-
-
-void Nepomuk::TagCloud::setZoomEnabled( bool zoom )
-{
- if ( d->zoomEnabled != zoom ) {
- d->zoomEnabled = zoom;
- d->rebuildCloud();
- }
-}
-
-
-void Nepomuk::TagCloud::setContextMenuEnabled( bool enabled )
-{
- Q_UNUSED(enabled);
-}
-
-
-void Nepomuk::TagCloud::setAlignment( Qt::Alignment alignment )
-{
- d->alignment = alignment;
- d->rebuildCloud();
-}
-
-
-void Nepomuk::TagCloud::setSorting( Sorting s )
-{
- d->invalidateCachedValues();
- d->sorting = s;
- d->rebuildCloud();
-}
-
-
-void Nepomuk::TagCloud::showAllTags()
-{
- showTags( Nepomuk::Tag::allTags() );
- d->showAllTags = true;
-}
-
-
-void Nepomuk::TagCloud::showResourceTags( const Resource& resource )
-{
- showTags( resource.tags() );
- d->resource = resource.uri();
-}
-
-
-void Nepomuk::TagCloud::showTags( const QList<Tag>& tags )
-{
- d->resource = QUrl();
- d->showAllTags = false;
- d->invalidateCachedValues();
- d->nodes.clear();
- Q_FOREACH( const Tag &tag, tags ) {
- TagNode node;
- node.tag = tag;
- node.weight = d->calculateWeight( tag );
- node.text = node.tag.genericLabel();
-
- d->nodes.append( node );
- }
- d->updateNodeFonts();
- d->rebuildCloud();
-}
-
-
-void Nepomuk::TagCloud::setTagSelected( const Tag& tag, bool selected )
-{
- if ( TagNode* node = d->nodeForTag( tag ) ) {
- node->selected = selected;
- if ( d->selectionEnabled ) {
- update( node->zoomedRect );
- }
- }
-}
-
-
-QSize Nepomuk::TagCloud::sizeHint() const
-{
- // If we have tags d->rebuildCloud() has been called at least once,
- // thus, we have proper rects (i.e. needed sizes)
-
- if ( !d->cachedSizeHint.isValid() ) {
- QList<QList<TagNode*> > rows;
- rows.append( QList<TagNode*>() );
- for ( QList<TagNode>::iterator it = d->nodes.begin();
- it != d->nodes.end(); ++it ) {
- TagNode& node = *it;
- rows.first().append( &node );
- }
- if ( d->newTagButtonEnabled ) {
- rows.first().append( &d->newTagNode );
- }
-
- QSize size( rowLength( rows.first() ), rowHeight( rows.first() ) );
- QSize bestSize( size );
- while ( size.height() < size.width() ) {
- // find the longest row
- int maxRow = 0;
- int maxLen = 0;
- for ( int i = 0; i < rows.count(); ++i ) {
- int rowLen = rowLength( rows[i] );
- if ( rowLen > maxLen ) {
- maxLen = rowLen;
- maxRow = i;
- }
- }
-
- // move the last item from the longest row to the next row
- TagNode* node = rows[maxRow].takeLast();
- if ( rows.count() <= maxRow+1 ) {
- rows.append( QList<TagNode*>() );
- }
- rows[maxRow+1].prepend( node );
-
- // update the size
- size = cloudSize( rows );
-
- if ( size.width() < bestSize.width() &&
- size.width() > size.height() ) {
- bestSize = size;
- }
- }
-
- d->cachedSizeHint = QSize( bestSize.width() + frameWidth()*2,
- bestSize.height() + frameWidth()*2 );
- }
-
- return d->cachedSizeHint;
-}
-
-
-QSize Nepomuk::TagCloud::minimumSizeHint() const
-{
- return QFrame::minimumSizeHint();
- // If we have tags d->rebuildCloud() has been called at least once,
- // thus, we have proper rects (i.e. needed sizes)
- if ( d->nodes.isEmpty() && !d->newTagButtonEnabled ) {
- return QSize( fontMetrics().width( i18nc( "@label Indicator when no tags defined", "No Tags" ) ), fontMetrics().height() );
- }
- else {
- QSize size;
- for ( QList<TagNode>::iterator it = d->nodes.begin();
- it != d->nodes.end(); ++it ) {
- size.setWidth( qMax( size.width(), ( *it ).rect.width() ) );
- size.setHeight( qMax( size.height(), ( *it ).rect.height() ) );
- }
- if ( d->newTagButtonEnabled ) {
- size.setWidth( qMax( size.width(), d->newTagNode.rect.width() ) );
- size.setHeight( qMax( size.height(), d->newTagNode.rect.height() ) );
- }
- size.setWidth( size.width() + frameWidth()*2 );
- size.setHeight( size.height() + frameWidth()*2 );
- return size;
- }
-}
-
-
-int Nepomuk::TagCloud::heightForWidth( int contentsWidth ) const
-{
- // If we have tags d->rebuildCloud() has been called at least once,
- // thus, we have proper rects (i.e. needed sizes)
-
- if ( d->cachedHfwWidth != contentsWidth ) {
- // have to keep in mind the frame
- contentsWidth -= frameWidth()*2;
-
- QList<TagNode*> allNodes;
- for ( QList<TagNode>::iterator it = d->nodes.begin();
- it != d->nodes.end(); ++it ) {
- TagNode& node = *it;
- allNodes.append( &node );
- }
- if ( d->newTagButtonEnabled ) {
- allNodes.append( &d->newTagNode );
- }
-
- int h = 0;
- bool newRow = true;
- int rowW = 0;
- int rowH = 0;
- int maxW = 0;
- for ( int i = 0; i < allNodes.count(); ++i ) {
- int w = rowW;
- if ( !newRow ) {
- w += s_hSpacing;
- }
- newRow = false;
- w += allNodes[i]->rect.width();
- if ( w <= contentsWidth ) {
- rowH = qMax( rowH, allNodes[i]->rect.height() );
- rowW = w;
- }
- else {
- if ( h > 0 ) {
- h += s_vSpacing;
- }
- h += rowH;
- rowH = allNodes[i]->rect.height();
- rowW = allNodes[i]->rect.width();
- }
- maxW = qMax( maxW, rowW );
- }
- if ( rowH > 0 ) {
- h += s_vSpacing + rowH;
- }
-
- d->cachedHfwWidth = contentsWidth;
- d->cachedHfwHeight = h;
-
- // zooming
- if ( maxW > contentsWidth ) {
- d->cachedHfwHeight = d->cachedHfwHeight * contentsWidth / maxW;
- }
- }
-
- return d->cachedHfwHeight + frameWidth()*2;
-}
-
-
-void Nepomuk::TagCloud::resizeEvent( QResizeEvent* e )
-{
- QFrame::resizeEvent( e );
- d->rebuildCloud();
- update();
-}
-
-
-void Nepomuk::TagCloud::paintEvent( QPaintEvent* e )
-{
- QFrame::paintEvent( e );
-
- KStatefulBrush normalTextBrush( KColorScheme::View, KColorScheme::NormalText );
- KStatefulBrush activeTextBrush( KColorScheme::View, KColorScheme::VisitedText );
- KStatefulBrush hoverTextBrush( KColorScheme::View, KColorScheme::ActiveText );
-
- QPainter p( this );
- QRegion paintRegion = e->region();
-
- p.save();
- p.setMatrix( d->zoomMatrix );
-
- for ( QList<TagNode>::iterator it = d->nodes.begin();
- it != d->nodes.end(); ++it ) {
- TagNode& node = *it;
-
- if ( paintRegion.contains( node.zoomedRect ) ) {
- p.setFont( node.font );
-
- if ( &node == d->hoverTag ) {
- p.setPen( hoverTextBrush.brush( this ).color() );
- }
- else if ( d->selectionEnabled && node.selected ) {
- p.setPen( activeTextBrush.brush( this ).color() );
- }
- else {
- p.setPen( normalTextBrush.brush( this ).color() );
- }
- p.drawText( node.rect, Qt::AlignCenter, node.text );
- }
- }
-
- if ( d->newTagButtonEnabled ) {
- p.setFont( d->newTagNode.font );
- if ( &d->newTagNode == d->hoverTag ) {
- p.setPen( hoverTextBrush.brush( this ).color() );
- }
- else {
- p.setPen( normalTextBrush.brush( this ).color() );
- }
- p.drawText( d->newTagNode.rect, Qt::AlignCenter, d->customNewTagAction ? d->customNewTagAction->text() : d->newTagNode.text );
- }
-
- p.restore();
-}
-
-
-void Nepomuk::TagCloud::mousePressEvent( QMouseEvent* e )
-{
- if ( e->button() == Qt::LeftButton ) {
- if ( TagNode* node = d->tagAt( e->pos() ) ) {
- kDebug() << "clicked" << node->text;
- if ( node == &d->newTagNode ) {
- if ( d->customNewTagAction ) {
- d->customNewTagAction->trigger();
- }
- else {
- // FIXME: nicer gui
- Tag newTag = NewTagDialog::createTag( this );
- if ( newTag.isValid() ) {
- emit tagAdded( newTag );
- }
- }
- }
- else {
- emit tagClicked( node->tag );
- if ( d->selectionEnabled ) {
- kDebug() << "Toggleing tag" << node->text;
- node->selected = !node->selected;
- emit tagToggled( node->tag, node->selected );
- update( node->zoomedRect );
- }
- }
- }
- }
-}
-
-
-void Nepomuk::TagCloud::mouseMoveEvent( QMouseEvent* e )
-{
- if ( e->buttons() == Qt::NoButton ) {
-
- TagNode* oldHoverTag = d->hoverTag;
-
- if ( ( d->hoverTag = d->tagAt( e->pos() ) ) &&
- !d->selectionEnabled ) {
- setCursor( Qt::PointingHandCursor );
- }
- else if ( d->newTagButtonEnabled &&
- d->newTagNode.zoomedRect.contains( e->pos() ) ) {
- d->hoverTag = &d->newTagNode;
- setCursor( Qt::PointingHandCursor );
- }
- else {
- unsetCursor();
- }
-
- if ( oldHoverTag || d->hoverTag ) {
- QRect updateRect;
- if ( d->hoverTag )
- updateRect = updateRect.united( d->hoverTag->zoomedRect );
- if ( oldHoverTag )
- updateRect = updateRect.united( oldHoverTag->zoomedRect );
-
- update( updateRect );
- }
- }
-}
-
-
-void Nepomuk::TagCloud::leaveEvent( QEvent* )
-{
- unsetCursor();
- if ( d->hoverTag ) {
- QRect updateRect = d->hoverTag->zoomedRect;
- d->hoverTag = 0;
- update( updateRect );
- }
-}
-
-
-void Nepomuk::TagCloud::slotStatementAdded( const Soprano::Statement& s )
-{
- if ( s.predicate().uri() == Soprano::Vocabulary::RDF::type() &&
- s.object().uri() == Nepomuk::Tag::resourceTypeUri() ) {
- // new tag created
- if ( d->showAllTags ) {
- showAllTags();
- }
- }
- else if ( s.predicate().uri() == Nepomuk::Resource::tagUri() ) {
- if ( s.subject().uri() == d->resource ) {
- showResourceTags( d->resource );
- }
- else {
- // weights might have changed
- d->updateNodeWeights();
- d->rebuildCloud();
- }
- }
-}
-
-
-void Nepomuk::TagCloud::slotStatementRemoved( const Soprano::Statement& s )
-{
- // FIXME: In theory might contain empty nodes as wildcards
-
- if ( s.predicate().uri() == Nepomuk::Resource::tagUri() ) {
- if ( d->resource.isValid() &&
- d->resource == s.subject().uri() ) {
- showResourceTags( d->resource );
- }
- else {
- // weights might have changed
- d->updateNodeWeights();
- d->rebuildCloud();
- }
- }
- else if ( s.predicate().uri() == Soprano::Vocabulary::RDF::type() &&
- s.object().uri() == Nepomuk::Tag::resourceTypeUri() ) {
- // tag deleted
- if ( d->showAllTags ) {
- showAllTags();
- }
- }
-}
-
-
-void Nepomuk::TagCloud::setCustomNewTagAction( QAction* action )
-{
- d->customNewTagAction = action;
- setNewTagButtonEnabled( action != 0 );
-}
-
-#include "tagcloud.moc"
diff --git a/src/tagcloud/tagcloud.h b/src/tagcloud/tagcloud.h
deleted file mode 100644
index 9710ca9b7..000000000
--- a/src/tagcloud/tagcloud.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- This file is part of the Nepomuk KDE project.
- Copyright (C) 2007 Sebastian Trueg <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-#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
diff --git a/src/tagcloud/taggingpopup.cpp b/src/tagcloud/taggingpopup.cpp
deleted file mode 100644
index 3e59c80d1..000000000
--- a/src/tagcloud/taggingpopup.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- This file is part of the Nepomuk KDE project.
- Copyright (C) 2007 Sebastian Trueg <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-#include "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::Box|QFrame::Plain );
- 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 );
-}
-
diff --git a/src/tagcloud/taggingpopup.h b/src/tagcloud/taggingpopup.h
deleted file mode 100644
index 99cee701c..000000000
--- a/src/tagcloud/taggingpopup.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- This file is part of the Nepomuk KDE project.
- Copyright (C) 2007 Sebastian Trueg <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
-
-#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