24#include <QtCore/QStringList>
25#include <QtGui/QKeyEvent>
26#include <QtGui/QLabel>
27#include <QtGui/QLayout>
28#include <QtGui/QListView>
40class KEditListWidgetPrivate
53 QVBoxLayout* mainLayout;
54 QVBoxLayout* btnsLayout;
55 QStringListModel *model;
58 KEditListWidget::Buttons buttons;
61 QWidget *representationWidget = 0 );
63 void updateButtonState();
64 QModelIndex selectedIndex();
71void KEditListWidgetPrivate::init(
bool check, KEditListWidget::Buttons newButtons,
74 checkAtEntering = check;
76 servNewButton = servRemoveButton = servUpButton = servDownButton = 0L;
77 q->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
78 QSizePolicy::Preferred));
80 mainLayout =
new QVBoxLayout(q);
81 mainLayout->setMargin(0);
83 QHBoxLayout* subLayout =
new QHBoxLayout;
84 btnsLayout =
new QVBoxLayout;
85 btnsLayout->addStretch();
87 model =
new QStringListModel();
89 listView->setModel(model);
91 subLayout->addWidget(listView);
92 subLayout->addLayout(btnsLayout);
94 mainLayout->insertLayout(1, subLayout);
96 setEditor( lineEdit, representationWidget );
99 q->setButtons( newButtons );
101 q->connect(listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
102 SLOT(slotSelectionChanged(QItemSelection,QItemSelection)));
106void KEditListWidgetPrivate::setEditor(
KLineEdit* newLineEdit,
QWidget* representationWidget )
108 if (editingWidget != lineEdit &&
109 editingWidget != representationWidget) {
110 delete editingWidget;
112 if (lineEdit != newLineEdit) {
115 lineEdit = newLineEdit ? newLineEdit :
new KLineEdit(q);
116 editingWidget = representationWidget ?
117 representationWidget : lineEdit;
119 if ( representationWidget )
120 representationWidget->setParent(q);
122 mainLayout->insertWidget(0,editingWidget);
124 lineEdit->setTrapReturnKey(
true);
125 lineEdit->installEventFilter(q);
127 q->connect(lineEdit,SIGNAL(textChanged(QString)),SLOT(typedSomething(QString)));
128 q->connect(lineEdit,SIGNAL(returnPressed()),SLOT(addItem()));
131 q->typedSomething( lineEdit->text() );
135 q->setTabOrder(editingWidget, listView);
138 q->setTabOrder(w,servNewButton);
141 if (servRemoveButton) {
142 q->setTabOrder(w,servRemoveButton);
143 w = servRemoveButton;
146 q->setTabOrder(w,servUpButton);
149 if (servDownButton) {
150 q->setTabOrder(w,servDownButton);
156void KEditListWidgetPrivate::updateButtonState()
158 QModelIndex index = selectedIndex();
160 servUpButton->setEnabled(index.isValid());
162 if (servDownButton) {
163 servDownButton->setEnabled(index.isValid());
165 if (servRemoveButton) {
166 servRemoveButton->setEnabled(index.isValid());
170QModelIndex KEditListWidgetPrivate::selectedIndex()
173 const QModelIndexList selectedIndexes = selection->selectedIndexes();
174 if ( !selectedIndexes.isEmpty() && selectedIndexes[0].isValid() )
175 return selectedIndexes[0];
177 return QModelIndex();
181class KEditListWidget::CustomEditorPrivate
186 representationWidget(0),
195 : d(new CustomEditorPrivate(this))
200 : d(new CustomEditorPrivate(this))
202 d->representationWidget = repWidget;
207 : d(new CustomEditorPrivate(this))
209 d->representationWidget = combo;
210 d->lineEdit = qobject_cast<KLineEdit*>( combo->lineEdit() );
211 Q_ASSERT( d->lineEdit );
221 d->representationWidget = repWidget;
231 return d->representationWidget;
240 :
QWidget(parent), d(new KEditListWidgetPrivate(this))
247 bool checkAtEntering,
249 :
QWidget(parent), d(new KEditListWidgetPrivate(this))
277 return d->servNewButton;
282 return d->servRemoveButton;
287 return d->servUpButton;
292 return d->servDownButton;
297 return int(d->model->rowCount());
302 if ( d->buttons == buttons )
305 if ( ( buttons &
Add ) && !d->servNewButton ) {
307 d->servNewButton->setEnabled(
false);
308 d->servNewButton->show();
309 connect(d->servNewButton, SIGNAL(clicked()), SLOT(addItem()));
311 d->btnsLayout->insertWidget(0, d->servNewButton);
312 }
else if ( ( buttons & Add ) == 0 && d->servNewButton ) {
313 delete d->servNewButton;
314 d->servNewButton = 0;
317 if ( ( buttons &
Remove ) && !d->servRemoveButton ) {
319 d->servRemoveButton->setEnabled(
false);
320 d->servRemoveButton->show();
321 connect(d->servRemoveButton, SIGNAL(clicked()), SLOT(removeItem()));
323 d->btnsLayout->insertWidget(1, d->servRemoveButton);
324 }
else if ( ( buttons & Remove ) == 0 && d->servRemoveButton ) {
325 delete d->servRemoveButton;
326 d->servRemoveButton = 0;
329 if ( ( buttons &
UpDown ) && !d->servUpButton ) {
331 d->servUpButton->setEnabled(
false);
332 d->servUpButton->show();
333 connect(d->servUpButton, SIGNAL(clicked()), SLOT(moveItemUp()));
336 d->servDownButton->setEnabled(
false);
337 d->servDownButton->show();
338 connect(d->servDownButton, SIGNAL(clicked()), SLOT(moveItemDown()));
340 d->btnsLayout->insertWidget(2, d->servUpButton);
341 d->btnsLayout->insertWidget(3, d->servDownButton);
342 }
else if ( ( buttons & UpDown ) == 0 && d->servUpButton ) {
343 delete d->servUpButton; d->servUpButton = 0;
344 delete d->servDownButton; d->servDownButton = 0;
347 d->buttons = buttons;
352 d->checkAtEntering = check;
357 return d->checkAtEntering;
360void KEditListWidget::typedSomething(
const QString& text)
368 bool block = d->listView->signalsBlocked();
369 d->listView->blockSignals(
true );
370 QModelIndex currentIndex = d->selectedIndex();
371 if ( currentIndex.isValid() )
372 d->model->setData(currentIndex,text);
373 d->listView->blockSignals( block );
378 if ( !d->servNewButton )
381 if ( !d->lineEdit->hasAcceptableInput() ) {
382 d->servNewButton->setEnabled(
false);
386 if (!d->checkAtEntering)
387 d->servNewButton->setEnabled(!text.isEmpty());
392 d->servNewButton->setEnabled(
false);
396 QStringList list = d->model->stringList();
397 bool enable = !list.contains( text, Qt::CaseSensitive );
398 d->servNewButton->setEnabled( enable );
403void KEditListWidget::moveItemUp()
405 if (!d->listView->isEnabled())
411 QModelIndex index = d->selectedIndex();
412 if ( index.isValid() ) {
413 if (index.row() == 0) {
418 QModelIndex aboveIndex = d->model->index( index.row() - 1, index.column() );
420 QString tmp = d->model->data( aboveIndex, Qt::DisplayRole ).toString();
421 d->model->setData( aboveIndex, d->model->data( index, Qt::DisplayRole ) );
422 d->model->setData( index, tmp );
424 d->listView->selectionModel()->select(index, QItemSelectionModel::Deselect);
425 d->listView->selectionModel()->select(aboveIndex, QItemSelectionModel::Select);
431void KEditListWidget::moveItemDown()
433 if (!d->listView->isEnabled())
439 QModelIndex index = d->selectedIndex();
440 if ( index.isValid() ) {
441 if (index.row() == d->model->rowCount() - 1) {
446 QModelIndex belowIndex = d->model->index( index.row() + 1, index.column() );
448 QString tmp = d->model->data( belowIndex, Qt::DisplayRole ).toString();
449 d->model->setData( belowIndex, d->model->data( index, Qt::DisplayRole ) );
450 d->model->setData( index, tmp );
452 d->listView->selectionModel()->select(index, QItemSelectionModel::Deselect);
453 d->listView->selectionModel()->select(belowIndex, QItemSelectionModel::Select);
459void KEditListWidget::addItem()
464 if ( !d->servNewButton || !d->servNewButton->isEnabled() )
467 QModelIndex currentIndex = d->selectedIndex();
469 const QString& currentTextLE=d->lineEdit->text();
470 bool alreadyInList(
false);
472 if (!d->checkAtEntering)
475 if ( currentIndex.isValid() ) {
476 if ( d->model->data( currentIndex, Qt::DisplayRole ).toString() == currentTextLE )
477 alreadyInList =
true;
481 alreadyInList = d->model->stringList().contains( currentTextLE, Qt::CaseSensitive );
484 if ( d->servNewButton )
485 d->servNewButton->setEnabled(
false);
487 bool block = d->lineEdit->signalsBlocked();
488 d->lineEdit->blockSignals(
true);
489 d->lineEdit->clear();
490 d->lineEdit->blockSignals(block);
492 d->listView->selectionModel()->setCurrentIndex(currentIndex, QItemSelectionModel::Deselect);
496 block = d->listView->signalsBlocked();
498 if ( currentIndex.isValid() ) {
499 d->model->setData(currentIndex, currentTextLE );
503 lst<<d->model->stringList();
504 d->model->setStringList(lst);
507 emit
added( currentTextLE );
510 d->updateButtonState();
515 QModelIndex selectedIndex = d->selectedIndex();
516 if ( selectedIndex.isValid() )
517 return selectedIndex.row();
522void KEditListWidget::removeItem()
524 QModelIndex currentIndex = d->selectedIndex();
525 if ( !currentIndex.isValid() )
528 if ( currentIndex.row() >= 0 )
530 QString removedText = d->model->data( currentIndex, Qt::DisplayRole ).toString();
532 d->model->removeRows( currentIndex.row(), 1 );
534 d->listView->selectionModel()->clear();
538 emit removed( removedText );
541 d->updateButtonState();
544void KEditListWidget::enableMoveButtons(
const QModelIndex &newIndex,
const QModelIndex&)
546 int index = newIndex.row();
552 bool moveEnabled = d->servUpButton && d->servDownButton;
556 if (d->model->rowCount() <= 1)
558 d->servUpButton->setEnabled(
false);
559 d->servDownButton->setEnabled(
false);
561 else if (index == (d->model->rowCount() - 1))
563 d->servUpButton->setEnabled(
true);
564 d->servDownButton->setEnabled(
false);
568 d->servUpButton->setEnabled(
false);
569 d->servDownButton->setEnabled(
true);
573 d->servUpButton->setEnabled(
true);
574 d->servDownButton->setEnabled(
true);
578 if ( d->servRemoveButton )
579 d->servRemoveButton->setEnabled(
true);
584 d->lineEdit->clear();
585 d->model->setStringList( QStringList() );
591 QStringList content = d->model->stringList();
595 for (
int i = 0, j = index; i < list.count(); ++i, ++j )
596 content.insert( j, list[ i ] );
598 d->model->setStringList( content );
603 QStringList list = d->model->stringList();
608 list.insert( index, text );
610 d->model->setStringList(list);
615 const QStringList list = d->model->stringList();
617 return list[ index ];
622 QModelIndex index = d->selectedIndex();
623 if ( !index.isValid() )
626 return text( index.row() );
631 return d->model->stringList();
636 d->model->setStringList(items);
644void KEditListWidget::slotSelectionChanged(
const QItemSelection&,
const QItemSelection& )
646 d->updateButtonState();
647 QModelIndex index = d->selectedIndex();
648 enableMoveButtons(index, QModelIndex());
649 if (index.isValid()) {
650 d->lineEdit->setFocus( Qt::OtherFocusReason );
656 if (o == d->lineEdit && e->type() == QEvent::KeyPress ) {
657 QKeyEvent* keyEvent = (QKeyEvent*)e;
658 if (keyEvent->key() == Qt::Key_Down ||
659 keyEvent->key() == Qt::Key_Up) {
660 return ((
QObject*)d->listView)->event(e);
667#include "keditlistwidget.moc"
A wrapper around QIcon that provides KDE icon features.
An enhanced QLineEdit widget for inputting text.
static void beep(const QString &reason=QString(), QWidget *widget=0L)
This is a simple substitution for QApplication::beep()
QString i18n(const char *text)