mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-20 15:24:14 +02:00
Apply the same zoom clamp to DiagramView::zoom()
DiagramView::zoom() had the same unbounded scale() as the element editor: a held scroll-wheel zoom could overflow the view transform. Clamp the resulting scale to [m_min_zoom, m_max_zoom] before applying it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HdWpDp3TrPKbHnv7YUcNJj
This commit is contained in:
@@ -334,6 +334,13 @@ void DiagramView::setSelectionMode()
|
|||||||
*/
|
*/
|
||||||
void DiagramView::zoom(const qreal zoom_factor)
|
void DiagramView::zoom(const qreal zoom_factor)
|
||||||
{
|
{
|
||||||
|
// clamp the resulting scale so a repeated wheel-zoom cannot drive the view
|
||||||
|
// transform to floating-point overflow and crash the editor (issue #798)
|
||||||
|
const qreal target = transform().m11() * zoom_factor;
|
||||||
|
if (target < m_min_zoom || target > m_max_zoom) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (zoom_factor >= 1){
|
if (zoom_factor >= 1){
|
||||||
scale(zoom_factor, zoom_factor);
|
scale(zoom_factor, zoom_factor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,6 +103,12 @@ class DiagramView : public QGraphicsView
|
|||||||
bool mustIntegrateTitleBlockTemplate(const TitleBlockTemplateLocation &) const;
|
bool mustIntegrateTitleBlockTemplate(const TitleBlockTemplateLocation &) const;
|
||||||
bool gestures() const;
|
bool gestures() const;
|
||||||
|
|
||||||
|
/// Lowest and highest allowed value of the view transform scale (m11).
|
||||||
|
/// Prevents wheel-zoom from driving the transform to overflow, which
|
||||||
|
/// crashes the editor (see GitHub issue #798, same class of bug).
|
||||||
|
static constexpr qreal m_min_zoom = 0.01;
|
||||||
|
static constexpr qreal m_max_zoom = 200.0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/// Signal emitted after the selection mode changed
|
/// Signal emitted after the selection mode changed
|
||||||
void modeChanged();
|
void modeChanged();
|
||||||
|
|||||||
Reference in New Issue
Block a user