• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KDEUI

  • kdeui
  • itemviews
klistwidget.cpp
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 Copyright (C) 2000 Reginald Stadlbauer <reggie@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation.
7
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details.
12
13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16 Boston, MA 02110-1301, USA.
17*/
18
19#include "klistwidget.h"
20
21#include <kglobalsettings.h>
22#include <kdebug.h>
23
24#include <QtCore/QTimer>
25#include <QKeyEvent>
26#include <QApplication>
27
28class KListWidget::KListWidgetPrivate
29{
30 public:
31 KListWidgetPrivate(KListWidget *q)
32 : q(q),
33 m_pCurrentItem(0),
34 m_eventPos()
35 {
36 }
37
38 void _k_slotItemEntered(QListWidgetItem*);
39 void _k_slotOnViewport();
40 void _k_slotSettingsChanged(int);
41 void _k_slotAutoSelect();
42 void _k_slotEmitExecute(QListWidgetItem *item);
43
44 KListWidget *q;
45 bool m_bUseSingle : 1;
46 bool m_bChangeCursorOverItem : 1;
47
48 QListWidgetItem* m_pCurrentItem;
49 QTimer* m_pAutoSelect;
50 int m_autoSelectDelay;
51 QPoint m_eventPos;
52};
53
54KListWidget::KListWidget( QWidget *parent )
55 : QListWidget(parent), d(new KListWidgetPrivate(this))
56{
57 connect( this, SIGNAL(viewportEntered()),
58 this, SLOT(_k_slotOnViewport()) );
59 connect( this, SIGNAL(itemEntered(QListWidgetItem*)),
60 this, SLOT(_k_slotItemEntered(QListWidgetItem*)) );
61 d->_k_slotSettingsChanged(KGlobalSettings::SETTINGS_MOUSE);
62 connect( KGlobalSettings::self(), SIGNAL(settingsChanged(int)), SLOT(_k_slotSettingsChanged(int)) );
63
64 d->m_pAutoSelect = new QTimer( this );
65 connect( d->m_pAutoSelect, SIGNAL(timeout()),
66 this, SLOT(_k_slotAutoSelect()) );
67}
68
69KListWidget::~KListWidget()
70{
71 delete d;
72}
73
74void KListWidget::KListWidgetPrivate::_k_slotItemEntered( QListWidgetItem *item )
75{
76 if ( item && m_bChangeCursorOverItem && m_bUseSingle )
77 q->viewport()->setCursor( QCursor( Qt::OpenHandCursor ) );
78
79 if ( item && (m_autoSelectDelay > -1) && m_bUseSingle ) {
80 m_pAutoSelect->setSingleShot( true );
81 m_pAutoSelect->start( m_autoSelectDelay );
82 m_pCurrentItem = item;
83 }
84}
85
86void KListWidget::KListWidgetPrivate::_k_slotOnViewport()
87{
88 if ( m_bChangeCursorOverItem )
89 q->viewport()->unsetCursor();
90
91 m_pAutoSelect->stop();
92 m_pCurrentItem = 0;
93}
94
95
96void KListWidget::KListWidgetPrivate::_k_slotSettingsChanged(int category)
97{
98 if (category != KGlobalSettings::SETTINGS_MOUSE)
99 return;
100 m_bUseSingle = KGlobalSettings::singleClick();
101
102 q->disconnect(q, SIGNAL(itemClicked(QListWidgetItem*)));
103 q->disconnect(q, SIGNAL(itemDoubleClicked(QListWidgetItem*)));
104
105 if( m_bUseSingle )
106 {
107 q->connect(q, SIGNAL(itemClicked(QListWidgetItem*)),
108 SLOT(_k_slotEmitExecute(QListWidgetItem*)));
109 }
110 else
111 {
112 q->connect(q, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
113 SLOT(_k_slotEmitExecute(QListWidgetItem*)));
114 }
115
116 m_bChangeCursorOverItem = KGlobalSettings::changeCursorOverIcon();
117 m_autoSelectDelay = KGlobalSettings::autoSelectDelay();
118
119 if( !m_bUseSingle || !m_bChangeCursorOverItem )
120 q->viewport()->unsetCursor();
121}
122
123void KListWidget::KListWidgetPrivate::_k_slotAutoSelect()
124{
125 // check that the item still exists
126 if( q->row( m_pCurrentItem ) == -1 )
127 return;
128
129 //Give this widget the keyboard focus.
130 if( !q->hasFocus() )
131 q->setFocus();
132
133 Qt::KeyboardModifiers keybstate = QApplication::keyboardModifiers();
134
135 QListWidgetItem* previousItem = q->currentItem();
136 q->setCurrentItem( m_pCurrentItem );
137
138 if( m_pCurrentItem ) {
139 //Shift pressed?
140 if( (keybstate & Qt::ShiftModifier) ) {
141 bool block = q->signalsBlocked();
142 q->blockSignals( true );
143
144 //No Ctrl? Then clear before!
145 if( !(keybstate & Qt::ControlModifier) )
146 q->clearSelection();
147
148 bool select = !m_pCurrentItem->isSelected();
149 bool update = q->viewport()->updatesEnabled();
150 q->viewport()->setUpdatesEnabled( false );
151
152 bool down = q->row( previousItem ) < q->row( m_pCurrentItem );
153 QListWidgetItem* it = down ? previousItem : m_pCurrentItem;
154
155 for (int i = q->row(it) ; i < q->count() ; i++ ) {
156 if ( down && q->item(i) == m_pCurrentItem ) {
157 m_pCurrentItem->setSelected(select);
158 break;
159 }
160
161 if ( !down && q->item(i) == previousItem ) {
162 previousItem->setSelected(select);
163 break;
164 }
165 it->setSelected(select);
166 }
167
168 q->blockSignals( block );
169 q->viewport()->setUpdatesEnabled( update );
170
171 emit q->itemSelectionChanged();
172
173 if( q->selectionMode() == QAbstractItemView::SingleSelection )
174 q->emit itemSelectionChanged();
175 }
176 else if( (keybstate & Qt::ControlModifier) )
177 m_pCurrentItem->setSelected(!m_pCurrentItem->isSelected());
178 else {
179 bool block = q->signalsBlocked();
180 q->blockSignals( true );
181
182 if( !m_pCurrentItem->isSelected() )
183 q->clearSelection();
184
185 q->blockSignals( block );
186
187 m_pCurrentItem->setSelected(true);
188 }
189 }
190 else
191 kDebug() << "That's not supposed to happen!!!!";
192}
193
194void KListWidget::KListWidgetPrivate::_k_slotEmitExecute(QListWidgetItem *item)
195{
196 Qt::KeyboardModifiers keybstate = QApplication::keyboardModifiers();
197
198 m_pAutoSelect->stop();
199
200 //Don't emit executed if in SC mode and Shift or Ctrl are pressed
201 if( !( m_bUseSingle && ((keybstate & Qt::ShiftModifier) || (keybstate & Qt::ControlModifier)) ) ) {
202 emit q->executed( item );
203 if (!m_eventPos.isNull()) {
204 emit q->executed( item, m_eventPos );
205 }
206 }
207}
208
209//
210// 2000-16-01 Espen Sand
211// This widget is used in dialogs. It should ignore
212// F1 (and combinations) and Escape since these are used
213// to start help or close the dialog. This functionality
214// should be done in QListView but it is not (at least now)
215//
216void KListWidget::keyPressEvent(QKeyEvent *e)
217{
218 if( e->key() == Qt::Key_Escape )
219 {
220 e->ignore();
221 }
222 else if( e->key() == Qt::Key_F1 )
223 {
224 e->ignore();
225 }
226 else
227 {
228 QListWidget::keyPressEvent(e);
229 }
230}
231
232void KListWidget::focusOutEvent( QFocusEvent *fe )
233{
234 d->m_pAutoSelect->stop();
235
236 QListWidget::focusOutEvent( fe );
237}
238
239void KListWidget::leaveEvent( QEvent *e )
240{
241 d->m_pAutoSelect->stop();
242
243 QListWidget::leaveEvent( e );
244}
245
246void KListWidget::mousePressEvent( QMouseEvent *e )
247{
248 if( (selectionMode() == QAbstractItemView::ExtendedSelection) && (e->modifiers() & Qt::ShiftModifier) && !(e->modifiers() & Qt::ControlModifier) ) {
249 bool block = signalsBlocked();
250 blockSignals( true );
251
252 clearSelection();
253
254 blockSignals( block );
255 }
256
257 QListWidget::mousePressEvent( e );
258}
259
260void KListWidget::mouseDoubleClickEvent ( QMouseEvent * e )
261{
262 QPoint oldPos = d->m_eventPos;
263 d->m_eventPos = e->globalPos();
264 QListWidget::mouseDoubleClickEvent(e);
265 d->m_eventPos = oldPos;
266}
267
268void KListWidget::mouseReleaseEvent ( QMouseEvent * e )
269{
270 QPoint oldPos = d->m_eventPos;
271 d->m_eventPos = e->globalPos();
272 QListWidget::mouseReleaseEvent(e);
273 d->m_eventPos = oldPos;
274}
275
276#include "klistwidget.moc"
KGlobalSettings::singleClick
static bool singleClick()
Returns whether KDE runs in single (default) or double click mode.
Definition: kglobalsettings.cpp:233
KGlobalSettings::autoSelectDelay
static int autoSelectDelay()
Returns the KDE setting for the auto-select option.
Definition: kglobalsettings.cpp:261
KGlobalSettings::self
static KGlobalSettings * self()
Return the KGlobalSettings singleton.
Definition: kglobalsettings.cpp:188
KGlobalSettings::changeCursorOverIcon
static bool changeCursorOverIcon()
Checks whether the cursor changes over icons.
Definition: kglobalsettings.cpp:255
KGlobalSettings::SETTINGS_MOUSE
@ SETTINGS_MOUSE
Definition: kglobalsettings.h:593
KListWidget
A variant of QListWidget that honors KDE's system-wide settings.
Definition: klistwidget.h:41
KListWidget::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
Definition: klistwidget.cpp:216
KListWidget::leaveEvent
virtual void leaveEvent(QEvent *e)
Definition: klistwidget.cpp:239
KListWidget::mousePressEvent
virtual void mousePressEvent(QMouseEvent *e)
Definition: klistwidget.cpp:246
KListWidget::focusOutEvent
virtual void focusOutEvent(QFocusEvent *e)
Definition: klistwidget.cpp:232
KListWidget::mouseDoubleClickEvent
virtual void mouseDoubleClickEvent(QMouseEvent *e)
Definition: klistwidget.cpp:260
KListWidget::~KListWidget
~KListWidget()
Definition: klistwidget.cpp:69
KListWidget::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *e)
Definition: klistwidget.cpp:268
KListWidget::KListWidget
KListWidget(QWidget *parent=0)
Definition: klistwidget.cpp:54
QCursor
QListWidget
QWidget
kDebug
#define kDebug
kdebug.h
kglobalsettings.h
timeout
int timeout
klistwidget.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal