21 #include "keditlistbox.h"
23 #include <QStringList>
28 #include <QPushButton>
30 #include <kcombobox.h>
32 #include <klineedit.h>
34 #include <knotification.h>
38 class KEditListBoxPrivate
43 editingWidget(nullptr),
60 QWidget *representationWidget =
nullptr);
61 void setEditor(
KLineEdit *lineEdit,
QWidget *representationWidget =
nullptr);
62 void updateButtonState();
72 checkAtEntering = check;
74 servNewButton = servRemoveButton = servUpButton = servDownButton =
nullptr;
86 listView->setModel(model);
91 mainLayout->insertLayout(1, subLayout);
93 setEditor(lineEdit, representationWidget);
96 q->setButtons(newButtons);
102 void KEditListBoxPrivate::setEditor(
KLineEdit *newLineEdit,
QWidget *representationWidget)
104 if (editingWidget != lineEdit &&
105 editingWidget != representationWidget) {
106 delete editingWidget;
108 if (lineEdit != newLineEdit) {
111 lineEdit = newLineEdit ? newLineEdit :
new KLineEdit(q);
112 editingWidget = representationWidget ?
113 representationWidget : lineEdit;
115 if (representationWidget) {
119 mainLayout->insertWidget(0, editingWidget);
121 lineEdit->setTrapReturnKey(
true);
122 lineEdit->installEventFilter(q);
124 q->connect(lineEdit, SIGNAL(textChanged(
QString)), SLOT(typedSomething(
QString)));
125 q->connect(lineEdit, SIGNAL(returnPressed()), SLOT(addItem()));
128 q->typedSomething(lineEdit->text());
131 q->setTabOrder(editingWidget, listView);
137 if (servRemoveButton) {
139 w = servRemoveButton;
145 if (servDownButton) {
151 void KEditListBoxPrivate::updateButtonState()
155 servUpButton->setEnabled(index.
isValid());
157 if (servDownButton) {
158 servDownButton->setEnabled(index.
isValid());
160 if (servRemoveButton) {
161 servRemoveButton->setEnabled(index.
isValid());
169 if (!selectedIndexes.isEmpty() && selectedIndexes[0].isValid()) {
170 return selectedIndexes[0];
181 representationWidget(nullptr),
189 KEditListBox::CustomEditor::CustomEditor()
190 : d(new CustomEditorPrivate(this))
194 KEditListBox::CustomEditor::CustomEditor(
QWidget *repWidget,
KLineEdit *edit)
195 : d(new CustomEditorPrivate(this))
197 d->representationWidget = repWidget;
201 KEditListBox::CustomEditor::CustomEditor(
KComboBox *combo)
202 : d(new CustomEditorPrivate(this))
204 d->representationWidget = combo;
205 d->lineEdit = qobject_cast<KLineEdit *>(combo->
lineEdit());
206 Q_ASSERT(d->lineEdit);
209 KEditListBox::CustomEditor::~CustomEditor()
214 void KEditListBox::CustomEditor::setRepresentationWidget(
QWidget *repWidget)
216 d->representationWidget = repWidget;
219 void KEditListBox::CustomEditor::setLineEdit(
KLineEdit *edit)
224 QWidget *KEditListBox::CustomEditor::representationWidget()
const
226 return d->representationWidget;
229 KLineEdit *KEditListBox::CustomEditor::lineEdit()
const
241 :
QGroupBox(title, parent), d(new KEditListBoxPrivate(this))
247 bool checkAtEntering,
Buttons buttons)
248 :
QGroupBox(parent), d(new KEditListBoxPrivate(this))
255 const char *name,
bool checkAtEntering,
Buttons buttons)
256 :
QGroupBox(title, parent), d(new KEditListBoxPrivate(this))
263 QWidget *parent,
const char *name,
264 bool checkAtEntering,
Buttons buttons)
265 :
QGroupBox(title, parent), d(new KEditListBoxPrivate(this))
268 d->lineEdit = custom.lineEdit();
272 KEditListBox::~KEditListBox()
279 d->setEditor(editor.lineEdit(), editor.representationWidget());
294 return d->servNewButton;
299 return d->servRemoveButton;
304 return d->servUpButton;
309 return d->servDownButton;
314 return int(d->model->rowCount());
319 if (d->buttons == buttons) {
323 if ((buttons & Add) && !d->servNewButton) {
325 d->servNewButton->setEnabled(
false);
326 d->servNewButton->show();
329 d->btnsLayout->insertWidget(0, d->servNewButton);
330 }
else if ((buttons & Add) == 0 && d->servNewButton) {
331 delete d->servNewButton;
332 d->servNewButton =
nullptr;
335 if ((buttons & Remove) && !d->servRemoveButton) {
337 d->servRemoveButton->setEnabled(
false);
338 d->servRemoveButton->show();
339 connect(d->servRemoveButton, SIGNAL(
clicked()), SLOT(removeItem()));
341 d->btnsLayout->insertWidget(1, d->servRemoveButton);
342 }
else if ((buttons & Remove) == 0 && d->servRemoveButton) {
343 delete d->servRemoveButton;
344 d->servRemoveButton =
nullptr;
347 if ((buttons & UpDown) && !d->servUpButton) {
349 d->servUpButton->setEnabled(
false);
350 d->servUpButton->show();
354 d->servDownButton->setEnabled(
false);
355 d->servDownButton->show();
356 connect(d->servDownButton, SIGNAL(
clicked()), SLOT(moveItemDown()));
358 d->btnsLayout->insertWidget(2, d->servUpButton);
359 d->btnsLayout->insertWidget(3, d->servDownButton);
360 }
else if ((buttons & UpDown) == 0 && d->servUpButton) {
361 delete d->servUpButton; d->servUpButton =
nullptr;
362 delete d->servDownButton; d->servDownButton =
nullptr;
365 d->buttons = buttons;
370 d->checkAtEntering = check;
375 return d->checkAtEntering;
378 void KEditListBox::typedSomething(
const QString &text)
385 bool block = d->listView->signalsBlocked();
386 d->listView->blockSignals(
true);
389 d->model->setData(currentIndex,
text);
391 d->listView->blockSignals(block);
396 if (!d->servNewButton) {
400 if (!d->lineEdit->hasAcceptableInput()) {
401 d->servNewButton->setEnabled(
false);
405 if (!d->checkAtEntering) {
409 d->servNewButton->setEnabled(
false);
413 d->servNewButton->setEnabled(enable);
418 void KEditListBox::moveItemUp()
420 if (!d->listView->isEnabled()) {
427 if (index.
row() == 0) {
436 d->model->setData(index, tmp);
445 void KEditListBox::moveItemDown()
447 if (!d->listView->isEnabled()) {
454 if (index.
row() == d->model->rowCount() - 1) {
463 d->model->setData(index, tmp);
472 void KEditListBox::addItem()
477 if (!d->servNewButton || !d->servNewButton->isEnabled()) {
483 const QString ¤tTextLE = d->lineEdit->text();
484 bool alreadyInList(
false);
486 if (!d->checkAtEntering) {
489 if (d->model->data(currentIndex,
Qt::DisplayRole).toString() == currentTextLE) {
490 alreadyInList =
true;
493 alreadyInList = d->model->stringList().contains(currentTextLE,
Qt::CaseSensitive);
496 if (d->servNewButton) {
497 d->servNewButton->setEnabled(
false);
500 bool block = d->lineEdit->signalsBlocked();
501 d->lineEdit->blockSignals(
true);
502 d->lineEdit->clear();
503 d->lineEdit->blockSignals(block);
507 if (!alreadyInList) {
508 block = d->listView->signalsBlocked();
511 d->model->setData(currentIndex, currentTextLE);
514 lst << currentTextLE;
515 lst << d->model->stringList();
516 d->model->setStringList(lst);
519 emit
added(currentTextLE);
522 d->updateButtonState();
529 return selectedIndex.
row();
535 void KEditListBox::removeItem()
542 if (currentIndex.
row() >= 0) {
545 d->model->removeRows(currentIndex.
row(), 1);
547 d->listView->selectionModel()->clear();
554 d->updateButtonState();
559 int index = newIndex.
row();
566 bool moveEnabled = d->servUpButton && d->servDownButton;
569 if (d->model->rowCount() <= 1) {
570 d->servUpButton->setEnabled(
false);
571 d->servDownButton->setEnabled(
false);
572 }
else if (index == (d->model->rowCount() - 1)) {
573 d->servUpButton->setEnabled(
true);
574 d->servDownButton->setEnabled(
false);
575 }
else if (index == 0) {
576 d->servUpButton->setEnabled(
false);
577 d->servDownButton->setEnabled(
true);
579 d->servUpButton->setEnabled(
true);
580 d->servDownButton->setEnabled(
true);
584 if (d->servRemoveButton) {
585 d->servRemoveButton->setEnabled(
true);
591 d->lineEdit->clear();
602 for (
int i = 0, j = index; i < list.
count(); ++i, ++j) {
603 content.
insert(j, list[ i ]);
606 d->model->setStringList(content);
619 d->model->setStringList(list);
626 return list[ index ];
641 return d->model->stringList();
646 d->model->setStringList(items);
656 d->updateButtonState();
677 #include "moc_keditlistbox.cpp"