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