--- 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();
+}
+
+
+
+
+
+