Skip to content

Commit

Permalink
fix: no more bug when resizing image to extreme sizes when aspect rat…
Browse files Browse the repository at this point in the history
…io is locked
  • Loading branch information
Onetchou committed Apr 12, 2024
1 parent c9bc805 commit a2d63fd
Showing 1 changed file with 82 additions and 26 deletions.
108 changes: 82 additions & 26 deletions src/libs/vwidgets/resize_handle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -507,42 +507,98 @@ QPointF ResizeHandlesItem::HandleItem::limitPosition(const QPointF& newPos)
m_handlePosition == Position::TopRight ||
m_handlePosition == Position::BottomRight;

//limit minimum dimensions
if (isMovingTop && point.y() > m_parent->m_parentRect.bottom() - m_minDimension)
{
point.setY(m_parent->m_parentRect.bottom() - m_minDimension);
}
else if (isMovingBottom && point.y() < m_parent->m_parentRect.top() + m_minDimension)
{
point.setY(m_parent->m_parentRect.top() + m_minDimension);
}
qreal height;
qreal width;

if (isMovingLeft && point.x() > m_parent->m_parentRect.right() - m_minDimension)
{
point.setX(m_parent->m_parentRect.right() - m_minDimension);
}
else if (isMovingRight && point.x() < m_parent->m_parentRect.left() + m_minDimension)
if (isMovingTop)
{
point.setX(m_parent->m_parentRect.left() + m_minDimension);
}
height = m_parent->m_parentRect.bottom() - point.y();

//limit maximum dimensions
if (isMovingTop && point.y() < m_parent->m_parentRect.bottom() - m_maxDimension)
{
point.setY(m_parent->m_parentRect.bottom() - m_maxDimension);
if (height < m_minDimension)
{
point.setY(m_parent->m_parentRect.bottom() - m_minDimension);
}
else if (height > m_maxDimension)
{
point.setY(m_parent->m_parentRect.bottom() - m_maxDimension);
}

if (m_parent->m_lockAspectRatio && m_scalingFactor < 1 && height * m_scalingFactor < m_minDimension)
{
point.setY(m_parent->m_parentRect.bottom() - m_minDimension / m_scalingFactor);
}
else if (m_parent->m_lockAspectRatio && m_scalingFactor > 1 && height * m_scalingFactor > m_maxDimension)
{
point.setY(m_parent->m_parentRect.bottom() - m_maxDimension / m_scalingFactor);
}
}
else if (isMovingBottom && point.y() > m_parent->m_parentRect.top() + m_maxDimension)
else if (isMovingBottom)
{
point.setY(m_parent->m_parentRect.top() + m_maxDimension);
height = point.y() - m_parent->m_parentRect.top();

if (height < m_minDimension)
{
point.setY(m_parent->m_parentRect.top() + m_minDimension);
}
else if (height > m_maxDimension)
{
point.setY(m_parent->m_parentRect.top() + m_maxDimension);
}

if (m_parent->m_lockAspectRatio && m_scalingFactor < 1 && height * m_scalingFactor < m_minDimension)
{
point.setY(m_parent->m_parentRect.top() + m_minDimension / m_scalingFactor);
}
else if (m_parent->m_lockAspectRatio && m_scalingFactor > 1 && height * m_scalingFactor > m_maxDimension)
{
point.setY(m_parent->m_parentRect.top() + m_maxDimension / m_scalingFactor);
}
}

if (isMovingLeft && point.x() < m_parent->m_parentRect.right() - m_maxDimension)
if (isMovingLeft)
{
point.setX(m_parent->m_parentRect.right() - m_maxDimension);
width = m_parent->m_parentRect.right() - point.x();

if (width < m_minDimension)
{
point.setX(m_parent->m_parentRect.right() - m_minDimension);
}
else if (width > m_maxDimension)
{
point.setX(m_parent->m_parentRect.right() - m_maxDimension);
}

if (m_parent->m_lockAspectRatio && m_scalingFactor > 1 && width / m_scalingFactor < m_minDimension)
{
point.setX(m_parent->m_parentRect.right() - m_minDimension * m_scalingFactor);
}
else if (m_parent->m_lockAspectRatio && m_scalingFactor < 1 && width / m_scalingFactor > m_maxDimension)
{
point.setX(m_parent->m_parentRect.right() - m_maxDimension * m_scalingFactor);
}
}
else if (isMovingRight && point.x() > m_parent->m_parentRect.left() + m_maxDimension)
else if (isMovingRight)
{
point.setX(m_parent->m_parentRect.left() + m_maxDimension);
width = point.x() - m_parent->m_parentRect.left();
qDebug() << "width: " << width;

if (width < m_minDimension)
{
point.setX(m_parent->m_parentRect.left() + m_minDimension);
}
else if (width > m_maxDimension)
{
point.setX(m_parent->m_parentRect.left() + m_maxDimension);
}

if (m_parent->m_lockAspectRatio && m_scalingFactor > 1 && width / m_scalingFactor < m_minDimension)
{
point.setX(m_parent->m_parentRect.left() + m_minDimension * m_scalingFactor);
}
else if (m_parent->m_lockAspectRatio && m_scalingFactor < 1 && width / m_scalingFactor > m_maxDimension)
{
point.setX(m_parent->m_parentRect.left() + m_maxDimension * m_scalingFactor);
}
}

return point;
Expand Down

0 comments on commit a2d63fd

Please sign in to comment.