r23152 by jghali - #10988: Snap to items should make the guides snap to items <ale + jghali>

scribus-commit scribus-commit at lists.scribus.net
Fri Aug 23 11:45:10 UTC 2019


Author: jghali
Date: Fri Aug 23 11:45:10 2019
New Revision: 23152

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23152
Log:
#10988: Snap to items should make the guides snap to items <ale + jghali>

Modified:
    trunk/Scribus/scribus/canvasgesture_rulermove.cpp
    trunk/Scribus/scribus/scribusdoc.cpp
    trunk/Scribus/scribus/scribusdoc.h

Modified: trunk/Scribus/scribus/canvasgesture_rulermove.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23152&path=/trunk/Scribus/scribus/canvasgesture_rulermove.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasgesture_rulermove.cpp	(original)
+++ trunk/Scribus/scribus/canvasgesture_rulermove.cpp	Fri Aug 23 11:45:10 2019
@@ -1,364 +1,393 @@
-/*
- For general Scribus (>=1.3.2) copyright and licensing information please refer
- to the COPYING file provided with the program. Following this notice may exist
- a copyright and/or license notice that predates the release of Scribus 1.3.2
- for which a new license (GPL+exception) is in place.
- */
-/***************************************************************************
-*                                                                         *
-*   This program is free software; you can redistribute it and/or modify  *
-*   it under the terms of the GNU General Public License as published by  *
-*   the Free Software Foundation; either version 2 of the License, or     *
-*   (at your option) any later version.                                   *
-*                                                                         *
-***************************************************************************/
-
-#include "canvasgesture_rulermove.h"
-
-#include <QEvent>
-#include <QMouseEvent>
-#include <QPainter>
-
-#include "appmodes.h"
-#include "guidemanagercore.h"
-#include "scribus.h"
-#include "scribusdoc.h"
-#include "scribusview.h"
-#include "ui/guidemanager.h"
-#include "iconmanager.h"
-
-
-RulerGesture::RulerGesture(ScribusView *view, RulerGesture::Mode mode) :
-	CanvasGesture(view),
-	m_ScMW(m_view->m_ScMW),
-	m_mode(mode),
-	m_haveGuide(false),
-	m_page(0),
-	m_guide(0.0),
-	m_currentGuide(0.0),
-	m_haveCursor(false),
-	m_xy(0,0),
-	m_mousePoint(0,0)
-{
-}
-
-
-void RulerGesture::drawControls(QPainter* p)
-{
-	int page = -1;
-	//This is !null where we've entered the RulerGesture::mouseMoveEvent
-	if (!m_mousePoint.isNull())
-		page = m_doc->OnPage(m_mousePoint.x(), m_mousePoint.y());
-	if (page == -1)
-		return;
-	ScPage* dragToPage=m_doc->Pages->at(page);
-	if (!dragToPage)
-		return;
-	if (m_haveGuide)
-		dragToPage = m_doc->Pages->at(m_page);
-	QColor color(m_doc->guidesPrefs().guideColor);
-	p->save();
-	QPoint pageOrigin = m_canvas->canvasToLocal(QPointF(dragToPage->xOffset(), dragToPage->yOffset()));
-	QSize pageSize = (QSizeF(dragToPage->width(), dragToPage->height()) * m_canvas->scale()).toSize();
-	switch (m_mode)
-	{
-		case HORIZONTAL:
-			p->setPen(QPen(color, 1.0, Qt::DashDotLine, Qt::FlatCap, Qt::MiterJoin));
-			p->drawLine(QPoint(pageOrigin.x(), m_xy.y()), QPoint(pageOrigin.x() + pageSize.width(), m_xy.y()));
-			break;
-		case VERTICAL:
-			p->setPen(QPen(color, 1.0, Qt::DashDotLine, Qt::FlatCap, Qt::MiterJoin));
-			p->drawLine(QPoint(m_xy.x(), pageOrigin.y()), QPoint(m_xy.x(), pageOrigin.y() + pageSize.height()));
-			break;
-		case ORIGIN:
-			p->setPen(QPen(color, 1.0, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin));
-			p->drawLine(QPoint(m_xy.x(), 0), QPoint(m_xy.x(), m_canvas->height()));
-			p->drawLine(QPoint(0, m_xy.y()), QPoint(m_canvas->width(), m_xy.y()));
-			break;
-	}
-	p->restore();
-}
-
-
-void RulerGesture::clear()
-{
-	m_haveGuide = false;
-}
-
-
-void RulerGesture::prepare(Mode mode)
-{
-	m_haveGuide = false;
-	m_mode = mode;
-}
-
-
-void RulerGesture::activate(bool fromGesture)
-{
-	m_haveCursor = (qApp->overrideCursor() != nullptr);
-	if ( (!fromGesture) && qApp->overrideCursor())
-	{
-		m_haveCursor = true;
-		m_cursor = *(qApp->overrideCursor());
-	}
-	else
-	{
-		m_haveCursor = false;
-	}
-	switch (m_mode)
-	{
-		case HORIZONTAL:
-			qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
-			break;
-		case VERTICAL:
-			qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
-			break;
-		case ORIGIN:
-			qApp->changeOverrideCursor(QCursor(Qt::CrossCursor));
-			break;
-	}
-	emit guideInfo(m_mode, m_guide);
-}
-
-void RulerGesture::deactivate(bool)
-{
-	if (m_haveCursor)
-		qApp->changeOverrideCursor(m_cursor);
-	m_haveGuide = false;
-}
-
-
-bool RulerGesture::mouseHitsGuide(const FPoint& mousePointDoc)
-{
-	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
-	if ((m_doc->guidesPrefs().guidesShown) && (!m_doc->GuideLock) && page >= 0)
-	{
-		double grabRadScale = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
-		int index = m_doc->Pages->at(page)->guides.isMouseOnVertical(mousePointDoc.x() + grabRadScale, mousePointDoc.x() - grabRadScale, GuideManagerCore::Standard);
-		if (index >= 0)
-		{
-			m_mode = VERTICAL;
-			m_haveGuide = true;
-			m_guide = m_doc->Pages->at(page)->guides.vertical(index, GuideManagerCore::Standard);
-			m_currentGuide = m_guide;
-			m_page = page;
-			return true;
-		}
-		index = m_doc->Pages->at(page)->guides.isMouseOnHorizontal(mousePointDoc.y() + grabRadScale, mousePointDoc.y() - grabRadScale, GuideManagerCore::Standard);
-		if (index >= 0)
-		{
-			m_mode = HORIZONTAL;
-			m_haveGuide = true;
-			m_guide = m_doc->Pages->at(page)->guides.horizontal(index, GuideManagerCore::Standard);
-			m_currentGuide = m_guide;
-			m_page = page;
-			return true;
-		}
-	}
-	m_haveGuide = false;
-	return false;
-}
-
-void RulerGesture::mouseSelectGuide(QMouseEvent *m)
-{
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
-	if ((m_doc->guidesPrefs().guidesShown) && page >= 0)
-	{
-		double grabRadScale = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
-		int index = m_doc->Pages->at(page)->guides.isMouseOnVertical(mousePointDoc.x() + grabRadScale, mousePointDoc.x() - grabRadScale, GuideManagerCore::Standard);
-		if (index >= 0)
-		{
-			emit guideInfo(VERTICAL, m_doc->Pages->at(page)->guides.vertical(index, GuideManagerCore::Standard));
-			return;
-		}
-		index = m_doc->Pages->at(page)->guides.isMouseOnHorizontal(mousePointDoc.y() + grabRadScale, mousePointDoc.y() - grabRadScale, GuideManagerCore::Standard);
-		if (index >= 0)
-		{
-			emit guideInfo(HORIZONTAL, m_doc->Pages->at(page)->guides.horizontal(index, GuideManagerCore::Standard));
-			return;
-		}
-	}
-}
-
-void RulerGesture::movePoint(QMouseEvent* m, bool mouseRelease)
-{
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
-	QRect viewport(m_view->viewport()->mapToGlobal(QPoint(0,0)), QSize(m_view->visibleWidth(), m_view->visibleHeight()));
-	QPoint newMousePoint = m->globalPos() - (m_canvas->mapToParent(QPoint(0, 0)) + m_canvas->parentWidget()->mapToGlobal(QPoint(0, 0)));
-	switch (m_mode)
-	{
-		case ORIGIN:
-			m_canvas->repaint();
-			m_canvas->displayCorrectedXYHUD(m->globalPos(), mousePointDoc.x(), mousePointDoc.y());
-			break;
-		case HORIZONTAL:
-			if (!m_ScMW->doc->guidesPrefs().guidesShown)
-				break;
-			m_canvas->update(0, m_xy.y()-2, m_canvas->width(), 4);
-			m_canvas->update(0, newMousePoint.y()-2, m_canvas->width(), 4);
-			if ((page >= 0) && (viewport.contains(m->globalPos())))
-			{
-				if (!m_haveGuide)
-				{
-					qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
-					if (mouseRelease)
-					{
-						m_doc->Pages->at(page)->guides.addHorizontal(mousePointDoc.y() - m_doc->Pages->at(page)->yOffset(), GuideManagerCore::Standard);
-						m_guide = mousePointDoc.y() - m_doc->Pages->at(page)->yOffset();
-						m_page  = page;
-						m_haveGuide = true;
-						m_doc->changed();
-					}
-				}
-				else if (mouseRelease)
-				{
-					if (page == m_page)
-						m_doc->Pages->at(page)->guides.moveHorizontal( m_guide, mousePointDoc.y() - m_doc->Pages->at(page)->yOffset(), GuideManagerCore::Standard);
-					else
-					{
-						m_doc->Pages->at(m_page)->guides.deleteHorizontal( m_guide, GuideManagerCore::Standard);
-						m_doc->Pages->at(page)->guides.addHorizontal(mousePointDoc.y() - m_doc->Pages->at(page)->yOffset(), GuideManagerCore::Standard);
-						m_page = page;
-					}
-					if (m_doc->currentPage() != m_doc->Pages->at(m_page))
-						m_doc->setCurrentPage( m_doc->Pages->at(m_page) );
-					m_doc->changed();
-				}
-				else
-				{
-					QCursor* cursor = qApp->overrideCursor();
-					if (cursor && (cursor->shape() != Qt::SplitVCursor))
-						qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
-				}
-				m_currentGuide = mousePointDoc.y() - m_doc->Pages->at(page)->yOffset();
-			}
-			else
-			{ 
-				if (m_haveGuide)
-				{
-					qApp->changeOverrideCursor(IconManager::instance().loadCursor("DelPoint.png"));
-					if (mouseRelease)
-					{
-						m_doc->Pages->at(m_page)->guides.deleteHorizontal( m_guide, GuideManagerCore::Standard);
-						m_haveGuide = false;
-						m_doc->changed();
-					}
-				}
-			}
-			m_canvas->displayCorrectedSingleHUD(m->globalPos(), mousePointDoc.y(), false);
-			break;
-		case VERTICAL:
-			if (!m_ScMW->doc->guidesPrefs().guidesShown)
-				break;
-			m_canvas->update(m_xy.x()-2, 0, 4, m_canvas->height());
-			m_canvas->update(newMousePoint.x()-2, 0, 4, m_canvas->height());
-			if ((page >= 0) && viewport.contains(m->globalPos()))
-			{
-				if (!m_haveGuide)
-				{
-					qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
-					if (mouseRelease)
-					{
-						m_doc->Pages->at(page)->guides.addVertical(mousePointDoc.x() - m_doc->Pages->at(page)->xOffset(), GuideManagerCore::Standard);
-						m_guide = mousePointDoc.x() - m_doc->Pages->at(page)->xOffset();
-						m_page  = page;
-						m_haveGuide = true;
-						m_doc->changed();
-					}
-				}
-				else if (mouseRelease)
-				{
-					if (page == m_page)
-						m_doc->Pages->at(page)->guides.moveVertical( m_guide, mousePointDoc.x() - m_doc->Pages->at(page)->xOffset(), GuideManagerCore::Standard);
-					else
-					{
-						m_doc->Pages->at(m_page)->guides.deleteVertical( m_guide, GuideManagerCore::Standard);
-						m_doc->Pages->at(page)->guides.addVertical(mousePointDoc.x() - m_doc->Pages->at(page)->xOffset(), GuideManagerCore::Standard);
-						m_page = page;
-					}
-					if (m_doc->currentPage() != m_doc->Pages->at(m_page))
-						m_doc->setCurrentPage( m_doc->Pages->at(m_page) );
-					m_doc->changed();
-				}
-				else
-				{
-					QCursor* cursor = qApp->overrideCursor();
-					if (cursor && (cursor->shape() != Qt::SplitHCursor))
-						qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
-				}
-				m_currentGuide = mousePointDoc.x() - m_doc->Pages->at(page)->xOffset();
-			}
-			else
-			{ 
-				if (m_haveGuide)
-				{
-					qApp->changeOverrideCursor(IconManager::instance().loadCursor("DelPoint.png"));
-					if (mouseRelease)
-					{
-						m_doc->Pages->at(m_page)->guides.deleteVertical( m_guide, GuideManagerCore::Standard);
-						m_haveGuide = false;
-						m_doc->changed();
-					}
-				}
-			}
-			m_canvas->displayCorrectedSingleHUD(m->globalPos(), mousePointDoc.x(), true);
-			break;
-	}
-	m_xy = newMousePoint;
-}
-
-
-void RulerGesture::mouseMoveEvent(QMouseEvent* m)
-{
-	m_mousePoint=m_canvas->globalToCanvas(m->globalPos());
-	m->accept();
-	if (m_view->moveTimerElapsed())
-	{
-		movePoint(m, false);
-		if (m_ScMW->doc->guidesPrefs().guidesShown)
-			emit guideInfo(m_mode, m_currentGuide);
-	}
-}
-
-
-void RulerGesture::mouseReleaseEvent(QMouseEvent* m)
-{
-	m->accept();
-	if (m_view->moveTimerElapsed())
-	{
-		movePoint(m, true);
-		if (m_mode == ORIGIN)
-			m_view->setNewRulerOrigin(m);
-		else
-		{
-			if (m_ScMW->doc->guidesPrefs().guidesShown)
-				m_ScMW->guidePalette->setupPage();
-		}
-	}
-	m_haveGuide = false;
-	//#9391: Force redraw to get the guide drawn if we draw a guide in an edit mode
-	if (m_ScMW->doc->appMode != modeNormal)
-		m_canvas->setForcedRedraw(true);
-	m_canvas->repaint();
-	m_view->stopGesture();
-	m_mousePoint=QPoint(0,0);
-	if (m_ScMW->doc->guidesPrefs().guidesShown)
-		emit guideInfo(m_mode, m_currentGuide);
-}
-
-
-void RulerGesture::mousePressEvent(QMouseEvent* m)
-{
-	m->accept();
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	m_view->registerMousePress(m->globalPos());
-	if (mouseHitsGuide(mousePointDoc))
-	{
-		m_xy = m->globalPos() - (m_canvas->mapToParent(QPoint(0, 0)) + m_canvas->parentWidget()->mapToGlobal(QPoint(0, 0)));
-	}
-	if (m_ScMW->doc->guidesPrefs().guidesShown)
-		emit guideInfo(m_mode, m_currentGuide);
-}
-
+/*
+ For general Scribus (>=1.3.2) copyright and licensing information please refer
+ to the COPYING file provided with the program. Following this notice may exist
+ a copyright and/or license notice that predates the release of Scribus 1.3.2
+ for which a new license (GPL+exception) is in place.
+ */
+/***************************************************************************
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+***************************************************************************/
+
+#include "canvasgesture_rulermove.h"
+
+#include <QEvent>
+#include <QMouseEvent>
+#include <QPainter>
+
+#include "appmodes.h"
+#include "guidemanagercore.h"
+#include "scribus.h"
+#include "scribusdoc.h"
+#include "scribusview.h"
+#include "ui/guidemanager.h"
+#include "iconmanager.h"
+
+
+RulerGesture::RulerGesture(ScribusView *view, RulerGesture::Mode mode) :
+	CanvasGesture(view),
+	m_ScMW(m_view->m_ScMW),
+	m_mode(mode),
+	m_haveGuide(false),
+	m_page(0),
+	m_guide(0.0),
+	m_currentGuide(0.0),
+	m_haveCursor(false),
+	m_xy(0,0),
+	m_mousePoint(0,0)
+{
+}
+
+
+void RulerGesture::drawControls(QPainter* p)
+{
+	int page = -1;
+	//This is !null where we've entered the RulerGesture::mouseMoveEvent
+	if (!m_mousePoint.isNull())
+		page = m_doc->OnPage(m_mousePoint.x(), m_mousePoint.y());
+	if (page == -1)
+		return;
+	ScPage* dragToPage=m_doc->Pages->at(page);
+	if (!dragToPage)
+		return;
+	if (m_haveGuide)
+		dragToPage = m_doc->Pages->at(m_page);
+	QColor color(m_doc->guidesPrefs().guideColor);
+	p->save();
+	QPoint pageOrigin = m_canvas->canvasToLocal(QPointF(dragToPage->xOffset(), dragToPage->yOffset()));
+	QSize pageSize = (QSizeF(dragToPage->width(), dragToPage->height()) * m_canvas->scale()).toSize();
+	switch (m_mode)
+	{
+		case HORIZONTAL:
+			p->setPen(QPen(color, 1.0, Qt::DashDotLine, Qt::FlatCap, Qt::MiterJoin));
+			p->drawLine(QPoint(pageOrigin.x(), m_xy.y()), QPoint(pageOrigin.x() + pageSize.width(), m_xy.y()));
+			break;
+		case VERTICAL:
+			p->setPen(QPen(color, 1.0, Qt::DashDotLine, Qt::FlatCap, Qt::MiterJoin));
+			p->drawLine(QPoint(m_xy.x(), pageOrigin.y()), QPoint(m_xy.x(), pageOrigin.y() + pageSize.height()));
+			break;
+		case ORIGIN:
+			p->setPen(QPen(color, 1.0, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin));
+			p->drawLine(QPoint(m_xy.x(), 0), QPoint(m_xy.x(), m_canvas->height()));
+			p->drawLine(QPoint(0, m_xy.y()), QPoint(m_canvas->width(), m_xy.y()));
+			break;
+	}
+	p->restore();
+}
+
+
+void RulerGesture::clear()
+{
+	m_haveGuide = false;
+}
+
+
+void RulerGesture::prepare(Mode mode)
+{
+	m_haveGuide = false;
+	m_mode = mode;
+}
+
+
+void RulerGesture::activate(bool fromGesture)
+{
+	m_haveCursor = (qApp->overrideCursor() != nullptr);
+	if ( (!fromGesture) && qApp->overrideCursor())
+	{
+		m_haveCursor = true;
+		m_cursor = *(qApp->overrideCursor());
+	}
+	else
+	{
+		m_haveCursor = false;
+	}
+	switch (m_mode)
+	{
+		case HORIZONTAL:
+			qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
+			break;
+		case VERTICAL:
+			qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
+			break;
+		case ORIGIN:
+			qApp->changeOverrideCursor(QCursor(Qt::CrossCursor));
+			break;
+	}
+	emit guideInfo(m_mode, m_guide);
+}
+
+void RulerGesture::deactivate(bool)
+{
+	if (m_haveCursor)
+		qApp->changeOverrideCursor(m_cursor);
+	m_haveGuide = false;
+}
+
+
+bool RulerGesture::mouseHitsGuide(const FPoint& mousePointDoc)
+{
+	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
+	if ((m_doc->guidesPrefs().guidesShown) && (!m_doc->GuideLock) && page >= 0)
+	{
+		double grabRadScale = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
+		int index = m_doc->Pages->at(page)->guides.isMouseOnVertical(mousePointDoc.x() + grabRadScale, mousePointDoc.x() - grabRadScale, GuideManagerCore::Standard);
+		if (index >= 0)
+		{
+			m_mode = VERTICAL;
+			m_haveGuide = true;
+			m_guide = m_doc->Pages->at(page)->guides.vertical(index, GuideManagerCore::Standard);
+			m_currentGuide = m_guide;
+			m_page = page;
+			return true;
+		}
+		index = m_doc->Pages->at(page)->guides.isMouseOnHorizontal(mousePointDoc.y() + grabRadScale, mousePointDoc.y() - grabRadScale, GuideManagerCore::Standard);
+		if (index >= 0)
+		{
+			m_mode = HORIZONTAL;
+			m_haveGuide = true;
+			m_guide = m_doc->Pages->at(page)->guides.horizontal(index, GuideManagerCore::Standard);
+			m_currentGuide = m_guide;
+			m_page = page;
+			return true;
+		}
+	}
+	m_haveGuide = false;
+	return false;
+}
+
+void RulerGesture::mouseSelectGuide(QMouseEvent *m)
+{
+	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
+	if ((m_doc->guidesPrefs().guidesShown) && page >= 0)
+	{
+		double grabRadScale = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
+		int index = m_doc->Pages->at(page)->guides.isMouseOnVertical(mousePointDoc.x() + grabRadScale, mousePointDoc.x() - grabRadScale, GuideManagerCore::Standard);
+		if (index >= 0)
+		{
+			emit guideInfo(VERTICAL, m_doc->Pages->at(page)->guides.vertical(index, GuideManagerCore::Standard));
+			return;
+		}
+		index = m_doc->Pages->at(page)->guides.isMouseOnHorizontal(mousePointDoc.y() + grabRadScale, mousePointDoc.y() - grabRadScale, GuideManagerCore::Standard);
+		if (index >= 0)
+		{
+			emit guideInfo(HORIZONTAL, m_doc->Pages->at(page)->guides.horizontal(index, GuideManagerCore::Standard));
+			return;
+		}
+	}
+}
+
+void RulerGesture::movePoint(QMouseEvent* m, bool mouseRelease)
+{
+	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
+	QRect  viewport(m_view->viewport()->mapToGlobal(QPoint(0,0)), QSize(m_view->visibleWidth(), m_view->visibleHeight()));
+	QPoint newMousePoint = m->globalPos() - (m_canvas->mapToParent(QPoint(0, 0)) + m_canvas->parentWidget()->mapToGlobal(QPoint(0, 0)));
+	double x = mousePointDoc.x();
+	double y = mousePointDoc.y();
+	switch (m_mode)
+	{
+		case ORIGIN:
+			m_canvas->repaint();
+			m_canvas->displayCorrectedXYHUD(m->globalPos(), x, y);
+			break;
+		case HORIZONTAL:
+			if (!m_ScMW->doc->guidesPrefs().guidesShown)
+				break;
+			m_canvas->update(0, m_xy.y() - 2, m_canvas->width(), 4);
+			
+			if ((page >= 0) && (viewport.contains(m->globalPos())))
+			{
+				ScPage* currentPage = m_doc->Pages->at(page);
+				if (m_doc->SnapElement)
+				{
+					double xout = 0;
+					double yout = 0;
+					int GxM = -1, GyM = -1;
+					m_doc->getClosestElementBorder(x, y, &xout, &yout, &GxM, &GyM, currentPage, ScribusDoc::IncludeSelection);
+					if (GyM != -1)
+					{
+						y = yout + currentPage->yOffset();
+						newMousePoint = m_canvas->canvasToLocal(QPointF(x, y));
+					}
+				}
+				if (!m_haveGuide)
+				{
+					qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
+					if (mouseRelease)
+					{
+						currentPage->guides.addHorizontal(y - currentPage->yOffset(), GuideManagerCore::Standard);
+						m_guide = y - currentPage->yOffset();
+						m_page  = page;
+						m_haveGuide = true;
+						m_doc->changed();
+					}
+				}
+				else if (mouseRelease)
+				{
+					if (page == m_page)
+						currentPage->guides.moveHorizontal(m_guide, y - currentPage->yOffset(), GuideManagerCore::Standard);
+					else
+					{
+						m_doc->Pages->at(m_page)->guides.deleteHorizontal(m_guide, GuideManagerCore::Standard);
+						currentPage->guides.addHorizontal(y - currentPage->yOffset(), GuideManagerCore::Standard);
+						m_page = page;
+					}
+					if (m_doc->currentPage() != m_doc->Pages->at(m_page))
+						m_doc->setCurrentPage( m_doc->Pages->at(m_page) );
+					m_doc->changed();
+				}
+				else
+				{
+					QCursor* cursor = qApp->overrideCursor();
+					if (cursor && (cursor->shape() != Qt::SplitVCursor))
+						qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
+				}
+				m_currentGuide = y - currentPage->yOffset();
+			}
+			else
+			{ 
+				if (m_haveGuide)
+				{
+					qApp->changeOverrideCursor(IconManager::instance().loadCursor("DelPoint.png"));
+					if (mouseRelease)
+					{
+						m_doc->Pages->at(m_page)->guides.deleteHorizontal( m_guide, GuideManagerCore::Standard);
+						m_haveGuide = false;
+						m_doc->changed();
+					}
+				}
+			}
+			m_canvas->update(0, newMousePoint.y() - 2, m_canvas->width(), 4);
+			m_canvas->displayCorrectedSingleHUD(m->globalPos(), y, false);
+			break;
+		case VERTICAL:
+			if (!m_ScMW->doc->guidesPrefs().guidesShown)
+				break;
+			m_canvas->update(m_xy.x() - 2, 0, 4, m_canvas->height());
+			if ((page >= 0) && viewport.contains(m->globalPos()))
+			{
+				ScPage* currentPage = m_doc->Pages->at(page);
+				if (m_doc->SnapElement)
+				{
+					double xout = 0;
+					double yout = 0;
+					int GxM = -1, GyM = -1;
+					m_doc->getClosestElementBorder(x, y, &xout, &yout, &GxM, &GyM, currentPage, ScribusDoc::IncludeSelection);
+					if (GxM != -1)
+					{
+						x = xout + currentPage->xOffset();
+						newMousePoint = m_canvas->canvasToLocal(QPointF(x, y));
+					}
+				}
+				if (!m_haveGuide)
+				{
+					qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
+					if (mouseRelease)
+					{
+						currentPage->guides.addVertical(x - currentPage->xOffset(), GuideManagerCore::Standard);
+						m_guide = x - currentPage->xOffset();
+						m_page  = page;
+						m_haveGuide = true;
+						m_doc->changed();
+					}
+				}
+				else if (mouseRelease)
+				{
+					if (page == m_page)
+						currentPage->guides.moveVertical(m_guide, x - currentPage->xOffset(), GuideManagerCore::Standard);
+					else
+					{
+						m_doc->Pages->at(m_page)->guides.deleteVertical(m_guide, GuideManagerCore::Standard);
+						currentPage->guides.addVertical(x - currentPage->xOffset(), GuideManagerCore::Standard);
+						m_page = page;
+					}
+					if (m_doc->currentPage() != m_doc->Pages->at(m_page))
+						m_doc->setCurrentPage( m_doc->Pages->at(m_page) );
+					m_doc->changed();
+				}
+				else
+				{
+					QCursor* cursor = qApp->overrideCursor();
+					if (cursor && (cursor->shape() != Qt::SplitHCursor))
+						qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
+				}
+				m_currentGuide = x - currentPage->xOffset();
+			}
+			else
+			{ 
+				if (m_haveGuide)
+				{
+					qApp->changeOverrideCursor(IconManager::instance().loadCursor("DelPoint.png"));
+					if (mouseRelease)
+					{
+						m_doc->Pages->at(m_page)->guides.deleteVertical( m_guide, GuideManagerCore::Standard);
+						m_haveGuide = false;
+						m_doc->changed();
+					}
+				}
+			}
+			m_canvas->update(newMousePoint.x() - 2, 0, 4, m_canvas->height());
+			m_canvas->displayCorrectedSingleHUD(m->globalPos(), x, true);
+			break;
+	}
+	m_xy = newMousePoint;
+}
+
+
+void RulerGesture::mouseMoveEvent(QMouseEvent* m)
+{
+	m_mousePoint=m_canvas->globalToCanvas(m->globalPos());
+	m->accept();
+	if (m_view->moveTimerElapsed())
+	{
+		movePoint(m, false);
+		if (m_ScMW->doc->guidesPrefs().guidesShown)
+			emit guideInfo(m_mode, m_currentGuide);
+	}
+}
+
+
+void RulerGesture::mouseReleaseEvent(QMouseEvent* m)
+{
+	m->accept();
+	if (m_view->moveTimerElapsed())
+	{
+		movePoint(m, true);
+		if (m_mode == ORIGIN)
+			m_view->setNewRulerOrigin(m);
+		else
+		{
+			if (m_ScMW->doc->guidesPrefs().guidesShown)
+				m_ScMW->guidePalette->setupPage();
+		}
+	}
+	m_haveGuide = false;
+	//#9391: Force redraw to get the guide drawn if we draw a guide in an edit mode
+	if (m_ScMW->doc->appMode != modeNormal)
+		m_canvas->setForcedRedraw(true);
+	m_canvas->repaint();
+	m_view->stopGesture();
+	m_mousePoint=QPoint(0,0);
+	if (m_ScMW->doc->guidesPrefs().guidesShown)
+		emit guideInfo(m_mode, m_currentGuide);
+}
+
+
+void RulerGesture::mousePressEvent(QMouseEvent* m)
+{
+	m->accept();
+	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+	m_view->registerMousePress(m->globalPos());
+	if (mouseHitsGuide(mousePointDoc))
+	{
+		m_xy = m->globalPos() - (m_canvas->mapToParent(QPoint(0, 0)) + m_canvas->parentWidget()->mapToGlobal(QPoint(0, 0)));
+	}
+	if (m_ScMW->doc->guidesPrefs().guidesShown)
+		emit guideInfo(m_mode, m_currentGuide);
+}
+

Modified: trunk/Scribus/scribus/scribusdoc.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23152&path=/trunk/Scribus/scribus/scribusdoc.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.cpp	(original)
+++ trunk/Scribus/scribus/scribusdoc.cpp	Fri Aug 23 11:45:10 2019
@@ -13834,63 +13834,67 @@
 	}
 }
 
-void ScribusDoc::getClosestElementBorder(double xin, double yin, double *xout, double *yout, int *GxM, int *GyM, ScPage* refPage)
+void ScribusDoc::getClosestElementBorder(double xin, double yin, double *xout, double *yout, int *GxM, int *GyM, ScPage* refPage, SelectionSkipBehavior behavior)
 {
 	*GxM = -1;
 	*GyM = -1;
 	ScPage* page = (refPage == nullptr) ? currentPage() : refPage;
 	QMap<double, uint> tmpGuidesSel;
-	double viewScale=m_View->scale();
+	double viewScale = m_View->scale();
 	QList<PageItem*> item = getAllItems(*Items);
 	PageItem *parentI = nullptr;
 	if (m_Selection->count() > 0)
 		parentI = m_Selection->itemAt(0)->Parent;
-	for (int i=0;i<item.size();i++)
-	{
-		if (m_Selection->containsItem(item.at(i)) || item.at(i)->OwnPage != OnPage(xin,yin))
+	for (int i = 0; i < item.size(); ++i)
+	{
+		if ((behavior == ExcludeSelection) && m_Selection->containsItem(item.at(i)))
+			continue;
+		if (item.at(i)->OwnPage != OnPage(xin, yin))
 			continue;
 		if (item.at(i)->Parent != parentI)
 			continue;
 		if (fabs(item.at(i)->visualYPos() - yin) < (prefsData().guidesPrefs.guideRad / viewScale))
-			tmpGuidesSel.insert(fabs(item.at(i)->visualYPos() - yin), i*3);
+			tmpGuidesSel.insert(fabs(item.at(i)->visualYPos() - yin), i * 3);
 		else if (fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight() - yin) < (prefsData().guidesPrefs.guideRad / viewScale))
-			tmpGuidesSel.insert(fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight() - yin), i*3+1);
-		else if (fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight()/2 - yin) < (prefsData().guidesPrefs.guideRad / viewScale))
-			tmpGuidesSel.insert(fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight()/2 - yin), i*3+2);
+			tmpGuidesSel.insert(fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight() - yin), i * 3 + 1);
+		else if (fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight() / 2 - yin) < (prefsData().guidesPrefs.guideRad / viewScale))
+			tmpGuidesSel.insert(fabs(item.at(i)->visualYPos() + item.at(i)->visualHeight() / 2 - yin), i * 3 + 2);
 	}
 	if (tmpGuidesSel.count() != 0)
 	{
 		*GyM = tmpGuidesSel.begin().value();
-		if (*GyM%3==0)
-			*yout = item.at(*GyM/3)->visualYPos() - page->yOffset();
-		else if (*GyM%3==1)
-			*yout = item.at(*GyM/3)->visualYPos() + item.at(*GyM/3)->visualHeight() -page->yOffset();
-		else if (*GyM%3==2)
-			*yout = item.at(*GyM/3)->visualYPos() + item.at(*GyM/3)->visualHeight()/2 -page->yOffset();
+		if (*GyM % 3 == 0)
+			*yout = item.at(*GyM / 3)->visualYPos() - page->yOffset();
+		else if (*GyM %3 == 1)
+			*yout = item.at(*GyM / 3)->visualYPos() + item.at(*GyM / 3)->visualHeight() -page->yOffset();
+		else if (*GyM %3 == 2)
+			*yout = item.at(*GyM / 3)->visualYPos() + item.at(*GyM / 3)->visualHeight() / 2 -page->yOffset();
 	}
 	tmpGuidesSel.clear();
-	for (int i=0;i<item.size();i++)
-	{
-		if (m_Selection->containsItem(item.at(i)) || item.at(i)->OwnPage != OnPage(xin,yin))
+	for (int i = 0; i < item.size(); ++i)
+	{
+		if ((behavior == ExcludeSelection) && m_Selection->containsItem(item.at(i)))
+			continue;
+		if (item.at(i)->OwnPage != OnPage(xin, yin))
 			continue;
 		if (item.at(i)->Parent != parentI)
 			continue;
 		if (fabs(item.at(i)->visualXPos() - xin) < (prefsData().guidesPrefs.guideRad / viewScale))
-			tmpGuidesSel.insert(fabs(item.at(i)->visualXPos() - xin), i*3);
+			tmpGuidesSel.insert(fabs(item.at(i)->visualXPos() - xin), i * 3);
 		else if (fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth() - xin) < (prefsData().guidesPrefs.guideRad / viewScale))
-			tmpGuidesSel.insert(fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth() - xin), i*3+1);
-		else if (fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth()/2 - xin) < (prefsData().guidesPrefs.guideRad / viewScale))
-			tmpGuidesSel.insert(fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth()/2 - xin), i*3+2);
+			tmpGuidesSel.insert(fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth() - xin), i * 3 + 1);
+		else if (fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth() / 2 - xin) < (prefsData().guidesPrefs.guideRad / viewScale))
+			tmpGuidesSel.insert(fabs(item.at(i)->visualXPos() + item.at(i)->visualWidth()/2 - xin), i * 3 + 2);
 	}
 	if (tmpGuidesSel.count() != 0)
 	{
 		*GxM = tmpGuidesSel.begin().value();
-		if (*GxM%3==0)
-			*xout = item.at(*GxM/3)->visualXPos() -page->xOffset();
-		else if (*GxM%3==1)
-			*xout = item.at(*GxM/3)->visualXPos() + item.at(*GxM/3)->visualWidth() -page->xOffset();
-		else if (*GxM%3==2)
-			*xout = item.at(*GxM/3)->visualXPos() + item.at(*GxM/3)->visualWidth()/2 -page->xOffset();
+		if (*GxM % 3 == 0)
+			*xout = item.at(*GxM / 3)->visualXPos() - page->xOffset();
+		else if (*GxM %3 == 1)
+			*xout = item.at(*GxM / 3)->visualXPos() + item.at(*GxM / 3)->visualWidth() - page->xOffset();
+		else if (*GxM %3 == 2)
+			*xout = item.at(*GxM / 3)->visualXPos() + item.at(*GxM / 3)->visualWidth() / 2 -page->xOffset();
 	}
 }
 
@@ -13964,7 +13968,7 @@
 		if (!elementSnap)
 			getClosestGuides(*x, *y, &xout, &yout, &GxM, &GyM, page);
 		else
-			getClosestElementBorder(*x, *y, &xout, &yout, &GxM, &GyM, page);
+			getClosestElementBorder(*x, *y, &xout, &yout, &GxM, &GyM, page, ExcludeSelection);
 		if (GxM != -1)
 		{
 			*x = xout+page->xOffset();

Modified: trunk/Scribus/scribus/scribusdoc.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23152&path=/trunk/Scribus/scribus/scribusdoc.h
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.h	(original)
+++ trunk/Scribus/scribus/scribusdoc.h	Fri Aug 23 11:45:10 2019
@@ -1167,10 +1167,18 @@
 	QRectF ApplyGridF(const QRectF& in);
 	/*! \brief Does this doc have any TOC setups and potentially a TOC to generate */
 	bool hasTOCSetup() { return !m_docPrefsData.tocPrefs.defaultToCSetups.empty(); }
+
+	enum SelectionSkipBehavior
+	{
+		IncludeSelection = 0,
+		ExcludeSelection = 1
+	};
+
 	//! \brief Get the closest guide to the given point
 	void getClosestGuides(double xin, double yin, double *xout, double *yout, int *GxM, int *GyM, ScPage* refPage = nullptr);
 	//! \brief Get the closest border of another element to the given point
-	void getClosestElementBorder(double xin, double yin, double *xout, double *yout, int *GxM, int *GyM, ScPage* refPage = nullptr);
+	void getClosestElementBorder(double xin, double yin, double *xout, double *yout, int *GxM, int *GyM, ScPage* refPage = nullptr, SelectionSkipBehavior behavior = IncludeSelection);
+
 	//! \brief Snap an item to the guides
 	void SnapToGuides(PageItem *currItem);
 	bool ApplyGuides(double *x, double *y, bool elementSnap = false);




More information about the scribus-commit mailing list