diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp index 9470d2dd..7d1d1033 100644 --- a/src/board/UBBoardView.cpp +++ b/src/board/UBBoardView.cpp @@ -52,6 +52,11 @@ #include "board/UBBoardController.h" #include "board/UBBoardPaletteManager.h" +#ifdef Q_WS_MAC +#include "core/UBApplicationController.h" +#include "desktop/UBDesktopAnnotationController.h" +#endif + #include "domain/UBGraphicsTextItem.h" #include "domain/UBGraphicsPixmapItem.h" #include "domain/UBGraphicsWidgetItem.h" @@ -379,6 +384,17 @@ void UBBoardView::tabletEvent (QTabletEvent * event) bool acceptEvent = true; +#ifdef Q_WS_MAC + //Work around #1388. After selecting annotation tool in desktop mode, annotation view appears on top when + //using Mac OS X. In this case tablet event should send mouse event so as to let user interact with + //stylus palette. + Q_ASSERT(UBApplication::applicationController->uninotesController()); + if (UBApplication::applicationController->uninotesController()->drawingView() == this) { + if (UBApplication::applicationController->uninotesController()->desktopPalettePath().contains(event->pos())) { + acceptEvent = false; + } + } +#endif switch (event->type ()) { case QEvent::TabletPress: { @@ -1161,7 +1177,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) movingItem = NULL; } else - if (movingItem && !isCppTool(movingItem)) + if (movingItem && (!isCppTool(movingItem) || UBGraphicsCurtainItem::Type == movingItem->type())) { if (suspendedMousePressEvent) { diff --git a/src/desktop/UBDesktopAnnotationController.cpp b/src/desktop/UBDesktopAnnotationController.cpp index 39c474ec..0bb9ff00 100644 --- a/src/desktop/UBDesktopAnnotationController.cpp +++ b/src/desktop/UBDesktopAnnotationController.cpp @@ -42,6 +42,7 @@ #include "board/UBBoardPaletteManager.h" #include "domain/UBGraphicsScene.h" +#include "domain/UBGraphicsPolygonItem.h" #include "UBCustomCaptureWindow.h" #include "UBWindowCapture.h" @@ -179,6 +180,25 @@ UBDesktopPalette* UBDesktopAnnotationController::desktopPalette() return mDesktopPalette; } +QPainterPath UBDesktopAnnotationController::desktopPalettePath() const +{ + QPainterPath result; + if (mDesktopPalette && mDesktopPalette->isVisible()) { + result.addRect(mDesktopPalette->geometry()); + } + if (mDesktopPenPalette && mDesktopPenPalette->isVisible()) { + result.addRect(mDesktopPenPalette->geometry()); + } + if (mDesktopMarkerPalette && mDesktopMarkerPalette->isVisible()) { + result.addRect(mDesktopMarkerPalette->geometry()); + } + if (mDesktopEraserPalette && mDesktopEraserPalette->isVisible()) { + result.addRect(mDesktopEraserPalette->geometry()); + } + + return result; +} + /** * \brief Toggle the visibility of the pen associated palette * @param checked as the visibility state @@ -821,6 +841,7 @@ void UBDesktopAnnotationController::updateMask(bool bTransparent) // Here we have to generate a new mask This method is certainly resource // consuming but for the moment this is the only solution that I found. mMask = QPixmap(mTransparentDrawingView->width(), mTransparentDrawingView->height()); + mMask.fill(Qt::transparent); QPainter p; @@ -836,8 +857,8 @@ void UBDesktopAnnotationController::updateMask(bool bTransparent) } if(UBApplication::boardController->paletteManager()->mKeyboardPalette->isVisible()) { - p.drawRect(UBApplication::boardController->paletteManager()->mKeyboardPalette->geometry().x(), UBApplication::boardController->paletteManager()->mKeyboardPalette->geometry().y(), - UBApplication::boardController->paletteManager()->mKeyboardPalette->width(), UBApplication::boardController->paletteManager()->mKeyboardPalette->height()); + p.drawRect(UBApplication::boardController->paletteManager()->mKeyboardPalette->geometry().x(), UBApplication::boardController->paletteManager()->mKeyboardPalette->geometry().y(), + UBApplication::boardController->paletteManager()->mKeyboardPalette->width(), UBApplication::boardController->paletteManager()->mKeyboardPalette->height()); } if(UBApplication::boardController->paletteManager()->leftPalette()->isVisible()) @@ -897,7 +918,7 @@ void UBDesktopAnnotationController::updateMask(bool bTransparent) { QGraphicsItem* pCrntItem = allItems.at(i); - if(pCrntItem->isVisible()) + if(pCrntItem->isVisible() && pCrntItem->type() == UBGraphicsPolygonItem::Type) { QPainterPath crntPath = pCrntItem->shape(); QRectF rect = crntPath.boundingRect(); @@ -908,7 +929,7 @@ void UBDesktopAnnotationController::updateMask(bool bTransparent) annotationPainter.end(); - mTransparentDrawingView->setMask(mMask.createMaskFromColor(Qt::black)); + mTransparentDrawingView->setMask(mMask.mask()); } else { diff --git a/src/desktop/UBDesktopAnnotationController.h b/src/desktop/UBDesktopAnnotationController.h index 0c09c35f..3a92b1dc 100644 --- a/src/desktop/UBDesktopAnnotationController.h +++ b/src/desktop/UBDesktopAnnotationController.h @@ -61,6 +61,7 @@ class UBDesktopAnnotationController : public QObject void hideWindow(); UBDesktopPalette *desktopPalette(); + QPainterPath desktopPalettePath() const; UBBoardView *drawingView(); void TransparentWidgetResized();