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