Merge pull request #2164 from KLayout/bugfix/issue-2162

Bugfix/issue 2162
This commit is contained in:
Matthias Köfferlein 2025-10-18 13:50:47 +02:00 committed by GitHub
commit 77cc0be2ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 72 additions and 34 deletions

View File

@ -150,8 +150,7 @@ ShapeEditService::get_edit_layer ()
mp_layout = &(cv->layout ()); mp_layout = &(cv->layout ());
mp_cell = cv.cell (); mp_cell = cv.cell ();
// fetches the last configuration for the given layer view ()->set_active_cellview_index_silent (cv_index);
view ()->set_active_cellview_index (cv_index);
} }
void void
@ -173,8 +172,9 @@ ShapeEditService::change_edit_layer (const db::LayerProperties &lp)
close_editor_hooks (false); close_editor_hooks (false);
} }
view ()->set_active_cellview_index_silent (m_cv_index);
// fetches the last configuration for the given layer // fetches the last configuration for the given layer
view ()->set_active_cellview_index (m_cv_index);
config_recent_for_layer (lp, m_cv_index); config_recent_for_layer (lp, m_cv_index);
if (editing ()) { if (editing ()) {
@ -237,7 +237,9 @@ ShapeEditService::update_edit_layer (const lay::LayerPropertiesConstIterator &cl
return; return;
} }
view ()->set_active_cellview_index (cv_index); // NOTE: we don't want side effects during this operation - i.e. some that
// change the selection. Hence no events here.
view ()->set_active_cellview_index_silent (cv_index);
const lay::ParsedLayerSource &source = cl->source (true /*real*/); const lay::ParsedLayerSource &source = cl->source (true /*real*/);
int layer = cl->layer_index (); int layer = cl->layer_index ();

View File

@ -879,6 +879,7 @@ LAYBASIC_PUBLIC Class<lay::LayoutViewBase> decl_LayoutViewBase (decl_Dispatcher,
gsi::method ("active_cellview_index=|#active_setview_index=|#set_active_cellview_index", &lay::LayoutViewBase::set_active_cellview_index, gsi::arg ("index"), gsi::method ("active_cellview_index=|#active_setview_index=|#set_active_cellview_index", &lay::LayoutViewBase::set_active_cellview_index, gsi::arg ("index"),
"@brief Makes the cellview with the given index the active one (shown in hierarchy browser)\n" "@brief Makes the cellview with the given index the active one (shown in hierarchy browser)\n"
"See \\active_cellview_index.\n" "See \\active_cellview_index.\n"
"Note, that this changing the active cell view index has side effects such as terminating an editing operation.\n"
"\n" "\n"
"This method has been renamed from set_active_cellview_index to active_cellview_index= in version 0.25. " "This method has been renamed from set_active_cellview_index to active_cellview_index= in version 0.25. "
"The original name is still available, but is deprecated." "The original name is still available, but is deprecated."

View File

@ -475,6 +475,12 @@ LayoutViewBase::shutdown ()
} }
} }
// NOTE: this must happen before the services are deleted
mp_move_service = 0;
mp_selection_service = 0;
mp_tracker = 0;
mp_zoom_service = 0;
// delete all plugins // delete all plugins
std::vector<lay::Plugin *> plugins; std::vector<lay::Plugin *> plugins;
plugins.swap (mp_plugins); plugins.swap (mp_plugins);
@ -4943,6 +4949,19 @@ LayoutViewBase::active_cellview_index () const
return m_active_cellview_index; return m_active_cellview_index;
} }
void
LayoutViewBase::set_active_cellview_index_silent (int index)
{
enable_active_cellview_changed_event (false);
try {
set_active_cellview_index (index);
enable_active_cellview_changed_event (true, true /*silent*/);
} catch (...) {
enable_active_cellview_changed_event (true, true /*silent*/);
throw;
}
}
void void
LayoutViewBase::set_active_cellview_index (int index) LayoutViewBase::set_active_cellview_index (int index)
{ {

View File

@ -2151,6 +2151,12 @@ public:
*/ */
virtual void set_active_cellview_index (int index); virtual void set_active_cellview_index (int index);
/**
* @brief Select a certain cellview for the active one
* This version does not emit any events while changing the cellview index
*/
void set_active_cellview_index_silent (int index);
/** /**
* @brief An event triggered if the active cellview changes * @brief An event triggered if the active cellview changes
* This event is triggered after the active cellview changed. * This event is triggered after the active cellview changed.

View File

@ -707,11 +707,41 @@ HierarchyControlPanel::update_required ()
} }
void void
HierarchyControlPanel::select_active (int cellview_index) HierarchyControlPanel::select_active (int cellview_index, bool silent)
{ {
if (cellview_index != m_active_index) { if (cellview_index != m_active_index) {
mp_selector->setCurrentIndex (cellview_index); mp_selector->setCurrentIndex (cellview_index);
selection_changed (cellview_index); change_active_cellview (cellview_index);
if (! silent) {
emit active_cellview_changed (cellview_index);
}
}
}
void
HierarchyControlPanel::change_active_cellview (int index)
{
search_editing_finished ();
m_active_index = index;
bool split_mode = m_split_mode;
// for more than max_cellviews_in_split_mode cellviews, switch to overlay mode
if (int (m_cellviews.size ()) > max_cellviews_in_split_mode) {
split_mode = false;
}
int i = 0;
for (std::vector <QFrame *>::const_iterator f = mp_cell_list_frames.begin (); f != mp_cell_list_frames.end (); ++f, ++i) {
(*f)->setVisible (i == index || split_mode);
if (i == index) {
mp_cell_lists [i]->setFocus ();
}
}
i = 0;
for (std::vector <QToolButton *>::const_iterator f = mp_cell_list_headers.begin (); f != mp_cell_list_headers.end (); ++f, ++i) {
(*f)->setChecked (i == index);
} }
} }
@ -719,32 +749,8 @@ void
HierarchyControlPanel::selection_changed (int index) HierarchyControlPanel::selection_changed (int index)
{ {
if (index != m_active_index) { if (index != m_active_index) {
change_active_cellview (index);
search_editing_finished ();
m_active_index = index;
bool split_mode = m_split_mode;
// for more than max_cellviews_in_split_mode cellviews, switch to overlay mode
if (int (m_cellviews.size ()) > max_cellviews_in_split_mode) {
split_mode = false;
}
int i = 0;
for (std::vector <QFrame *>::const_iterator f = mp_cell_list_frames.begin (); f != mp_cell_list_frames.end (); ++f, ++i) {
(*f)->setVisible (i == index || split_mode);
if (i == index) {
mp_cell_lists [i]->setFocus ();
}
}
i = 0;
for (std::vector <QToolButton *>::const_iterator f = mp_cell_list_headers.begin (); f != mp_cell_list_headers.end (); ++f, ++i) {
(*f)->setChecked (i == index);
}
emit active_cellview_changed (index); emit active_cellview_changed (index);
} }
} }

View File

@ -140,7 +140,7 @@ public:
* selects the active cellview by index. The index must be * selects the active cellview by index. The index must be
* a valid index within the context of the layout view. * a valid index within the context of the layout view.
*/ */
void select_active (int cellview_index); void select_active (int cellview_index, bool silent = false);
/** /**
* @brief Get the active cellview * @brief Get the active cellview
@ -346,6 +346,9 @@ private:
// ask for cell copy mode // ask for cell copy mode
bool ask_for_cell_copy_mode (const db::Layout &layout, const std::vector<cell_path_type> &paths, int &cell_copy_mode); bool ask_for_cell_copy_mode (const db::Layout &layout, const std::vector<cell_path_type> &paths, int &cell_copy_mode);
// changes the active cellview
void change_active_cellview (int index);
}; };
} // namespace lay } // namespace lay

View File

@ -1387,12 +1387,13 @@ LayoutView::active_cellview_index () const
} }
} }
void void
LayoutView::set_active_cellview_index (int index) LayoutView::set_active_cellview_index (int index)
{ {
if (index >= 0 && index < int (cellviews ())) { if (index >= 0 && index < int (cellviews ())) {
if (mp_hierarchy_panel) { if (mp_hierarchy_panel) {
mp_hierarchy_panel->select_active (index); // NOTE: we don't send events from here, that is done in "LayoutViewBase::set_active_cellview_index"
mp_hierarchy_panel->select_active (index, true /*no events*/);
} }
LayoutViewBase::set_active_cellview_index (index); LayoutViewBase::set_active_cellview_index (index);
} }