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 ();
};
}