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
|