diff options
Diffstat (limited to 'lib/kofficeui/KoGuides.cpp')
-rw-r--r-- | lib/kofficeui/KoGuides.cpp | 926 |
1 files changed, 926 insertions, 0 deletions
diff --git a/lib/kofficeui/KoGuides.cpp b/lib/kofficeui/KoGuides.cpp new file mode 100644 index 000000000..f6d375f6a --- /dev/null +++ b/lib/kofficeui/KoGuides.cpp @@ -0,0 +1,926 @@ +// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- +/* This file is part of the KDE project + Copyright (C) 2005 Thorsten Zachmann <zachmann@kde.org> + Copyright (C) 2005 Casper Boemann Rasmussen <cbr@boemann.dk> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "KoGuides.h" + +#include <qcursor.h> +#include <qpainter.h> +#include <qpixmap.h> + +#include <klocale.h> +#include <kpopupmenu.h> + +#include <KoDocument.h> +#include <KoPoint.h> +#include <KoRect.h> +#include <KoView.h> +#include <KoZoomHandler.h> + +#include "KoGuideLineDia.h" + +class KoGuides::Popup : public KPopupMenu +{ +public: + Popup( KoGuides * guides ) + { + m_title = insertTitle( i18n( "Guide Line" ) ); + m_delete = insertItem( i18n( "&Delete" ), guides, SLOT( slotRemove() ) ); + m_seperator = insertSeparator(); + m_pos = insertItem( i18n( "&Set Position..." ), guides, SLOT( slotChangePosition() ) ); + } + + void update( int count ) + { + if ( count == 1 ) + { + changeTitle( m_title, i18n( "Guide Line" ) ); + setItemVisible( m_seperator, true ); + setItemVisible( m_pos, true ); + } + else + { + changeTitle( m_title, i18n( "Guide Lines" ) ); + setItemVisible( m_seperator, false ); + setItemVisible( m_pos, false ); + } + } +private: + int m_title; + int m_delete; + int m_seperator; + int m_pos; +}; + +const KoGuides::SnapStatus KoGuides::SNAP_NONE = 0; +const KoGuides::SnapStatus KoGuides::SNAP_HORIZ = 1; +const KoGuides::SnapStatus KoGuides::SNAP_VERT = 2; +const KoGuides::SnapStatus KoGuides::SNAP_BOTH = 3; + +KoGuides::KoGuides( KoView *view, KoZoomHandler *zoomHandler ) +: m_view( view ) +, m_zoomHandler( zoomHandler ) +{ + m_popup = new Popup( this ); + m_mouseSelected = false; +} + + +KoGuides::~KoGuides() +{ + delete m_popup; +} + + +void KoGuides::paintGuides( QPainter &painter ) +{ + //painter.setRasterOp( NotROP ); + const KoPageLayout& pl = m_view->koDocument()->pageLayout(); + int width = QMAX( m_view->canvas()->width(), m_zoomHandler->zoomItX( pl.ptWidth ) ); + int height = QMAX( m_view->canvas()->height(), m_zoomHandler->zoomItY( pl.ptHeight ) ); + + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( !( *it )->automatic || ( *it )->snapping ) // dont paint autoStyle guides when they are not snapping + { + if ( ( *it )->snapping ) + painter.setPen( QPen( green, 0, DotLine ) ); + else if ( ( *it )->selected ) + painter.setPen( QPen( red, 0, DotLine ) ); + else + painter.setPen( QPen( blue, 0, DotLine ) ); + + painter.save(); + if ( ( *it )->orientation == Qt::Vertical ) + { + painter.translate( m_zoomHandler->zoomItX( ( *it )->position ), 0 ); + painter.drawLine( 0, 0, 0, height ); + } + else + { + painter.translate( 0, m_zoomHandler->zoomItY( ( *it )->position ) ); + painter.drawLine( 0, 0, width, 0 ); + } + painter.restore(); + } + } + } +} + +bool KoGuides::mousePressEvent( QMouseEvent *e ) +{ + bool eventProcessed = true; + bool changed = false; + m_mouseSelected = false; + + KoPoint p( mapFromScreen( e->pos() ) ); + KoGuideLine * guideLine = find( p, m_zoomHandler->unzoomItY( 2 ) ); + if ( guideLine ) + { + m_lastPoint = e->pos(); + if ( e->button() == Qt::LeftButton || e->button() == Qt::RightButton ) + { + if ( e->button() == Qt::LeftButton ) + { + m_mouseSelected = true; + } + if ( e->state() & Qt::ControlButton ) + { + if ( guideLine->selected ) + { + unselect( guideLine ); + m_mouseSelected = false; + } + else + { + select( guideLine ); + } + changed = true; + } + else if ( ! guideLine->selected ) + { + unselectAll(); + select( guideLine ); + changed = true; + } + } + } + else + { + if ( !( e->state() & Qt::ControlButton ) ) + { + changed = unselectAll(); + } + eventProcessed = false; + } + + if ( changed || hasSelected() ) + { + emit moveGuides( true ); + } + + if ( changed ) + { + paint(); + } + + if ( changed && ! hasSelected() ) + { + emit moveGuides( false ); + } + + if ( e->button() == Qt::RightButton && hasSelected() ) + { + m_popup->update( m_guideLines[GL_SELECTED].count() ); + m_popup->exec( QCursor::pos() ); + emit moveGuides( false ); + } + + return eventProcessed; +} + + +bool KoGuides::mouseMoveEvent( QMouseEvent *e ) +{ + bool eventProcessed = false; + if ( m_mouseSelected ) + { + QPoint p( e->pos() ); + p -= m_lastPoint; + m_lastPoint = e->pos(); + moveSelectedBy( p ); + paint(); + emit guideLinesChanged( m_view ); + eventProcessed = true; + } + else if ( e->state() == Qt::NoButton ) + { + KoPoint p( mapFromScreen( e->pos() ) ); + KoGuideLine * guideLine = find( p, m_zoomHandler->unzoomItY( 2 ) ); + if ( guideLine ) + { + m_view->canvas()->setCursor( guideLine->orientation == Qt::Vertical ? Qt::sizeHorCursor : Qt::sizeVerCursor ); + eventProcessed = true; + } + } + return eventProcessed; +} + + +bool KoGuides::mouseReleaseEvent( QMouseEvent *e ) +{ + bool eventProcessed = false; + if ( m_mouseSelected ) + { + KoPoint p( mapFromScreen( e->pos() ) ); + if ( m_guideLines[GL_SELECTED].count() == 1 ) + { + int x1, y1, x2, y2; + m_view->canvas()->rect().coords( &x1, &y1, &x2, &y2 ); + QPoint gp( m_view->canvas()->mapFromGlobal( e->globalPos() ) ); + if ( m_guideLines[GL_SELECTED].first()->orientation == Qt::Vertical ) + { + if ( gp.x() < x1 || gp.x() > x2 ) + removeSelected(); + } + else + { + if ( gp.y() < y1 || gp.y() > y2 ) + removeSelected(); + } + } + KoGuideLine * guideLine = find( p, m_zoomHandler->unzoomItY( 2 ) ); + if ( guideLine ) + { + m_view->canvas()->setCursor( guideLine->orientation == Qt::Vertical ? Qt::sizeHorCursor : Qt::sizeVerCursor ); + } + m_mouseSelected = false; + eventProcessed = true; + emit guideLinesChanged( m_view ); + } + emit moveGuides( false ); + return eventProcessed; +} + + +bool KoGuides::keyPressEvent( QKeyEvent *e ) +{ + bool eventProcessed = false; + switch( e->key() ) + { + case Qt::Key_Delete: + if ( hasSelected() ) + { + removeSelected(); + paint(); + emit guideLinesChanged( m_view ); + eventProcessed = true; + } + break; + default: + break; + } + return eventProcessed; +} + +void KoGuides::setGuideLines( const QValueList<double> &horizontalPos, const QValueList<double> &verticalPos ) +{ + removeSelected(); + + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL].begin(); + for ( ; it != m_guideLines[GL].end(); ++it ) + { + delete ( *it ); + } + m_guideLines[GL].clear(); + + QValueList<double>::ConstIterator posIt = horizontalPos.begin(); + for ( ; posIt != horizontalPos.end(); ++posIt ) + { + KoGuideLine *guideLine = new KoGuideLine( Qt::Horizontal, *posIt, false ); + m_guideLines[GL].append( guideLine ); + } + posIt = verticalPos.begin(); + for ( ; posIt != verticalPos.end(); ++posIt ) + { + KoGuideLine *guideLine = new KoGuideLine( Qt::Vertical, *posIt, false ); + m_guideLines[GL].append( guideLine ); + } + paint(); +} + +void KoGuides::setAutoGuideLines( const QValueList<double> &horizontalPos, const QValueList<double> &verticalPos ) +{ + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL_AUTOMATIC].begin(); + for ( ; it != m_guideLines[GL_AUTOMATIC].end(); ++it ) + { + delete ( *it ); + } + m_guideLines[GL_AUTOMATIC].clear(); + + QValueList<double>::ConstIterator posIt = horizontalPos.begin(); + for ( ; posIt != horizontalPos.end(); ++posIt ) + { + KoGuideLine *guideLine = new KoGuideLine( Qt::Horizontal, *posIt, true ); + m_guideLines[GL_AUTOMATIC].append( guideLine ); + } + posIt = verticalPos.begin(); + for ( ; posIt != verticalPos.end(); ++posIt ) + { + KoGuideLine *guideLine = new KoGuideLine( Qt::Vertical, *posIt, true ); + m_guideLines[GL_AUTOMATIC].append( guideLine ); + } +} + + +void KoGuides::getGuideLines( QValueList<double> &horizontalPos, QValueList<double> &verticalPos ) const +{ + horizontalPos.clear(); + verticalPos.clear(); + + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[GL].begin(); + for ( ; it != m_guideLines[GL].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal ) + { + horizontalPos.append( ( *it )->position ); + } + else + { + verticalPos.append( ( *it )->position ); + } + } + it = m_guideLines[GL_SELECTED].begin(); + for ( ; it != m_guideLines[GL_SELECTED].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal ) + { + horizontalPos.append( ( *it )->position ); + } + else + { + verticalPos.append( ( *it )->position ); + } + } +} + + +void KoGuides::snapToGuideLines( KoRect &rect, int snap, SnapStatus &snapStatus, KoPoint &diff ) +{ + if( !(snapStatus & SNAP_VERT)) + diff.setX(10000); + if( !(snapStatus & SNAP_HORIZ)) + diff.setY(10000); + + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal ) + { + double tmp = (*it)->position - rect.top(); + if ( snapStatus & SNAP_HORIZ || QABS( tmp ) < m_zoomHandler->unzoomItY( snap ) ) + { + if(QABS( tmp ) < QABS(diff.y())) + { + diff.setY( tmp ); + snapStatus |= SNAP_HORIZ; + } + } + tmp = (*it)->position - rect.bottom(); + if ( snapStatus & SNAP_HORIZ || QABS( tmp ) < m_zoomHandler->unzoomItY( snap ) ) + { + if(QABS( tmp ) < QABS(diff.y())) + { + diff.setY( tmp ); + snapStatus |= SNAP_HORIZ; + } + } + } + else + { + double tmp = (*it)->position - rect.left(); + if ( snapStatus & SNAP_VERT || QABS( tmp ) < m_zoomHandler->unzoomItX( snap ) ) + { + if(QABS( tmp ) < QABS(diff.x())) + { + diff.setX( tmp ); + snapStatus |= SNAP_VERT; + } + } + tmp = (*it)->position - rect.right(); + if ( snapStatus & SNAP_VERT || QABS( tmp ) < m_zoomHandler->unzoomItX( snap ) ) + { + if(QABS( tmp ) < QABS(diff.x())) + { + diff.setX( tmp ); + snapStatus |= SNAP_VERT; + } + } + } + } + } + + if(!(snapStatus & SNAP_VERT)) + diff.setX( 0 ); + + if(!(snapStatus & SNAP_HORIZ)) + diff.setY( 0 ); +} + +void KoGuides::snapToGuideLines( KoPoint &pos, int snap, SnapStatus &snapStatus, KoPoint &diff ) +{ + if( !(snapStatus & SNAP_VERT)) + diff.setX(10000); + if( !(snapStatus & SNAP_HORIZ)) + diff.setY(10000); + + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal ) + { + double tmp = (*it)->position - pos.y(); + if ( snapStatus & SNAP_HORIZ || QABS( tmp ) < m_zoomHandler->unzoomItY( snap ) ) + { + if(QABS( tmp ) < QABS(diff.y())) + { + diff.setY( tmp ); + snapStatus |= SNAP_HORIZ; + } + } + } + else + { + double tmp = (*it)->position - pos.x(); + if ( snapStatus & SNAP_VERT || QABS( tmp ) < m_zoomHandler->unzoomItX( snap ) ) + { + if(QABS( tmp ) < QABS(diff.x())) + { + diff.setX( tmp ); + snapStatus |= SNAP_VERT; + } + } + } + } + } + + if(!(snapStatus & SNAP_VERT)) + diff.setX( 0 ); + + if(!(snapStatus & SNAP_HORIZ)) + diff.setY( 0 ); +} + + +void KoGuides::repaintSnapping( const KoRect &snappedRect ) +{ + bool needRepaint = false; + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal ) + { + if ( virtuallyEqual( snappedRect.top(), (*it)->position ) + || virtuallyEqual( snappedRect.bottom(), ( *it )->position ) ) + { + if ( ! ( *it )->snapping ) + { + ( *it )->snapping = true; + needRepaint = true; + } + } + else if ( ( *it )->snapping ) + { + ( *it )->snapping = false; + needRepaint = true; + } + } + else + { + if ( virtuallyEqual( snappedRect.left(), (*it)->position ) + || virtuallyEqual( snappedRect.right(), ( *it )->position ) ) + { + if ( ! ( *it )->snapping ) + { + ( *it )->snapping = true; + needRepaint = true; + } + } + else if ( ( *it )->snapping ) + { + ( *it )->snapping = false; + needRepaint = true; + } + } + } + } + + if ( needRepaint ) + { + emit paintGuides( true ); + paint(); + emit paintGuides( false ); + } +} + + +void KoGuides::repaintSnapping( const KoPoint &snappedPoint, SnapStatus snapStatus ) +{ + bool needRepaint = false; + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal && ( snapStatus & SNAP_HORIZ ) ) + { + if( virtuallyEqual( snappedPoint.y(), (*it)->position ) ) + { + if ( ! ( *it )->snapping ) + { + ( *it )->snapping = true; + needRepaint = true; + } + } + else if ( ( *it )->snapping ) + { + ( *it )->snapping = false; + needRepaint = true; + } + } + else + { + if ( snapStatus & SNAP_VERT ) + { + if( virtuallyEqual( snappedPoint.x(), (*it)->position ) ) + { + if ( ! ( *it )->snapping ) + { + ( *it )->snapping = true; + needRepaint = true; + } + } + else if ( ( *it )->snapping ) + { + ( *it )->snapping = false; + needRepaint = true; + } + } + } + } + } + + if ( needRepaint ) + { + emit paintGuides( true ); + paint(); + emit paintGuides( false ); + } +} + + +void KoGuides::repaintAfterSnapping() +{ + bool needRepaint = false; + + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( ( *it )->snapping ) + { + needRepaint = true; + ( *it )->snapping = false; + } + } + } + + if ( needRepaint ) + { + emit paintGuides( true ); + paint(); + emit paintGuides( false ); + } +} + + +void KoGuides::diffNextGuide( KoRect &rect, KoPoint &diff ) +{ + for ( int i = 0; i < GL_END; ++i ) + { + QValueList<KoGuideLine *>::const_iterator it = m_guideLines[i].begin(); + for ( ; it != m_guideLines[i].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Horizontal ) + { + double moveyl = ( *it )->position - rect.top(); + double moveyr = ( *it )->position - rect.bottom(); + if ( diff.y() > 0 ) + { + if ( moveyl < diff.y() && moveyl > 1E-10 ) + { + diff.setY( moveyl ); + } + if ( moveyr < diff.y() && moveyr > 1E-10 ) + { + diff.setY( moveyr ); + } + } + else if ( diff.y() < 0 ) + { + if ( moveyl > diff.y() && moveyl < -1E-10 ) + { + diff.setY( moveyl ); + } + if ( moveyr > diff.y() && moveyr < -1E-10 ) + { + diff.setY( moveyr ); + } + } + } + else + { + double movexl = ( *it )->position - rect.left(); + double movexr = ( *it )->position - rect.right(); + if ( diff.x() > 0 ) + { + if ( movexl < diff.x() && movexl > 1E-10 ) + { + diff.setX( movexl ); + } + if ( ( movexr < diff.x() ) && movexr > 1E-10 ) + { + diff.setX( movexr ); + } + } + else if ( diff.x() < 0 ) + { + if ( movexl > diff.x() && movexl < -1E-10 ) + { + diff.setX( movexl ); + } + if ( movexr > diff.x() && movexr < -1E-10 ) + { + diff.setX( movexr ); + } + } + } + } + } +} + + +void KoGuides::moveGuide( const QPoint &pos, bool horizontal, int rulerWidth ) +{ + int x = pos.x() - rulerWidth; + int y = pos.y() - rulerWidth; + QPoint p( x, y ); + if ( !m_insertGuide ) + { + if ( ! horizontal && x > 0 ) + { + m_insertGuide = true; + add( Qt::Vertical, p ); + } + else if ( horizontal && y > 0 ) + { + m_insertGuide = true; + add( Qt::Horizontal, p ); + } + if ( m_insertGuide ) + { + QMouseEvent e( QEvent::MouseButtonPress, p, Qt::LeftButton, Qt::LeftButton ); + mousePressEvent( &e ); + } + } + else + { + QMouseEvent e( QEvent::MouseMove, p, Qt::NoButton, Qt::LeftButton ); + mouseMoveEvent( &e ); + } +} + + +void KoGuides::addGuide( const QPoint &pos, bool /* horizontal */, int rulerWidth ) +{ + int x = pos.x() - rulerWidth; + int y = pos.y() - rulerWidth; + QPoint p( x, y ); + m_insertGuide = false; + QMouseEvent e( QEvent::MouseButtonRelease, p, Qt::LeftButton, Qt::LeftButton ); + mouseReleaseEvent( &e ); +} + + +void KoGuides::slotChangePosition() +{ + KoPoint p( mapFromScreen( m_lastPoint ) ); + KoGuideLine * guideLine = find( p, m_zoomHandler->unzoomItY( 2 ) ); + + const KoPageLayout& pl = m_view->koDocument()->pageLayout(); + double max = 0.0; + if ( guideLine->orientation == Qt::Vertical ) + { + max = QMAX( pl.ptWidth, m_zoomHandler->unzoomItX( m_view->canvas()->size().width() + m_view->canvasXOffset() - 1 ) ); + } + else + { + max = QMAX( pl.ptHeight, m_zoomHandler->unzoomItY( m_view->canvas()->size().height() + m_view->canvasYOffset() - 1 ) ); + } + + KoGuideLineDia dia( 0, guideLine->position, 0.0, max, m_view->koDocument()->unit() ); + if ( dia.exec() == QDialog::Accepted ) + { + guideLine->position = dia.pos(); + paint(); + emit guideLinesChanged( m_view ); + } +} + + +void KoGuides::slotRemove() +{ + removeSelected(); + paint(); +} + + +void KoGuides::paint() +{ + m_view->canvas()->repaint( false ); +} + + +void KoGuides::add( Qt::Orientation o, QPoint &pos ) +{ + KoPoint p( mapFromScreen( pos ) ); + KoGuideLine *guideLine = new KoGuideLine( o, o == Qt::Vertical ? p.x(): p.y() ); + m_guideLines[GL].append( guideLine ); +} + + +void KoGuides::select( KoGuideLine *guideLine ) +{ + guideLine->selected = true; + if ( m_guideLines[GL].remove( guideLine ) == 1 ) + { + m_guideLines[GL_SELECTED].append( guideLine ); + } +} + + +void KoGuides::unselect( KoGuideLine *guideLine ) +{ + guideLine->selected = false; + if ( m_guideLines[GL_SELECTED].remove( guideLine ) == 1 ) + { + m_guideLines[GL].append( guideLine ); + } +} + + +bool KoGuides::unselectAll() +{ + bool selected = m_guideLines[GL_SELECTED].empty() == false; + + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL_SELECTED].begin(); + for ( ; it != m_guideLines[GL_SELECTED].end(); ++it ) + { + ( *it )->selected = false; + m_guideLines[GL].append( *it ); + } + m_guideLines[GL_SELECTED].clear(); + + return selected; +} + + +void KoGuides::removeSelected() +{ + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL_SELECTED].begin(); + for ( ; it != m_guideLines[GL_SELECTED].end(); ++it ) + { + delete ( *it ); + } + m_guideLines[GL_SELECTED].clear(); +} + + +bool KoGuides::hasSelected() +{ + return m_guideLines[GL_SELECTED].empty() == false; +} + + +KoGuides::KoGuideLine * KoGuides::find( KoPoint &p, double diff ) +{ + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL_SELECTED].begin(); + for ( ; it != m_guideLines[GL_SELECTED].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Vertical && QABS( ( *it )->position - p.x() ) < diff ) + { + return *it; + } + if ( ( *it )->orientation == Qt::Horizontal && QABS( ( *it )->position - p.y() ) < diff ) + { + return *it; + } + } + + it = m_guideLines[GL].begin(); + for ( ; it != m_guideLines[GL].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Vertical && QABS( ( *it )->position - p.x() ) < diff ) + { + return *it; + } + if ( ( *it )->orientation == Qt::Horizontal && QABS( ( *it )->position - p.y() ) < diff ) + { + return *it; + } + } + return 0; +} + + +void KoGuides::moveSelectedBy( QPoint &p ) +{ + KoPoint point( m_zoomHandler->unzoomPoint( p ) ); + if ( m_guideLines[GL_SELECTED].count() > 1 ) + { + const KoPageLayout& pl = m_view->koDocument()->pageLayout(); + double right = QMAX( pl.ptWidth, m_zoomHandler->unzoomItX( m_view->canvas()->width() + m_view->canvasXOffset() - 1 ) ); + double bottom = QMAX( pl.ptHeight, m_zoomHandler->unzoomItY( m_view->canvas()->height() + m_view->canvasYOffset() - 1 ) ); + + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL_SELECTED].begin(); + for ( ; it != m_guideLines[GL_SELECTED].end(); ++it ) + { + if ( ( *it )->orientation == Qt::Vertical ) + { + double tmp = ( *it )->position + point.x(); + if ( tmp < 0 ) + { + point.setX( point.x() - tmp ); + } + else if ( tmp > right ) + { + point.setX( point.x() - ( tmp - right ) ); + } + } + else + { + double tmp = ( *it )->position + point.y(); + if ( tmp < 0 ) + { + point.setY( point.y() - tmp ); + } + else if ( tmp > bottom ) + { + point.setY( point.y() - ( tmp - bottom ) ); + } + } + } + } + QValueList<KoGuideLine *>::iterator it = m_guideLines[GL_SELECTED].begin(); + for ( ; it != m_guideLines[GL_SELECTED].end(); ++it ) + { + ( *it )->snapping = false; + + if ( ( *it )->orientation == Qt::Vertical && p.x() != 0 ) + { + ( *it )->position = ( *it )->position + point.x(); + } + else if ( ( *it )->orientation == Qt::Horizontal && p.y() != 0 ) + { + ( *it )->position = ( *it )->position + point.y(); + } + } +} + + +KoPoint KoGuides::mapFromScreen( const QPoint & pos ) +{ + int x = pos.x() + m_view->canvasXOffset(); + int y = pos.y() + m_view->canvasYOffset(); + double xf = m_zoomHandler->unzoomItX( x ); + double yf = m_zoomHandler->unzoomItY( y ); + return KoPoint( xf, yf ); +} + + +QPoint KoGuides::mapToScreen( const KoPoint & pos ) +{ + int x = m_zoomHandler->zoomItX( pos.x() ) - m_view->canvasXOffset(); + int y = m_zoomHandler->zoomItY( pos.y() ) - m_view->canvasYOffset(); + return QPoint( x, y ); +} + + +#include "KoGuides.moc" |