/* * Copyright (C) 2012 Webdoc SA * * This file is part of Open-Sankoré. * * Open-Sankoré 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, version 3 of the License, * with a specific linking exception for the OpenSSL project's * "OpenSSL" library (or with modified versions of it that use the * same license as the "OpenSSL" library). * * Open-Sankoré 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Open-Sankoré. If not, see . */ #include "UBRubberBand.h" #include #include #include #ifdef Q_WS_MAC #include #endif #include "core/UBApplication.h" #include "board/UBBoardController.h" #include "board/UBBoardView.h" #include "core/memcheck.h" UBRubberBand::UBRubberBand(Shape s, QWidget * p) : QRubberBand(s, p) , mResizingMode(None) , mResizingBorderHeight(20) , mMouseIsPressed(false) , mLastPressedPoint(QPoint()) { customStyle = NULL; #ifdef Q_WS_WIN customStyle = new QWindowsXPStyle(); #elif defined(Q_WS_MAC) customStyle = new QMacStyle(); #elif defined(Q_WS_X11) customStyle = QStyleFactory::create("oxygen"); #endif if (customStyle) QRubberBand::setStyle(customStyle); setAttribute(Qt::WA_TransparentForMouseEvents, false); setMouseTracking(true); } UBRubberBand::~UBRubberBand() { if (customStyle) delete customStyle; } UBRubberBand::enm_resizingMode UBRubberBand::determineResizingMode(QPoint pos) { if (mMouseIsPressed) return mResizingMode; QRect resizerTop (mResizingBorderHeight , 0 , rect().width()-2*mResizingBorderHeight, mResizingBorderHeight ); QRect resizerBottom (mResizingBorderHeight , rect().height() - mResizingBorderHeight, rect().width()-2*mResizingBorderHeight, mResizingBorderHeight ); QRect resizerLeft (0 , mResizingBorderHeight , mResizingBorderHeight , rect().height() - 2*mResizingBorderHeight); QRect resizerRight (rect().width()-mResizingBorderHeight, mResizingBorderHeight , mResizingBorderHeight , rect().height() - 2*mResizingBorderHeight); QRect resizerTopLeft (0 , 0 , mResizingBorderHeight, mResizingBorderHeight); QRect resizerTopRight (rect().width()-mResizingBorderHeight, 0 , mResizingBorderHeight, mResizingBorderHeight); QRect resizerBottomLeft (0 , rect().height() - mResizingBorderHeight, mResizingBorderHeight, mResizingBorderHeight); QRect resizerBottomRight(rect().width()-mResizingBorderHeight, rect().height() - mResizingBorderHeight, mResizingBorderHeight, mResizingBorderHeight); enm_resizingMode resizingMode; QTransform cursorTransrofm; if (resizerTop.contains(pos)) { resizingMode = Top; cursorTransrofm.rotate(90); } else if (resizerBottom.contains(pos)) { resizingMode = Bottom; cursorTransrofm.rotate(90); } else if (resizerLeft.contains(pos)) { resizingMode = Left; } else if (resizerRight.contains(pos)) { resizingMode = Right; } else if (resizerTopLeft.contains(pos)) { resizingMode = TopLeft; cursorTransrofm.rotate(45); } else if (resizerTopRight.contains(pos)) { resizingMode = TopRight; cursorTransrofm.rotate(-45); } else if (resizerBottomLeft.contains(pos)) { resizingMode = BottomLeft; cursorTransrofm.rotate(-45); } else if (resizerBottomRight.contains(pos)) { resizingMode = BottomRight; cursorTransrofm.rotate(45); } else resizingMode = None; if (None != resizingMode) { QPixmap pix(":/images/cursors/resize.png"); QCursor resizeCursor = QCursor(pix.transformed(cursorTransrofm, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2); setCursor(resizeCursor); } else unsetCursor(); return resizingMode; } void UBRubberBand::mousePressEvent(QMouseEvent *event) { mResizingMode = determineResizingMode(event->pos()); mMouseIsPressed = true; mLastPressedPoint = event->pos(); mLastMousePos = event->pos(); if (None == mResizingMode) { UBApplication::boardController->controlView()->rubberItems(); setCursor(QCursor(Qt::SizeAllCursor)); } } void UBRubberBand::mouseMoveEvent(QMouseEvent *event) { determineResizingMode(event->pos()); if (mMouseIsPressed) { UBBoardView *view = UBApplication::boardController->controlView(); QRect currentGeometry = geometry(); QPoint pressPoint(event->pos()); QPoint pressPointGlobal(view->mapToGlobal(pressPoint)); QPoint prevPressPointGlobal(view->mapToGlobal(mLastPressedPoint)); QPoint movePointGlogal = (view->mapToGlobal(mLastMousePos)); QPoint topLeftResizeVector(pressPointGlobal - prevPressPointGlobal); QPoint rightBottomResizeVector(pressPointGlobal - movePointGlogal); bool bGeometryChange = true; switch(mResizingMode) { case None: { QPointF itemsMoveVector(view->mapToScene(pressPointGlobal) - view->mapToScene(prevPressPointGlobal)); move(pos()+pressPointGlobal - prevPressPointGlobal); view->moveRubberedItems(itemsMoveVector); bGeometryChange = false; break; } case Top: { currentGeometry.setY(currentGeometry.y()+topLeftResizeVector.y()); }break; case Bottom: { currentGeometry.setHeight(currentGeometry.height()+rightBottomResizeVector.y()); }break; case Left: { currentGeometry.setX(currentGeometry.x()+topLeftResizeVector.x()); }break; case Right: { currentGeometry.setWidth(currentGeometry.width()+rightBottomResizeVector.x()); }break; case TopLeft: { currentGeometry.setX(currentGeometry.x()+topLeftResizeVector.x()); currentGeometry.setY(currentGeometry.y()+topLeftResizeVector.y()); }break; case TopRight: { currentGeometry.setY(currentGeometry.y()+topLeftResizeVector.y()); currentGeometry.setWidth(currentGeometry.width()+rightBottomResizeVector.x()); } break; case BottomLeft: { currentGeometry.setX(currentGeometry.x()+topLeftResizeVector.x()); currentGeometry.setHeight(currentGeometry.height()+rightBottomResizeVector.y()); }break; case BottomRight: { currentGeometry.setWidth(currentGeometry.width()+rightBottomResizeVector.x()); currentGeometry.setHeight(currentGeometry.height()+rightBottomResizeVector.y()); }break; } if(bGeometryChange) { setGeometry(currentGeometry); } mLastMousePos = event->pos(); } QRubberBand::mouseMoveEvent(event); } void UBRubberBand::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); mMouseIsPressed = false; unsetCursor(); }