WIP: added vertical zoom factor slider, some enhancements

This commit is contained in:
Matthias Koefferlein 2021-08-30 16:01:35 +02:00
parent f82e22c5c2
commit 4a3e694b9b
7 changed files with 156 additions and 12 deletions

View File

@ -85,9 +85,28 @@
</widget>
</item>
<item>
<widget class="QLabel" name="zoom_factor">
<widget class="QLabel" name="percent_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="zoom_factor">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -98,8 +117,76 @@
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>70</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>8</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>%</string>
<string>Z</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="vzoom_slider">
<property name="minimum">
<number>-300</number>
</property>
<property name="maximum">
<number>300</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="vzoom_factor">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>70</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>

View File

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

View File

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

View File

@ -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);

View File

@ -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:

View File

@ -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);

View File

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