1 /*
2  outline_tree_view.cpp     MindForger thinking notebook
3 
4  Copyright (C) 2016-2020 Martin Dvorak <martin.dvorak@mindforger.com>
5 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License
8  as published by the Free Software Foundation; either version 2
9  of the License, or (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #ifndef M8RUI_OUTLINE_TREE_VIEW_H
20 #define M8RUI_OUTLINE_TREE_VIEW_H
21 
22 #include <QtWidgets>
23 
24 #include "../../lib/src/gear/lang_utils.h"
25 #include "../lib/src/debug.h"
26 
27 namespace m8r {
28 
29 class OutlineTreeView;
30 
31 class OutlineTreeViewItemDelegate : public QStyledItemDelegate
32 {
33     Q_OBJECT
34 
35 public:
OutlineTreeViewItemDelegate(QObject * outlineTreeView)36     OutlineTreeViewItemDelegate(QObject* outlineTreeView)
37         : QStyledItemDelegate(outlineTreeView)
38     {
39         installEventFilter(this);
40     }
41 
42     /**
43      * If you want to FILTER the event out, i.e. STOP it being
44      * handled further, then return TRUE; otherwise return FALSE.
45      *
46      * Event filter must be installed in constructor.
47      */
eventFilter(QObject * obj,QEvent * event)48     bool eventFilter(QObject* obj, QEvent* event) override
49     {
50         if(event->type() == QEvent::KeyPress) {
51             return true;
52         } else {
53             return QStyledItemDelegate::eventFilter(obj, event);
54         }
55     }
56 
createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index)57     QWidget *createEditor(QWidget *parent,
58                           const QStyleOptionViewItem& option,
59                           const QModelIndex& index) const override
60     {
61         QWidget *result = QStyledItemDelegate::createEditor(parent, option, index);
62         result->installEventFilter(new OutlineTreeViewItemDelegate(parent));
63         return result;
64     }
65 };
66 
67 class OutlineTreeView : public QTableView
68 {
69     Q_OBJECT
70 
71 private:
72     // if view is width < threshold columns, then shows simplified view w/o Mind-related columns
73     static constexpr int SIMPLIFIED_VIEW_THRESHOLD_WIDTH = 75;
74 
75 public:
76     explicit OutlineTreeView(QWidget* parent);
77     OutlineTreeView(const OutlineTreeView&) = delete;
78     OutlineTreeView(const OutlineTreeView&&) = delete;
79     OutlineTreeView &operator=(const OutlineTreeView&) = delete;
80     OutlineTreeView &operator=(const OutlineTreeView&&) = delete;
81 
82     virtual void keyPressEvent(QKeyEvent* event) override;
83     virtual void mouseDoubleClickEvent(QMouseEvent* event) override;
84     virtual void resizeEvent(QResizeEvent* event) override;
refreshNotes(const QModelIndex & from,const QModelIndex & to)85     void refreshNotes(const QModelIndex& from, const QModelIndex& to) { dataChanged(from, to); }
86 
87 signals:
88     void signalOutlineShow();
89 
90     void signalFromOutlineTreeToOutlines();
91 
92     void signalSelectNextRow();
93     void signalSelectPreviousRow();
94 
95     void signalChangeUp();
96     void signalChangeDown();
97     void signalChangePromote();
98     void signalChangeDemote();
99     void signalChangeFirst();
100     void signalChangeLast();
101 
102     void signalOutlineOrNoteEdit(); // O or N edit
103     void signalEdit(); // N edit
104     void signalForget();
105 };
106 
107 }
108 #endif // M8RUI_OUTLINE_TREE_VIEW_H
109