From 1fd73126e13baaa062ab33295a3a13de804dd1d4 Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 1 Oct 2022 08:12:14 +0200 Subject: [PATCH] #6107: Preserve the expanded/selected state of the tree when rebuilding it --- radiant/ui/layers/LayerControlDialog.cpp | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/radiant/ui/layers/LayerControlDialog.cpp b/radiant/ui/layers/LayerControlDialog.cpp index 289e81aa4e..fe83e12271 100644 --- a/radiant/ui/layers/LayerControlDialog.cpp +++ b/radiant/ui/layers/LayerControlDialog.cpp @@ -222,6 +222,18 @@ void LayerControlDialog::refresh() { _refreshTreeOnIdle = false; + // Find out which layers are currently expanded and/or selected + auto selectedLayerId = getSelectedLayerId(); + std::set expandedLayers; + + for (const auto& [id, item] : _layerItemMap) + { + if (_layersView->IsExpanded(item)) + { + expandedLayers.insert(id); + } + } + clearControls(); if (!GlobalMapModule().getRoot()) return; // no map present @@ -234,6 +246,22 @@ void LayerControlDialog::refresh() std::bind(&TreePopulator::processLayer, &populator, std::placeholders::_1, std::placeholders::_2)); _layerItemMap = std::move(populator.getLayerItemMap()); + + // Restore the expanded state of tree elements + for (const auto& [id, item] : _layerItemMap) + { + if (expandedLayers.count(id) > 0) + { + _layersView->Expand(item); + } + + if (selectedLayerId == id) + { + _layersView->Select(item); + _layersView->EnsureVisible(item); + } + } + updateButtonSensitivity(populator.getNumVisibleLayers(), populator.getNumHiddenLayers()); }