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 *>)