Files
sqlitebrowser/src/sqlitetablemodel.h
Martin Kleusberg 39a49e33c2 Allow clicking cells with foreign key in order to jump to referenced cell
Add a tooltip to the database browser when you hover a cell with a
foreign key set in order to show the referenced table and column.

When clicking on such a cell while holding the Ctrl and Shift key (only
one of them won't work because they are for multiselection and Alt
doesn't do the trick on my system because it's just for grabbing and
moving the window) try to jump to the table and row which is referenced
in the clicked cell.

See issue #192.
2015-06-21 23:59:45 +02:00

87 lines
2.7 KiB
C++

#ifndef SQLITETABLEMODEL_H
#define SQLITETABLEMODEL_H
#include <QAbstractTableModel>
#include <QStringList>
#include <QVector>
class DBBrowserDB;
namespace sqlb { class ForeignKeyClause; }
class SqliteTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit SqliteTableModel(QObject *parent = 0, DBBrowserDB* db = 0, size_t chunkSize = 50000);
void reset();
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int totalRowCount() const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
bool canFetchMore(const QModelIndex &parent = QModelIndex()) const;
void fetchMore(const QModelIndex &parent = QModelIndex());
size_t queryMore(size_t offset);
bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex());
bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex());
void setQuery(const QString& sQuery, bool dontClearHeaders = false);
QString query() const { return m_sQuery; }
void setTable(const QString& table);
void setChunkSize(size_t chunksize);
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
Qt::ItemFlags flags(const QModelIndex& index) const;
bool valid() const { return m_valid; }
bool isBinary(const QModelIndex& index) const;
typedef QList<QByteArray> QByteArrayList;
sqlb::ForeignKeyClause getForeignKeyClause(int column) const;
signals:
public slots:
void updateFilter(int column, const QString& value);
private:
void fetchData(unsigned int from, unsigned to);
void clearCache();
void buildQuery();
QStringList getColumns(const QString& sQuery, QVector<int>& fieldsTypes);
int getQueryRowCount();
DBBrowserDB* m_db;
int m_rowCount;
QStringList m_headers;
typedef QList<QByteArrayList> DataType;
DataType m_data;
QString m_sQuery;
QString m_sTable;
int m_iSortColumn;
QString m_sSortOrder;
QMap<int, QString> m_mWhere;
QVector<int> m_vDataTypes;
/**
* @brief m_chunkSize Size of the next chunk fetch more will try to fetch.
* This value should be rather high, because our query
* uses LIMIT and sqlite3 will still execute the whole query and
* just skip the not wanted rows, but the execution will
* still take nearly the same time as doing the query at all up
* to that row count.
*/
size_t m_chunkSize;
bool m_valid; //! tells if the current query is valid.
};
#endif // SQLITETABLEMODEL_H