Skip to content

Commit 77cc0be

Browse files
Merge pull request #2164 from KLayout/bugfix/issue-2162
Bugfix/issue 2162
2 parents d5c6b73 + 17f4397 commit 77cc0be

File tree

7 files changed

+68
-30
lines changed

7 files changed

+68
-30
lines changed

src/edt/edt/edtShapeService.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,7 @@ ShapeEditService::get_edit_layer ()
150150
mp_layout = &(cv->layout ());
151151
mp_cell = cv.cell ();
152152

153-
// fetches the last configuration for the given layer
154-
view ()->set_active_cellview_index (cv_index);
153+
view ()->set_active_cellview_index_silent (cv_index);
155154
}
156155

157156
void
@@ -173,8 +172,9 @@ ShapeEditService::change_edit_layer (const db::LayerProperties &lp)
173172
close_editor_hooks (false);
174173
}
175174

175+
view ()->set_active_cellview_index_silent (m_cv_index);
176+
176177
// fetches the last configuration for the given layer
177-
view ()->set_active_cellview_index (m_cv_index);
178178
config_recent_for_layer (lp, m_cv_index);
179179

180180
if (editing ()) {
@@ -237,7 +237,9 @@ ShapeEditService::update_edit_layer (const lay::LayerPropertiesConstIterator &cl
237237
return;
238238
}
239239

240-
view ()->set_active_cellview_index (cv_index);
240+
// NOTE: we don't want side effects during this operation - i.e. some that
241+
// change the selection. Hence no events here.
242+
view ()->set_active_cellview_index_silent (cv_index);
241243

242244
const lay::ParsedLayerSource &source = cl->source (true /*real*/);
243245
int layer = cl->layer_index ();

src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc

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

src/laybasic/laybasic/layLayoutViewBase.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,12 @@ LayoutViewBase::shutdown ()
475475
}
476476
}
477477

478+
// NOTE: this must happen before the services are deleted
479+
mp_move_service = 0;
480+
mp_selection_service = 0;
481+
mp_tracker = 0;
482+
mp_zoom_service = 0;
483+
478484
// delete all plugins
479485
std::vector<lay::Plugin *> plugins;
480486
plugins.swap (mp_plugins);
@@ -4943,6 +4949,19 @@ LayoutViewBase::active_cellview_index () const
49434949
return m_active_cellview_index;
49444950
}
49454951

4952+
void
4953+
LayoutViewBase::set_active_cellview_index_silent (int index)
4954+
{
4955+
enable_active_cellview_changed_event (false);
4956+
try {
4957+
set_active_cellview_index (index);
4958+
enable_active_cellview_changed_event (true, true /*silent*/);
4959+
} catch (...) {
4960+
enable_active_cellview_changed_event (true, true /*silent*/);
4961+
throw;
4962+
}
4963+
}
4964+
49464965
void
49474966
LayoutViewBase::set_active_cellview_index (int index)
49484967
{

src/laybasic/laybasic/layLayoutViewBase.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2151,6 +2151,12 @@ class LAYBASIC_PUBLIC LayoutViewBase :
21512151
*/
21522152
virtual void set_active_cellview_index (int index);
21532153

2154+
/**
2155+
* @brief Select a certain cellview for the active one
2156+
* This version does not emit any events while changing the cellview index
2157+
*/
2158+
void set_active_cellview_index_silent (int index);
2159+
21542160
/**
21552161
* @brief An event triggered if the active cellview changes
21562162
* This event is triggered after the active cellview changed.

src/layui/layui/layHierarchyControlPanel.cc

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -707,44 +707,50 @@ HierarchyControlPanel::update_required ()
707707
}
708708

709709
void
710-
HierarchyControlPanel::select_active (int cellview_index)
710+
HierarchyControlPanel::select_active (int cellview_index, bool silent)
711711
{
712712
if (cellview_index != m_active_index) {
713713
mp_selector->setCurrentIndex (cellview_index);
714-
selection_changed (cellview_index);
714+
change_active_cellview (cellview_index);
715+
if (! silent) {
716+
emit active_cellview_changed (cellview_index);
717+
}
715718
}
716719
}
717720

718721
void
719-
HierarchyControlPanel::selection_changed (int index)
722+
HierarchyControlPanel::change_active_cellview (int index)
720723
{
721-
if (index != m_active_index) {
724+
search_editing_finished ();
722725

723-
search_editing_finished ();
726+
m_active_index = index;
724727

725-
m_active_index = index;
726-
727-
bool split_mode = m_split_mode;
728-
// for more than max_cellviews_in_split_mode cellviews, switch to overlay mode
729-
if (int (m_cellviews.size ()) > max_cellviews_in_split_mode) {
730-
split_mode = false;
731-
}
728+
bool split_mode = m_split_mode;
729+
// for more than max_cellviews_in_split_mode cellviews, switch to overlay mode
730+
if (int (m_cellviews.size ()) > max_cellviews_in_split_mode) {
731+
split_mode = false;
732+
}
732733

733-
int i = 0;
734-
for (std::vector <QFrame *>::const_iterator f = mp_cell_list_frames.begin (); f != mp_cell_list_frames.end (); ++f, ++i) {
735-
(*f)->setVisible (i == index || split_mode);
736-
if (i == index) {
737-
mp_cell_lists [i]->setFocus ();
738-
}
734+
int i = 0;
735+
for (std::vector <QFrame *>::const_iterator f = mp_cell_list_frames.begin (); f != mp_cell_list_frames.end (); ++f, ++i) {
736+
(*f)->setVisible (i == index || split_mode);
737+
if (i == index) {
738+
mp_cell_lists [i]->setFocus ();
739739
}
740+
}
740741

741-
i = 0;
742-
for (std::vector <QToolButton *>::const_iterator f = mp_cell_list_headers.begin (); f != mp_cell_list_headers.end (); ++f, ++i) {
743-
(*f)->setChecked (i == index);
744-
}
742+
i = 0;
743+
for (std::vector <QToolButton *>::const_iterator f = mp_cell_list_headers.begin (); f != mp_cell_list_headers.end (); ++f, ++i) {
744+
(*f)->setChecked (i == index);
745+
}
746+
}
745747

748+
void
749+
HierarchyControlPanel::selection_changed (int index)
750+
{
751+
if (index != m_active_index) {
752+
change_active_cellview (index);
746753
emit active_cellview_changed (index);
747-
748754
}
749755
}
750756

src/layui/layui/layHierarchyControlPanel.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ Q_OBJECT
140140
* selects the active cellview by index. The index must be
141141
* a valid index within the context of the layout view.
142142
*/
143-
void select_active (int cellview_index);
143+
void select_active (int cellview_index, bool silent = false);
144144

145145
/**
146146
* @brief Get the active cellview
@@ -346,6 +346,9 @@ public slots:
346346

347347
// ask for cell copy mode
348348
bool ask_for_cell_copy_mode (const db::Layout &layout, const std::vector<cell_path_type> &paths, int &cell_copy_mode);
349+
350+
// changes the active cellview
351+
void change_active_cellview (int index);
349352
};
350353

351354
} // namespace lay

src/layview/layview/layLayoutView_qt.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,12 +1387,13 @@ LayoutView::active_cellview_index () const
13871387
}
13881388
}
13891389

1390-
void
1390+
void
13911391
LayoutView::set_active_cellview_index (int index)
13921392
{
13931393
if (index >= 0 && index < int (cellviews ())) {
13941394
if (mp_hierarchy_panel) {
1395-
mp_hierarchy_panel->select_active (index);
1395+
// NOTE: we don't send events from here, that is done in "LayoutViewBase::set_active_cellview_index"
1396+
mp_hierarchy_panel->select_active (index, true /*no events*/);
13961397
}
13971398
LayoutViewBase::set_active_cellview_index (index);
13981399
}

0 commit comments

Comments
 (0)