summaryrefslogtreecommitdiffstats
path: root/src/deselectabletreeview.h
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