diff --git a/src/plugins/tools/view_25d/lay_plugin/D25View.ui b/src/plugins/tools/view_25d/lay_plugin/D25View.ui index 04a6aac27..d8b0c85e8 100644 --- a/src/plugins/tools/view_25d/lay_plugin/D25View.ui +++ b/src/plugins/tools/view_25d/lay_plugin/D25View.ui @@ -85,9 +85,28 @@ - + - + + 0 + 0 + + + + + 0 + 0 + + + + x + + + + + + + 0 0 @@ -98,8 +117,76 @@ 0 + + + 70 + 16777215 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 8 + 20 + + + + + + - % + Z + + + + + + + -300 + + + 300 + + + Qt::Horizontal + + + + + + + x + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 70 + 16777215 + diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25Camera.cc b/src/plugins/tools/view_25d/lay_plugin/layD25Camera.cc index a9a585e7e..28185e735 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25Camera.cc +++ b/src/plugins/tools/view_25d/lay_plugin/layD25Camera.cc @@ -32,7 +32,7 @@ namespace lay D25Camera::D25Camera () { - init (); + camera_init (); } D25Camera::~D25Camera () @@ -41,7 +41,7 @@ D25Camera::~D25Camera () } void -D25Camera::init () +D25Camera::camera_init () { m_fov = 45.0; m_cam_azimuth = m_cam_elevation = 0.0; @@ -51,7 +51,7 @@ D25Camera::init () void D25Camera::camera_reset () { - init (); + camera_init (); camera_changed (); } diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25Camera.h b/src/plugins/tools/view_25d/lay_plugin/layD25Camera.h index 81cced9ee..aed410432 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25Camera.h +++ b/src/plugins/tools/view_25d/lay_plugin/layD25Camera.h @@ -123,6 +123,11 @@ public: */ void camera_reset (); + /** + * @brief Resets the camera's orientation but does not call "camera_changed" + */ + void camera_init (); + protected: virtual void camera_changed () { } virtual double aspect_ratio () const { return 1.0; } @@ -133,7 +138,6 @@ private: QVector3D m_displacement; double m_fov; - void init (); }; } diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25View.cc b/src/plugins/tools/view_25d/lay_plugin/layD25View.cc index 6c57d177e..9a1b29c2b 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25View.cc +++ b/src/plugins/tools/view_25d/lay_plugin/layD25View.cc @@ -50,7 +50,9 @@ D25View::D25View (QWidget *parent) connect (mp_ui->fit_top, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ())); connect (mp_ui->fit_bottom, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ())); connect (mp_ui->zoom_slider, SIGNAL (valueChanged (int)), this, SLOT (scale_slider_changed (int))); + connect (mp_ui->vzoom_slider, SIGNAL (valueChanged (int)), this, SLOT (vscale_slider_changed (int))); connect (mp_ui->d25_view, SIGNAL (scale_factor_changed (double)), this, SLOT (scale_factor_changed (double))); + connect (mp_ui->d25_view, SIGNAL (vscale_factor_changed (double)), this, SLOT (vscale_factor_changed (double))); connect (mp_ui->d25_view, SIGNAL (init_failed ()), this, SLOT (init_failed ())); mp_ui->gl_stack->setCurrentIndex (0); @@ -67,7 +69,7 @@ D25View::~D25View () static QString scale_factor_to_string (double f) { QString s; - s.sprintf ("x %.3g", f); + s.sprintf ("%.3g", f); return s; } @@ -96,7 +98,25 @@ D25View::scale_factor_changed (double f) mp_ui->zoom_slider->blockSignals (false); } -int +void +D25View::vscale_slider_changed (int value) +{ + double f = exp (log (10.0) * -0.01 * value); + mp_ui->vzoom_factor->setText (scale_factor_to_string (f)); + mp_ui->d25_view->set_vscale_factor (f); +} + +void +D25View::vscale_factor_changed (double f) +{ + mp_ui->vzoom_factor->setText (scale_factor_to_string (f)); + int v = floor (0.5 - log10 (f) * 100.0); + mp_ui->vzoom_slider->blockSignals (true); + mp_ui->vzoom_slider->setValue (v); + mp_ui->vzoom_slider->blockSignals (false); +} + +int D25View::exec_dialog (lay::LayoutView *view) { mp_view.reset (view); diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25View.h b/src/plugins/tools/view_25d/lay_plugin/layD25View.h index 2af22126d..9e8d7d409 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25View.h +++ b/src/plugins/tools/view_25d/lay_plugin/layD25View.h @@ -58,6 +58,8 @@ private slots: void fit_button_clicked (); void scale_factor_changed (double f); void scale_slider_changed (int value); + void vscale_factor_changed (double f); + void vscale_slider_changed (int value); void init_failed (); private: diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc index 74eb76da5..846bd1136 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc +++ b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc @@ -200,6 +200,8 @@ D25ViewWidget::D25ViewWidget (QWidget *parent) m_zmin = m_zmax = 0.0; mp_view = 0; + + reset_viewport (); } D25ViewWidget::~D25ViewWidget () @@ -214,12 +216,22 @@ D25ViewWidget::~D25ViewWidget () } void -D25ViewWidget::reset () +D25ViewWidget::reset_viewport () { m_scale_factor = 1.0; + m_vscale_factor = 1.0; mp_mode.reset (0); - camera_reset (); + camera_init (); +} + +void +D25ViewWidget::reset () +{ + reset_viewport (); + emit scale_factor_changed (m_scale_factor); + emit vscale_factor_changed (m_vscale_factor); + refresh (); } void @@ -438,6 +450,13 @@ D25ViewWidget::refresh () update (); } +void +D25ViewWidget::showEvent (QShowEvent *) +{ + // NOTE: This should happen automatically, but apparently the OpenGL widget doesn't do an automatic refresh: + update (); +} + void D25ViewWidget::camera_changed () { @@ -898,7 +917,7 @@ D25ViewWidget::paintGL () QMatrix4x4 scene_trans, scene_trans_wo_y; // provide the displacement and scaling (in this order!) - scene_trans.scale (m_scale_factor); + scene_trans.scale (m_scale_factor, m_scale_factor * m_vscale_factor, m_scale_factor); scene_trans.translate (m_displacement); // this way we can use y as z coordinate when drawing scene_trans.scale (1.0, 1.0, -1.0); diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h index cee0c67e5..57a07bdb6 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h +++ b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h @@ -104,6 +104,14 @@ public: refresh (); } + double vscale_factor () const { return m_vscale_factor; } + + void set_vscale_factor (double f) + { + m_vscale_factor = f; + refresh (); + } + const std::string &error () const { return m_error; @@ -111,11 +119,13 @@ public: signals: void scale_factor_changed (double f); + void vscale_factor_changed (double f); void init_failed (); protected: virtual void camera_changed (); virtual double aspect_ratio () const; + virtual void showEvent (QShowEvent *); public slots: void fit (); @@ -127,6 +137,7 @@ private: QOpenGLShaderProgram *m_shapes_program, *m_gridplane_program; std::string m_error; double m_scale_factor; + double m_vscale_factor; QVector3D m_displacement; lay::LayoutView *mp_view; db::DBox m_bbox; @@ -152,6 +163,7 @@ private: void render_layout (D25ViewWidget::chunks_type &chunks, const db::Layout &layout, const db::Cell &cell, const db::Box &clip_box, unsigned int layer, double zstart, double zstop); void render_polygon (D25ViewWidget::chunks_type &chunks, const db::Polygon &poly, double dbu, double zstart, double zstop); void render_wall (D25ViewWidget::chunks_type &chunks, const db::Edge &poly, double dbu, double zstart, double zstop); + void reset_viewport (); }; }