Line data Source code
1 : // SPDX-FileCopyrightText: 2016 Anne Jan Brouwer
2 : // SPDX-License-Identifier: GPL-3.0-or-later
3 : #ifndef SRC_DESELECTABLETREEVIEW_H_
4 : #define SRC_DESELECTABLETREEVIEW_H_
5 :
6 : #include <QCoreApplication>
7 : #include <QMouseEvent>
8 : #include <QTime>
9 : #include <QTreeView>
10 :
11 : /**
12 : * @brief The DeselectableTreeView class
13 : * loosly based on http://stackoverflow.com/questions/2761284/
14 : * thanks to Yassir Ennazk
15 : */
16 : class DeselectableTreeView : public QTreeView {
17 : Q_OBJECT
18 :
19 : public:
20 : /**
21 : * @brief DeselectableTreeView standard constructor
22 : * @param parent
23 : */
24 0 : DeselectableTreeView(QWidget *parent) : QTreeView(parent) {}
25 : /**
26 : * @brief ~DeselectableTreeView standard destructor
27 : */
28 0 : virtual ~DeselectableTreeView() {}
29 :
30 : signals:
31 : /**
32 : * @brief emptyClicked event
33 : */
34 : void emptyClicked();
35 :
36 : private:
37 : bool doubleClickHappened = false;
38 : bool clickSelected = false;
39 :
40 : /**
41 : * @brief mousePressEvent registers if the field was pre-selected
42 : * @param event
43 : */
44 0 : virtual void mousePressEvent(QMouseEvent *event) {
45 0 : clickSelected = selectionModel()->isSelected(indexAt(event->pos()));
46 0 : QTreeView::mousePressEvent(event);
47 0 : }
48 :
49 : /**
50 : * @brief mouseReleaseEvent now deselects on click on empty space
51 : * @param event
52 : */
53 0 : void mouseReleaseEvent(QMouseEvent *event) {
54 0 : doubleClickHappened = false;
55 : // The timer is to distinguish between single and double click
56 0 : QTime dieTime = QTime::currentTime().addMSecs(200);
57 0 : while (QTime::currentTime() < dieTime)
58 0 : QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
59 : // could this be done nicer?
60 0 : if (!doubleClickHappened && clickSelected) {
61 0 : QModelIndex item = indexAt(event->pos());
62 0 : bool selected = selectionModel()->isSelected(indexAt(event->pos()));
63 0 : if ((item.row() == -1 && item.column() == -1) || selected) {
64 0 : clearSelection();
65 0 : const QModelIndex index;
66 0 : selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
67 0 : emit emptyClicked();
68 : } else {
69 0 : QTreeView::mouseReleaseEvent(event);
70 : }
71 0 : } else {
72 0 : QTreeView::mouseReleaseEvent(event);
73 : }
74 0 : clickSelected = false;
75 0 : }
76 :
77 : /**
78 : * @brief mouseDoubleClickEvent
79 : * @param event
80 : */
81 0 : void mouseDoubleClickEvent(QMouseEvent *event) {
82 0 : doubleClickHappened = true;
83 0 : QTreeView::mouseDoubleClickEvent(event);
84 0 : }
85 : };
86 :
87 : #endif // SRC_DESELECTABLETREEVIEW_H_
|