aboutsummaryrefslogtreecommitdiff
path: root/src/views
diff options
context:
space:
mode:
Diffstat (limited to 'src/views')
-rw-r--r--src/views/mimagewidgetview.cpp244
-rw-r--r--src/views/mimagewidgetview.h3
-rw-r--r--src/views/mimagewidgetview_p.h64
3 files changed, 221 insertions, 90 deletions
diff --git a/src/views/mimagewidgetview.cpp b/src/views/mimagewidgetview.cpp
index 4ba442e6..b780ced1 100644
--- a/src/views/mimagewidgetview.cpp
+++ b/src/views/mimagewidgetview.cpp
@@ -18,6 +18,7 @@
****************************************************************************/
#include "mimagewidgetview.h"
+#include "mimagewidgetview_p.h"
#include <QPixmap>
@@ -26,17 +27,15 @@
#include "mviewcreator.h"
#include "private/mwidgetview_p.h"
-class MImageWidgetViewPrivate : public MWidgetViewPrivate
-{
-public:
- MImageWidgetViewPrivate();
- ~MImageWidgetViewPrivate();
-
- MImageWidget *controller;
-};
-
MImageWidgetViewPrivate::MImageWidgetViewPrivate()
- : controller(0)
+ : controller(NULL),
+ cachedPixmapSize(0, 0),
+ borderOpacity(1.0),
+ brush(Qt::transparent),
+ leftBorder(0.0),
+ topBorder(0.0),
+ rightBorder(0.0),
+ bottomBorder(0.0)
{
}
@@ -44,45 +43,53 @@ MImageWidgetViewPrivate::~MImageWidgetViewPrivate()
{
}
-MImageWidgetView::MImageWidgetView(MImageWidget *controller) :
- MWidgetView(* new MImageWidgetViewPrivate, controller)
+void MImageWidgetViewPrivate::calculateDrawRect(const QSizeF &imageSize)
{
- Q_D(MImageWidgetView);
- d->controller = controller;
-}
+ Q_Q(MImageWidgetView);
-MImageWidgetView::MImageWidgetView(MImageWidgetViewPrivate &dd, MImageWidget *controller) :
- MWidgetView(dd, controller)
-{
- Q_D(MImageWidgetView);
- d->controller = controller;
-}
+ // no image, return
+ if (imageSize.isEmpty())
+ return;
-MImageWidgetView::~MImageWidgetView()
-{
-}
+ // get target size, bounded by widget size
+ QSizeF widgetSize = q->size();
+ QSizeF targetSize = widgetSize;
+ QSizeF t;
-void MImageWidgetView::drawContents(QPainter *painter, const QStyleOptionGraphicsItem *option) const
-{
- Q_UNUSED(option);
+ // get the image display size
+ qreal fx, fy;
+ controller->zoomFactor(&fx, &fy);
- Q_D(const MImageWidgetView);
+ t.setWidth(imageSize.width()*fx);
+ t.setHeight(imageSize.height()*fy);
- // no image, return
- QSizeF imageSize = d->controller->d_func()->imageDataSize();
- if (imageSize.isEmpty()) return;
+ // limited by target size
+ t = targetSize.boundedTo(t);
+
+ // calculate the rectangle of draw
+ qreal dx = (widgetSize.width() - t.width()) / 2.0;
+ qreal dy = (widgetSize.height() - t.height()) / 2.0;
- // the source image section size will be used finally
+ // calculate draw rect
+ drawRect.setRect(dx, dy, t.width(), t.height());
+}
+
+QSizeF MImageWidgetViewPrivate::calculateSourceSize(const QSizeF &imageSize)
+{
QSizeF sourceSize = imageSize;
+ QSizeF targetSize = controller->size();
+
+ // protection codes
+ if (sourceSize.width() < 1.0)
+ sourceSize.setWidth(1.0);
+ if (sourceSize.height() < 1.0)
+ sourceSize.setHeight(1.0);
- // get target size, bounded by widget size
- QSizeF widgetSize = size();
- QSizeF targetSize = widgetSize;
QSizeF t;
// get the image display size
qreal fx, fy;
- d->controller->zoomFactor(&fx, &fy);
+ controller->zoomFactor(&fx, &fy);
t.setWidth(imageSize.width()*fx);
t.setHeight(imageSize.height()*fy);
@@ -98,57 +105,55 @@ void MImageWidgetView::drawContents(QPainter *painter, const QStyleOptionGraphic
sourceSize.setHeight(qRound(value * targetSize.height() / t.height()));
}
- // limited by target size
- t = targetSize.boundedTo(t);
-
- // protection codes
- if (sourceSize.width() < 1.0)
- sourceSize.setWidth(1.0);
- if (sourceSize.height() < 1.0)
- sourceSize.setHeight(1.0);
-
- // get values from controller
- const QPixmap *pixmap = d->controller->pixmap();
+ return sourceSize;
+}
- qreal leftBorder = style()->borderLeft();
- qreal topBorder = style()->borderTop();
- qreal rightBorder = style()->borderRight();
- qreal bottomBorder = style()->borderBottom();
+void MImageWidgetViewPrivate::calculateSourceRect(const QSizeF &imageSize)
+{
+ QPointF topLeft = controller->crop().topLeft();
+ QSizeF originalSize = controller->imageSize();
+ QSizeF sourceSize = calculateSourceSize(imageSize);
- qreal w = leftBorder + rightBorder;
- qreal h = topBorder + bottomBorder;
+ if (topLeft == QPointF(-1.0, -1.0)) {
+ // calculate default crop section
+ qreal dx = (originalSize.width() - sourceSize.width()) / 2.0;
+ qreal dy = (originalSize.height() - sourceSize.height()) / 2.0;
- // calculate if need draw border
- // notice: no border on the cropped edge
- QSizeF originSize = pixmap->size();
+ sourceRect = QRectF(dx, dy, sourceSize.width(), sourceSize.height());
+ } else {
+ // calculate crop section by given topLeft corner
+ qreal dx = topLeft.x();
+ qreal dy = topLeft.y();
- if (originSize.width() > sourceSize.width())
- w = 0;
+ sourceRect = QRectF(dx, dy, qMin(dx + sourceSize.width(), originalSize.width()),
+ qMin(dy + sourceSize.height(), originalSize.height()));
+ }
+}
- if (originSize.height() > sourceSize.height())
- h = 0;
+void MImageWidgetViewPrivate::checkPixmapSize()
+{
+ Q_Q(MImageWidgetView);
- // calculate the rectangle of draw
- qreal dx = (widgetSize.width() - t.width()) / 2.0;
- qreal dy = (widgetSize.height() - t.height()) / 2.0;
+ const QPixmap *pixmap = controller->pixmap();
+ if (pixmap->size() != cachedPixmapSize) {
+ cachedPixmapSize = pixmap->size();
+ q->updateGeometry();
+ }
+}
- // calculate draw rect
- QRectF drawRect, sourceRect, border;
- drawRect.setRect(dx, dy, t.width(), t.height());
+void MImageWidgetViewPrivate::drawBorders(QPainter *painter, const QRectF &drawRect) const
+{
+ qreal w = leftBorder + rightBorder;
+ qreal h = topBorder + bottomBorder;
- // draw borders outside of target
- // if both borders equals 0, do not draw border
if (w > 0 || h > 0) {
-
- QColor borderColor = style()->borderColor();
- qreal borderOpacity = style()->borderOpacity();
- QBrush brush(borderColor);
+ QRectF border;
qreal oldOpacity = painter->opacity();
painter->setOpacity(borderOpacity);
- dx = drawRect.x() - leftBorder;
- dy = drawRect.y() - topBorder;
+ qreal dx = drawRect.x() - leftBorder;
+ qreal dy = drawRect.y() - topBorder;
if (w > 0 && h == 0) {
// only have horizontal border
@@ -165,7 +170,6 @@ void MImageWidgetView::drawContents(QPainter *painter, const QStyleOptionGraphic
border = QRectF(drawRect.x(), drawRect.y() + drawRect.height(), drawRect.width(), bottomBorder);
painter->fillRect(border, brush);
} else {
-
// draw top border
border = QRectF(dx, dy, drawRect.width() + w, topBorder);
painter->fillRect(border, brush);
@@ -185,27 +189,56 @@ void MImageWidgetView::drawContents(QPainter *painter, const QStyleOptionGraphic
painter->setOpacity(oldOpacity);
}
- // draw image
- QPointF topLeft = d->controller->crop().topLeft();
+}
- if (topLeft == QPointF(-1.0, -1.0)) {
+void MImageWidgetViewPrivate::applyStyle()
+{
+ Q_Q(MImageWidgetView);
- // calculate default crop section
- dx = (originSize.width() - sourceSize.width()) / 2.0;
- dy = (originSize.height() - sourceSize.height()) / 2.0;
+ borderOpacity = q->style()->borderOpacity();
+ brush.setColor(q->style()->borderColor());
- sourceRect = QRectF(dx, dy, sourceSize.width(), sourceSize.height());
- } else {
+ leftBorder = q->style()->borderLeft();
+ topBorder = q->style()->borderTop();
+ rightBorder = q->style()->borderRight();
+ bottomBorder = q->style()->borderBottom();
+}
- // calculate crop section by given topLeft corner
- dx = topLeft.x();
- dy = topLeft.y();
+MImageWidgetView::MImageWidgetView(MImageWidget *controller) :
+ MWidgetView(* new MImageWidgetViewPrivate, controller)
+{
+ Q_D(MImageWidgetView);
+ d->controller = controller;
+}
- sourceRect = QRectF(dx, dy, qMin(dx + sourceSize.width(), originSize.width()),
- qMin(dy + sourceSize.height(), originSize.height()));
- }
+MImageWidgetView::MImageWidgetView(MImageWidgetViewPrivate &dd, MImageWidget *controller) :
+ MWidgetView(dd, controller)
+{
+ Q_D(MImageWidgetView);
+ d->controller = controller;
+}
- painter->drawPixmap(drawRect, *pixmap, sourceRect);
+MImageWidgetView::~MImageWidgetView()
+{
+}
+
+void MImageWidgetView::drawContents(QPainter *painter, const QStyleOptionGraphicsItem *option) const
+{
+ Q_UNUSED(option);
+
+ Q_D(const MImageWidgetView);
+
+ const QPixmap *pixmap = d->controller->pixmap();
+
+ d->drawBorders(painter, d->drawRect);
+
+ if (pixmap) {
+ const_cast<MImageWidgetViewPrivate*>(d)->checkPixmapSize();
+ painter->drawPixmap(d->drawRect, *pixmap, d->sourceRect);
+ } else {
+ QImage image = d->controller->d_func()->image;
+ painter->drawImage(d->drawRect, image, d->sourceRect);
+ }
}
void MImageWidgetView::resizeEvent(QGraphicsSceneResizeEvent *event)
@@ -214,6 +247,37 @@ void MImageWidgetView::resizeEvent(QGraphicsSceneResizeEvent *event)
update();
}
+void MImageWidgetView::setGeometry(const QRectF &rect)
+{
+ Q_D(MImageWidgetView);
+ MWidgetView::setGeometry(rect);
+
+ QSizeF imageSize = d->controller->d_func()->imageDataSize();
+ d->calculateDrawRect(imageSize);
+ d->calculateSourceRect(imageSize);
+}
+
+void MImageWidgetView::applyStyle()
+{
+ Q_D(MImageWidgetView);
+ MWidgetView::applyStyle();
+
+ d->applyStyle();
+}
+
+void MImageWidgetView::updateData(const QList<const char *> &modifications)
+{
+ MWidgetView::updateData(modifications);
+
+ const char *member;
+ for (int i = 0; i < modifications.count(); i++) {
+ member = modifications[i];
+ if (member == MImageWidgetModel::ZoomFactorX || member == MImageWidgetModel::ZoomFactorY || member == MImageWidgetModel::Crop) {
+ updateGeometry();
+ }
+ }
+}
+
QSizeF MImageWidgetView::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
Q_D(const MImageWidgetView);
diff --git a/src/views/mimagewidgetview.h b/src/views/mimagewidgetview.h
index 0f1d0040..fd4c80e0 100644
--- a/src/views/mimagewidgetview.h
+++ b/src/views/mimagewidgetview.h
@@ -72,6 +72,9 @@ protected:
//! \reimp
virtual void drawContents(QPainter *painter, const QStyleOptionGraphicsItem *option) const;
virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
+ virtual void setGeometry(const QRectF &rect);
+ virtual void applyStyle();
+ virtual void updateData(const QList<const char *> &modifications);
//! \reimp_end
//! \internal
diff --git a/src/views/mimagewidgetview_p.h b/src/views/mimagewidgetview_p.h
new file mode 100644
index 00000000..569643b4
--- /dev/null
+++ b/src/views/mimagewidgetview_p.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (directui@nokia.com)
+**
+** This file is part of libmeegotouch.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at directui@nokia.com.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation
+** and appearing in the file LICENSE.LGPL included in the packaging
+** of this file.
+**
+****************************************************************************/
+
+#ifndef MIMAGEWIDGETVIEW_P_H
+#define MIMAGEWIDGETVIEW_P_H
+
+#include "private/mwidgetview_p.h"
+
+class MImageWidget;
+
+class MImageWidgetViewPrivate : public MWidgetViewPrivate
+{
+public:
+ MImageWidgetViewPrivate();
+ ~MImageWidgetViewPrivate();
+
+ void calculateDrawRect(const QSizeF &imageSize);
+ QSizeF calculateSourceSize(const QSizeF &imageSize);
+ void calculateSourceRect(const QSizeF &imageSize);
+
+ void checkPixmapSize();
+
+ void drawBorders(QPainter *painter, const QRectF &drawRect) const;
+
+ void applyStyle();
+
+
+ QRectF drawRect;
+ QRectF sourceRect;
+
+private:
+ Q_DECLARE_PUBLIC(MImageWidgetView)
+ MImageWidget *controller;
+
+ QSize cachedPixmapSize;
+
+ //border related
+ qreal borderOpacity;
+ QBrush brush;
+
+ qreal leftBorder;
+ qreal topBorder;
+ qreal rightBorder;
+ qreal bottomBorder;
+};
+
+
+#endif // MIMAGEWIDGETVIEW_P_H