19 #include "kedittagsdialog_p.h"
22 #include <klineedit.h>
24 #include <kmessagebox.h>
27 #include <QHBoxLayout>
29 #include <QListWidget>
30 #include <QPushButton>
32 #include <QVBoxLayout>
35 KEditTagsDialog::KEditTagsDialog(
const QVector<Nepomuk::Tag>& tags,
38 KDialog(parent, flags),
44 m_deleteButtonTimer(0)
47 const QString caption = (tags.count() > 0) ?
48 i18nc(
"@title:window",
"Change Tags") :
49 i18nc(
"@title:window",
"Add Tags");
51 setButtons(KDialog::Ok | KDialog::Cancel);
52 setDefaultButton(KDialog::Ok);
54 QWidget* mainWidget =
new QWidget(
this);
55 QVBoxLayout* topLayout =
new QVBoxLayout(mainWidget);
57 QLabel* label =
new QLabel(i18nc(
"@label:textbox",
58 "Configure which tags should "
59 "be applied."),
this);
61 m_tagsList =
new QListWidget(
this);
62 m_tagsList->setMouseTracking(
true);
63 m_tagsList->setSortingEnabled(
true);
64 m_tagsList->setSelectionMode(QAbstractItemView::NoSelection);
65 m_tagsList->installEventFilter(
this);
66 connect(m_tagsList, SIGNAL(itemEntered(QListWidgetItem*)),
67 this, SLOT(slotItemEntered(QListWidgetItem*)));
68 connect(m_tagsList, SIGNAL(itemEntered(QListWidgetItem*)),
69 this, SLOT(slotItemEntered(QListWidgetItem*)));
71 QLabel* newTagLabel =
new QLabel(i18nc(
"@label",
"Create new tag:"));
72 m_newTagEdit =
new KLineEdit(
this);
73 m_newTagEdit->setClearButtonShown(
true);
74 connect(m_newTagEdit, SIGNAL(textEdited(QString)),
75 this, SLOT(slotTextEdited(QString)));
77 QHBoxLayout* newTagLayout =
new QHBoxLayout();
78 newTagLayout->addWidget(newTagLabel);
79 newTagLayout->addWidget(m_newTagEdit, 1);
81 topLayout->addWidget(label);
82 topLayout->addWidget(m_tagsList);
83 topLayout->addLayout(newTagLayout);
85 setMainWidget(mainWidget);
91 m_deleteButton =
new QPushButton(m_tagsList->viewport());
92 m_deleteButton->setIcon(KIcon(QLatin1String(
"edit-delete")));
93 m_deleteButton->setToolTip(i18nc(
"@info",
"Delete tag"));
94 m_deleteButton->hide();
95 connect(m_deleteButton, SIGNAL(clicked()),
this, SLOT(deleteTag()));
97 m_deleteButtonTimer =
new QTimer(
this);
98 m_deleteButtonTimer->setSingleShot(
true);
99 m_deleteButtonTimer->setInterval(500);
100 connect(m_deleteButtonTimer, SIGNAL(timeout()),
this, SLOT(showDeleteButton()));
103 KEditTagsDialog::~KEditTagsDialog()
107 QVector<Nepomuk::Tag> KEditTagsDialog::tags()
const
112 bool KEditTagsDialog::eventFilter(QObject* watched, QEvent* event)
114 if ((watched == m_tagsList) && (event->type() == QEvent::Leave)) {
115 m_deleteButtonTimer->stop();
116 m_deleteButton->hide();
118 return KDialog::eventFilter(watched, event);
121 void KEditTagsDialog::slotButtonClicked(
int button)
123 if (button == KDialog::Ok) {
129 const int count = m_tagsList->count();
130 for (
int i = 0; i < count; ++i) {
131 QListWidgetItem* item = m_tagsList->item(i);
132 if (item->checkState() == Qt::Checked) {
133 const QString label = item->data(Qt::UserRole).toString();
134 Nepomuk::Tag tag(label);
142 KDialog::slotButtonClicked(button);
146 void KEditTagsDialog::slotTextEdited(
const QString& text)
151 const QString tagText = text.simplified();
152 if (tagText.isEmpty()) {
159 const int count = m_tagsList->count();
160 for (
int i = 0; i < count; ++i) {
161 const QListWidgetItem* item = m_tagsList->item(i);
162 const bool remove = (item->text() == tagText) &&
163 ((m_newTagItem == 0) || (m_newTagItem != item));
165 m_tagsList->scrollToItem(item);
172 if (m_newTagItem == 0) {
173 m_newTagItem =
new QListWidgetItem(tagText, m_tagsList);
175 m_newTagItem->setText(tagText);
177 m_newTagItem->setData(Qt::UserRole, tagText);
178 m_newTagItem->setCheckState(Qt::Checked);
179 m_tagsList->scrollToItem(m_newTagItem);
182 void KEditTagsDialog::slotItemEntered(QListWidgetItem* item)
186 const QRect rect = m_tagsList->visualItemRect(item);
187 const int size = rect.height();
188 const int x = rect.right() - size;
189 const int y = rect.top();
190 m_deleteButton->move(x, y);
191 m_deleteButton->resize(size, size);
193 m_deleteCandidate = item;
194 m_deleteButtonTimer->start();
197 void KEditTagsDialog::showDeleteButton()
199 m_deleteButton->show();
202 void KEditTagsDialog::deleteTag()
204 Q_ASSERT(m_deleteCandidate != 0);
205 const QString text = i18nc(
"@info",
206 "Should the tag <resource>%1</resource> really be deleted for all files?",
207 m_deleteCandidate->text());
208 const QString caption = i18nc(
"@title",
"Delete tag");
209 const KGuiItem deleteItem(i18nc(
"@action:button",
"Delete"), KIcon(QLatin1String(
"edit-delete")));
210 const KGuiItem cancelItem(i18nc(
"@action:button",
"Cancel"), KIcon(QLatin1String(
"dialog-cancel")));
211 if (KMessageBox::warningYesNo(
this, text, caption, deleteItem, cancelItem) == KMessageBox::Yes) {
212 const QString label = m_deleteCandidate->data(Qt::UserRole).toString();
213 Nepomuk::Tag tag(label);
217 for (
int i = m_tagsList->count() - 1; i >= 0; --i) {
218 QListWidgetItem* item = m_tagsList->takeItem(i);
225 void KEditTagsDialog::loadTags()
229 foreach (
const Nepomuk::Tag& tag, Nepomuk::Tag::allTags()) {
230 const QString label = tag.label();
232 QListWidgetItem* item =
new QListWidgetItem(label, m_tagsList);
233 item->setData(Qt::UserRole, label);
236 foreach (
const Nepomuk::Tag& selectedTag, m_tags) {
237 if (selectedTag.label() == label) {
242 item->setCheckState(check ? Qt::Checked : Qt::Unchecked);
246 void KEditTagsDialog::removeNewTagItem()
248 if (m_newTagItem != 0) {
249 const int row = m_tagsList->row(m_newTagItem);
250 m_tagsList->takeItem(row);
256 #include "kedittagsdialog_p.moc"