File: dbtreemodel.h

package info (click to toggle)
sqlitestudio 3.4.21%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 54,880 kB
  • sloc: ansic: 406,208; cpp: 123,872; yacc: 2,692; tcl: 497; sh: 462; xml: 426; makefile: 19
file content (154 lines) | stat: -rw-r--r-- 7,596 bytes parent folder | download
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef DBTREEMODEL_H
#define DBTREEMODEL_H

#include "db/db.h"
#include "dbtreeitem.h"
#include "services/config.h"
#include "guiSQLiteStudio_global.h"
#include "common/strhash.h"
#include <QStandardItemModel>
#include <QObject>

class DbManager;
class DbTreeView;
class DbPlugin;
class DbObjectOrganizer;
class QMenu;
class QCheckBox;

class GUI_API_EXPORT DbTreeModel : public QStandardItemModel
{
    Q_OBJECT

    public:
        DbTreeModel();
        ~DbTreeModel();

        void connectDbManagerSignals();
        DbTreeItem* findItem(DbTreeItem::Type type, const QString &name);
        DbTreeItem* findItem(DbTreeItem::Type type, Db* db);
        DbTreeItem* findFirstItemOfType(DbTreeItem::Type type);
        DbTreeItem* findItemBySignature(const QStringList &signature);
        QList<DbTreeItem*> findItems(DbTreeItem::Type type);
        void move(QStandardItem* itemToMove, QStandardItem* newParentItem, int newRow = -1);
        void move(QStandardItem* itemToMove, int newRow);
        DbTreeItem *createGroup(const QString& name, QStandardItem *parent = nullptr);
        void deleteGroup(QStandardItem* groupItem);
        QStandardItem *root() const;
        QStringList getGroupFor(QStandardItem* item);
        void storeGroups();
        void refreshSchema(Db* db);
        QList<DbTreeItem*> getAllItemsAsFlatList() const;
        void setTreeView(DbTreeView *value);
        QVariant data(const QModelIndex &index, int role) const;
        QStringList mimeTypes() const;
        QMimeData* mimeData(const QModelIndexList &indexes) const;
        bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent);
        bool pasteData(const QMimeData* data, int row, int column, const QModelIndex& parent, Qt::DropAction defaultAction = Qt::IgnoreAction,
                       bool *invokeStdAction = nullptr);
        void interruptableStarted(Interruptable* obj);
        void interruptableFinished(Interruptable* obj);
        bool getIgnoreDbLoadedSignal() const;
        void setIgnoreDbLoadedSignal(bool value);
        bool hasDbTreeItem(const QMimeData* data);
        QList<DbTreeItem*> getDragItems(const QMimeData* data);
        QList<DbTreeItem*> getItemsForIndexes(const QModelIndexList& indexes) const;
        QHash<QString, QVariant> collectSelectionState();
        void restoreSelectionState(const QHash<QString, QVariant>& selectionState);

        static DbTreeItem* findItem(QStandardItem *parentItem, DbTreeItem::Type type, const QString &name);
        static DbTreeItem* findItem(QStandardItem* parentItem, DbTreeItem::Type type, Db* db);
        static QList<DbTreeItem*> findItems(QStandardItem* parentItem, DbTreeItem::Type type);
        static DbTreeItem* findFirstItem(QStandardItem* parentItem, DbTreeItem::Type type);
        static void staticInit();

        static const constexpr char* MIMETYPE = "application/x-sqlitestudio-dbtreeitem";

    private:
        class ItemFiltering : public Interruptable
        {
            public:
                virtual ~ItemFiltering() {}
                void interrupt() {interrupted = true;}
                bool interrupted = false;
        };

        void readGroups(QList<Db*> dbList);
        QList<Config::DbGroupPtr> childsToConfig(QStandardItem* item);
        void restoreGroup(const Config::DbGroupPtr& group, QList<Db*>* dbList = nullptr, QStandardItem *parent = nullptr);
        void applyFilter(QStandardItem* parentItem, const QString& filter);
        bool applyFilterRecursively(QStandardItem* parentItem, const QString& filter);
        void refreshSchema(Db* db, QStandardItem* item);
        void collectExpandedState(QHash<QString, bool>& state, QStandardItem* parentItem = nullptr);
        QList<QStandardItem*> refreshSchemaTables(const QStringList &tables, const QSet<QString>& virtualTables, bool sort);
        QList<QStandardItem*> refreshSchemaTableColumns(const QStringList& columns);
        QList<QStandardItem*> refreshSchemaIndexes(const QStringList& indexes, bool sort);
        QList<QStandardItem*> refreshSchemaTriggers(const QStringList& triggers, bool sort);
        QList<QStandardItem*> refreshSchemaViews(const QStringList &views, bool sort);
        void populateChildItemsWithDb(QStandardItem* parentItem, Db* db);
        void loadTableSchema(DbTreeItem* tableItem);
        void loadViewSchema(DbTreeItem* viewItem);
        void refreshSchemaBuild(QStandardItem* dbItem, QList<QStandardItem*> tables, QList<QStandardItem*> views);
        void restoreExpandedState(const QHash<QString, bool>& expandedState, QStandardItem* parentItem);
        QString getToolTip(DbTreeItem *item) const;
        QString getDbToolTip(DbTreeItem *item) const;
        QString getTableToolTip(DbTreeItem *item) const;
        QList<DbTreeItem*> getChildsAsFlatList(QStandardItem* item) const;
        bool dropDbTreeItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool* invokeStdDropAction);
        bool dropDbObjectItem(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction);
        QCheckBox* createCopyOrMoveMenuCheckBox(QMenu* menu, const QString& label);
        bool dropUrls(const QList<QUrl>& urls);
        bool quickAddDroppedDb(const QString& filePath);
        void moveOrCopyDbObjects(const QList<DbTreeItem*>& srcItems, DbTreeItem* dstItem, bool move, bool includeData, bool includeIndexes, bool includeTriggers);
        QHash<QStringList, DbTreeItem*> getAllItemsWithSignatures() const;
        DbTreeItem* findDeepestExistingItemBySignature(QStringList signature, const QHash<QStringList, DbTreeItem*>& allItemsWithSignatures) const;

        static bool confirmReferencedTables(const QStringList& tables);
        static bool resolveNameConflict(QString& nameInConflict);
        static bool confirmConversion(const QList<QPair<QString, QString>>& diffs);
        static bool confirmConversionErrors(const QHash<QString, QSet<QString>>& errors);

        static const QString toolTipTableTmp;
        static const QString toolTipHdrRowTmp;
        static const QString toolTipRowTmp;
        static const QString toolTipIconRowTmp;

        DbTreeView* treeView = nullptr;
        bool requireSchemaReloading = false;
        DbObjectOrganizer* dbOrganizer = nullptr;
        QList<Interruptable*> interruptables;
        bool ignoreDbLoadedSignal = false;
        QString currentFilter;
        QString queuedFilterValue;
        ItemFiltering* filteringInProgress = nullptr;

    private slots:
        void expanded(const QModelIndex &index);
        void collapsed(const QModelIndex &index);
        void dbAdded(Db* db);
        void dbUpdated(const QString &oldName, Db* db);
        void dbRemoved(Db* db);
        void dbConnected(Db* db, bool expandItem = true);
        void dbDisconnected(Db* db);
        void dbUnloaded(Db* db);
        void dbLoaded(Db* db);
        void massSaveBegins();
        void massSaveCommitted();
        void markSchemaReloadingRequired();
        void dbObjectsMoveFinished(bool success, Db* srcDb, Db* dstDb);
        void dbObjectsCopyFinished(bool success, Db* srcDb, Db* dstDb);

    public slots:
        void loadDbList();
        void itemChangedVisibility(DbTreeItem* item);
        void applyFilter(const QString& filter);
        void dbRemoved(const QString& name);
        void dbRemoved(QStandardItem* item);
        void interrupt();

    signals:
        void updateItemHidden(DbTreeItem* item);
        void filteringInterrupted();
};

#endif // DBTREEMODEL_H