Skip to content

Commit fdc4169

Browse files
committed
Clear Table Browser settings when the table does not exist any longer
For example, when a database is detached. See issue #3662
1 parent e8445ae commit fdc4169

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

src/MainWindow.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,14 +671,14 @@ void MainWindow::populateStructure(const std::vector<sqlb::ObjectIdentifier>& ol
671671
ui->treeSchemaDock->resizeColumnToContents(DbStructureModel::ColumnName);
672672
}
673673

674-
void MainWindow::refreshTableBrowsers()
674+
void MainWindow::refreshTableBrowsers(bool all)
675675
{
676676
QApplication::setOverrideCursor(Qt::WaitCursor);
677677
for(const auto& d : allTableBrowserDocks())
678678
{
679679
// When in the Browse Data tab update all docks. Otherwise just update the floating ones because they might
680680
// be visible even when another tab is active.
681-
if(ui->mainTab->currentWidget() == ui->browser || d->isFloating())
681+
if(all || ui->mainTab->currentWidget() == ui->browser || d->isFloating())
682682
{
683683
TableBrowser* t = d->tableBrowser();
684684
if(t)
@@ -3402,6 +3402,8 @@ void MainWindow::fileDetachTreeViewSelected(QTreeView* treeView)
34023402
std::string attached_as = treeView->model()->data(treeView->currentIndex().sibling(treeView->currentIndex().row(), DbStructureModel::ColumnSchema), Qt::EditRole).toString().toStdString();
34033403
if (db.detach(attached_as))
34043404
{
3405+
db.updateSchema();
3406+
refreshTableBrowsers(/* all */ true);
34053407
isProjectModified = true;
34063408
}
34073409
}

src/MainWindow.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ private slots:
175175
void changeTreeSelection();
176176
void fileNew();
177177
void fileNewInMemoryDatabase(bool open_create_dialog = true);
178-
void refreshTableBrowsers();
178+
// Refresh visible table browsers. When all is true, refresh all browsers.
179+
void refreshTableBrowsers(bool all = false);
179180
bool fileClose();
180181
bool fileSaveAs();
181182
void createTable();

src/TableBrowser.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,15 @@ void TableBrowser::refresh()
536536
});
537537
}
538538

539+
// Delete settings of no-longer existent tables
540+
for (auto it = m_settings.cbegin(); it != m_settings.cend(); ) {
541+
if (!db->getTableByName(it->first)) {
542+
it = m_settings.erase(it);
543+
} else {
544+
++it;
545+
}
546+
}
547+
539548
// Retrieve the stored data for this table if there is any. If there are no settings for this table,
540549
// this will insert and return a settings object with default values.
541550
const sqlb::ObjectIdentifier tablename = currentlyBrowsedTableName();
@@ -551,9 +560,9 @@ void TableBrowser::refresh()
551560
emit currentTableChanged(tablename);
552561

553562
// Build query and apply settings
554-
applyModelSettings(storedData, buildQuery(storedData, tablename));
555-
applyViewportSettings(storedData, tablename);
556-
emit updatePlot(ui->dataTable, m_model, &m_settings[tablename], true);
563+
applyModelSettings(storedData, buildQuery(storedData, tablename));
564+
applyViewportSettings(storedData, tablename);
565+
emit updatePlot(ui->dataTable, m_model, &m_settings[tablename], true);
557566
}
558567

559568
void TableBrowser::clearFilters()

0 commit comments

Comments
 (0)