void KCompletionBox::setVisible( bool visible ) { if (visible) { d->upwardBox = false; if ( d->m_parent ) { sizeAndPosition(); qApp->installEventFilter( this ); } // ### we shouldn't need to call this, but without this, the scrollbars // are pretty b0rked. //triggerUpdate( true ); // Workaround for I'm not sure whose bug - if this KCompletionBox' parent // is in a layout, that layout will detect inserting new child (posted // ChildInserted event), and will trigger relayout (post LayoutHint event). // QWidget::show() sends also posted ChildInserted events for the parent, // and later all LayoutHint events, which causes layout updating. // The problem is, KCompletionBox::eventFilter() detects resizing // of the parent, and calls hide() - and this hide() happen in the middle // of show(), causing inconsistent state. I'll try to submit a Qt patch too. qApp->sendPostedEvents(); } else { if ( d->m_parent ) qApp->removeEventFilter( this ); d->cancelText.clear(); } KListWidget::setVisible(visible); }
void KCompletionBox::setItems( const QStringList& items ) { bool block = signalsBlocked(); blockSignals( true ); int rowIndex = 0; if (!count()) { addItems(items); } else { // Keep track of whether we need to change anything, // so we can avoid a repaint for identical updates, // to reduce flicker bool dirty = false; QStringList::ConstIterator it = items.constBegin(); const QStringList::ConstIterator itEnd = items.constEnd(); for ( ; it != itEnd; ++it) { if ( rowIndex < count() ) { const bool changed = ((KCompletionBoxItem*)item(rowIndex))->reuse( *it ); dirty = dirty || changed; } else { dirty = true; // Inserting an item is a way of making this dirty addItem(*it); } rowIndex++; } // If there is an unused item, mark as dirty -> less items now if (rowIndex < count()) { dirty = true; } // remove unused items with an index >= rowIndex for ( ; rowIndex < count() ; ) { QListWidgetItem* item = takeItem(rowIndex); Q_ASSERT(item); delete item; } //TODO KDE4 : Port me //if (dirty) // triggerUpdate( false ); } if (isVisible() && size().height() != sizeHint().height()) sizeAndPosition(); blockSignals(block); }
void KonqComboCompletionBox::setItems( const QStringList& items ) { bool block = signalsBlocked(); blockSignals( true ); int rowIndex = 0; if ( count() == 0 ) insertStringList( items ); else { //Keep track of whether we need to change anything, //so we can avoid a repaint for identical updates, //to reduce flicker bool dirty = false; QStringList::ConstIterator it = items.constBegin(); const QStringList::ConstIterator itEnd = items.constEnd(); for ( ; it != itEnd; ++it) { if ( rowIndex < count() ) { const bool changed = (static_cast<KonqListWidgetItem*>(item(rowIndex)))->reuse( *it ); dirty = dirty || changed; } else { dirty = true; //Inserting an item is a way of making this dirty addItem( new KonqListWidgetItem( *it ) ); } rowIndex++; } //If there is an unused item, mark as dirty -> less items now if ( rowIndex < count() ) dirty = true; while ( rowIndex < count() ) { delete item(rowIndex); } //TODO KDE 4 - Port this //if ( dirty ) // triggerUpdate( false ); } if ( isVisible() && size().height() != sizeHint().height() ) sizeAndPosition(); blockSignals( block ); }
void KCompletionBox::popup() { if ( count() == 0 ) hide(); else { bool block = signalsBlocked(); blockSignals( true ); setCurrentRow( -1 ); blockSignals( block ); clearSelection(); if ( !isVisible() ) show(); else if ( size().height() != sizeHint().height() ) sizeAndPosition(); } }