mirror of https://github.com/KLayout/klayout.git
fix for #264
1. Errors in coerce_parameters are now shown as red label + warning icon in the parameters dialog 2. Errors during produce are always logged now Plus: the scroll bars of the PCell parameters page don't jump back on "Apply".
This commit is contained in:
parent
391484b276
commit
e8ff8156a0
|
|
@ -159,9 +159,8 @@ PCellVariant::update (ImportLayerMapping *layer_mapping)
|
||||||
header->declaration ()->produce (*layout (), layer_ids, m_parameters, *this);
|
header->declaration ()->produce (*layout (), layer_ids, m_parameters, *this);
|
||||||
m_display_name = header->declaration ()->get_display_name (m_parameters);
|
m_display_name = header->declaration ()->get_display_name (m_parameters);
|
||||||
} catch (tl::Exception &ex) {
|
} catch (tl::Exception &ex) {
|
||||||
if (layer_ids.empty ()) {
|
tl::error << ex.msg ();
|
||||||
tl::error << ex.msg ();
|
if (! layer_ids.empty ()) {
|
||||||
} else {
|
|
||||||
// put error messages into layout as text objects
|
// put error messages into layout as text objects
|
||||||
shapes (layer_ids [0]).insert (db::Text (ex.msg (), db::Trans ()));
|
shapes (layer_ids [0]).insert (db::Text (ex.msg (), db::Trans ()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -849,8 +849,11 @@ EditorOptionsInst::update_pcell_parameters (const std::vector <tl::Variant> &par
|
||||||
}
|
}
|
||||||
mp_ui->cell_le->setPalette (pl);
|
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.
|
// Hint: we shall not delete the page immediately. This gives a segmentation fault in some cases.
|
||||||
if (mp_pcell_parameters) {
|
if (mp_pcell_parameters) {
|
||||||
|
pcp_state = mp_pcell_parameters->get_state ();
|
||||||
mp_pcell_parameters->hide ();
|
mp_pcell_parameters->hide ();
|
||||||
mp_pcell_parameters->deleteLater ();
|
mp_pcell_parameters->deleteLater ();
|
||||||
}
|
}
|
||||||
|
|
@ -864,6 +867,8 @@ EditorOptionsInst::update_pcell_parameters (const std::vector <tl::Variant> &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_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_ui->pcell_tab->layout ()->addWidget (mp_pcell_parameters);
|
||||||
|
|
||||||
|
mp_pcell_parameters->set_state (pcp_state);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
mp_ui->param_tab_widget->setTabEnabled (1, false);
|
mp_ui->param_tab_widget->setTabEnabled (1, false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "edtPCellParametersPage.h"
|
#include "edtPCellParametersPage.h"
|
||||||
#include "layWidgets.h"
|
#include "layWidgets.h"
|
||||||
|
#include "tlScriptError.h"
|
||||||
|
|
||||||
#include <QFrame>
|
#include <QFrame>
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
|
|
@ -32,6 +33,7 @@
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
|
#include <QScrollBar>
|
||||||
|
|
||||||
namespace edt
|
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)
|
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;
|
m_parameters = parameters;
|
||||||
|
|
||||||
QFrame *fi = new QFrame (this);
|
QFrame *fi = new QFrame (mp_parameters_area);
|
||||||
QWidget *inner_frame = fi;
|
QWidget *inner_frame = fi;
|
||||||
fi->setFrameShape (QFrame::NoFrame);
|
fi->setFrameShape (QFrame::NoFrame);
|
||||||
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 ();
|
main_frame->show ();
|
||||||
|
|
||||||
// does a first coerce and update
|
// does a first coerce and update
|
||||||
get_parameters ();
|
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
|
void
|
||||||
PCellParametersPage::activated (int)
|
PCellParametersPage::activated (int)
|
||||||
{
|
{
|
||||||
|
|
@ -416,10 +460,26 @@ PCellParametersPage::get_parameters ()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// call coerce on the parameters
|
try {
|
||||||
mp_pcell_decl->coerce_parameters (*mp_layout, parameters);
|
|
||||||
|
|
||||||
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;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,9 @@
|
||||||
|
|
||||||
#include "dbPCellDeclaration.h"
|
#include "dbPCellDeclaration.h"
|
||||||
|
|
||||||
|
#include <QFrame>
|
||||||
#include <QScrollArea>
|
#include <QScrollArea>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
namespace lay
|
namespace lay
|
||||||
{
|
{
|
||||||
|
|
@ -40,11 +42,20 @@ namespace edt
|
||||||
* @brief A QScrollArea that displays and allows editing PCell parameters
|
* @brief A QScrollArea that displays and allows editing PCell parameters
|
||||||
*/
|
*/
|
||||||
class PCellParametersPage
|
class PCellParametersPage
|
||||||
: public QScrollArea
|
: public QFrame
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
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
|
* @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);
|
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
|
* @brief Get the current parameters
|
||||||
*/
|
*/
|
||||||
|
|
@ -80,6 +101,9 @@ public slots:
|
||||||
void clicked ();
|
void clicked ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QScrollArea *mp_parameters_area;
|
||||||
|
QLabel *mp_error_label;
|
||||||
|
QLabel *mp_error_icon;
|
||||||
const db::PCellDeclaration *mp_pcell_decl;
|
const db::PCellDeclaration *mp_pcell_decl;
|
||||||
std::vector<QWidget *> m_widgets;
|
std::vector<QWidget *> m_widgets;
|
||||||
const db::Layout *mp_layout;
|
const db::Layout *mp_layout;
|
||||||
|
|
|
||||||
|
|
@ -67,11 +67,7 @@ BacktraceElement::to_string() const
|
||||||
std::string
|
std::string
|
||||||
ScriptError::basic_msg () const
|
ScriptError::basic_msg () const
|
||||||
{
|
{
|
||||||
std::string m = tl::Exception::msg ();
|
return tl::Exception::msg ();
|
||||||
if (! m_context.empty ()) {
|
|
||||||
m += tl::to_string (tr (" in ")) + m_context;
|
|
||||||
}
|
|
||||||
return m;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
|
|
@ -79,6 +75,10 @@ ScriptError::msg () const
|
||||||
{
|
{
|
||||||
std::string m = basic_msg ();
|
std::string m = basic_msg ();
|
||||||
|
|
||||||
|
if (! m_context.empty ()) {
|
||||||
|
m += tl::to_string (tr (" in ")) + m_context;
|
||||||
|
}
|
||||||
|
|
||||||
for (std::vector<BacktraceElement>::const_iterator bt = backtrace ().begin (); bt != backtrace ().end (); ++bt) {
|
for (std::vector<BacktraceElement>::const_iterator bt = backtrace ().begin (); bt != backtrace ().end (); ++bt) {
|
||||||
m += "\n ";
|
m += "\n ";
|
||||||
m += bt->to_string ();
|
m += bt->to_string ();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue