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.
This commit is contained in:
Matthias Koefferlein 2021-03-07 22:20:28 +01:00
parent a7c263bc98
commit 9e3183250f
4 changed files with 37 additions and 9 deletions

View File

@ -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 ();

View File

@ -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<size_t> m_new_sel;
int m_phase;
tl::DeferredMethod<LayerControlPanel> m_do_update_content_dm, m_do_update_hidden_flags_dm;
tl::DeferredMethod<LayerControlPanel> m_do_update_content_dm;
std::set<unsigned int> m_expanded;
bool m_no_stipples;
QLabel *m_no_stipples_label;

View File

@ -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 ();
}

View File

@ -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 ();