Files
sqlitebrowser/src/TableBrowser.h
mgrojo 63aabb9601 Added toolbar for direct formatting of columns in Data Browser
The new toolbar is hidden by default and can be toggled using a button in
the main Data Browser toolbar. Margins and spacing have been updated to
improve appearance of the two toolbars.

These tool buttons apply the format to the columns which are contained in
the selection. This is done by updating or adding a new condition-less
format to the list of conditional formats of those columns.

New style icons from the Silk icon set. Changed existent ones for
coherence.

See issue #1976.
2019-09-29 12:33:34 +02:00

179 lines
5.9 KiB
C++

#ifndef TABLEBROWSER_H
#define TABLEBROWSER_H
#include "CondFormat.h"
#include "PlotDock.h"
#include "sql/Query.h"
#include <QMap>
#include <QModelIndex>
#include <QWidget>
#include <unordered_set>
class DBBrowserDB;
class ExtendedTableWidget;
class SqliteTableModel;
class QAbstractItemModel;
class QIntValidator;
namespace Ui {
class TableBrowser;
}
struct BrowseDataTableSettings
{
sqlb::Query query; // NOTE: We only store the sort order in here (for now)
QMap<int, int> columnWidths;
QMap<int, QString> filterValues;
QMap<int, std::vector<CondFormat>> condFormats;
QMap<int, QString> displayFormats;
bool showRowid;
QString encoding;
QString plotXAxis;
QMap<QString, PlotDock::PlotSettings> plotYAxes;
QString unlockViewPk;
QMap<int, bool> hiddenColumns;
std::vector<QString> globalFilters;
BrowseDataTableSettings() :
showRowid(false),
unlockViewPk("_rowid_")
{
}
friend QDataStream& operator>>(QDataStream& stream, BrowseDataTableSettings& object)
{
int sortOrderIndex, sortOrderMode;
stream >> sortOrderIndex;
stream >> sortOrderMode;
object.query.orderBy().emplace_back(sortOrderIndex, sortOrderMode == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending);
stream >> object.columnWidths;
stream >> object.filterValues;
stream >> object.displayFormats;
stream >> object.showRowid;
stream >> object.encoding;
// Versions pre 3.10.0 didn't store the following information in their project files.
// To be absolutely sure that nothing strange happens when we read past the stream for
// those cases, check for the end of the stream here.
if(stream.atEnd())
return stream;
stream >> object.plotXAxis;
stream >> object.plotYAxes;
stream >> object.unlockViewPk;
// Project files from versions before 3.11.0 didn't have these fields
if(stream.atEnd())
return stream;
stream >> object.hiddenColumns;
return stream;
}
};
class TableBrowser : public QWidget
{
Q_OBJECT
public:
explicit TableBrowser(QWidget* parent = nullptr);
~TableBrowser();
void init(DBBrowserDB* _db);
void reset();
sqlb::ObjectIdentifier currentlyBrowsedTableName() const;
QMap<sqlb::ObjectIdentifier, BrowseDataTableSettings> allSettings() const { return browseTableSettings; }
BrowseDataTableSettings& settings(const sqlb::ObjectIdentifier& object);
void setSettings(const sqlb::ObjectIdentifier& table, const BrowseDataTableSettings& table_settings);
void setStructure(QAbstractItemModel* model, const QString& old_table = QString());
void updateStructure();
SqliteTableModel* model() { return m_browseTableModel; }
QModelIndex currentIndex() const;
void setDefaultEncoding(const QString& encoding) { defaultBrowseTableEncoding = encoding; }
QString defaultEncoding() const { return defaultBrowseTableEncoding; }
public slots:
void setEnabled(bool enable);
void updateTable();
void clearFilters();
void reloadSettings();
void setCurrentTable(const sqlb::ObjectIdentifier& name);
void updateRecordsetLabel();
void jumpToRow(const sqlb::ObjectIdentifier& table, QString column, const QByteArray& value);
signals:
void projectModified();
void selectionChanged(QModelIndex index);
void selectionChangedByDoubleClick(QModelIndex index);
void statusMessageRequested(QString message);
void updatePlot(ExtendedTableWidget* tableWidget, SqliteTableModel* model, BrowseDataTableSettings* settings, bool keepOrResetSelection);
void createView(QString sql);
void requestFileOpen(QString file);
private slots:
void clearTableBrowser();
void updateFilter(int column, const QString& value);
void addCondFormat(int column, const QString& value);
void clearAllCondFormats(int column);
void editCondFormats(int column);
void applyBrowseTableSettings(const BrowseDataTableSettings& storedData, bool skipFilters = false);
void enableEditing(bool enable_edit);
void showRowidColumn(bool show, bool skipFilters = false);
void unlockViewEditing(bool unlock, QString pk = QString());
void hideColumns(int column = -1, bool hide = true);
void on_actionShowAllColumns_triggered();
void updateInsertDeleteRecordButton();
void duplicateRecord(int currentRow);
void browseTableHeaderClicked(int logicalindex);
void updateBrowseDataColumnWidth(int section, int /*old_size*/, int new_size);
void showDataColumnPopupMenu(const QPoint& pos);
void showRecordPopupMenu(const QPoint& pos);
void addRecord();
void insertValues();
void deleteRecord();
void navigatePrevious();
void navigateNext();
void navigateBegin();
void navigateEnd();
void navigateGoto();
void selectTableLine(int lineToSelect);
void on_actionClearFilters_triggered();
void on_actionClearSorting_triggered();
void editDataColumnDisplayFormat();
void exportFilteredTable();
void saveFilterAsView();
void browseDataSetTableEncoding(bool forAllTables = false);
void browseDataSetDefaultTableEncoding();
private:
Ui::TableBrowser* ui;
QIntValidator* gotoValidator;
QMenu* popupNewRecordMenu;
QMenu* popupSaveFilterAsMenu;
QMenu* popupBrowseDataHeaderMenu;
DBBrowserDB* db;
QAbstractItemModel* dbStructureModel;
/// the table model used in the "Browse Data" page (re-used and
/// re-initialized when switching to another table)
SqliteTableModel* m_browseTableModel;
static QMap<sqlb::ObjectIdentifier, BrowseDataTableSettings> browseTableSettings; // This is static, so settings are shared between instances
static QString defaultBrowseTableEncoding;
Palette m_condFormatPalette;
void modifyColumnFormat(std::unordered_set<int> columns, std::function<void(CondFormat&)> changeFunction);
};
#endif