WIP: implementing an optional 'update' button for lazy evaluation PCells

This commit is contained in:
Matthias Koefferlein 2021-12-25 17:40:10 +01:00
parent 219fbceb28
commit f985d946a1
2 changed files with 116 additions and 26 deletions

View File

@ -154,6 +154,9 @@ PCellParametersPage::PCellParametersPage (QWidget *parent, bool dense)
void void
PCellParametersPage::init () PCellParametersPage::init ()
{ {
QPalette palette;
QFont font;
mp_pcell_decl.reset (0); mp_pcell_decl.reset (0);
mp_view = 0; mp_view = 0;
m_cv_index = 0; m_cv_index = 0;
@ -162,24 +165,69 @@ PCellParametersPage::init ()
QGridLayout *frame_layout = new QGridLayout (this); QGridLayout *frame_layout = new QGridLayout (this);
// spacing and margin for tool windows // spacing and margin for tool windows
frame_layout->setMargin (0); frame_layout->setMargin (0);
frame_layout->setVerticalSpacing (0);
setLayout (frame_layout); setLayout (frame_layout);
mp_error_icon = new QLabel (this); mp_update_frame = new QFrame ();
mp_error_icon->setPixmap (QPixmap (":/warn.png")); mp_update_frame->setFrameShape (QFrame::NoFrame);
mp_error_icon->hide (); frame_layout->addWidget (mp_update_frame, 0, 0, 1, 1);
frame_layout->addWidget (mp_error_icon, 1, 0, 1, 1);
mp_error_label = new QLabel (this); QGridLayout *update_frame_layout = new QGridLayout (mp_update_frame);
mp_update_frame->setLayout (update_frame_layout);
if (m_dense) {
update_frame_layout->setMargin (4);
update_frame_layout->setHorizontalSpacing (6);
update_frame_layout->setVerticalSpacing (2);
}
mp_changed_icon = new QLabel (mp_update_frame);
mp_changed_icon->setPixmap (QPixmap (":/warn.png"));
update_frame_layout->addWidget (mp_changed_icon, 0, 0, 1, 1);
mp_update_button = new QToolButton (mp_update_frame);
mp_update_button->setText (tr ("Update"));
connect (mp_update_button, SIGNAL (clicked()), this, SLOT (update_button_pressed ()));
update_frame_layout->addWidget (mp_update_button, 0, 1, 1, 1);
mp_changed_label = new QLabel (mp_update_frame);
mp_changed_label->setText (tr ("Update needed"));
update_frame_layout->addWidget (mp_changed_label, 0, 2, 1, 1);
update_frame_layout->setColumnStretch (2, 1);
mp_error_frame = new QFrame ();
mp_error_frame->setFrameShape (QFrame::NoFrame);
frame_layout->addWidget (mp_error_frame, 1, 0, 1, 1);
QGridLayout *error_frame_layout = new QGridLayout (mp_update_frame);
mp_error_frame->setLayout (error_frame_layout);
if (m_dense) {
error_frame_layout->setMargin (4);
error_frame_layout->setHorizontalSpacing (6);
error_frame_layout->setVerticalSpacing (2);
}
mp_error_icon = new QLabel (mp_update_frame);
mp_error_icon->setPixmap (QPixmap (":/warn.png"));
error_frame_layout->addWidget (mp_error_icon, 1, 0, 1, 1);
mp_error_label = new QLabel (mp_update_frame);
mp_error_label->setWordWrap (true); mp_error_label->setWordWrap (true);
QPalette palette = mp_error_label->palette (); palette = mp_error_label->palette ();
palette.setColor (QPalette::Foreground, Qt::red); palette.setColor (QPalette::Foreground, Qt::red);
mp_error_label->setPalette (palette); mp_error_label->setPalette (palette);
QFont font = mp_error_label->font (); font = mp_error_label->font ();
font.setBold (true); font.setBold (true);
mp_error_label->setFont (font); mp_error_label->setFont (font);
mp_error_label->hide (); error_frame_layout->addWidget (mp_error_label, 1, 1, 1, 2);
frame_layout->addWidget (mp_error_label, 1, 1, 1, 1);
frame_layout->setColumnStretch (1, 1); error_frame_layout->setColumnStretch (2, 1);
}
bool
PCellParametersPage::lazy_evaluation ()
{
return false; // @@@
} }
void void
@ -199,8 +247,8 @@ PCellParametersPage::setup (lay::LayoutView *view, int cv_index, const db::PCell
mp_parameters_area = new QScrollArea (this); mp_parameters_area = new QScrollArea (this);
mp_parameters_area->setFrameShape (QFrame::NoFrame); mp_parameters_area->setFrameShape (QFrame::NoFrame);
QGridLayout *frame_layout = dynamic_cast<QGridLayout *> (QFrame::layout ()); QGridLayout *frame_layout = dynamic_cast<QGridLayout *> (QFrame::layout ());
frame_layout->addWidget (mp_parameters_area, 0, 0, 1, 2); frame_layout->addWidget (mp_parameters_area, 2, 0, 1, 1);
frame_layout->setRowStretch (0, 1); frame_layout->setRowStretch (2, 1);
QFrame *fi = new QFrame (mp_parameters_area); QFrame *fi = new QFrame (mp_parameters_area);
QWidget *inner_frame = fi; QWidget *inner_frame = fi;
@ -396,9 +444,7 @@ PCellParametersPage::setup (lay::LayoutView *view, int cv_index, const db::PCell
mp_parameters_area->setWidget (main_frame); mp_parameters_area->setWidget (main_frame);
main_frame->show (); main_frame->show ();
// does a first coerce and update. Ignore errors for now. update_current_parameters ();
bool ok = false;
get_parameters (&ok);
} }
PCellParametersPage::State PCellParametersPage::State
@ -446,12 +492,33 @@ PCellParametersPage::do_parameter_changed ()
{ {
// does a coerce and update // does a coerce and update
bool ok = false; bool ok = false;
get_parameters (&ok); std::vector<tl::Variant> parameters = get_parameters (&ok);
if (ok) { if (ok && ! lazy_evaluation ()) {
emit edited (); emit edited ();
} }
} }
void
PCellParametersPage::update_button_pressed ()
{
if (update_current_parameters ()) {
emit edited ();
}
}
bool
PCellParametersPage::update_current_parameters ()
{
bool ok = false;
std::vector<tl::Variant> parameters = get_parameters (&ok);
if (ok) {
m_current_parameters = parameters;
mp_update_frame->hide ();
}
return ok;
}
std::vector<tl::Variant> std::vector<tl::Variant>
PCellParametersPage::get_parameters (bool *ok) PCellParametersPage::get_parameters (bool *ok)
{ {
@ -594,10 +661,7 @@ PCellParametersPage::get_parameters (bool *ok)
if (mp_view->cellview (m_cv_index).is_valid ()) { if (mp_view->cellview (m_cv_index).is_valid ()) {
mp_pcell_decl->coerce_parameters (mp_view->cellview (m_cv_index)->layout (), parameters); mp_pcell_decl->coerce_parameters (mp_view->cellview (m_cv_index)->layout (), parameters);
} }
set_parameters (parameters); set_parameters_internal (parameters, lazy_evaluation ());
mp_error_label->hide ();
mp_error_icon->hide ();
if (ok) { if (ok) {
*ok = true; *ok = true;
@ -608,8 +672,7 @@ PCellParametersPage::get_parameters (bool *ok)
if (ok) { if (ok) {
mp_error_label->setText (tl::to_qstring (ex.basic_msg ())); mp_error_label->setText (tl::to_qstring (ex.basic_msg ()));
mp_error_label->setToolTip (tl::to_qstring (ex.msg ())); mp_error_label->setToolTip (tl::to_qstring (ex.msg ()));
mp_error_icon->show (); mp_error_frame->show ();
mp_error_label->show ();
*ok = false; *ok = false;
} else { } else {
throw; throw;
@ -619,8 +682,7 @@ PCellParametersPage::get_parameters (bool *ok)
if (ok) { if (ok) {
mp_error_label->setText (tl::to_qstring (ex.msg ())); mp_error_label->setText (tl::to_qstring (ex.msg ()));
mp_error_icon->show (); mp_error_frame->show ();
mp_error_label->show ();
*ok = false; *ok = false;
} else { } else {
throw; throw;
@ -633,6 +695,12 @@ PCellParametersPage::get_parameters (bool *ok)
void void
PCellParametersPage::set_parameters (const std::vector<tl::Variant> &parameters) PCellParametersPage::set_parameters (const std::vector<tl::Variant> &parameters)
{
set_parameters_internal (parameters, false);
}
void
PCellParametersPage::set_parameters_internal (const std::vector<tl::Variant> &parameters, bool tentatively)
{ {
if (! mp_pcell_decl) { if (! mp_pcell_decl) {
return; return;
@ -646,6 +714,18 @@ PCellParametersPage::set_parameters (const std::vector<tl::Variant> &parameters)
set_value (*p, m_widgets [r], parameters [r]); set_value (*p, m_widgets [r], parameters [r]);
} }
} }
mp_error_frame->hide ();
bool update_needed = false;
if (! tentatively) {
m_current_parameters = parameters;
} else {
update_needed = (m_current_parameters != parameters);
}
mp_update_frame->setVisible (update_needed);
} }
} }

View File

@ -30,6 +30,7 @@
#include <QFrame> #include <QFrame>
#include <QScrollArea> #include <QScrollArea>
#include <QLabel> #include <QLabel>
#include <QToolButton>
namespace lay namespace lay
{ {
@ -117,11 +118,16 @@ signals:
private slots: private slots:
void parameter_changed (); void parameter_changed ();
void update_button_pressed ();
private: private:
QScrollArea *mp_parameters_area; QScrollArea *mp_parameters_area;
QLabel *mp_error_label; QLabel *mp_error_label;
QLabel *mp_error_icon; QLabel *mp_error_icon;
QLabel *mp_changed_label;
QLabel *mp_changed_icon;
QToolButton *mp_update_button;
QFrame *mp_error_frame, *mp_update_frame;
tl::weak_ptr<db::PCellDeclaration> mp_pcell_decl; tl::weak_ptr<db::PCellDeclaration> mp_pcell_decl;
std::vector<QWidget *> m_widgets; std::vector<QWidget *> m_widgets;
lay::LayoutView *mp_view; lay::LayoutView *mp_view;
@ -129,9 +135,13 @@ private:
db::pcell_parameters_type m_parameters; db::pcell_parameters_type m_parameters;
bool m_dense; bool m_dense;
tl::DeferredMethod<PCellParametersPage> dm_parameter_changed; tl::DeferredMethod<PCellParametersPage> dm_parameter_changed;
std::vector<tl::Variant> m_current_parameters;
void init (); void init ();
void do_parameter_changed (); void do_parameter_changed ();
bool lazy_evaluation ();
void set_parameters_internal (const std::vector<tl::Variant> &values, bool tentatively);
bool update_current_parameters ();
}; };
} }