24 #include <QtCore/QTimer>
26 #include <QApplication>
28 class KListWidget::KListWidgetPrivate
37 void emitExecute( QListWidgetItem *item,
const QPoint &pos );
39 void _k_slotItemEntered(QListWidgetItem*);
40 void _k_slotOnViewport();
41 void _k_slotSettingsChanged(
int);
42 void _k_slotAutoSelect();
45 bool m_bUseSingle : 1;
46 bool m_bChangeCursorOverItem : 1;
48 QListWidgetItem* m_pCurrentItem;
49 QTimer* m_pAutoSelect;
50 int m_autoSelectDelay;
54 :
QListWidget(parent), d(new KListWidgetPrivate(this))
56 connect(
this, SIGNAL(viewportEntered()),
57 this, SLOT(_k_slotOnViewport()) );
58 connect(
this, SIGNAL(itemEntered(QListWidgetItem*)),
59 this, SLOT(_k_slotItemEntered(QListWidgetItem*)) );
63 d->m_pAutoSelect =
new QTimer(
this );
64 connect( d->m_pAutoSelect, SIGNAL(
timeout()),
65 this, SLOT(_k_slotAutoSelect()) );
73 void KListWidget::KListWidgetPrivate::_k_slotItemEntered( QListWidgetItem *item )
75 if ( item && m_bChangeCursorOverItem && m_bUseSingle )
76 q->viewport()->setCursor(
QCursor( Qt::OpenHandCursor ) );
78 if ( item && (m_autoSelectDelay > -1) && m_bUseSingle ) {
79 m_pAutoSelect->setSingleShot(
true );
80 m_pAutoSelect->start( m_autoSelectDelay );
81 m_pCurrentItem = item;
85 void KListWidget::KListWidgetPrivate::_k_slotOnViewport()
87 if ( m_bChangeCursorOverItem )
88 q->viewport()->unsetCursor();
90 m_pAutoSelect->stop();
95 void KListWidget::KListWidgetPrivate::_k_slotSettingsChanged(
int category)
101 q->disconnect(q, SIGNAL(itemClicked(QListWidgetItem*)));
102 q->disconnect(q, SIGNAL(itemDoubleClicked(QListWidgetItem*)));
106 q->connect(q, SIGNAL(itemClicked(QListWidgetItem*)),
107 SIGNAL(executed(QListWidgetItem*)));
111 q->connect(q, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
112 SIGNAL(executed(QListWidgetItem*)));
118 if( !m_bUseSingle || !m_bChangeCursorOverItem )
119 q->viewport()->unsetCursor();
122 void KListWidget::KListWidgetPrivate::_k_slotAutoSelect()
125 if( q->row( m_pCurrentItem ) == -1 )
132 Qt::KeyboardModifiers keybstate = QApplication::keyboardModifiers();
134 QListWidgetItem* previousItem = q->currentItem();
135 q->setCurrentItem( m_pCurrentItem );
137 if( m_pCurrentItem ) {
139 if( (keybstate & Qt::ShiftModifier) ) {
140 bool block = q->signalsBlocked();
141 q->blockSignals(
true );
144 if( !(keybstate & Qt::ControlModifier) )
147 bool select = !m_pCurrentItem->isSelected();
148 bool update = q->viewport()->updatesEnabled();
149 q->viewport()->setUpdatesEnabled(
false );
151 bool down = q->row( previousItem ) < q->row( m_pCurrentItem );
152 QListWidgetItem* it = down ? previousItem : m_pCurrentItem;
154 for (
int i = q->row(it) ; i < q->count() ; i++ ) {
155 if ( down && q->item(i) == m_pCurrentItem ) {
156 m_pCurrentItem->setSelected(select);
160 if ( !down && q->item(i) == previousItem ) {
161 previousItem->setSelected(select);
164 it->setSelected(select);
167 q->blockSignals( block );
168 q->viewport()->setUpdatesEnabled( update );
170 emit q->itemSelectionChanged();
172 if( q->selectionMode() == QAbstractItemView::SingleSelection )
173 q->emit itemSelectionChanged();
175 else if( (keybstate & Qt::ControlModifier) )
176 m_pCurrentItem->setSelected(!m_pCurrentItem->isSelected());
178 bool block = q->signalsBlocked();
179 q->blockSignals(
true );
181 if( !m_pCurrentItem->isSelected() )
184 q->blockSignals( block );
186 m_pCurrentItem->setSelected(
true);
190 kDebug() <<
"That's not supposed to happen!!!!";
193 void KListWidget::KListWidgetPrivate::emitExecute( QListWidgetItem *item,
const QPoint &pos )
195 Qt::KeyboardModifiers keybstate = QApplication::keyboardModifiers();
197 m_pAutoSelect->stop();
200 if( !( m_bUseSingle && ((keybstate & Qt::ShiftModifier) || (keybstate & Qt::ControlModifier)) ) ) {
201 emit q->executed( item );
202 emit q->executed( item, pos );
215 if( e->key() == Qt::Key_Escape )
219 else if( e->key() == Qt::Key_F1 )
231 d->m_pAutoSelect->stop();
238 d->m_pAutoSelect->stop();
245 if( (selectionMode() == QAbstractItemView::ExtendedSelection) && (e->modifiers() & Qt::ShiftModifier) && !(e->modifiers() & Qt::ControlModifier) ) {
246 bool block = signalsBlocked();
247 blockSignals(
true );
251 blockSignals( block );
261 QListWidgetItem* item = itemAt( e->pos() );
266 if( (e->button() == Qt::LeftButton) && !d->m_bUseSingle )
267 d->emitExecute( item, e->globalPos() );
271 #include "klistwidget.moc"