Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/edt/edt/edtShapeService.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 ()) {
Expand Down Expand Up @@ -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 ();
Expand Down
1 change: 1 addition & 0 deletions src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
"@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."
Expand Down
19 changes: 19 additions & 0 deletions src/laybasic/laybasic/layLayoutViewBase.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<lay::Plugin *> plugins;
plugins.swap (mp_plugins);
Expand Down Expand Up @@ -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)
{
Expand Down
6 changes: 6 additions & 0 deletions src/laybasic/laybasic/layLayoutViewBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
52 changes: 29 additions & 23 deletions src/layui/layui/layHierarchyControlPanel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 <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 ();
}
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);
}
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);
}
}

void
HierarchyControlPanel::selection_changed (int index)
{
if (index != m_active_index) {
change_active_cellview (index);
emit active_cellview_changed (index);

}
}

Expand Down
5 changes: 4 additions & 1 deletion src/layui/layui/layHierarchyControlPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -346,6 +346,9 @@ public slots:

// 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);

// changes the active cellview
void change_active_cellview (int index);
};

} // namespace lay
Expand Down
5 changes: 3 additions & 2 deletions src/layview/layview/layLayoutView_qt.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Loading