@@ -267,6 +267,8 @@ DisplayControls::DisplayControls(QWidget* parent)
267267
268268 auto * root = model_->invisibleRootItem ();
269269
270+ custom_controls_start_ = -1 ;
271+
270272 auto layers
271273 = makeParentItem (layers_group_, " Layers" , root, Qt::Checked, true );
272274 view_->expand (layers->index ());
@@ -535,6 +537,9 @@ DisplayControls::DisplayControls(QWidget* parent)
535537
536538 connect (
537539 this , &DisplayControls::colorChanged, this , &DisplayControls::changed);
540+
541+ custom_controls_start_ = root->rowCount ();
542+
538543 // register renderers
539544 if (gui::Gui::get () != nullptr ) {
540545 for (auto renderer : gui::Gui::get ()->renderers ()) {
@@ -1241,8 +1246,20 @@ void DisplayControls::save()
12411246
12421247void DisplayControls::restore ()
12431248{
1249+ // Collect current controls in case some were removed after save was called.
1250+ std::map<std::string, QStandardItem*> all_controls;
1251+ collectControls (model_->invisibleRootItem (), Visible, all_controls);
1252+ collectControls (model_->invisibleRootItem (), Selectable, all_controls);
1253+ std::set<QStandardItem*> controls;
1254+
1255+ for (auto & [control_name, control] : all_controls) {
1256+ controls.insert (control);
1257+ }
1258+
12441259 for (auto & [control, state] : saved_state_) {
1245- control->setCheckState (state);
1260+ if (controls.find (control) != controls.end ()) {
1261+ control->setCheckState (state);
1262+ }
12461263 }
12471264}
12481265
@@ -1912,6 +1929,7 @@ void DisplayControls::registerRenderer(Renderer* renderer)
19121929 }
19131930
19141931 auto & add_rows = custom_controls_[renderer];
1932+
19151933 add_rows.insert (add_rows.begin (), rows.begin (), rows.end ());
19161934 }
19171935
@@ -1923,6 +1941,22 @@ void DisplayControls::registerRenderer(Renderer* renderer)
19231941 renderer->setSettings (setting->second );
19241942 }
19251943 }
1944+
1945+ // Sort custom_controls
1946+ std::vector<QList<QStandardItem*>> custom_controls;
1947+ while (model_->invisibleRootItem ()->rowCount () > custom_controls_start_) {
1948+ custom_controls.push_back (
1949+ model_->takeRow (model_->invisibleRootItem ()->rowCount () - 1 ));
1950+ }
1951+ std::stable_sort (custom_controls.begin (),
1952+ custom_controls.end (),
1953+ [](const QList<QStandardItem*>& list0,
1954+ const QList<QStandardItem*>& list1) {
1955+ return list0[Name]->text () < list1[Name]->text ();
1956+ });
1957+ for (const auto & row : custom_controls) {
1958+ model_->appendRow (row);
1959+ }
19261960}
19271961
19281962void DisplayControls::unregisterRenderer (Renderer* renderer)
0 commit comments