From 9e3183250f10aafada3ff64f4097e84c45e3964a Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 7 Mar 2021 22:20:28 +0100 Subject: [PATCH] Fixed some flaws in the layer list - sometimes, layers which were supposed to be hidden were still shown (e.g. after paste, "add other layer views" etc.) - sometimes, layers were only partially hightlighted due to invalid persistent model indexes. --- src/laybasic/laybasic/layLayerControlPanel.cc | 19 +++++++++++++++---- src/laybasic/laybasic/layLayerControlPanel.h | 3 ++- src/laybasic/laybasic/layLayerTreeModel.cc | 19 +++++++++++++++++-- src/laybasic/laybasic/layLayerTreeModel.h | 5 +++-- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/laybasic/laybasic/layLayerControlPanel.cc b/src/laybasic/laybasic/layLayerControlPanel.cc index 0316d6711..72ff771d0 100644 --- a/src/laybasic/laybasic/layLayerControlPanel.cc +++ b/src/laybasic/laybasic/layLayerControlPanel.cc @@ -204,10 +204,10 @@ LayerControlPanel::LayerControlPanel (lay::LayoutView *view, db::Manager *manage mp_view (view), m_needs_update (true), m_tabs_need_update (true), + m_hidden_flags_need_update (true), m_in_update (false), m_phase (0), m_do_update_content_dm (this, &LayerControlPanel::do_update_content), - m_do_update_hidden_flags_dm (this, &LayerControlPanel::do_update_hidden_flags), m_no_stipples (false) { setObjectName (QString::fromUtf8 (name)); @@ -1661,7 +1661,8 @@ LayerControlPanel::set_text_color (QColor c) void LayerControlPanel::update_hidden_flags () { - m_do_update_hidden_flags_dm (); + m_hidden_flags_need_update = true; + m_do_update_content_dm (); } void @@ -1688,6 +1689,7 @@ LayerControlPanel::begin_updates () if (! m_in_update) { m_in_update = true; + m_hidden_flags_need_update = true; mp_model->signal_begin_layer_changed (); // this makes the view redraw the data @@ -1718,6 +1720,7 @@ LayerControlPanel::cancel_updates () { m_in_update = false; m_needs_update = false; + m_hidden_flags_need_update = false; m_tabs_need_update = false; } @@ -1833,7 +1836,7 @@ LayerControlPanel::do_update_content () mp_layer_list->setCurrentIndex(QModelIndex()); // this makes the view redraw the data and establishes a valid selection scheme - mp_model->signal_layer_changed (); + mp_model->signal_layers_changed (); // now realize the selection if required if (! m_new_sel.empty ()) { @@ -1875,6 +1878,14 @@ LayerControlPanel::do_update_content () } else { mp_model->signal_data_changed (); // this makes the view redraw the data } + + if (m_hidden_flags_need_update) { + + do_update_hidden_flags (); + + m_hidden_flags_need_update = false; + + } } void @@ -2007,7 +2018,7 @@ LayerControlPanel::update_required (int f) } if ((f & 3) != 0) { - m_do_update_hidden_flags_dm (); + m_hidden_flags_need_update = true; } m_do_update_content_dm (); diff --git a/src/laybasic/laybasic/layLayerControlPanel.h b/src/laybasic/laybasic/layLayerControlPanel.h index 8d235c877..f8124f8df 100644 --- a/src/laybasic/laybasic/layLayerControlPanel.h +++ b/src/laybasic/laybasic/layLayerControlPanel.h @@ -341,10 +341,11 @@ private: lay::LayoutView *mp_view; bool m_needs_update; bool m_tabs_need_update; + bool m_hidden_flags_need_update; bool m_in_update; std::vector m_new_sel; int m_phase; - tl::DeferredMethod m_do_update_content_dm, m_do_update_hidden_flags_dm; + tl::DeferredMethod m_do_update_content_dm; std::set m_expanded; bool m_no_stipples; QLabel *m_no_stipples_label; diff --git a/src/laybasic/laybasic/layLayerTreeModel.cc b/src/laybasic/laybasic/layLayerTreeModel.cc index c5c6f2b99..66efa50e9 100644 --- a/src/laybasic/laybasic/layLayerTreeModel.cc +++ b/src/laybasic/laybasic/layLayerTreeModel.cc @@ -421,9 +421,9 @@ LayerTreeModel::signal_begin_layer_changed () } void -LayerTreeModel::signal_layer_changed () +LayerTreeModel::signal_layers_changed () { - // establish a new range of valid iterator indices + // establish a new range of valid iterator indices m_id_start = m_id_end; // TODO: is there a more efficient way to compute that? @@ -433,6 +433,21 @@ LayerTreeModel::signal_layer_changed () } m_id_end += max_id + 1; + // update the persistent indexes + + QModelIndexList indexes = persistentIndexList (); + QModelIndexList new_indexes; + for (QModelIndexList::const_iterator i = indexes.begin (); i != indexes.end (); ++i) { + lay::LayerPropertiesConstIterator li = iterator (*i); + if (! li.at_end ()) { + new_indexes.push_back (createIndex (li.child_index (), i->column (), (void *) (li.uint () + m_id_start))); + } else { + new_indexes.push_back (QModelIndex ()); + } + } + + changePersistentIndexList (indexes, new_indexes); + m_test_shapes_cache.clear (); emit layoutChanged (); } diff --git a/src/laybasic/laybasic/layLayerTreeModel.h b/src/laybasic/laybasic/layLayerTreeModel.h index 10404160c..12bba517e 100644 --- a/src/laybasic/laybasic/layLayerTreeModel.h +++ b/src/laybasic/laybasic/layLayerTreeModel.h @@ -235,11 +235,12 @@ public: /** * @brief emit a layoutChanged signal */ - void signal_layer_changed (); + void signal_layers_changed (); signals: /** - * @brief This signal is emitted to indicate + * @brief This signal is emitted to indicate the hidden flags need update by the client + * Note this is neither done by the view nor the model. It needs to be implemented elsewhere. */ void hidden_flags_need_update ();