diff --git a/src/edt/edt/edtRecentConfigurationPage.cc b/src/edt/edt/edtRecentConfigurationPage.cc index 6c4b998cc..554f85be0 100644 --- a/src/edt/edt/edtRecentConfigurationPage.cc +++ b/src/edt/edt/edtRecentConfigurationPage.cc @@ -327,7 +327,7 @@ RecentConfigurationPage::item_clicked (QTreeWidgetItem *item) ex.read (cv_index); } - mp_view->set_current_layer (cv_index, lp); + mp_view->set_or_request_current_layer (cv_index, lp); } else { dispatcher ()->config_set (c->cfg_name, v); diff --git a/src/laybasic/laybasic/layLayerControlPanel.cc b/src/laybasic/laybasic/layLayerControlPanel.cc index 4c5c8f884..b0038635d 100644 --- a/src/laybasic/laybasic/layLayerControlPanel.cc +++ b/src/laybasic/laybasic/layLayerControlPanel.cc @@ -505,16 +505,14 @@ LayerControlPanel::cm_insert () BEGIN_PROTECTED_CLEANUP - transaction (tl::to_string (QObject::tr ("Insert views"))); + transaction (tl::to_string (QObject::tr ("Insert layer view"))); props.set_source (tl::to_string (n)); mp_view->init_layer_properties (props); + const LayerPropertiesNode &lp = mp_view->insert_layer (sel, props); - if (transacting ()) { - manager ()->queue (this, new LayerSelectionClearOp ()); - } - mp_layer_list->set_current (sel); + set_current_layer (sel); commit (); @@ -565,18 +563,12 @@ LayerControlPanel::cm_group () mp_view->insert_layer (ins_pos, node); - if (transacting ()) { - manager ()->queue (this, new LayerSelectionClearOp ()); - } + set_current_layer (*sel.rbegin ()); commit (); - end_updates (); - emit order_changed (); - mp_layer_list->set_current (*sel.rbegin ()); - } END_PROTECTED_CLEANUP { recover (); } @@ -1907,8 +1899,14 @@ LayerControlPanel::do_update_content () } void -LayerControlPanel::set_current_layer (const lay::LayerPropertiesConstIterator &l) const +LayerControlPanel::set_current_layer (const lay::LayerPropertiesConstIterator &l) { + if (transacting ()) { + manager ()->queue (this, new LayerSelectionClearOp ()); + } + + end_updates (); + mp_layer_list->set_current (l); } diff --git a/src/laybasic/laybasic/layLayerControlPanel.h b/src/laybasic/laybasic/layLayerControlPanel.h index 6fd767e74..7276bdfbe 100644 --- a/src/laybasic/laybasic/layLayerControlPanel.h +++ b/src/laybasic/laybasic/layLayerControlPanel.h @@ -250,7 +250,7 @@ public: * * This will also select this layer. */ - void set_current_layer (const lay::LayerPropertiesConstIterator &l) const; + void set_current_layer (const lay::LayerPropertiesConstIterator &l); /** * @brief Return the current layer index diff --git a/src/laybasic/laybasic/layLayoutView.cc b/src/laybasic/laybasic/layLayoutView.cc index cdd930078..fe3c642b7 100644 --- a/src/laybasic/laybasic/layLayoutView.cc +++ b/src/laybasic/laybasic/layLayoutView.cc @@ -1709,7 +1709,41 @@ LayoutView::enable_edits (bool enable) } } -void +bool +LayoutView::set_or_request_current_layer (unsigned int cv_index, const db::LayerProperties &lp) +{ + bool ok = set_current_layer (cv_index, lp); + if (ok) { + return true; + } + + if (! mp_control_panel) { + return false; + } + + const lay::CellView &cv = cellview (cv_index); + if (! cv.is_valid ()) { + return false; + } + + if (QMessageBox::question (this, tr ("Create Layer"), tr ("Layer %1 does not exist yet. Create it now?").arg (tl::to_qstring (lp.to_string ()))) == QMessageBox::Yes) { + + lay::LayerPropertiesNode lpn; + lpn.set_source (lay::ParsedLayerSource (lp, cv_index)); + init_layer_properties (lpn); + + transaction (tl::to_string (QObject::tr ("Create new layer"))); + set_current_layer (lay::LayerPropertiesConstIterator (& insert_layer (end_layers (), lpn))); + commit (); + + return true; + + } + + return false; +} + +bool LayoutView::set_current_layer (unsigned int cv_index, const db::LayerProperties &lp) { // rename the ones that got shifted. @@ -1717,13 +1751,14 @@ LayoutView::set_current_layer (unsigned int cv_index, const db::LayerProperties while (! l.at_end ()) { if (l->source (true).cv_index () == int (cv_index) && l->source (true).layer_props ().log_equal (lp)) { set_current_layer (l); - break; + return true; } ++l; } + return false; } -void +void LayoutView::set_current_layer (const lay::LayerPropertiesConstIterator &l) { if (mp_control_panel) { diff --git a/src/laybasic/laybasic/layLayoutView.h b/src/laybasic/laybasic/layLayoutView.h index 77c29d23d..66469b163 100644 --- a/src/laybasic/laybasic/layLayoutView.h +++ b/src/laybasic/laybasic/layLayoutView.h @@ -780,8 +780,18 @@ public: * * This method will look up that layer in the layer view tree and select that layer. * This method will also select this layer. + * + * Returns false if the layer is not a valid one. */ - void set_current_layer (unsigned int cv_index, const db::LayerProperties &properties); + bool set_current_layer (unsigned int cv_index, const db::LayerProperties &properties); + + /** + * @brief Sets the currently active layer by layer properties and cell view index + * + * If the layer does not exist, the user will be asked whether to create the layer. + * Returns false if the layer is not a valid one and the user defined to create the layer. + */ + bool set_or_request_current_layer (unsigned int cv_index, const db::LayerProperties &properties); /** * @brief Sets the currently active layer