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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
#ifndef SQLQUERYVIEW_H
#define SQLQUERYVIEW_H
#include "csvformat.h"
#include "common/extactioncontainer.h"
#include "db/queryexecutor.h"
#include "guiSQLiteStudio_global.h"
#include <QTableView>
#include <QHeaderView>
class SqlQueryItemDelegate;
class SqlQueryItem;
class WidgetCover;
class SqlQueryModel;
class SqlQueryModelColumn;
class QPushButton;
class QProgressBar;
class QMenu;
CFG_KEY_LIST(SqlQueryView, QObject::tr("Data grid view"),
CFG_KEY_ENTRY(EDIT_CURRENT, Qt::Key_F2, QObject::tr("Edit current cell inline"))
CFG_KEY_ENTRY(COPY, Qt::CTRL + Qt::Key_C, QObject::tr("Copy cell(s) contents to clipboard"))
CFG_KEY_ENTRY(COPY_WITH_HEADER, Qt::CTRL + Qt::SHIFT + Qt::Key_C, QObject::tr("Copy cell(s) contents together with header to clipboard"))
// CFG_KEY_ENTRY(COPY_AS, Qt::CTRL + Qt::ALT + Qt::Key_C, QObject::tr(""))
CFG_KEY_ENTRY(PASTE, Qt::CTRL + Qt::Key_V, QObject::tr("Paste cell(s) contents from clipboard"))
// CFG_KEY_ENTRY(PASTE_AS, Qt::CTRL + Qt::ALT + Qt::Key_V, QObject::tr(""))
CFG_KEY_ENTRY(ERASE, Qt::ALT + Qt::Key_Backspace, QObject::tr("Set empty value to selected cell(s)"))
CFG_KEY_ENTRY(SET_NULL, Qt::Key_Backspace, QObject::tr("Set NULL value to selected cell(s)"))
CFG_KEY_ENTRY(COMMIT, Qt::CTRL + Qt::Key_Return, QObject::tr("Commit changes to cell(s) contents"))
CFG_KEY_ENTRY(ROLLBACK, Qt::ALT + Qt::SHIFT + Qt::Key_Backspace, QObject::tr("Rollback changes to cell(s) contents"))
CFG_KEY_ENTRY(DELETE_ROW, Qt::Key_Delete, QObject::tr("Delete selected data row"))
CFG_KEY_ENTRY(INSERT_ROW, Qt::Key_Insert, QObject::tr("Insert new data row"))
CFG_KEY_ENTRY(OPEN_VALUE_EDITOR, Qt::ALT + Qt::Key_Return, QObject::tr("Open contents of selected cell in a separate editor"))
CFG_KEY_ENTRY(ADJUST_ROWS_SIZE, Qt::CTRL + Qt::ALT + Qt::Key_H, QObject::tr("Toggle the height adjustment of rows"))
CFG_KEY_ENTRY(INCR_FONT_SIZE, Qt::CTRL + Qt::Key_Plus, QObject::tr("Increase font size", "data view"))
CFG_KEY_ENTRY(DECR_FONT_SIZE, Qt::CTRL + Qt::Key_Minus, QObject::tr("Decrease font size", "data view"))
)
class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer
{
Q_OBJECT
public:
enum Action
{
COPY,
COPY_WITH_HEADER,
COPY_AS,
PASTE,
PASTE_AS,
SET_NULL,
ERASE,
ROLLBACK,
COMMIT,
INSERT_ROW,
INSERT_MULTIPLE_ROWS,
DELETE_ROW,
SELECTIVE_COMMIT,
SELECTIVE_ROLLBACK,
EDIT_CURRENT,
OPEN_VALUE_EDITOR,
SORT_DIALOG,
RESET_SORTING,
GENERATE_SELECT,
GENERATE_INSERT,
GENERATE_UPDATE,
GENERATE_DELETE,
INVERT_SELECTION,
ADJUST_ROWS_SIZE,
INCR_FONT_SIZE,
DECR_FONT_SIZE
};
Q_ENUM(Action)
enum ToolBar
{
};
explicit SqlQueryView(QWidget* parent = 0);
virtual ~SqlQueryView();
QList<SqlQueryItem*> getSelectedItems();
SqlQueryItem* getCurrentItem();
SqlQueryModel* getModel();
void setModel(QAbstractItemModel *model);
SqlQueryItem *itemAt(const QPoint& pos);
QToolBar* getToolBar(int toolbar) const;
void addAdditionalAction(QAction* action);
QModelIndex getCurrentIndex() const;
bool getSimpleBrowserMode() const;
void setSimpleBrowserMode(bool value);
void setIgnoreColumnWidthChanges(bool ignore);
QMenu* getHeaderContextMenu() const;
protected:
void scrollContentsBy(int dx, int dy);
void keyPressEvent(QKeyEvent *e);
private:
class Header : public QHeaderView
{
public:
explicit Header(SqlQueryView* parent);
QSize sectionSizeFromContents(int section) const;
};
void init();
void setupWidgetCover();
void createActions();
void setupDefShortcuts();
void refreshShortcuts();
void setupActionsForMenu(SqlQueryItem* currentItem, const QList<SqlQueryItem*>& selectedItems);
void setupHeaderMenu();
bool editInEditorIfNecessary(SqlQueryItem* item);
void paste(const QList<QList<QVariant>>& data);
bool validatePasting(QSet<QString>& warnedColumns, bool& warnedRowDeletion, SqlQueryItem* item);
void addFkActionsToContextMenu(SqlQueryItem* currentItem);
void goToReferencedRow(const QString& table, const QString& column, const QVariant& value);
void copy(bool withHeaders);
void changeFontSize(int factor);
constexpr static const char* mimeDataId = "application/x-sqlitestudio-data-view-data";
constexpr static const int minHeaderWidth = 15;
SqlQueryItemDelegate* itemDelegate = nullptr;
QMenu* contextMenu = nullptr;
QMenu* headerContextMenu = nullptr;
QMenu* referencedTablesMenu = nullptr;
WidgetCover* widgetCover = nullptr;
QPushButton* cancelButton = nullptr;
QProgressBar* busyBar = nullptr;
QList<QAction*> additionalActions;
bool simpleBrowserMode = false;
bool ignoreColumnWidthChanges = false;
int beforeExecutionHorizontalPosition = -1;
int beforeExecutionVerticalPosition = -1;
private slots:
void updateCommitRollbackActions(bool enabled);
void customContextMenuRequested(const QPoint& pos);
void headerContextMenuRequested(const QPoint& pos);
void openSortDialog();
void resetSorting();
void sortingUpdated(const QueryExecutor::SortList& sortOrder);
void updateFont();
void itemActivated(const QModelIndex& index);
void generateSelect();
void generateInsert();
void generateUpdate();
void generateDelete();
void editCurrent();
void toggleRowsHeightAdjustment(bool enabled);
void adjustRowToContents(int section);
void fontSizeChangeRequested(int delta);
void incrFontSize();
void decrFontSize();
void invertSelection();
public slots:
void executionStarted();
void executionEnded();
void setCurrentRow(int row);
void copy();
void copyWithHeader();
void paste();
void copyAs();
void pasteAs();
void setNull();
void erase();
void commit();
void rollback();
void selectiveCommit();
void selectiveRollback();
void openValueEditor(SqlQueryItem* item);
void openValueEditor();
signals:
void contextMenuRequested(SqlQueryItem* currentItem, const QList<SqlQueryItem*>& selectedItems);
void requestForRowInsert();
void requestForMultipleRowInsert();
void requestForRowDelete();
void scrolledBy(int dx, int dy);
};
GUI_API_EXPORT int qHash(SqlQueryView::Action action);
#endif // SQLQUERYVIEW_H
|