mirror of
https://github.com/KLayout/klayout.git
synced 2026-09-07 03:21:34 +02:00
Some fixes for the technology feature
- Fixed some potential segfaults due to invalid layout object - More consistent handling of potential technology switch due to active cellview change
This commit is contained in:
@@ -2538,7 +2538,7 @@ LayoutView::erase_cellview (unsigned int index)
|
||||
return;
|
||||
}
|
||||
|
||||
cancel ();
|
||||
cancel_esc ();
|
||||
|
||||
// issue to event that signals a change in the cellviews
|
||||
cellviews_about_to_change_event ();
|
||||
@@ -2704,6 +2704,8 @@ LayoutView::signal_apply_technology (lay::LayoutHandle *layout_handle)
|
||||
|
||||
if (cellview (i).handle () == layout_handle) {
|
||||
|
||||
cancel_esc ();
|
||||
|
||||
std::string lyp_file;
|
||||
const db::Technology *tech = db::Technologies::instance ()->technology_by_name (cellview (i)->tech_name ());
|
||||
if (tech && ! tech->eff_layer_properties_file ().empty ()) {
|
||||
@@ -3056,7 +3058,7 @@ void
|
||||
LayoutView::reload_layout (unsigned int cv_index)
|
||||
{
|
||||
stop ();
|
||||
cancel ();
|
||||
cancel_esc ();
|
||||
|
||||
// save the current view state
|
||||
lay::DisplayState state;
|
||||
@@ -3948,6 +3950,13 @@ LayoutView::cancel ()
|
||||
clear_selection ();
|
||||
}
|
||||
|
||||
void
|
||||
LayoutView::cancel_esc ()
|
||||
{
|
||||
cancel ();
|
||||
switch_mode (default_mode ());
|
||||
}
|
||||
|
||||
void
|
||||
LayoutView::bookmark_current_view ()
|
||||
{
|
||||
@@ -4751,7 +4760,7 @@ LayoutView::select_cellviews_fit (const std::list <CellView> &cvs)
|
||||
cellviews_about_to_change_event ();
|
||||
|
||||
set_min_hier_levels (0);
|
||||
cancel ();
|
||||
cancel_esc ();
|
||||
m_cellviews = cvs;
|
||||
zoom_fit ();
|
||||
finish_cellviews_changed ();
|
||||
@@ -4772,6 +4781,12 @@ LayoutView::active_cellview_changed (int index)
|
||||
{
|
||||
if (m_active_cellview_changed_event_enabled) {
|
||||
|
||||
// we need to cancel pending drawing or dragging operations to reflect the new cellview (different target, may have different technology etc.)
|
||||
cancel_esc ();
|
||||
|
||||
// we need to setup the editor option pages because the technology may have changed
|
||||
dm_setup_editor_option_pages ();
|
||||
|
||||
active_cellview_changed_event ();
|
||||
active_cellview_changed_with_index_event (index);
|
||||
|
||||
@@ -4889,7 +4904,7 @@ LayoutView::select_cellviews (const std::list <CellView> &cvs)
|
||||
cellviews_about_to_change_event ();
|
||||
|
||||
set_min_hier_levels (0);
|
||||
cancel ();
|
||||
cancel_esc ();
|
||||
m_cellviews = cvs;
|
||||
redraw ();
|
||||
|
||||
@@ -4914,7 +4929,7 @@ LayoutView::select_cellview (int index, const CellView &cv)
|
||||
|
||||
cellview_about_to_change_event (index);
|
||||
|
||||
cancel ();
|
||||
cancel_esc ();
|
||||
*cellview_iter (index) = cv;
|
||||
redraw ();
|
||||
|
||||
|
||||
@@ -2576,12 +2576,17 @@ public slots:
|
||||
void store_state ();
|
||||
|
||||
/**
|
||||
* @brief Cancel all edit operations and clear the selection
|
||||
* @brief Cancels all edit operations, clears the selection and resets the mode to "Select"
|
||||
*/
|
||||
void cancel_esc ();
|
||||
|
||||
/**
|
||||
* @brief Cancels all edit operations and clears the selection
|
||||
*/
|
||||
void cancel ();
|
||||
|
||||
/**
|
||||
* @brief Cancel all edit operations but leave selection
|
||||
* @brief Cancels all edit operations but maintains selection
|
||||
*/
|
||||
void cancel_edits ();
|
||||
|
||||
|
||||
@@ -420,7 +420,7 @@ LayerSelectionComboBox::set_view (lay::LayoutView *view, int cv_index, bool all_
|
||||
return;
|
||||
}
|
||||
|
||||
mp_private->layout = &view->cellview (cv_index)->layout ();
|
||||
mp_private->layout = 0;
|
||||
mp_private->view = view;
|
||||
mp_private->cv_index = cv_index;
|
||||
mp_private->all_layers = all_layers;
|
||||
@@ -465,45 +465,60 @@ LayerSelectionComboBox::update_layer_list ()
|
||||
|
||||
if (mp_private->view) {
|
||||
|
||||
LPIPairCompareOp cmp_op;
|
||||
std::map<std::pair <db::LayerProperties, int>, std::string, LPIPairCompareOp> name_for_layer (cmp_op);
|
||||
LayerPropertiesConstIterator lp = mp_private->view->begin_layers ();
|
||||
while (! lp.at_end ()) {
|
||||
if (lp->cellview_index () == mp_private->cv_index && ! lp->has_children () && (mp_private->all_layers || lp->layer_index () >= 0) && lp->source (true).layer_props () != db::LayerProperties ()) {
|
||||
std::pair <db::LayerProperties, int> k (lp->source (true).layer_props (), lp->layer_index ());
|
||||
name_for_layer.insert (std::make_pair (k, lp->display_string (mp_private->view, true, true /*always show source*/)));
|
||||
mp_private->layers.push_back (k);
|
||||
}
|
||||
++lp;
|
||||
const db::Layout *layout = 0;
|
||||
|
||||
const CellView &cv = mp_private->view->cellview (mp_private->cv_index);
|
||||
if (cv.is_valid ()) {
|
||||
layout = & cv->layout ();
|
||||
}
|
||||
|
||||
size_t nk = mp_private->layers.size ();
|
||||
if (! layout) {
|
||||
|
||||
for (unsigned int l = 0; l < mp_private->layout->layers (); ++l) {
|
||||
if (mp_private->layout->is_valid_layer (l)) {
|
||||
std::pair <db::LayerProperties, int> k (mp_private->layout->get_properties (l), int (l));
|
||||
if (name_for_layer.find (k) == name_for_layer.end ()) {
|
||||
set_current_layer (-1);
|
||||
|
||||
} else {
|
||||
|
||||
LPIPairCompareOp cmp_op;
|
||||
std::map<std::pair <db::LayerProperties, int>, std::string, LPIPairCompareOp> name_for_layer (cmp_op);
|
||||
LayerPropertiesConstIterator lp = mp_private->view->begin_layers ();
|
||||
while (! lp.at_end ()) {
|
||||
if (lp->cellview_index () == mp_private->cv_index && ! lp->has_children () && (mp_private->all_layers || lp->layer_index () >= 0) && lp->source (true).layer_props () != db::LayerProperties ()) {
|
||||
std::pair <db::LayerProperties, int> k (lp->source (true).layer_props (), lp->layer_index ());
|
||||
name_for_layer.insert (std::make_pair (k, lp->display_string (mp_private->view, true, true /*always show source*/)));
|
||||
mp_private->layers.push_back (k);
|
||||
}
|
||||
++lp;
|
||||
}
|
||||
}
|
||||
|
||||
std::sort (mp_private->layers.begin () + nk, mp_private->layers.end ());
|
||||
size_t nk = mp_private->layers.size ();
|
||||
|
||||
for (std::vector <std::pair <db::LayerProperties, int> >::iterator ll = mp_private->layers.begin (); ll != mp_private->layers.end (); ++ll) {
|
||||
std::map<std::pair <db::LayerProperties, int>, std::string, LPIPairCompareOp>::const_iterator ln = name_for_layer.find (*ll);
|
||||
if (ln != name_for_layer.end ()) {
|
||||
addItem (tl::to_qstring (ln->second));
|
||||
} else {
|
||||
addItem (tl::to_qstring (ll->first.to_string ()));
|
||||
for (unsigned int l = 0; l < layout->layers (); ++l) {
|
||||
if (layout->is_valid_layer (l)) {
|
||||
std::pair <db::LayerProperties, int> k (layout->get_properties (l), int (l));
|
||||
if (name_for_layer.find (k) == name_for_layer.end ()) {
|
||||
mp_private->layers.push_back (k);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mp_private->new_layer_enabled) {
|
||||
addItem (QObject::tr ("New Layer .."));
|
||||
}
|
||||
std::sort (mp_private->layers.begin () + nk, mp_private->layers.end ());
|
||||
|
||||
set_current_layer (props);
|
||||
for (std::vector <std::pair <db::LayerProperties, int> >::iterator ll = mp_private->layers.begin (); ll != mp_private->layers.end (); ++ll) {
|
||||
std::map<std::pair <db::LayerProperties, int>, std::string, LPIPairCompareOp>::const_iterator ln = name_for_layer.find (*ll);
|
||||
if (ln != name_for_layer.end ()) {
|
||||
addItem (tl::to_qstring (ln->second));
|
||||
} else {
|
||||
addItem (tl::to_qstring (ll->first.to_string ()));
|
||||
}
|
||||
}
|
||||
|
||||
if (mp_private->new_layer_enabled) {
|
||||
addItem (QObject::tr ("New Layer .."));
|
||||
}
|
||||
|
||||
set_current_layer (props);
|
||||
|
||||
}
|
||||
|
||||
} else if (mp_private->layout) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user