┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-11-11 21:47:09 +0000
committerPeter Penz <[email protected]>2009-11-11 21:47:09 +0000
commit56bccf8f2fbff0ff2f26f1c9a124621c96665750 (patch)
tree08014ed5ed8d1e18e3e80dccfbdb5f477ed68bd5 /src
parent98f0289c767292bf94a6aae85386f8d01d128d28 (diff)
let the user also delete the created tags
svn path=/trunk/KDE/kdebase/apps/; revision=1047714
Diffstat (limited to 'src')
-rw-r--r--src/panels/information/kedittagsdialog.cpp80
-rw-r--r--src/panels/information/kedittagsdialog_p.h11
2 files changed, 90 insertions, 1 deletions
diff --git a/src/panels/information/kedittagsdialog.cpp b/src/panels/information/kedittagsdialog.cpp
index 4dfe0275d..841242295 100644
--- a/src/panels/information/kedittagsdialog.cpp
+++ b/src/panels/information/kedittagsdialog.cpp
@@ -18,12 +18,17 @@
#include "kedittagsdialog_p.h"
+#include <kicon.h>
#include <klineedit.h>
#include <klocale.h>
+#include <kmessagebox.h>
+#include <QEvent>
#include <QHBoxLayout>
#include <QLabel>
#include <QListWidget>
+#include <QPushButton>
+#include <QTimer>
#include <QVBoxLayout>
#include <QWidget>
@@ -34,7 +39,9 @@ KEditTagsDialog::KEditTagsDialog(const QList<Nepomuk::Tag>& tags,
m_tags(tags),
m_tagsList(0),
m_newTagItem(0),
- m_newTagEdit(0)
+ m_deleteCandidate(0),
+ m_newTagEdit(0),
+ m_deleteButtonTimer(0)
{
const QString caption = (tags.count() > 0) ?
@@ -52,8 +59,14 @@ KEditTagsDialog::KEditTagsDialog(const QList<Nepomuk::Tag>& tags,
"be applied."), this);
m_tagsList = new QListWidget(this);
+ m_tagsList->setMouseTracking(true);
m_tagsList->setSortingEnabled(true);
m_tagsList->setSelectionMode(QAbstractItemView::NoSelection);
+ m_tagsList->installEventFilter(this);
+ connect(m_tagsList, SIGNAL(itemEntered(QListWidgetItem*)),
+ this, SLOT(slotItemEntered(QListWidgetItem*)));
+ connect(m_tagsList, SIGNAL(itemEntered(QListWidgetItem*)),
+ this, SLOT(slotItemEntered(QListWidgetItem*)));
QLabel* newTagLabel = new QLabel(i18nc("@label", "Create new tag:"));
m_newTagEdit = new KLineEdit(this);
@@ -72,6 +85,19 @@ KEditTagsDialog::KEditTagsDialog(const QList<Nepomuk::Tag>& tags,
setMainWidget(mainWidget);
loadTags();
+
+ // create the delete button, which is shown when
+ // hovering the items
+ m_deleteButton = new QPushButton(m_tagsList->viewport());
+ m_deleteButton->setIcon(KIcon("edit-delete"));
+ m_deleteButton->setToolTip(i18nc("@info", "Delete tag"));
+ m_deleteButton->hide();
+ connect(m_deleteButton, SIGNAL(clicked()), this, SLOT(deleteTag()));
+
+ m_deleteButtonTimer = new QTimer(this);
+ m_deleteButtonTimer->setSingleShot(true);
+ m_deleteButtonTimer->setInterval(500);
+ connect(m_deleteButtonTimer, SIGNAL(timeout()), this, SLOT(showDeleteButton()));
}
KEditTagsDialog::~KEditTagsDialog()
@@ -83,6 +109,15 @@ QList<Nepomuk::Tag> KEditTagsDialog::tags() const
return m_tags;
}
+bool KEditTagsDialog::eventFilter(QObject* watched, QEvent* event)
+{
+ if ((watched == m_tagsList) && (event->type() == QEvent::Leave)) {
+ m_deleteButtonTimer->stop();
+ m_deleteButton->hide();
+ }
+ return KDialog::eventFilter(watched, event);
+}
+
void KEditTagsDialog::slotButtonClicked(int button)
{
if (button == KDialog::Ok) {
@@ -144,6 +179,49 @@ void KEditTagsDialog::slotTextEdited(const QString& text)
m_tagsList->scrollToItem(m_newTagItem);
}
+void KEditTagsDialog::slotItemEntered(QListWidgetItem* item)
+{
+ // align the delete-button to stay on the right border
+ // of the item
+ const QRect rect = m_tagsList->visualItemRect(item);
+ const int size = rect.height();
+ const int x = rect.right() - size;
+ const int y = rect.top();
+ m_deleteButton->move(x, y);
+ m_deleteButton->resize(size, size);
+
+ m_deleteCandidate = item;
+ m_deleteButtonTimer->start();
+}
+
+void KEditTagsDialog::showDeleteButton()
+{
+ m_deleteButton->show();
+}
+
+void KEditTagsDialog::deleteTag()
+{
+ Q_ASSERT(m_deleteCandidate != 0);
+ const QString text = i18nc("@info",
+ "Should the tag <resource>%1</resource> really be deleted for all files?",
+ m_deleteCandidate->text());
+ const QString caption = i18nc("@title", "Delete tag");
+ const KGuiItem deleteItem(i18nc("@action:button", "Delete"), KIcon("edit-delete"));
+ const KGuiItem cancelItem(i18nc("@action:button", "Cancel"), KIcon("dialog-cancel"));
+ if (KMessageBox::warningYesNo(this, text, caption, deleteItem, cancelItem) == KMessageBox::Yes) {
+ const QString label = m_deleteCandidate->data(Qt::UserRole).toString();
+ Nepomuk::Tag tag(label);
+ tag.remove();
+
+ // clear list and reload it
+ for (int i = m_tagsList->count() - 1; i >= 0; --i) {
+ QListWidgetItem* item = m_tagsList->takeItem(i);
+ delete item;
+ }
+ loadTags();
+ }
+}
+
void KEditTagsDialog::loadTags()
{
// load all available tags and mark those tags as checked
diff --git a/src/panels/information/kedittagsdialog_p.h b/src/panels/information/kedittagsdialog_p.h
index d85bcf9da..c8bea8867 100644
--- a/src/panels/information/kedittagsdialog_p.h
+++ b/src/panels/information/kedittagsdialog_p.h
@@ -25,6 +25,8 @@
class KLineEdit;
class QListWidget;
class QListWidgetItem;
+class QPushButton;
+class QTimer;
/**
* @brief Dialog to edit a list of Nepomuk tags.
@@ -47,11 +49,16 @@ public:
QList<Nepomuk::Tag> tags() const;
+ virtual bool eventFilter(QObject* watched, QEvent* event);
+
protected slots:
virtual void slotButtonClicked(int button);
private slots:
void slotTextEdited(const QString& text);
+ void slotItemEntered(QListWidgetItem* item);
+ void showDeleteButton();
+ void deleteTag();
private:
void loadTags();
@@ -61,7 +68,11 @@ private:
QList<Nepomuk::Tag> m_tags;
QListWidget* m_tagsList;
QListWidgetItem* m_newTagItem;
+ QListWidgetItem* m_deleteCandidate;
KLineEdit* m_newTagEdit;
+
+ QPushButton* m_deleteButton;
+ QTimer* m_deleteButtonTimer;
};
#endif