added plugins
[semnotes:semnotes.git] / src / plugins / tagcloud / tagcloudwidget.cpp
1 /*
2  * This file is part of SemNotes Project.
3  *
4  * Copyright (C) 2009 - 2010 Laura Dragan <laura.dragan@deri.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 #include "tagcloudwidget.h"
22 #include "tagcloudfilter.h"
23 #include "note.h"
24 #include "filtermanager.h"
25 #include <QList>
26 #include <QDockWidget>
27 #include <Nepomuk/Tag>
28 #include <KDebug>
29
30 namespace SemNotes
31 {
32 TagcloudWidget::TagcloudWidget(TagcloudFilter *filter, QWidget *parent)
33         : QTextBrowser(parent)
34 {
35     setAlignment(Qt::AlignCenter | Qt::AlignHCenter | Qt::AlignVCenter);
36 //    m_filterManager = FilterManager::self();
37     m_filter = filter;
38     connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(parseTag(const QUrl&)));
39 }
40
41 TagcloudWidget::~TagcloudWidget()
42 {
43 }
44
45 void TagcloudWidget::populate(const QList<Note> &notes)
46 {
47     kDebug() << "started populating the tagcloud widget";
48     kDebug() << notes.size();
49     QMap<QString, int> occurences;
50     foreach(Note note, notes) {
51         QList<Nepomuk::Tag> tags = note.tags();
52         foreach(Nepomuk::Tag tag, tags) {
53             QString label = tag.label();
54             occurences.insert(label, occurences.value(label, 0) + 1);
55         }
56     }
57
58     QString html = "<html><body><center>";
59     QString tag = "<a style=\"text-decoration:underline;\" href=\"%1\"><font style=\"font-size:%2px;\">%3</font><\a><span style=\"text-decoration:none;\">  </span>";
60     QString tagFilter = "<a style=\"text-decoration:underline;\" href=\"%1\"><font style=\"font-size:%2px;color:#009933\">%3</font><\a><span style=\"text-decoration:none;\">  </span>";
61
62     QList<QString> keys = occurences.keys();
63     int min_value = 65353;
64     int max_value = 0;
65     int min_size = 0;
66     int max_size = 6;
67     int spread = 1;
68     float step = 1.0;
69
70     foreach(QString key, keys) {
71         int value = occurences.value(key, 0);
72         if (value < min_value) min_value = value;
73         if (value > max_value) max_value = value;
74     }
75     spread = max_value - min_value;
76     if (spread == 0) spread = 1;
77     step = ((float)(max_size - min_size)) / ((float)spread);
78
79     foreach(QString key, keys) {
80         int value = min_size + ((occurences.value(key, 0) - min_value) * step);
81         if (m_filter->tags().contains(key)) {
82             html.append(tagFilter.arg(key).arg(QString::number(12 + (value * 3))).arg(key));
83         } else {
84             html.append(tag.arg(key).arg(QString::number(12 + (value * 3))).arg(key));
85         }
86     }
87
88     html.append("</center></body></html>");
89
90     setHtml(html);
91     update();
92 }
93
94 void TagcloudWidget::parseTag(const QUrl &tag)
95 {
96     emit contactAllNotes();
97     QString t = tag.toString();
98     if (m_filter->tags().contains(t)) {
99         m_filter->removeTag(t);
100     } else {
101         m_filter->addTag(t);
102     }
103 }
104
105 }
106 #include "tagcloudwidget.moc"