Allow free resizing (without maintaining aspect ratio) by holding down CTRL.
This should probably be documented somewhere. Plasma should probably have docs. svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=757567
This commit is contained in:
parent
91300d6fc9
commit
ec09262001
@ -22,6 +22,7 @@
|
|||||||
#include <QtGui/QGraphicsSceneMouseEvent>
|
#include <QtGui/QGraphicsSceneMouseEvent>
|
||||||
#include <QtGui/QLinearGradient>
|
#include <QtGui/QLinearGradient>
|
||||||
#include <QtGui/QPainter>
|
#include <QtGui/QPainter>
|
||||||
|
#include <QtGui/QApplication>
|
||||||
|
|
||||||
#include <KColorScheme>
|
#include <KColorScheme>
|
||||||
#include <KIcon>
|
#include <KIcon>
|
||||||
@ -51,7 +52,8 @@ AppletHandle::AppletHandle(Containment *parent, Applet *applet)
|
|||||||
m_anim(FadeIn),
|
m_anim(FadeIn),
|
||||||
m_animId(0),
|
m_animId(0),
|
||||||
m_angle(0.0),
|
m_angle(0.0),
|
||||||
m_scale(1.0)
|
m_scaleWidth(1.0),
|
||||||
|
m_scaleHeight(1.0)
|
||||||
{
|
{
|
||||||
KColorScheme colors(QPalette::Active, KColorScheme::View, Theme::self()->colors());
|
KColorScheme colors(QPalette::Active, KColorScheme::View, Theme::self()->colors());
|
||||||
m_gradientColor = colors.background(KColorScheme::NormalBackground).color();
|
m_gradientColor = colors.background(KColorScheme::NormalBackground).color();
|
||||||
@ -212,15 +214,15 @@ void AppletHandle::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
|||||||
if (m_applet && event->button() == Qt::LeftButton) {
|
if (m_applet && event->button() == Qt::LeftButton) {
|
||||||
switch (m_pressedButton) {
|
switch (m_pressedButton) {
|
||||||
case RotateButton: {
|
case RotateButton: {
|
||||||
if (m_scale > 0) {
|
if (m_scaleWidth > 0 && m_scaleHeight > 0) {
|
||||||
QRectF rect(m_applet->boundingRect());
|
QRectF rect(m_applet->boundingRect());
|
||||||
const qreal newWidth = rect.width() * m_scale;
|
const qreal newWidth = rect.width() * m_scaleWidth;
|
||||||
const qreal newHeight = rect.height() * m_scale;
|
const qreal newHeight = rect.height() * m_scaleHeight;
|
||||||
m_applet->resetTransform();
|
m_applet->resetTransform();
|
||||||
m_applet->resize(newWidth, newHeight);
|
m_applet->resize(newWidth, newHeight);
|
||||||
scale(1.0/m_scale, 1.0/m_scale);
|
scale(1.0/m_scaleWidth, 1.0/m_scaleHeight);
|
||||||
moveBy((rect.width() - newWidth) / 2, (rect.height() - newHeight) / 2);
|
moveBy((rect.width() - newWidth) / 2, (rect.height() - newHeight) / 2);
|
||||||
m_scale = 0;
|
m_scaleWidth = m_scaleHeight = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF rect(boundingRect());
|
QRectF rect(boundingRect());
|
||||||
@ -324,17 +326,6 @@ void AppletHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|||||||
QRectF rect = QRectF(m_applet->pos(), m_applet->size());
|
QRectF rect = QRectF(m_applet->pos(), m_applet->size());
|
||||||
QPointF center = rect.center();
|
QPointF center = rect.center();
|
||||||
|
|
||||||
m_angle = _k_angleForPoints(center, pressPos, event->pos());
|
|
||||||
|
|
||||||
if (fabs(remainder(m_originalAngle+m_angle, snapAngle)) < 0.15) {
|
|
||||||
m_angle = m_angle - remainder(m_originalAngle+m_angle, snapAngle);
|
|
||||||
}
|
|
||||||
|
|
||||||
qreal newScale = _k_distanceForPoint(event->pos()-center) / _k_distanceForPoint(pressPos-center);
|
|
||||||
if (qAbs(newScale-1.0)<=0.1) {
|
|
||||||
newScale = 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
qreal w = m_applet->size().width();
|
qreal w = m_applet->size().width();
|
||||||
qreal h = m_applet->size().height();
|
qreal h = m_applet->size().height();
|
||||||
QSizeF min = m_applet->minimumSize();
|
QSizeF min = m_applet->minimumSize();
|
||||||
@ -347,21 +338,65 @@ void AppletHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|||||||
min += QSizeF(16, 16);
|
min += QSizeF(16, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: this code will only work if we are keeping the aspect ratio, as we currently do
|
if (QApplication::keyboardModifiers() & Qt::ControlModifier) {
|
||||||
// as it resets only on the width, which will break if we allow resizing of width
|
m_angle = 0;
|
||||||
// and height independantly
|
|
||||||
if (newScale * w < min.width() || newScale * h < min.height()) {
|
qreal newScaleWidth = 0;
|
||||||
m_scale = min.width() / w;
|
qreal newScaleHeight = 0;
|
||||||
} else if (newScale * w > max.width() && newScale * h > max.height()) {
|
|
||||||
m_scale = max.width() / w;
|
QPointF startDistance(pressPos - center);
|
||||||
|
QPointF currentDistance(event->pos() - center);
|
||||||
|
newScaleWidth = currentDistance.x() / startDistance.x();
|
||||||
|
newScaleHeight = currentDistance.y() / startDistance.y();
|
||||||
|
|
||||||
|
if (qAbs(newScaleWidth-1.0)<=0.1) {
|
||||||
|
newScaleWidth = 1.0;
|
||||||
|
}
|
||||||
|
if (qAbs(newScaleHeight-1.0)<=0.1) {
|
||||||
|
newScaleHeight = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newScaleHeight * h < min.height()) {
|
||||||
|
m_scaleHeight = min.height() / h;
|
||||||
|
} else if (newScaleHeight * h > max.height()) {
|
||||||
|
m_scaleHeight = max.height() / h;
|
||||||
|
} else {
|
||||||
|
m_scaleHeight = newScaleHeight;
|
||||||
|
}
|
||||||
|
if (newScaleWidth * w < min.width()) {
|
||||||
|
m_scaleWidth = min.width() / w;
|
||||||
|
} else if (newScaleWidth * w > max.width()) {
|
||||||
|
m_scaleWidth = max.width() / w;
|
||||||
|
} else {
|
||||||
|
m_scaleWidth = newScaleWidth;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m_scale = newScale;
|
m_angle = _k_angleForPoints(center, pressPos, event->pos());
|
||||||
|
|
||||||
|
if (fabs(remainder(m_originalAngle+m_angle, snapAngle)) < 0.15) {
|
||||||
|
m_angle = m_angle - remainder(m_originalAngle+m_angle, snapAngle);
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal newScale = 0;
|
||||||
|
|
||||||
|
newScale = _k_distanceForPoint(event->pos()-center) / _k_distanceForPoint(pressPos-center);
|
||||||
|
if (qAbs(newScale-1.0)<=0.1) {
|
||||||
|
newScale = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newScale * w < min.width() || newScale * h < min.height()) {
|
||||||
|
m_scaleWidth = m_scaleHeight = qMax(min.width() / w, min.height() / h);
|
||||||
|
} else if (newScale * w > max.width() && newScale * h > max.height()) {
|
||||||
|
m_scaleWidth = m_scaleHeight = qMin(max.width() / w, max.height() / h);
|
||||||
|
} else {
|
||||||
|
m_scaleHeight = m_scaleWidth = newScale;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QTransform matrix;
|
QTransform matrix;
|
||||||
matrix.translate(center.x(), center.y());
|
matrix.translate(center.x(), center.y());
|
||||||
matrix.rotateRadians(m_angle);
|
matrix.rotateRadians(m_angle);
|
||||||
matrix.scale(m_scale, m_scale);
|
matrix.scale(m_scaleWidth, m_scaleHeight);
|
||||||
matrix.translate(-center.x(), -center.y());
|
matrix.translate(-center.x(), -center.y());
|
||||||
setTransform(matrix);
|
setTransform(matrix);
|
||||||
} else {
|
} else {
|
||||||
|
@ -81,7 +81,8 @@ class AppletHandle : public QObject, public QGraphicsItem
|
|||||||
FadeType m_anim;
|
FadeType m_anim;
|
||||||
Phase::AnimId m_animId;
|
Phase::AnimId m_animId;
|
||||||
qreal m_angle;
|
qreal m_angle;
|
||||||
qreal m_scale;
|
qreal m_scaleWidth;
|
||||||
|
qreal m_scaleHeight;
|
||||||
qreal m_originalAngle;
|
qreal m_originalAngle;
|
||||||
QColor m_gradientColor;
|
QColor m_gradientColor;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user