phoneuis/bubblemanager2/bubblecore/src/bubbleimagewidget.cpp
branchGCC_SURGE
changeset 51 f39ed5e045e0
parent 30 ebdbd102c78a
parent 46 bc5a64e5bc3c
--- a/phoneuis/bubblemanager2/bubblecore/src/bubbleimagewidget.cpp	Tue Jun 15 14:14:38 2010 +0100
+++ b/phoneuis/bubblemanager2/bubblecore/src/bubbleimagewidget.cpp	Thu Jul 22 16:33:21 2010 +0100
@@ -17,19 +17,27 @@
 */
 
 #include <QPainter>
+#include <QGraphicsSceneResizeEvent>
+#include <QDebug>
 #include <hbstyle.h>
 #include <hbiconitem.h>
 #include <hbstyleloader.h>
+#include <hbdeviceprofile.h>
 #include "bubbleimagemanager.h"
 #include "bubbleimagewidget.h"
 
+static const qreal BubbbleImageRounding = 1.5; // units
+
 BubbleImageWidget::BubbleImageWidget(
     BubbleImageManager& imageManager,
     QGraphicsItem* parent)
     : HbWidget(parent),
       mImageManager(imageManager),
-      mDefaultAvatar(0)
+      mDefaultAvatar(0),
+      mKeepSquareShape(0)
 {
+    setFlag(QGraphicsItem::ItemHasNoContents, false);
+
     // create avatar
     mDefaultAvatar = new HbIconItem(this);
     style()->setItemName( mDefaultAvatar, "default_avatar" );
@@ -39,8 +47,10 @@
     connect(&mImageManager, SIGNAL(pixmapReady(QString)),
             this, SLOT(imageLoaded(QString)));
 
-    HbStyleLoader::registerFilePath(":/bubbleimagewidget.css");
-    HbStyleLoader::registerFilePath(":/bubbleimagewidget.widgetml");
+    HbStyleLoader::registerFilePath(
+        QLatin1String(":/bubbleimagewidget.css"));
+    HbStyleLoader::registerFilePath(
+        QLatin1String(":/bubbleimagewidget.widgetml"));
 }
 
 BubbleImageWidget::~BubbleImageWidget()
@@ -50,13 +60,14 @@
 void BubbleImageWidget::setImage(const QString& name)
 {
     mImageName = name;
+    mUpdateCount = 0;
 
     if (!mImageName.isEmpty()) {
         mDefaultAvatar->setVisible(false);
         mDefaultAvatar->setIcon(HbIcon());
         mImageManager.loadImage(mImageName);
     } else {
-        mDefaultAvatar->setIconName("qtg_large_avatar");
+        mDefaultAvatar->setIconName(QLatin1String("qtg_large_avatar"));
         mDefaultAvatar->setVisible(true);
     }
 }
@@ -75,7 +86,7 @@
 {
     Q_UNUSED(option);
     Q_UNUSED(widget);
-    
+
     if (mImageName.isEmpty())
         return;
 
@@ -83,6 +94,8 @@
         mImageManager.pixmap(mImageName);
 
     if (pixmap) {
+        painter->save();
+
         // up or downscales images to fill image area
         QSize imageSize(pixmap->size());
         QSize sourceSize(rect().size().toSize());
@@ -95,6 +108,13 @@
         // qDebug() << "imageSize:" << imageSize;
         // qDebug() << "sourceRect:" << sourceRect;
         painter->setRenderHint(QPainter::SmoothPixmapTransform);
+        painter->setRenderHint(QPainter::Antialiasing);
+
+        QPainterPath clip;
+        qreal rounding = BubbbleImageRounding *
+                         HbDeviceProfile::profile(this).unitValue();
+        clip.addRoundedRect(rect(), rounding, rounding);
+        painter->setClipPath(clip);
 
 #ifdef __WINS__
         // sourceRect crashes emulator, RC ou1cimx1#320113
@@ -102,6 +122,68 @@
 #else        
         painter->drawPixmap(rect().toRect(),*pixmap,sourceRect);
 #endif        
-        
+        painter->restore();
+    }
+}
+
+QSizeF BubbleImageWidget::sizeHint(
+    Qt::SizeHint which,
+    const QSizeF & constraint) const
+{
+    Q_UNUSED(which);
+    Q_UNUSED(constraint);
+
+    if (mKeepSquareShape && which==Qt::PreferredSize ) {
+        QSizeF hint(size().height(), size().height());
+        if (hint.isNull()) {
+            hint = QSizeF(100,100);
+        }
+
+        // workaround, sometimes last resize event is missing
+        if ((size().width()!=size().height()) && (mUpdateCount<10)) {
+            BubbleImageWidget* mutableThis = const_cast<BubbleImageWidget*>(this);
+            mutableThis->updateGeometry();
+            mutableThis->mUpdateCount++; // prevent looping
+        }
+
+        // qDebug() << "size hint: " << hint;
+        return hint;
+    } else {
+        return HbWidget::sizeHint(which,constraint);
     }
 }
+
+void BubbleImageWidget::resizeEvent(QGraphicsSceneResizeEvent * event)
+{
+    // qDebug() << "size:" << event->newSize();
+    if ( event->newSize().height()!= event->oldSize().height() &&
+         event->newSize().height() > 1 ) {
+        updateGeometry();
+    }
+
+    HbWidget::resizeEvent(event);
+}
+
+bool BubbleImageWidget::keepSquareShape() const
+{
+    return mKeepSquareShape;
+}
+
+void BubbleImageWidget::setKeepSquareShape(bool keepSquare)
+{
+    mKeepSquareShape = keepSquare;
+
+    if (mKeepSquareShape) {
+        setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+    } else {
+        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    }
+
+    updateGeometry();
+}
+
+
+
+
+
+