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

KDEUI

  • sources
  • kde-4.14
  • kdelibs
  • 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 
28 class 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 
54 KListWidget::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 
69 KListWidget::~KListWidget()
70 {
71  delete d;
72 }
73 
74 void 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 
86 void 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 
96 void 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 
123 void 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 
194 void 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 //
216 void 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 
232 void KListWidget::focusOutEvent( QFocusEvent *fe )
233 {
234  d->m_pAutoSelect->stop();
235 
236  QListWidget::focusOutEvent( fe );
237 }
238 
239 void KListWidget::leaveEvent( QEvent *e )
240 {
241  d->m_pAutoSelect->stop();
242 
243  QListWidget::leaveEvent( e );
244 }
245 
246 void 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 
260 void 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 
268 void 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"
QEvent
QWidget
QAbstractItemView::viewportEntered
void viewportEntered()
KGlobalSettings::SETTINGS_MOUSE
Definition: kglobalsettings.h:593
QListWidgetItem::isSelected
bool isSelected() const
kdebug.h
QApplication::keyboardModifiers
Qt::KeyboardModifiers keyboardModifiers()
QAbstractItemView::selectionMode
QAbstractItemView::SelectionMode selectionMode() const
kglobalsettings.h
KGlobalSettings::singleClick
static bool singleClick()
Returns whether KDE runs in single (default) or double click mode.
Definition: kglobalsettings.cpp:233
timeout
int timeout
QAbstractItemView::focusOutEvent
virtual void focusOutEvent(QFocusEvent *event)
QListView::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *e)
QListWidgetItem
QPoint
QMouseEvent
KGlobalSettings::self
static KGlobalSettings * self()
Return the KGlobalSettings singleton.
Definition: kglobalsettings.cpp:188
QListWidget
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
KListWidget::leaveEvent
virtual void leaveEvent(QEvent *e)
Definition: klistwidget.cpp:239
QMouseEvent::globalPos
const QPoint & globalPos() const
QEvent::ignore
void ignore()
QTimer
KListWidget::~KListWidget
~KListWidget()
Definition: klistwidget.cpp:69
QListWidget::item
QListWidgetItem * item(int row) const
KListWidget::KListWidget
KListWidget(QWidget *parent=0)
Definition: klistwidget.cpp:54
QObject::signalsBlocked
bool signalsBlocked() const
QInputEvent::modifiers
Qt::KeyboardModifiers modifiers() const
QKeyEvent::key
int key() const
QObject::blockSignals
bool blockSignals(bool block)
KGlobalSettings::changeCursorOverIcon
static bool changeCursorOverIcon()
Checks whether the cursor changes over icons.
Definition: kglobalsettings.cpp:255
QKeyEvent
QAbstractItemView::mousePressEvent
virtual void mousePressEvent(QMouseEvent *event)
KListWidget::mousePressEvent
virtual void mousePressEvent(QMouseEvent *e)
Definition: klistwidget.cpp:246
KListWidget::mouseDoubleClickEvent
virtual void mouseDoubleClickEvent(QMouseEvent *e)
Definition: klistwidget.cpp:260
KGlobalSettings::autoSelectDelay
static int autoSelectDelay()
Returns the KDE setting for the auto-select option.
Definition: kglobalsettings.cpp:261
KListWidget::focusOutEvent
virtual void focusOutEvent(QFocusEvent *e)
Definition: klistwidget.cpp:232
QAbstractItemView::keyPressEvent
virtual void keyPressEvent(QKeyEvent *event)
QListWidget::itemEntered
void itemEntered(QListWidgetItem *item)
QAbstractItemView::clearSelection
void clearSelection()
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KListWidget
A variant of QListWidget that honors KDE's system-wide settings.
Definition: klistwidget.h:40
QWidget::leaveEvent
virtual void leaveEvent(QEvent *event)
QCursor
klistwidget.h
QFocusEvent
QListWidgetItem::setSelected
void setSelected(bool select)
QAbstractItemView::mouseDoubleClickEvent
virtual void mouseDoubleClickEvent(QMouseEvent *event)
KListWidget::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *e)
Definition: klistwidget.cpp:268
KListWidget::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
Definition: klistwidget.cpp:216
Qt::KeyboardModifiers
typedef KeyboardModifiers
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:23:59 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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

Search



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