diff --git a/scribus/canvasmode.cpp b/scribus/canvasmode.cpp --- a/scribus/canvasmode.cpp +++ b/scribus/canvasmode.cpp @@ -1295,6 +1295,7 @@ bool resizing=((buttonModifiers & Qt::AltModifier) && !(buttonModifiers & Qt::ControlModifier)); bool resizingsmaller=(resizing && (buttonModifiers & Qt::ShiftModifier)); double resizeBy=1.0; + //CB with control locked out due to the requirement of moveby of 0.01, we cannot support //resizeby 10 units unless we move to supporting modifier keys that most people don't have. //if (buttonModifiers & Qt::ControlModifier) @@ -1304,6 +1305,14 @@ resizeBy*=-1.0; PageItem *currItem = m_doc->m_Selection->itemAt(0); + + //#8860 + //rotationFC is a temporary variable to manage items rotation: + //currently an item with e.g. 40° rotation is as 360° - 40° = 320° + double rotationFC = fabs(360.0 - currItem->rotation()); + //radRotation calculates item rotation in rad + double radRotation = rotationFC * M_PI / 180.0; + switch (kk) { case Qt::Key_Backspace: @@ -1379,13 +1388,27 @@ m_view->TransformPoly(10, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex())); else if (!currItem->sizeLocked()) { - if (!resizingsmaller) + if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0)) { - m_doc->moveItem(-resizeBy, 0, currItem); + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem); currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0); } + else if (rotationFC >= 45.0 && rotationFC < 135.0) + { + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem); + currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale()); + } + else if (rotationFC >= 135.0 && rotationFC < 225.0) + { + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + } + else if (rotationFC >= 225.0 && rotationFC < 315.0) + { + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + } currItem->Sizing = false; - m_doc->sizeItem(currItem->width()+resizeBy, currItem->height(), currItem); } } currItem->update(); @@ -1453,13 +1476,27 @@ m_view->TransformPoly(11, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex())); else if (!currItem->sizeLocked()) { - if (resizingsmaller) + if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0)) { - m_doc->moveItem(-resizeBy, 0, currItem); + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + } + else if (rotationFC >= 45.0 && rotationFC < 135.0) + { + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + } + else if (rotationFC >= 135.0 && rotationFC < 225.0) + { + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem); currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0); } + else if (rotationFC >= 225.0 && rotationFC < 315.0) + { + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem); + currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale()); + } currItem->Sizing = false; - m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); } } currItem->update(); @@ -1527,13 +1564,27 @@ m_view->TransformPoly(12, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex())); else { - if (!resizingsmaller) + if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0)) { - m_doc->moveItem(0, -resizeBy, currItem); + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem); currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale()); } + else if (rotationFC >= 45.0 && rotationFC < 135.0) + { + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + } + else if (rotationFC >= 135.0 && rotationFC < 225.0) + { + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + } + else if (rotationFC >= 225.0 && rotationFC < 315.0) + { + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem); + currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0); + } currItem->Sizing = false; - m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); } } currItem->update(); @@ -1601,13 +1652,27 @@ m_view->TransformPoly(13, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex())); else if (!currItem->sizeLocked()) { - if (resizingsmaller) + if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0)) { - m_doc->moveItem(0, -resizeBy, currItem); + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + } + else if (rotationFC >= 45.0 && rotationFC < 135.0) + { + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem); + currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0); + } + else if (rotationFC >= 135.0 && rotationFC < 225.0) + { + m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); + m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem); currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale()); } + else if (rotationFC >= 225.0 && rotationFC < 315.0) + { + m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem); + } currItem->Sizing = false; - m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem); } } currItem->update();