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<Nepomuk2::Tag>& tags,
37 Qt::WindowFlags flags) :
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" );
50 setCaption( caption );
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<Nepomuk2::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 Nepomuk2::Tag tag( label );
135 tag.setLabel( label );
136 m_tags.append( tag );
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 Nepomuk2::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 Nepomuk2::Tag& tag, Nepomuk2::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 Nepomuk2::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 "moc_kedittagsdialog_p.cpp"