File indexing completed on 2024-05-05 05:51:26
0001 /* This file is part of the KDE project 0002 SPDX-FileCopyrightText: 2010 Thomas Fjellstrom <thomas@fjellstrom.ca> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <unordered_map> 0010 0011 #include <QAbstractItemModel> 0012 #include <QBrush> 0013 #include <QColor> 0014 0015 #include <KTextEditor/Document> 0016 0017 namespace KTextEditor 0018 { 0019 class Document; 0020 class MainWindow; 0021 } 0022 0023 class ProxyItem; 0024 class ProxyItemDir; 0025 0026 QDebug operator<<(QDebug dbg, ProxyItem *item); 0027 QDebug operator<<(QDebug dbg, ProxyItemDir *item); 0028 0029 class KateFileTreeModel : public QAbstractItemModel 0030 { 0031 Q_OBJECT 0032 0033 public: 0034 enum { 0035 DocumentRole = Qt::UserRole + 1, 0036 PathRole, 0037 OpeningOrderRole, 0038 DocumentTreeRole, 0039 WidgetRole, 0040 }; 0041 0042 KateFileTreeModel(KTextEditor::MainWindow *mainWindow, QObject *p); 0043 ~KateFileTreeModel() override; 0044 0045 /* QAbstractItemModel implementations */ 0046 Qt::ItemFlags flags(const QModelIndex &index) const override; 0047 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 0048 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; 0049 int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0050 int columnCount(const QModelIndex &parent = QModelIndex()) const override; 0051 0052 QModelIndex parent(const QModelIndex &index) const override; 0053 QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; 0054 bool hasChildren(const QModelIndex &parent = QModelIndex()) const override; 0055 0056 QMimeData *mimeData(const QModelIndexList &indexes) const override; 0057 0058 Qt::DropActions supportedDropActions() const override; 0059 0060 /* extra api for view */ 0061 QModelIndex docIndex(const KTextEditor::Document *) const; 0062 0063 QModelIndex widgetIndex(QWidget *) const; 0064 0065 bool isDir(const QModelIndex &index) const; 0066 bool isWidgetDir(const QModelIndex &index) const; 0067 0068 bool listMode() const; 0069 void setListMode(bool); 0070 0071 void setShadingEnabled(bool); 0072 0073 void setEditShade(const QColor &); 0074 0075 void setViewShade(const QColor &); 0076 0077 bool showFullPathOnRoots(void) const; 0078 void setShowFullPathOnRoots(bool); 0079 0080 void documentsOpened(const QList<KTextEditor::Document *> &); 0081 /* used strictly for the item coloring */ 0082 void documentActivated(const KTextEditor::Document *); 0083 void documentEdited(const KTextEditor::Document *); 0084 void resetHistory(); 0085 0086 bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; 0087 bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override; 0088 0089 public Q_SLOTS: 0090 void documentOpened(KTextEditor::Document *); 0091 void documentClosed(KTextEditor::Document *); 0092 void documentNameChanged(KTextEditor::Document *); 0093 void documentModifiedChanged(KTextEditor::Document *); 0094 void documentModifiedOnDisc(KTextEditor::Document *, bool, KTextEditor::Document::ModifiedOnDiskReason); 0095 0096 void addWidget(QWidget *w); 0097 void removeWidget(QWidget *w); 0098 0099 Q_SIGNALS: 0100 void triggerViewChangeAfterNameChange(); 0101 0102 private: 0103 ProxyItemDir *findRootNode(const QString &name, const int r = 1) const; 0104 static ProxyItemDir *findChildNode(const ProxyItemDir *parent, const QString &name); 0105 void insertItemInto(ProxyItemDir *root, ProxyItem *item, bool move = false, ProxyItemDir **moveDest = nullptr); 0106 void handleInsert(ProxyItem *item); 0107 void handleNameChange(ProxyItem *item); 0108 void handleEmptyParents(ProxyItemDir *item); 0109 static void setupIcon(ProxyItem *item); 0110 static void updateItemPathAndHost(ProxyItem *item); 0111 void handleDuplicitRootDisplay(ProxyItemDir *item); 0112 0113 void updateBackgrounds(bool force = false); 0114 0115 void initModel(); 0116 void clearModel(); 0117 void connectDocument(const KTextEditor::Document *); 0118 ProxyItem *itemForIndex(const QModelIndex &index) const; 0119 0120 private: 0121 class KTextEditor::MainWindow *const m_mainWindow = nullptr; 0122 ProxyItemDir *m_root; 0123 ProxyItem *m_widgetsRoot = nullptr; 0124 QHash<const KTextEditor::Document *, ProxyItem *> m_docmap; 0125 0126 bool m_shadingEnabled; 0127 0128 std::vector<ProxyItem *> m_viewHistory; 0129 std::vector<ProxyItem *> m_editHistory; 0130 std::unordered_map<ProxyItem *, QBrush> m_brushes; 0131 0132 QColor m_editShade; 0133 QColor m_viewShade; 0134 QColor m_inactiveDocColor; 0135 0136 bool m_listMode; 0137 }; 0138 0139 Q_DECLARE_METATYPE(QList<KTextEditor::Document *>)