Skip to content

Commit bda2cae

Browse files
ui,events: added support for select all behaviour
- Allow selecting all rows with Ctrl+a. Note: The Ctrl key must be held while pressing 'a'. Sometimes when pressing Ctrl+a, the Ctrl key is released briefly before 'a' is pressed. - Display the number of rows that will be affected by an action (for example, delete) Closes: #1272
1 parent 845c147 commit bda2cae

2 files changed

Lines changed: 23 additions & 10 deletions

File tree

ui/opensnitch/customwidgets/generictableview.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ def __init__(self, parent):
237237
self.mousePressed = False
238238
self.shiftPressed = False
239239
self.ctrlPressed = False
240+
self.keySelectAll = False
240241
self.trackingCol = 0
241242
self._rows_selection = {}
242243
# first and last row selected with shift pressed
@@ -278,7 +279,7 @@ def getRowCells(self, row):
278279
return cols
279280

280281
def clear(self):
281-
pass
282+
self.keySelectAll = False
282283

283284
def refresh(self):
284285
self.calculateRowsInViewport()
@@ -330,11 +331,11 @@ def mouseMoveEvent(self, event):
330331
row = self.rowAt(pos.y())
331332
item = self.indexAt(pos)
332333

333-
if item == None:
334+
if item is None:
334335
return
335336

336337
clickedItem = self.model().index(row, self.trackingCol)
337-
if clickedItem.data() == None:
338+
if clickedItem.data() is None:
338339
return
339340
self.handleMouseMoveEvent(row, clickedItem, self.selectionModel().isRowSelected(row, QModelIndex()))
340341

@@ -344,22 +345,26 @@ def mouseMoveEvent(self, event):
344345

345346
# save the selected index, to preserve selection when moving around.
346347
def mousePressEvent(self, event):
347-
# we need to call upper class to paint selections properly
348-
super().mousePressEvent(event)
349348
rightBtnPressed = event.button() != Qt.MouseButton.LeftButton
349+
# if selectAll has been pressed, do not discard selection
350+
if self.keySelectAll and rightBtnPressed:
351+
return
350352

353+
# we need to call upper class to paint selections properly
354+
super().mousePressEvent(event)
355+
self.keySelectAll = False
351356
if not self.shiftPressed:
352357
self._first_row_selected = None
353358
self._last_row_selected = None
354359

355360
pos = event.pos()
356361
item = self.indexAt(pos)
357362
row = self.rowAt(pos.y())
358-
if item == None:
363+
if item is None:
359364
return
360365

361366
clickedItem = self.model().index(row, self.trackingCol)
362-
if clickedItem.data() == None:
367+
if clickedItem.data() is None:
363368
return
364369

365370
self.mousePressed = not rightBtnPressed
@@ -439,11 +444,11 @@ def handleMouseMoveEvent(self, row, clickedItem, selected):
439444
# handle scrolling the view while dragging the mouse.
440445
if self.mousePressed:
441446
scrollPos = self.scrollViewport(row)
442-
if scrollPos == None:
447+
if scrollPos is None:
443448
return
444449

445450
nextItem = self.model().index(scrollPos, self.trackingCol)
446-
if nextItem == None or nextItem.data() == None:
451+
if nextItem is None or nextItem.data() is None:
447452
return
448453
if clickedItem.data() not in self._rows_selection.keys():
449454
self._rows_selection[nextItem.data()] = self.getRowCells(nextItem.row())
@@ -481,10 +486,14 @@ def onRowCountChanged(self):
481486
self.model().refreshViewport(self.vScrollBar.value(), self.maxRowsInViewport, force=self.forceViewRefresh())
482487

483488
def clearSelection(self):
489+
self.keySelectAll = False
484490
self.selectionModel().reset()
485491
self.selectionModel().clearCurrentIndex()
486492

487493
def selectedRows(self, limit=""):
494+
if self.keySelectAll:
495+
return self.model().dumpRows(nolimits=True)
496+
488497
model = self.selectionModel()
489498
curModel = self.model()
490499
selection = model.selectedRows()
@@ -595,6 +604,8 @@ def eventFilter(self, obj, event):
595604
self.shiftPressed = False
596605
if event.key() == Qt.Key.Key_Control:
597606
self.ctrlPressed = False
607+
if event.key() == Qt.Key.Key_A:
608+
self.keySelectAll = True if self.ctrlPressed else False
598609

599610
elif event.type() == QEvent.Type.KeyPress:
600611
# FIXME: setValue() does not update the scrollbars correctly in

ui/opensnitch/dialogs/events/menu_actions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,10 @@ def table_menu_delete(self, cur_idx, model, selection):
308308
if cur_idx == constants.TAB_MAIN or cur_idx == constants.TAB_NODES or self.in_detail_view(cur_idx):
309309
return
310310

311+
rnum = len(selection)
311312
msg = QC.translate("stats", " You are about to delete this rule. ")
313+
if rnum > 1:
314+
msg = QC.translate("stats", " You are about to delete these rules ({0}) ".format(rnum))
312315
if cur_idx != constants.TAB_RULES:
313316
msg = QC.translate("stats", " You are about to delete this entry. ")
314317

@@ -396,4 +399,3 @@ def table_menu_edit(self, cur_idx, model, selection):
396399
self.load_fw_rule(node, uuid)
397400

398401
break
399-

0 commit comments

Comments
 (0)