diff --git a/src/db/db/dbPCellVariant.cc b/src/db/db/dbPCellVariant.cc index c2581a748..7b8cea8be 100644 --- a/src/db/db/dbPCellVariant.cc +++ b/src/db/db/dbPCellVariant.cc @@ -159,9 +159,8 @@ PCellVariant::update (ImportLayerMapping *layer_mapping) header->declaration ()->produce (*layout (), layer_ids, m_parameters, *this); m_display_name = header->declaration ()->get_display_name (m_parameters); } catch (tl::Exception &ex) { - if (layer_ids.empty ()) { - tl::error << ex.msg (); - } else { + tl::error << ex.msg (); + if (! layer_ids.empty ()) { // put error messages into layout as text objects shapes (layer_ids [0]).insert (db::Text (ex.msg (), db::Trans ())); } diff --git a/src/edt/edt/edtEditorOptionsPages.cc b/src/edt/edt/edtEditorOptionsPages.cc index 4114ff04d..22893aafe 100644 --- a/src/edt/edt/edtEditorOptionsPages.cc +++ b/src/edt/edt/edtEditorOptionsPages.cc @@ -849,8 +849,11 @@ EditorOptionsInst::update_pcell_parameters (const std::vector &par } mp_ui->cell_le->setPalette (pl); + PCellParametersPage::State pcp_state; + // Hint: we shall not delete the page immediately. This gives a segmentation fault in some cases. if (mp_pcell_parameters) { + pcp_state = mp_pcell_parameters->get_state (); mp_pcell_parameters->hide (); mp_pcell_parameters->deleteLater (); } @@ -864,6 +867,8 @@ EditorOptionsInst::update_pcell_parameters (const std::vector &par mp_pcell_parameters = new PCellParametersPage (mp_ui->pcell_tab, &view->cellview (m_cv_index)->layout (), view, m_cv_index, layout->pcell_declaration (pc.second), parameters); mp_ui->pcell_tab->layout ()->addWidget (mp_pcell_parameters); + mp_pcell_parameters->set_state (pcp_state); + } else { mp_ui->param_tab_widget->setTabEnabled (1, false); } diff --git a/src/edt/edt/edtPCellParametersPage.cc b/src/edt/edt/edtPCellParametersPage.cc index b39a35d88..a851e3508 100644 --- a/src/edt/edt/edtPCellParametersPage.cc +++ b/src/edt/edt/edtPCellParametersPage.cc @@ -23,6 +23,7 @@ #include "edtPCellParametersPage.h" #include "layWidgets.h" +#include "tlScriptError.h" #include #include @@ -32,6 +33,7 @@ #include #include #include +#include namespace edt { @@ -127,11 +129,34 @@ static void set_value (const db::PCellParameterDeclaration &p, const db::Layout } PCellParametersPage::PCellParametersPage (QWidget *parent, const db::Layout *layout, lay::LayoutView *view, int cv_index, const db::PCellDeclaration *pcell_decl, const db::pcell_parameters_type ¶meters) - : QScrollArea (parent), mp_pcell_decl (pcell_decl), mp_layout (layout), mp_view (view), m_cv_index (cv_index) + : QFrame (parent), mp_pcell_decl (pcell_decl), mp_layout (layout), mp_view (view), m_cv_index (cv_index) { + QGridLayout *frame_layout = new QGridLayout (this); + setLayout (frame_layout); + + mp_parameters_area = new QScrollArea (this); + frame_layout->addWidget (mp_parameters_area, 0, 0, 1, 2); + frame_layout->setRowStretch (0, 1); + + mp_error_icon = new QLabel (this); + mp_error_icon->setPixmap (QPixmap (":/warn.png")); + mp_error_icon->hide (); + frame_layout->addWidget (mp_error_icon, 1, 0, 1, 1); + + mp_error_label = new QLabel (this); + QPalette palette = mp_error_label->palette (); + palette.setColor (QPalette::Foreground, Qt::red); + mp_error_label->setPalette (palette); + QFont font = mp_error_label->font (); + font.setBold (true); + mp_error_label->setFont (font); + mp_error_label->hide (); + frame_layout->addWidget (mp_error_label, 1, 1, 1, 1); + frame_layout->setColumnStretch (1, 1); + m_parameters = parameters; - QFrame *fi = new QFrame (this); + QFrame *fi = new QFrame (mp_parameters_area); QWidget *inner_frame = fi; fi->setFrameShape (QFrame::NoFrame); setFrameShape (QFrame::NoFrame); @@ -295,13 +320,32 @@ PCellParametersPage::PCellParametersPage (QWidget *parent, const db::Layout *lay } - setWidget (main_frame); + mp_parameters_area->setWidget (main_frame); main_frame->show (); // does a first coerce and update get_parameters (); } +PCellParametersPage::State +PCellParametersPage::get_state () +{ + State s; + s.valid = true; + s.vScrollPosition = mp_parameters_area->verticalScrollBar ()->value (); + s.hScrollPosition = mp_parameters_area->horizontalScrollBar ()->value (); + return s; +} + +void +PCellParametersPage::set_state (const State &s) +{ + if (s.valid) { + mp_parameters_area->verticalScrollBar ()->setValue (s.vScrollPosition); + mp_parameters_area->horizontalScrollBar ()->setValue (s.hScrollPosition); + } +} + void PCellParametersPage::activated (int) { @@ -416,10 +460,26 @@ PCellParametersPage::get_parameters () } - // call coerce on the parameters - mp_pcell_decl->coerce_parameters (*mp_layout, parameters); + try { - set_parameters (parameters); + // coerce the parameters + mp_pcell_decl->coerce_parameters (*mp_layout, parameters); + set_parameters (parameters); + + } catch (tl::ScriptError &ex) { + + mp_error_label->setText (tl::to_qstring (ex.basic_msg ())); + mp_error_label->setToolTip (tl::to_qstring (ex.msg ())); + mp_error_icon->show (); + mp_error_label->show (); + + } catch (tl::Exception &ex) { + + mp_error_label->setText (tl::to_qstring (ex.msg ())); + mp_error_icon->show (); + mp_error_label->show (); + + } return parameters; } diff --git a/src/edt/edt/edtPCellParametersPage.h b/src/edt/edt/edtPCellParametersPage.h index 2039e6069..5da75cfbf 100644 --- a/src/edt/edt/edtPCellParametersPage.h +++ b/src/edt/edt/edtPCellParametersPage.h @@ -26,7 +26,9 @@ #include "dbPCellDeclaration.h" +#include #include +#include namespace lay { @@ -40,11 +42,20 @@ namespace edt * @brief A QScrollArea that displays and allows editing PCell parameters */ class PCellParametersPage - : public QScrollArea + : public QFrame { Q_OBJECT public: + struct State + { + State () : valid (false), hScrollPosition (0), vScrollPosition (0) { } + + bool valid; + int hScrollPosition; + int vScrollPosition; + }; + /** * @brief Constructor: create a page showing the given parameters * @@ -57,6 +68,16 @@ public: */ PCellParametersPage (QWidget *parent, const db::Layout *layout, lay::LayoutView *view, int cv_index, const db::PCellDeclaration *pcell_decl, const db::pcell_parameters_type ¶meters); + /** + * @brief Gets the pages current state + */ + State get_state (); + + /** + * @brief Restores the state + */ + void set_state (const State &s); + /** * @brief Get the current parameters */ @@ -80,6 +101,9 @@ public slots: void clicked (); private: + QScrollArea *mp_parameters_area; + QLabel *mp_error_label; + QLabel *mp_error_icon; const db::PCellDeclaration *mp_pcell_decl; std::vector m_widgets; const db::Layout *mp_layout; diff --git a/src/tl/tl/tlScriptError.cc b/src/tl/tl/tlScriptError.cc index f54573b0e..ef8cca1d5 100644 --- a/src/tl/tl/tlScriptError.cc +++ b/src/tl/tl/tlScriptError.cc @@ -67,11 +67,7 @@ BacktraceElement::to_string() const std::string ScriptError::basic_msg () const { - std::string m = tl::Exception::msg (); - if (! m_context.empty ()) { - m += tl::to_string (tr (" in ")) + m_context; - } - return m; + return tl::Exception::msg (); } std::string @@ -79,6 +75,10 @@ ScriptError::msg () const { std::string m = basic_msg (); + if (! m_context.empty ()) { + m += tl::to_string (tr (" in ")) + m_context; + } + for (std::vector::const_iterator bt = backtrace ().begin (); bt != backtrace ().end (); ++bt) { m += "\n "; m += bt->to_string ();