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);


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to