DRY. Refactoring item move code. smart-pattern/valentina#53
This commit is contained in:
parent
d08da56764
commit
5f2bec91d9
|
@ -194,29 +194,7 @@ QVariant VToolBasePoint::itemChange(QGraphicsItem::GraphicsItemChange change, co
|
||||||
{
|
{
|
||||||
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
||||||
{
|
{
|
||||||
const qreal scale = SceneScale(scene());
|
view->EnsureItemVisibleWithDelay(this, VMainGraphicsView::scrollDelay);
|
||||||
const int xmargin = 5;
|
|
||||||
const int ymargin = 5;
|
|
||||||
|
|
||||||
const QRectF viewRect = VMainGraphicsView::SceneVisibleArea(view);
|
|
||||||
const QRectF itemRect = mapToScene(boundingRect()).boundingRect();
|
|
||||||
|
|
||||||
// If item's rect is bigger than view's rect ensureVisible works very unstable.
|
|
||||||
if (itemRect.height() + 2*ymargin < viewRect.height() &&
|
|
||||||
itemRect.width() + 2*xmargin < viewRect.width())
|
|
||||||
{
|
|
||||||
view->EnsureVisibleWithDelay(itemRect, VMainGraphicsView::scrollDelay, xmargin, ymargin);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Ensure visible only small rect around a cursor
|
|
||||||
VMainGraphicsScene *currentScene = qobject_cast<VMainGraphicsScene *>(scene());
|
|
||||||
SCASSERT(currentScene)
|
|
||||||
const QPointF cursorPosition = currentScene->getScenePos();
|
|
||||||
view->EnsureVisibleWithDelay(QRectF(cursorPosition.x()-5/scale, cursorPosition.y()-5/scale,
|
|
||||||
10/scale, 10/scale),
|
|
||||||
VMainGraphicsView::scrollDelay);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
changeFinished = true;
|
changeFinished = true;
|
||||||
|
|
|
@ -977,29 +977,7 @@ QVariant VToolSeamAllowance::itemChange(QGraphicsItem::GraphicsItemChange change
|
||||||
{
|
{
|
||||||
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
||||||
{
|
{
|
||||||
const qreal scale = SceneScale(scene());
|
view->EnsureItemVisibleWithDelay(this, VMainGraphicsView::scrollDelay);
|
||||||
const int xmargin = 5;
|
|
||||||
const int ymargin = 5;
|
|
||||||
|
|
||||||
const QRectF viewRect = VMainGraphicsView::SceneVisibleArea(view);
|
|
||||||
const QRectF itemRect = mapToScene(boundingRect()|childrenBoundingRect()).boundingRect();
|
|
||||||
|
|
||||||
// If item's rect is bigger than view's rect ensureVisible works very unstable.
|
|
||||||
if (itemRect.height() + 2*ymargin < viewRect.height() &&
|
|
||||||
itemRect.width() + 2*xmargin < viewRect.width())
|
|
||||||
{
|
|
||||||
view->EnsureVisibleWithDelay(this, VMainGraphicsView::scrollDelay, xmargin, ymargin);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Ensure visible only small rect around a cursor
|
|
||||||
VMainGraphicsScene *currentScene = qobject_cast<VMainGraphicsScene *>(scene());
|
|
||||||
SCASSERT(currentScene);
|
|
||||||
const QPointF cursorPosition = currentScene->getScenePos();
|
|
||||||
view->EnsureVisibleWithDelay(QRectF(cursorPosition.x()-5/scale, cursorPosition.y()-5/scale,
|
|
||||||
10/scale, 10/scale),
|
|
||||||
VMainGraphicsView::scrollDelay);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -174,31 +174,7 @@ QVariant VControlPointSpline::itemChange(QGraphicsItem::GraphicsItemChange chang
|
||||||
{
|
{
|
||||||
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
||||||
{
|
{
|
||||||
const qreal scale = SceneScale(scene());
|
view->EnsureItemVisibleWithDelay(this, VMainGraphicsView::scrollDelay);
|
||||||
const int xmargin = 5;
|
|
||||||
const int ymargin = 5;
|
|
||||||
|
|
||||||
const QRectF viewRect = VMainGraphicsView::SceneVisibleArea(view);
|
|
||||||
const QRectF itemRect = sceneBoundingRect();
|
|
||||||
|
|
||||||
// If item's rect is bigger than view's rect ensureVisible works very unstable.
|
|
||||||
if (itemRect.height() + 2*ymargin < viewRect.height() &&
|
|
||||||
itemRect.width() + 2*xmargin < viewRect.width())
|
|
||||||
{
|
|
||||||
view->EnsureVisibleWithDelay(itemRect, VMainGraphicsView::scrollDelay, xmargin,
|
|
||||||
ymargin);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Ensure visible only small rect around a cursor
|
|
||||||
VMainGraphicsScene *currentScene = qobject_cast<VMainGraphicsScene *>(scene());
|
|
||||||
SCASSERT(currentScene)
|
|
||||||
|
|
||||||
const QPointF cursorPosition = currentScene->getScenePos();
|
|
||||||
view->EnsureVisibleWithDelay(QRectF(cursorPosition.x()-5/scale,
|
|
||||||
cursorPosition.y()-5/scale, 10/scale, 10/scale),
|
|
||||||
VMainGraphicsView::scrollDelay);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,30 +201,7 @@ QVariant VGraphicsSimpleTextItem::itemChange(GraphicsItemChange change, const QV
|
||||||
{
|
{
|
||||||
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
if (VMainGraphicsView *view = qobject_cast<VMainGraphicsView *>(viewList.at(0)))
|
||||||
{
|
{
|
||||||
const qreal scale = SceneScale(scene());
|
view->EnsureItemVisibleWithDelay(this, VMainGraphicsView::scrollDelay);
|
||||||
int xmargin = 5;
|
|
||||||
int ymargin = 5;
|
|
||||||
|
|
||||||
const QRectF viewRect = VMainGraphicsView::SceneVisibleArea(view);
|
|
||||||
const QRectF itemRect = mapToScene(boundingRect()).boundingRect();
|
|
||||||
|
|
||||||
// If item's rect is bigger than view's rect ensureVisible works very unstable.
|
|
||||||
if (itemRect.height() + 2*ymargin < viewRect.height() &&
|
|
||||||
itemRect.width() + 2*xmargin < viewRect.width())
|
|
||||||
{
|
|
||||||
view->EnsureVisibleWithDelay(itemRect, VMainGraphicsView::scrollDelay, xmargin, ymargin);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Ensure visible only small rect around a cursor
|
|
||||||
VMainGraphicsScene *currentScene = qobject_cast<VMainGraphicsScene *>(scene());
|
|
||||||
SCASSERT(currentScene)
|
|
||||||
const QPointF cursorPosition = currentScene->getScenePos();
|
|
||||||
|
|
||||||
view->EnsureVisibleWithDelay(QRectF(cursorPosition.x()-5/scale, cursorPosition.y()-5/scale,
|
|
||||||
10/scale, 10/scale),
|
|
||||||
VMainGraphicsView::scrollDelay);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
#include "../vmisc/vabstractapplication.h"
|
#include "../vmisc/vabstractapplication.h"
|
||||||
#include "../vmisc/vsettings.h"
|
#include "../vmisc/vsettings.h"
|
||||||
#include "vabstractmainwindow.h"
|
#include "vabstractmainwindow.h"
|
||||||
|
#include "global.h"
|
||||||
|
|
||||||
const qreal maxSceneSize = ((20.0 * 1000.0) / 25.4) * PrintDPI; // 20 meters in pixels
|
const qreal maxSceneSize = ((20.0 * 1000.0) / 25.4) * PrintDPI; // 20 meters in pixels
|
||||||
|
|
||||||
|
@ -670,6 +671,33 @@ qreal VMainGraphicsView::MaxScale()
|
||||||
return maxSceneSize / screenSize;
|
return maxSceneSize / screenSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VMainGraphicsView::EnsureItemVisibleWithDelay(const QGraphicsItem *item, unsigned long msecs, int xmargin,
|
||||||
|
int ymargin)
|
||||||
|
{
|
||||||
|
SCASSERT(item != nullptr)
|
||||||
|
const qreal scale = SceneScale(item->scene());
|
||||||
|
|
||||||
|
const QRectF viewRect = VMainGraphicsView::SceneVisibleArea(this);
|
||||||
|
const QRectF itemRect = item->mapToScene(item->boundingRect()).boundingRect();
|
||||||
|
|
||||||
|
// If item's rect is bigger than view's rect ensureVisible works very unstable.
|
||||||
|
if (itemRect.height() + 2*ymargin < viewRect.height() &&
|
||||||
|
itemRect.width() + 2*xmargin < viewRect.width())
|
||||||
|
{
|
||||||
|
EnsureVisibleWithDelay(item, msecs, xmargin, ymargin);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ensure visible only small rect around a cursor
|
||||||
|
VMainGraphicsScene *currentScene = qobject_cast<VMainGraphicsScene *>(item->scene());
|
||||||
|
SCASSERT(currentScene);
|
||||||
|
const QPointF cursorPosition = currentScene->getScenePos();
|
||||||
|
EnsureVisibleWithDelay(QRectF(cursorPosition.x()-5/scale, cursorPosition.y()-5/scale, 10/scale, 10/scale),
|
||||||
|
msecs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VMainGraphicsView::EnsureVisibleWithDelay(const QRectF &rect, unsigned long msecs, int xmargin, int ymargin)
|
void VMainGraphicsView::EnsureVisibleWithDelay(const QRectF &rect, unsigned long msecs, int xmargin, int ymargin)
|
||||||
{
|
{
|
||||||
|
|
|
@ -127,6 +127,8 @@ public:
|
||||||
static qreal MinScale();
|
static qreal MinScale();
|
||||||
static qreal MaxScale();
|
static qreal MaxScale();
|
||||||
|
|
||||||
|
void EnsureItemVisibleWithDelay(const QGraphicsItem *item, unsigned long msecs, int xmargin = 5, int ymargin = 5);
|
||||||
|
|
||||||
void EnsureVisibleWithDelay(const QRectF &rect, unsigned long msecs, int xmargin = 50, int ymargin = 50);
|
void EnsureVisibleWithDelay(const QRectF &rect, unsigned long msecs, int xmargin = 50, int ymargin = 50);
|
||||||
void EnsureVisibleWithDelay(const QGraphicsItem *item, unsigned long msecs, int xmargin = 50, int ymargin = 50);
|
void EnsureVisibleWithDelay(const QGraphicsItem *item, unsigned long msecs, int xmargin = 50, int ymargin = 50);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user