From c36f903f0c4e89818f98c1694a3e4614f57222c4 Mon Sep 17 00:00:00 2001
From: Aleksei Kanash <sc.kanash.aleksei@gmail.com>
Date: Thu, 26 Jul 2012 17:23:21 +0300
Subject: [PATCH] Small boarder for possibility to move item and select it
 without rubber band added. Audio items cannot be resized in vertical
 dimension because there are no useful content.

Audio and Video items has minimal dimensions.
---
 src/domain/UBGraphicsDelegateFrame.cpp     | 33 +++++++++++----------
 src/domain/UBGraphicsDelegateFrame.h       |  2 +-
 src/domain/UBGraphicsMediaItem.cpp         | 14 ++++++---
 src/domain/UBGraphicsMediaItem.h           | 34 +++++++++++++++-------
 src/domain/UBGraphicsMediaItemDelegate.cpp | 27 ++++++++++-------
 src/domain/UBGraphicsProxyWidget.cpp       | 26 +++++++++++++++--
 6 files changed, 93 insertions(+), 43 deletions(-)

diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp
index 5d26595b..031999b3 100644
--- a/src/domain/UBGraphicsDelegateFrame.cpp
+++ b/src/domain/UBGraphicsDelegateFrame.cpp
@@ -359,7 +359,7 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
             }
         }
     }
-    else if (mOperationMode == Resizing)
+    else if (mOperationMode == Resizing || mOperationMode == ResizingHorizontally)
     {
         mTranslateX = moveX;
         UBResizableGraphicsItem* resizableItem = dynamic_cast<UBResizableGraphicsItem*>(delegated());
@@ -675,19 +675,22 @@ void UBGraphicsDelegateFrame::positionHandles()
 
     QVariant vLocked = delegated()->data(UBGraphicsItemData::ItemLocked);
     bool isLocked = (vLocked.isValid() && vLocked.toBool());
-
-    mBottomRightResizeGripSvgItem->setVisible(!isLocked);
-    mBottomResizeGripSvgItem->setVisible(!isLocked);
-    mLeftResizeGripSvgItem->setVisible(!isLocked);
-    mRightResizeGripSvgItem->setVisible(!isLocked);
-    mTopResizeGripSvgItem->setVisible(!isLocked);
+    bool bShowHorizontalResizers = ResizingHorizontally == mOperationMode;
+    bool bShowVerticalResizers   = ResizingHorizontally != mOperationMode;
+    bool bShowAllResizers        = Resizing == mOperationMode || Scaling == mOperationMode ;
+
+    mBottomRightResizeGripSvgItem->setVisible(!isLocked && bShowAllResizers);
+    mBottomResizeGripSvgItem->setVisible(!isLocked && (bShowVerticalResizers || bShowAllResizers));
+    mLeftResizeGripSvgItem->setVisible(!isLocked && (bShowHorizontalResizers || bShowAllResizers));
+    mRightResizeGripSvgItem->setVisible(!isLocked && (bShowHorizontalResizers || bShowAllResizers));
+    mTopResizeGripSvgItem->setVisible(!isLocked && (bShowVerticalResizers || bShowAllResizers));
     mRotateButton->setVisible(mDelegate->canRotate() && !isLocked);
 
-    mBottomRightResizeGrip->setVisible(!isLocked);
-    mBottomResizeGrip->setVisible(!isLocked);
-    mLeftResizeGrip->setVisible(!isLocked);
-    mRightResizeGrip->setVisible(!isLocked);
-    mTopResizeGrip->setVisible(!isLocked);
+    mBottomRightResizeGrip->setVisible(!isLocked && bShowAllResizers);
+    mBottomResizeGrip->setVisible(!isLocked && (bShowVerticalResizers || bShowAllResizers));
+    mLeftResizeGrip->setVisible(!isLocked && (bShowHorizontalResizers || bShowAllResizers));
+    mRightResizeGrip->setVisible(!isLocked && (bShowHorizontalResizers || bShowAllResizers));
+    mTopResizeGrip->setVisible(!isLocked && (bShowVerticalResizers || bShowAllResizers));
 
     if (isLocked)
     {
@@ -714,9 +717,9 @@ UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF
 {
     if(mDelegate->isLocked())
         return None;
-    else if (bottomRightResizeGripRect().contains(pos))
+    else if (bottomRightResizeGripRect().contains(pos) && ResizingHorizontally != mOperationMode)
         return ResizeBottomRight;
-    else if (bottomResizeGripRect().contains(pos)){
+    else if (bottomResizeGripRect().contains(pos) && ResizingHorizontally != mOperationMode){
             if(mMirrorY){
                 return ResizeTop;
             }else{
@@ -738,7 +741,7 @@ UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF
                 return ResizeRight;
             }
         }
-    else if (topResizeGripRect().contains(pos)){
+    else if (topResizeGripRect().contains(pos) && ResizingHorizontally != mOperationMode){
             if(mMirrorY){
                 return ResizeBottom;
             }else{
diff --git a/src/domain/UBGraphicsDelegateFrame.h b/src/domain/UBGraphicsDelegateFrame.h
index c8e5b37d..8ffac3e7 100644
--- a/src/domain/UBGraphicsDelegateFrame.h
+++ b/src/domain/UBGraphicsDelegateFrame.h
@@ -46,7 +46,7 @@ class UBGraphicsDelegateFrame: public QGraphicsRectItem, public QObject
 
                 virtual void setAntiScale(qreal pAntiScale);
 
-        enum OperationMode {Scaling, Resizing};
+        enum OperationMode {Scaling, Resizing, ResizingHorizontally};
         void setOperationMode(OperationMode pMode) {mOperationMode = pMode;}
         bool isResizing(){return mResizing;}
 
diff --git a/src/domain/UBGraphicsMediaItem.cpp b/src/domain/UBGraphicsMediaItem.cpp
index 382e01a8..4339426e 100644
--- a/src/domain/UBGraphicsMediaItem.cpp
+++ b/src/domain/UBGraphicsMediaItem.cpp
@@ -56,6 +56,7 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte
 
         if(mVideoWidget->sizeHint() == QSize(1,1)){
             mVideoWidget->resize(320,240);
+            mVideoWidget->setMinimumSize(131,26);
         }
         setWidget(mVideoWidget);
         haveLinkedImage = true;
@@ -67,8 +68,10 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte
         mAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
 
         mMediaObject->setTickInterval(1000);
-        mAudioWidget = new QWidget();
-        mAudioWidget->resize(320,26);
+        mAudioWidget = new UBGraphicsMediaItem::UBAudioPresentationWidget();
+        int borderSize = dynamic_cast<UBGraphicsMediaItem::UBAudioPresentationWidget*>(mAudioWidget)->borderSize();
+        mAudioWidget->resize(320+2*borderSize,26+2*borderSize);
+        mAudioWidget->setMinimumSize(147,26+2*borderSize);
         setWidget(mAudioWidget);
         haveLinkedImage = false;
     }
@@ -82,7 +85,10 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte
     itemDelegate->init();
     setDelegate(itemDelegate);
 
-    mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::Resizing);
+    if (mediaType_Audio == mMediaType)
+        mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::ResizingHorizontally);
+    else
+        mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::Resizing);
 
     setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly
 
@@ -284,4 +290,4 @@ void UBGraphicsMediaItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 
     event->accept();
 
-}
+}
\ No newline at end of file
diff --git a/src/domain/UBGraphicsMediaItem.h b/src/domain/UBGraphicsMediaItem.h
index abf73015..889f6e04 100644
--- a/src/domain/UBGraphicsMediaItem.h
+++ b/src/domain/UBGraphicsMediaItem.h
@@ -27,6 +27,29 @@ class UBGraphicsMediaItem : public UBGraphicsProxyWidget
 {
     Q_OBJECT
 
+public:
+    class UBAudioPresentationWidget : public QWidget
+    {
+        public:
+            UBAudioPresentationWidget::UBAudioPresentationWidget(QWidget *parent = NULL)
+                :QWidget(parent)
+                , mBorderSize(7)
+            {}
+
+            int borderSize(){return mBorderSize;}
+
+        private:
+            virtual void paintEvent(QPaintEvent *event)
+            {
+                QPainter painter(this);
+                painter.fillRect(rect(), QBrush(Qt::black));
+
+                QWidget::paintEvent(event);
+            }
+
+        int mBorderSize;
+    };
+
 public:
     typedef enum{
         mediaType_Video,
@@ -118,15 +141,6 @@ private:
     QPointF mMouseMovePos;
 
     bool haveLinkedImage;
-    QGraphicsPixmapItem *mLinkedImage;
+    QGraphicsPixmapItem *mLinkedImage;    
 };
-
-
-class UBGraphicsUnitedMediaItem : public UBGraphicsMediaItem 
-{
-public:
-    UBGraphicsUnitedMediaItem(const QUrl& pMediaFileUrl, QGraphicsItem *parent = 0);
-
-};
-
 #endif // UBGRAPHICSMEDIAITEM_H
diff --git a/src/domain/UBGraphicsMediaItemDelegate.cpp b/src/domain/UBGraphicsMediaItemDelegate.cpp
index ba31b6b0..5be79c44 100644
--- a/src/domain/UBGraphicsMediaItemDelegate.cpp
+++ b/src/domain/UBGraphicsMediaItemDelegate.cpp
@@ -18,6 +18,7 @@
 
 #include "UBGraphicsMediaItem.h"
 #include "UBGraphicsMediaItemDelegate.h"
+#include "UBGraphicsDelegateFrame.h"
 
 #include "UBGraphicsScene.h"
 
@@ -125,19 +126,25 @@ void UBGraphicsMediaItemDelegate::positionHandles()
     UBGraphicsMediaItem *mediaItem = dynamic_cast<UBGraphicsMediaItem*>(mDelegated);
     if (mediaItem)
     {
-        if (mediaItem->getMediaType() != UBGraphicsMediaItem::mediaType_Audio)
-        {
-            mToolBarItem->setPos(0, delegated()->boundingRect().height()-mToolBarItem->rect().height()*AntiScaleRatio);
-            mToolBarItem->setScale(AntiScaleRatio);
-            QRectF toolBarRect = mToolBarItem->rect();
-            toolBarRect.setWidth(delegated()->boundingRect().width()/AntiScaleRatio);
-            mToolBarItem->setRect(toolBarRect);           
-        }
-        else
+       
+        mToolBarItem->setPos(0, delegated()->boundingRect().height()-mToolBarItem->rect().height()*AntiScaleRatio);
+        mToolBarItem->setScale(AntiScaleRatio);
+        QRectF toolBarRect = mToolBarItem->rect();
+        toolBarRect.setWidth(delegated()->boundingRect().width()/AntiScaleRatio);
+
+        if (mediaItem->getMediaType() == UBGraphicsMediaItem::mediaType_Audio)
         {
-            mToolBarItem->setPos(0, 0);
+            int borderSize = 0;
+            UBGraphicsMediaItem::UBAudioPresentationWidget *audioWidget = dynamic_cast<UBGraphicsMediaItem::UBAudioPresentationWidget*>(delegated()->widget());
+            if (audioWidget)
+                borderSize = audioWidget->borderSize();
+
+            toolBarRect.setWidth(delegated()->boundingRect().width()/AntiScaleRatio-2*borderSize);
+            mToolBarItem->setPos(borderSize,borderSize);
             mToolBarItem->show();
         }
+
+        mToolBarItem->setRect(toolBarRect);
     }
 
     int mediaItemWidth = mToolBarItem->boundingRect().width();
diff --git a/src/domain/UBGraphicsProxyWidget.cpp b/src/domain/UBGraphicsProxyWidget.cpp
index 91238efd..25617250 100644
--- a/src/domain/UBGraphicsProxyWidget.cpp
+++ b/src/domain/UBGraphicsProxyWidget.cpp
@@ -153,10 +153,30 @@ void UBGraphicsProxyWidget::resize(const QSizeF & pSize)
 {
     if (pSize != size())
     {
-        QGraphicsProxyWidget::setMaximumSize(pSize.width(), pSize.height());
-        QGraphicsProxyWidget::resize(pSize.width(), pSize.height());
+        qreal sizeX = 0;
+        qreal sizeY = 0;
+
+        if (widget())
+        {
+            
+            QSizeF minimumItemSize(widget()->minimumSize());
+            if (minimumItemSize.width() > pSize.width())
+                sizeX = minimumItemSize.width();
+            else
+                sizeX = pSize.width();
+
+            if (minimumItemSize.height() > pSize.height())
+                sizeY = minimumItemSize.height();
+            else
+                sizeY = pSize.height();
+        }
+        QSizeF size(sizeX, sizeY);
+
+
+        QGraphicsProxyWidget::setMaximumSize(size.width(), size.height());
+        QGraphicsProxyWidget::resize(size.width(), size.height());
         if (widget())
-            widget()->resize(pSize.width(), pSize.height());
+            widget()->resize(size.width(), size.height());
         if (mDelegate)
             mDelegate->positionHandles();
         if (scene())