diff --git a/src/edt/edt/edtShapeService.cc b/src/edt/edt/edtShapeService.cc index 4664f777b..86dfadb5e 100644 --- a/src/edt/edt/edtShapeService.cc +++ b/src/edt/edt/edtShapeService.cc @@ -150,8 +150,7 @@ ShapeEditService::get_edit_layer () mp_layout = &(cv->layout ()); mp_cell = cv.cell (); - // fetches the last configuration for the given layer - view ()->set_active_cellview_index (cv_index); + view ()->set_active_cellview_index_silent (cv_index); } void @@ -173,8 +172,9 @@ ShapeEditService::change_edit_layer (const db::LayerProperties &lp) close_editor_hooks (false); } + view ()->set_active_cellview_index_silent (m_cv_index); + // fetches the last configuration for the given layer - view ()->set_active_cellview_index (m_cv_index); config_recent_for_layer (lp, m_cv_index); if (editing ()) { @@ -237,7 +237,9 @@ ShapeEditService::update_edit_layer (const lay::LayerPropertiesConstIterator &cl 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*/); int layer = cl->layer_index (); diff --git a/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc b/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc index 86892f3c1..c9f365c20 100644 --- a/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc +++ b/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc @@ -879,6 +879,7 @@ LAYBASIC_PUBLIC Class 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"), "@brief Makes the cellview with the given index the active one (shown in hierarchy browser)\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" "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." diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index 50a160e5d..6c03e7087 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -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 std::vector plugins; plugins.swap (mp_plugins); @@ -4943,6 +4949,19 @@ LayoutViewBase::active_cellview_index () const 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 LayoutViewBase::set_active_cellview_index (int index) { diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index eeda5619a..49edddaff 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -2151,6 +2151,12 @@ class LAYBASIC_PUBLIC LayoutViewBase : */ 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 * This event is triggered after the active cellview changed. diff --git a/src/layui/layui/layHierarchyControlPanel.cc b/src/layui/layui/layHierarchyControlPanel.cc index 8c6ee9678..140f8fcae 100644 --- a/src/layui/layui/layHierarchyControlPanel.cc +++ b/src/layui/layui/layHierarchyControlPanel.cc @@ -707,44 +707,50 @@ HierarchyControlPanel::update_required () } void -HierarchyControlPanel::select_active (int cellview_index) +HierarchyControlPanel::select_active (int cellview_index, bool silent) { if (cellview_index != m_active_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::selection_changed (int index) +HierarchyControlPanel::change_active_cellview (int index) { - if (index != m_active_index) { + search_editing_finished (); - search_editing_finished (); + m_active_index = index; - 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; - } + 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 ::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 (); - } + int i = 0; + for (std::vector ::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 ::const_iterator f = mp_cell_list_headers.begin (); f != mp_cell_list_headers.end (); ++f, ++i) { - (*f)->setChecked (i == index); - } + i = 0; + for (std::vector ::const_iterator f = mp_cell_list_headers.begin (); f != mp_cell_list_headers.end (); ++f, ++i) { + (*f)->setChecked (i == index); + } +} +void +HierarchyControlPanel::selection_changed (int index) +{ + if (index != m_active_index) { + change_active_cellview (index); emit active_cellview_changed (index); - } } diff --git a/src/layui/layui/layHierarchyControlPanel.h b/src/layui/layui/layHierarchyControlPanel.h index b67df7f09..03a6630a7 100644 --- a/src/layui/layui/layHierarchyControlPanel.h +++ b/src/layui/layui/layHierarchyControlPanel.h @@ -140,7 +140,7 @@ Q_OBJECT * selects the active cellview by index. The index must be * 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 @@ -346,6 +346,9 @@ public slots: // ask for cell copy mode bool ask_for_cell_copy_mode (const db::Layout &layout, const std::vector &paths, int &cell_copy_mode); + + // changes the active cellview + void change_active_cellview (int index); }; } // namespace lay diff --git a/src/layview/layview/layLayoutView_qt.cc b/src/layview/layview/layLayoutView_qt.cc index 4502aec59..7fb6d316f 100644 --- a/src/layview/layview/layLayoutView_qt.cc +++ b/src/layview/layview/layLayoutView_qt.cc @@ -1387,12 +1387,13 @@ LayoutView::active_cellview_index () const } } -void +void LayoutView::set_active_cellview_index (int index) { if (index >= 0 && index < int (cellviews ())) { 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); }