22 #include <QtGui/QListWidget>
23 #include <QtGui/QApplication>
24 #include <QtGui/QKeyEvent>
25 #include <QtCore/QEvent>
27 #include <QtCore/QTimer>
30 #define DEFAULT_CASESENSITIVE Qt::CaseInsensitive
32 class KListWidgetSearchLine::KListWidgetSearchLinePrivate
39 activeSearch(
false ),
43 void _k_listWidgetDeleted();
44 void _k_queueSearch(
const QString&);
45 void _k_activateSearch();
46 void _k_rowsInserted(
const QModelIndex&,
int,
int);
47 void _k_dataChanged(
const QModelIndex&,
const QModelIndex&);
50 void updateHiddenState(
int start,
int end );
54 Qt::CaseSensitivity caseSensitivity;
65 d( new KListWidgetSearchLinePrivate(this) )
68 d->init( listWidget );
79 return d->caseSensitivity;
92 d->search = s.isNull() ? text() : s;
94 d->updateHiddenState( 0, d->listWidget->count() - 1 );
101 if ( d->listWidget != 0 ) {
102 for (
int i = 0 ; i < d->listWidget->count(); ++i) {
103 d->listWidget->item( i )->setHidden(
false );
108 d->queuedSearches = 0;
114 d->caseSensitivity = cs;
119 if ( d->listWidget != 0 ) {
120 disconnect( d->listWidget, SIGNAL(destroyed()),
121 this, SLOT(_k_listWidgetDeleted()) );
122 d->listWidget->model()->disconnect(
this );
128 connect( d->listWidget, SIGNAL(destroyed()),
129 this, SLOT(_k_listWidgetDeleted()) );
130 connect( d->listWidget->model(), SIGNAL(rowsInserted(QModelIndex,
int,
int)),
131 this, SLOT(_k_rowsInserted(QModelIndex,
int,
int)) );
132 connect( d->listWidget->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
133 this, SLOT(_k_dataChanged(QModelIndex,QModelIndex)) );
151 return ( item->text().indexOf( s, 0,
152 caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive ) >= 0 );
155 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::init(
QListWidget *_listWidget )
157 listWidget = _listWidget;
159 connect( q, SIGNAL(textChanged(
QString)),
160 q, SLOT(_k_queueSearch(
QString)) );
162 if ( listWidget != 0 ) {
163 connect( listWidget, SIGNAL(destroyed()),
164 q, SLOT(_k_listWidgetDeleted()) );
165 connect( listWidget->model(), SIGNAL(rowsInserted(QModelIndex,
int,
int)),
166 q, SLOT(_k_rowsInserted(QModelIndex,
int,
int)) );
167 connect( listWidget->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
168 q, SLOT(_k_dataChanged(QModelIndex,QModelIndex)) );
169 q->setEnabled(
true );
171 q->setEnabled(
false );
174 q->setClearButtonShown(
true);
177 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::updateHiddenState(
int start,
int end ) {
182 QListWidgetItem *currentItem = listWidget->currentItem();
185 for(
int index = start; index <=
end; ++index ) {
186 QListWidgetItem *item = listWidget->item(index);
187 if ( ! q->itemMatches( item, search ) ) {
188 item->setHidden(
true );
190 if ( item == currentItem ) {
193 }
else if ( item->isHidden() ) {
194 item->setHidden(
false );
198 if ( listWidget->isSortingEnabled() ) {
199 listWidget->sortItems();
202 if ( currentItem != 0 ) {
203 listWidget->scrollToItem( currentItem );
209 if (event->type() == QEvent::KeyPress) {
210 QKeyEvent *keyEvent =
static_cast<QKeyEvent *
>(
event);
211 if(keyEvent->matches(QKeySequence::MoveToNextLine) || keyEvent->matches(QKeySequence::SelectNextLine) ||
212 keyEvent->matches(QKeySequence::MoveToPreviousLine) || keyEvent->matches(QKeySequence::SelectPreviousLine) ||
213 keyEvent->matches(QKeySequence::MoveToNextPage) || keyEvent->matches(QKeySequence::SelectNextPage) ||
214 keyEvent->matches(QKeySequence::MoveToPreviousPage) || keyEvent->matches(QKeySequence::SelectPreviousPage)
218 QApplication::sendEvent(d->listWidget, event);
222 else if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return ) {
225 QApplication::sendEvent(d->listWidget, event);
236 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::_k_queueSearch(
const QString &s )
240 QTimer::singleShot( 200, q, SLOT(_k_activateSearch()) );
243 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::_k_activateSearch()
247 if ( queuedSearches <= 0 ) {
248 q->updateSearch( search );
256 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::_k_listWidgetDeleted()
259 q->setEnabled(
false );
263 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::_k_rowsInserted(
const QModelIndex &parent,
int start,
int end )
265 if( parent.isValid() ) {
269 updateHiddenState( start, end );
272 void KListWidgetSearchLine::KListWidgetSearchLinePrivate::_k_dataChanged(
const QModelIndex & topLeft,
const QModelIndex & bottomRight )
274 if( topLeft.parent().isValid() ) {
278 updateHiddenState( topLeft.row(), bottomRight.row() );
283 #include "klistwidgetsearchline.moc"