mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-20 02:50:46 -06:00
Save filter settings and sort order for each table
When changing the table in the Browse Data tab we used to remember the column widths for that particular table. When changing the tab and then coming back or when pressing the refresh button we used to save the filters (but not for a table change). The sort order wasn't remembered at all. I think this behaviour doesn't make any sense. With this patch we remember column widths, sort order and filter values for each table individually and restore it when the user switches back to the table. All the settings are handled the same way and as much information as possible is stored. It gets also saved in our project file format.
This commit is contained in:
@@ -57,16 +57,11 @@ FilterTableHeader::FilterTableHeader(QTableView* parent) :
|
||||
connect(parent->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(adjustPositions()));
|
||||
}
|
||||
|
||||
void FilterTableHeader::generateFilters(int number, bool bKeepValues)
|
||||
void FilterTableHeader::generateFilters(int number)
|
||||
{
|
||||
// Delete all the current filter widgets
|
||||
QStringList oldvalues;
|
||||
for(int i=0;i < filterWidgets.size(); ++i)
|
||||
{
|
||||
if(bKeepValues)
|
||||
oldvalues << filterWidgets.at(i)->text();
|
||||
delete filterWidgets.at(i);
|
||||
}
|
||||
filterWidgets.clear();
|
||||
|
||||
// And generate a bunch of new ones
|
||||
@@ -75,8 +70,6 @@ void FilterTableHeader::generateFilters(int number, bool bKeepValues)
|
||||
FilterLineEdit* l = new FilterLineEdit(this, &filterWidgets, i);
|
||||
l->setVisible(i>0); // This hides the first input widget which belongs to the hidden rowid column
|
||||
connect(l, SIGNAL(textChanged(QString)), this, SLOT(inputChanged(QString)));
|
||||
if(bKeepValues && oldvalues.size() > i && !oldvalues[i].isEmpty()) // restore old values
|
||||
l->setText(oldvalues[i]);
|
||||
filterWidgets.push_back(l);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ public:
|
||||
virtual QSize sizeHint() const;
|
||||
|
||||
public slots:
|
||||
void generateFilters(int number, bool bKeepValues = false);
|
||||
void generateFilters(int number);
|
||||
void adjustPositions();
|
||||
void clearFilters();
|
||||
void setFilter(int column, const QString& value);
|
||||
|
||||
@@ -303,7 +303,7 @@ void MainWindow::populateStructure()
|
||||
ui->dbTreeWidget->resizeColumnToContents(3);
|
||||
}
|
||||
|
||||
void MainWindow::populateTable(const QString & tablename, bool bKeepFilter)
|
||||
void MainWindow::populateTable(const QString& tablename)
|
||||
{
|
||||
// Remove the model-view link if the table name is empty in order to remove any data from the view
|
||||
if(ui->comboBrowseTable->model()->rowCount() == 0 && tablename.isEmpty())
|
||||
@@ -323,28 +323,41 @@ void MainWindow::populateTable(const QString & tablename, bool bKeepFilter)
|
||||
m_browseTableModel->setTable(tablename);
|
||||
ui->dataTable->setColumnHidden(0, true);
|
||||
|
||||
// Restore column widths
|
||||
QMap<QString, QMap<int, int> >::ConstIterator colWidthsIt;
|
||||
if((colWidthsIt = browseTableColumnWidths.constFind(tablename)) != browseTableColumnWidths.constEnd())
|
||||
// Update the filter row
|
||||
qobject_cast<FilterTableHeader*>(ui->dataTable->horizontalHeader())->generateFilters(m_browseTableModel->columnCount());
|
||||
|
||||
// Restore table settings
|
||||
QMap<QString, BrowseDataTableSettings>::ConstIterator tableIt;
|
||||
if((tableIt = browseTableSettings.constFind(tablename)) != browseTableSettings.constEnd())
|
||||
{
|
||||
// There are some column widths stored for this table
|
||||
for(QMap<int, int>::ConstIterator it=colWidthsIt.value().constBegin();it!=colWidthsIt.value().constEnd();++it)
|
||||
ui->dataTable->setColumnWidth(it.key(), it.value());
|
||||
// There is information stored for this table, so extract it and apply it
|
||||
|
||||
// Column widths
|
||||
for(QMap<int, int>::ConstIterator widthIt=tableIt.value().columnWidths.constBegin();widthIt!=tableIt.value().columnWidths.constEnd();++widthIt)
|
||||
ui->dataTable->setColumnWidth(widthIt.key(), widthIt.value());
|
||||
|
||||
// Sorting
|
||||
m_browseTableModel->sort(tableIt.value().sortOrderIndex, tableIt.value().sortOrderMode);
|
||||
ui->dataTable->filterHeader()->setSortIndicator(tableIt.value().sortOrderIndex, tableIt.value().sortOrderMode);
|
||||
|
||||
// Filters
|
||||
FilterTableHeader* filterHeader = qobject_cast<FilterTableHeader*>(ui->dataTable->horizontalHeader());
|
||||
for(QMap<int, QString>::ConstIterator filterIt=tableIt.value().filterValues.constBegin();filterIt!=tableIt.value().filterValues.constEnd();++filterIt)
|
||||
filterHeader->setFilter(filterIt.key(), filterIt.value());
|
||||
} else {
|
||||
// There aren't any column widths stored for this table yet, so set default widths
|
||||
// There aren't any information stored for this table yet, so use some default values
|
||||
|
||||
// Column widths
|
||||
for(int i=1;i<m_browseTableModel->columnCount();i++)
|
||||
ui->dataTable->setColumnWidth(i, ui->dataTable->horizontalHeader()->defaultSectionSize());
|
||||
|
||||
// Sorting
|
||||
m_browseTableModel->sort(0, Qt::AscendingOrder);
|
||||
ui->dataTable->filterHeader()->setSortIndicator(0, Qt::AscendingOrder);
|
||||
|
||||
// The filters can be left empty as they are
|
||||
}
|
||||
|
||||
// Reset sorting
|
||||
curBrowseOrderByIndex = 0;
|
||||
curBrowseOrderByMode = Qt::AscendingOrder;
|
||||
m_browseTableModel->sort(curBrowseOrderByIndex, curBrowseOrderByMode);
|
||||
ui->dataTable->filterHeader()->setSortIndicator(curBrowseOrderByIndex, curBrowseOrderByMode);
|
||||
|
||||
// Update the filter row
|
||||
qobject_cast<FilterTableHeader*>(ui->dataTable->horizontalHeader())->generateFilters(m_browseTableModel->columnCount(), bKeepFilter);
|
||||
|
||||
// Activate the add and delete record buttons and editing only if a table has been selected
|
||||
bool is_table = db.getObjectByName(tablename).gettype() == "table";
|
||||
ui->buttonNewRecord->setEnabled(is_table);
|
||||
@@ -391,10 +404,7 @@ void MainWindow::resetBrowser()
|
||||
int pos = ui->comboBrowseTable->findText(sCurrentTable);
|
||||
pos = pos == -1 ? 0 : pos;
|
||||
ui->comboBrowseTable->setCurrentIndex(pos);
|
||||
curBrowseOrderByIndex = 0;
|
||||
curBrowseOrderByMode = Qt::AscendingOrder;
|
||||
m_browseTableModel->sort(curBrowseOrderByIndex, curBrowseOrderByMode);
|
||||
populateTable(ui->comboBrowseTable->currentText(), true);
|
||||
populateTable(ui->comboBrowseTable->currentText());
|
||||
}
|
||||
|
||||
void MainWindow::fileClose()
|
||||
@@ -413,8 +423,8 @@ void MainWindow::fileClose()
|
||||
m_browseTableModel = new SqliteTableModel(this, &db, PreferencesDialog::getSettingsValue("db", "prefetchsize").toInt());
|
||||
connect(ui->dataTable->filterHeader(), SIGNAL(filterChanged(int,QString)), this, SLOT(updateFilter(int,QString)));
|
||||
|
||||
// Remove all stored column widths for the browse data table
|
||||
browseTableColumnWidths.clear();
|
||||
// Remove all stored table information browse data tab
|
||||
browseTableSettings.clear();
|
||||
|
||||
// Manually update the recordset label inside the Browse tab now
|
||||
setRecordsetLabel();
|
||||
@@ -555,7 +565,7 @@ void MainWindow::setRecordsetLabel()
|
||||
|
||||
void MainWindow::browseRefresh()
|
||||
{
|
||||
populateTable(ui->comboBrowseTable->currentText(), true);
|
||||
populateTable(ui->comboBrowseTable->currentText());
|
||||
}
|
||||
|
||||
void MainWindow::createTable()
|
||||
@@ -1122,9 +1132,10 @@ void MainWindow::browseTableHeaderClicked(int logicalindex)
|
||||
return;
|
||||
|
||||
// instead of the column name we just use the column index, +2 because 'rowid, *' is the projection
|
||||
curBrowseOrderByIndex = logicalindex;
|
||||
curBrowseOrderByMode = curBrowseOrderByMode == Qt::AscendingOrder ? Qt::DescendingOrder : Qt::AscendingOrder;
|
||||
ui->dataTable->sortByColumn(curBrowseOrderByIndex, curBrowseOrderByMode);
|
||||
BrowseDataTableSettings& settings = browseTableSettings[ui->comboBrowseTable->currentText()];
|
||||
settings.sortOrderIndex = logicalindex;
|
||||
settings.sortOrderMode = settings.sortOrderMode == Qt::AscendingOrder ? Qt::DescendingOrder : Qt::AscendingOrder;
|
||||
ui->dataTable->sortByColumn(settings.sortOrderIndex, settings.sortOrderMode);
|
||||
|
||||
// select the first item in the column so the header is bold
|
||||
// we might try to select the last selected item
|
||||
@@ -1773,7 +1784,7 @@ void MainWindow::updateBrowseDataColumnWidth(int section, int /*old_size*/, int
|
||||
QString tableName(ui->comboBrowseTable->currentText());
|
||||
if (!selectedCols.contains(section))
|
||||
{
|
||||
browseTableColumnWidths[tableName][section] = new_size;
|
||||
browseTableSettings[tableName].columnWidths[section] = new_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1781,7 +1792,7 @@ void MainWindow::updateBrowseDataColumnWidth(int section, int /*old_size*/, int
|
||||
foreach (int col, selectedCols)
|
||||
{
|
||||
ui->dataTable->setColumnWidth(col, new_size);
|
||||
browseTableColumnWidths[tableName][col] = new_size;
|
||||
browseTableSettings[tableName].columnWidths[col] = new_size;
|
||||
}
|
||||
ui->dataTable->blockSignals(false);
|
||||
}
|
||||
@@ -1865,18 +1876,14 @@ bool MainWindow::loadProject(QString filename)
|
||||
// Currently selected table
|
||||
ui->comboBrowseTable->setCurrentIndex(ui->comboBrowseTable->findText(xml.attributes().value("name").toString()));
|
||||
xml.skipCurrentElement();
|
||||
} else if(xml.name() == "column_widths") {
|
||||
// Column widths
|
||||
} else if(xml.name() == "browsetable_info") {
|
||||
QString attrData = xml.attributes().value("data").toString();
|
||||
QByteArray temp = QByteArray::fromBase64(attrData.toUtf8());
|
||||
QDataStream stream(temp);
|
||||
stream >> browseTableColumnWidths;
|
||||
stream >> browseTableSettings;
|
||||
populateTable(ui->comboBrowseTable->currentText()); // Refresh view
|
||||
xml.skipCurrentElement();
|
||||
} else if(xml.name() == "sort") {
|
||||
// Sort order
|
||||
ui->dataTable->sortByColumn(xml.attributes().value("column").toString().toInt(),
|
||||
static_cast<Qt::SortOrder>(xml.attributes().value("order").toString().toInt()));
|
||||
ui->dataTable->sortByColumn(browseTableSettings[ui->comboBrowseTable->currentText()].sortOrderIndex,
|
||||
browseTableSettings[ui->comboBrowseTable->currentText()].sortOrderMode);
|
||||
xml.skipCurrentElement();
|
||||
}
|
||||
}
|
||||
@@ -1976,18 +1983,14 @@ void MainWindow::saveProject()
|
||||
xml.writeStartElement("current_table"); // Currently selected table
|
||||
xml.writeAttribute("name", ui->comboBrowseTable->currentText());
|
||||
xml.writeEndElement();
|
||||
{ // Column widths
|
||||
{ // Table browser information
|
||||
QByteArray temp;
|
||||
QDataStream stream(&temp, QIODevice::WriteOnly);
|
||||
stream << browseTableColumnWidths;
|
||||
xml.writeStartElement("column_widths");
|
||||
stream << browseTableSettings;
|
||||
xml.writeStartElement("browsetable_info");
|
||||
xml.writeAttribute("data", temp.toBase64());
|
||||
xml.writeEndElement();
|
||||
}
|
||||
xml.writeStartElement("sort"); // Sort order
|
||||
xml.writeAttribute("column", QString::number(curBrowseOrderByIndex));
|
||||
xml.writeAttribute("order", QString::number(curBrowseOrderByMode));
|
||||
xml.writeEndElement();
|
||||
xml.writeEndElement();
|
||||
|
||||
// Execute SQL tab data
|
||||
@@ -2027,7 +2030,8 @@ void MainWindow::fileAttach()
|
||||
|
||||
void MainWindow::updateFilter(int column, const QString& value)
|
||||
{
|
||||
m_browseTableModel->updateFilter(column ,value);
|
||||
m_browseTableModel->updateFilter(column, value);
|
||||
browseTableSettings[ui->comboBrowseTable->currentText()].filterValues[column] = value;
|
||||
setRecordsetLabel();
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,35 @@ public:
|
||||
|
||||
DBBrowserDB* getDb() { return &db; }
|
||||
|
||||
struct BrowseDataTableSettings
|
||||
{
|
||||
int sortOrderIndex;
|
||||
Qt::SortOrder sortOrderMode;
|
||||
QMap<int, int> columnWidths;
|
||||
QMap<int, QString> filterValues;
|
||||
|
||||
friend QDataStream& operator<<(QDataStream& stream, const MainWindow::BrowseDataTableSettings& object)
|
||||
{
|
||||
stream << object.sortOrderIndex;
|
||||
stream << static_cast<int>(object.sortOrderMode);
|
||||
stream << object.columnWidths;
|
||||
stream << object.filterValues;
|
||||
|
||||
return stream;
|
||||
}
|
||||
friend QDataStream& operator>>(QDataStream& stream, MainWindow::BrowseDataTableSettings& object)
|
||||
{
|
||||
stream >> object.sortOrderIndex;
|
||||
int sortordermode;
|
||||
stream >> sortordermode;
|
||||
object.sortOrderMode = static_cast<Qt::SortOrder>(sortordermode);
|
||||
stream >> object.columnWidths;
|
||||
stream >> object.filterValues;
|
||||
|
||||
return stream;
|
||||
}
|
||||
};
|
||||
|
||||
private:
|
||||
struct PragmaValues
|
||||
{
|
||||
@@ -79,9 +108,7 @@ private:
|
||||
QAction *recentFileActs[MaxRecentFiles];
|
||||
QAction *recentSeparatorAct;
|
||||
|
||||
int curBrowseOrderByIndex;
|
||||
Qt::SortOrder curBrowseOrderByMode;
|
||||
QMap<QString, QMap<int, int> > browseTableColumnWidths;
|
||||
QMap<QString, BrowseDataTableSettings> browseTableSettings;
|
||||
|
||||
EditDialog* editWin;
|
||||
QIntValidator* gotoValidator;
|
||||
@@ -117,7 +144,7 @@ private slots:
|
||||
void changeTreeSelection();
|
||||
void fileNew();
|
||||
void populateStructure();
|
||||
void populateTable(const QString& tablename, bool bKeepFilter = false);
|
||||
void populateTable(const QString& tablename);
|
||||
void resetBrowser();
|
||||
void fileClose();
|
||||
void addRecord();
|
||||
|
||||
Reference in New Issue
Block a user