@@ -213,7 +213,7 @@ def __init__(self, parent):
213
213
self .mousePressed = False
214
214
self .shiftPressed = False
215
215
self .ctrlPressed = False
216
- self .selectedRows = {}
216
+ self ._rows_selection = {}
217
217
self .trackingCol = 0
218
218
219
219
#eventFilter to catch key up/down events and wheel events
@@ -275,12 +275,17 @@ def scrollViewport(self, row):
275
275
self .vScrollBar .setValue (pos )
276
276
return pos
277
277
278
+ return None
279
+
278
280
def mouseReleaseEvent (self , event ):
279
281
super ().mouseReleaseEvent (event )
280
282
self .mousePressed = False
283
+ if event .button () != Qt .LeftButton :
284
+ return
285
+
281
286
for idx in self .selectionModel ().selectedRows (self .trackingCol ):
282
- if idx .data () not in self .selectedRows .keys ():
283
- self .selectedRows [idx .data ()] = self .getRowCells (idx .row ())
287
+ if idx .data () != None and idx . data () not in self ._rows_selection .keys ():
288
+ self ._rows_selection [idx .data ()] = self .getRowCells (idx .row ())
284
289
285
290
# TODO: handle selection ranges when Shift is pressed
286
291
self ._selectSavedIndex ()
@@ -294,7 +299,7 @@ def mouseMoveEvent(self, event):
294
299
if item == None :
295
300
return
296
301
297
- clickedItem = self .model ().index (item . row () , self .trackingCol )
302
+ clickedItem = self .model ().index (row , self .trackingCol )
298
303
if clickedItem .data () == None :
299
304
return
300
305
self .handleMouseMoveEvent (row , clickedItem , self .selectionModel ().isRowSelected (row ))
@@ -305,10 +310,10 @@ def mouseMoveEvent(self, event):
305
310
306
311
def handleMouseMoveEvent (self , row , clickedItem , selected ):
307
312
if not selected :
308
- if clickedItem .data () in self .selectedRows .keys ():
309
- del self .selectedRows [clickedItem .data ()]
313
+ if clickedItem .data () in self ._rows_selection .keys ():
314
+ del self ._rows_selection [clickedItem .data ()]
310
315
else :
311
- self .selectedRows [clickedItem .data ()] = self .getRowCells (row )
316
+ self ._rows_selection [clickedItem .data ()] = self .getRowCells (row )
312
317
313
318
# handle scrolling the view while dragging the mouse.
314
319
if self .mousePressed :
@@ -319,15 +324,14 @@ def handleMouseMoveEvent(self, row, clickedItem, selected):
319
324
nextItem = self .model ().index (scrollPos , self .trackingCol )
320
325
if nextItem == None or nextItem .data () == None :
321
326
return
322
- if clickedItem .data () not in self .selectedRows .keys ():
323
- self .selectedRows [nextItem .data ()] = self .getRowCells (nextItem .row ())
327
+ if clickedItem .data () not in self ._rows_selection .keys ():
328
+ self ._rows_selection [nextItem .data ()] = self .getRowCells (nextItem .row ())
324
329
325
330
# save the selected index, to preserve selection when moving around.
326
331
def mousePressEvent (self , event ):
327
332
# we need to call upper class to paint selections properly
328
333
super ().mousePressEvent (event )
329
- if event .button () != Qt .LeftButton :
330
- return
334
+ rightBtnPressed = event .button () != Qt .LeftButton
331
335
332
336
pos = event .pos ()
333
337
item = self .indexAt (pos )
@@ -339,7 +343,7 @@ def mousePressEvent(self, event):
339
343
if clickedItem .data () == None :
340
344
return
341
345
342
- self .mousePressed = True
346
+ self .mousePressed = not rightBtnPressed
343
347
flags = QItemSelectionModel .Rows | QItemSelectionModel .SelectCurrent
344
348
345
349
# 1. if ctrl is pressed, select / deselect current row
@@ -349,20 +353,21 @@ def mousePressEvent(self, event):
349
353
# 3. if ctrl is not pressed and there's more than one row selected, and
350
354
# the clicked row is selected: discard selection, and select current
351
355
# clicked row.
352
- rowSelected = clickedItem .data () in self .selectedRows .keys ()
356
+ # 4. if Left button has not been pressed, do not discard the selection.
357
+ rowSelected = clickedItem .data () in self ._rows_selection .keys ()
353
358
if self .ctrlPressed :
354
359
if rowSelected :
355
- del self .selectedRows [clickedItem .data ()]
360
+ del self ._rows_selection [clickedItem .data ()]
356
361
flags = QItemSelectionModel .Rows | QItemSelectionModel .Deselect
357
362
else :
358
- deselectCurRow = len (self .selectedRows .keys ()) == 1
359
- self . selectionModel (). clear ()
360
- self . selectedRows = {}
361
- if rowSelected and deselectCurRow :
362
- #del self.selectedRows[clickedItem.data()]
363
+ deselectCurRow = len (self ._rows_selection .keys ()) == 1
364
+ if not rightBtnPressed :
365
+ self . selectionModel (). clear ()
366
+ self . _rows_selection = {}
367
+ if rowSelected and deselectCurRow and not rightBtnPressed :
363
368
flags = QItemSelectionModel .Rows | QItemSelectionModel .Deselect
364
369
else :
365
- self .selectedRows [clickedItem .data ()] = self .getRowCells (row )
370
+ self ._rows_selection [clickedItem .data ()] = self .getRowCells (row )
366
371
367
372
self .selectionModel ().setCurrentIndex (
368
373
clickedItem ,
@@ -400,16 +405,16 @@ def clearSelection(self):
400
405
self .selectionModel ().reset ()
401
406
self .selectionModel ().clearCurrentIndex ()
402
407
403
- def copySelection (self ):
408
+ def selectedRows (self , limit = "" ):
404
409
model = self .selectionModel ()
405
410
curModel = self .model ()
406
411
selection = model .selectedRows ()
407
412
if not selection :
408
413
return None
409
414
410
415
rows = []
411
- for k in self .selectedRows :
412
- rows .append (self .selectedRows [k ])
416
+ for k in self ._rows_selection :
417
+ rows .append (self ._rows_selection [k ])
413
418
return rows
414
419
415
420
def getCurrentIndex (self ):
@@ -428,7 +433,7 @@ def selectItem(self, _data, _column):
428
433
def _selectSavedIndex (self ):
429
434
sel = QItemSelection ()
430
435
431
- for text in self .selectedRows .keys ():
436
+ for text in self ._rows_selection .keys ():
432
437
items = self .model ().findItems (text , column = self .trackingCol )
433
438
if len (items ) == 0 :
434
439
continue
@@ -457,8 +462,8 @@ def onScrollbarValueChanged(self, vSBNewValue):
457
462
def onKeyUp (self ):
458
463
curIdx = self .selectionModel ().currentIndex ()
459
464
if not self .shiftPressed :
460
- self .selectedRows = {}
461
- self .selectedRows [curIdx .data ()] = self .getRowCells (curIdx .row ())
465
+ self ._rows_selection = {}
466
+ self ._rows_selection [curIdx .data ()] = self .getRowCells (curIdx .row ())
462
467
463
468
if self .selectionModel ().currentIndex ().row () == 0 :
464
469
self .vScrollBar .setValue (max (0 , self .vScrollBar .value () - 1 ))
@@ -467,8 +472,8 @@ def onKeyDown(self):
467
472
curIdx = self .selectionModel ().currentIndex ()
468
473
curRow = curIdx .row ()
469
474
if not self .shiftPressed :
470
- self .selectedRows = {}
471
- self .selectedRows [curIdx .data ()] = self .getRowCells (curRow )
475
+ self ._rows_selection = {}
476
+ self ._rows_selection [curIdx .data ()] = self .getRowCells (curRow )
472
477
473
478
if curRow >= self .maxRowsInViewport - 2 :
474
479
self .onKeyPageDown ()
@@ -498,6 +503,13 @@ def onKeyPageDown(self):
498
503
newValue = self .vScrollBar .value () + (self .maxRowsInViewport - 2 )
499
504
self .vScrollBar .setValue (newValue )
500
505
506
+ def onKeySpace (self ):
507
+ if self .vScrollBar .isVisible () == False :
508
+ return
509
+
510
+ newValue = self .vScrollBar .value () + (self .maxRowsInViewport - 2 )
511
+ self .vScrollBar .setValue (newValue )
512
+
501
513
def eventFilter (self , obj , event ):
502
514
if event .type () == QEvent .KeyRelease :
503
515
if event .key () == Qt .Key_Shift :
@@ -522,11 +534,13 @@ def eventFilter(self, obj, event):
522
534
self .onKeyPageDown ()
523
535
elif event .key () == Qt .Key_Escape :
524
536
self .selectionModel ().clear ()
525
- self .selectedRows = {}
537
+ self ._rows_selection = {}
526
538
elif event .key () == Qt .Key_Shift :
527
539
self .shiftPressed = True
528
540
elif event .key () == Qt .Key_Control :
529
541
self .ctrlPressed = True
542
+ elif event .key () == Qt .Key_Space :
543
+ self .onKeySpace ()
530
544
531
545
elif event .type () == QEvent .Wheel :
532
546
self .vScrollBar .wheelEvent (event )
0 commit comments