From 51cae6d538a24012ea0d1795bee1ed28149729e0 Mon Sep 17 00:00:00 2001 From: Mohammed Sameer Date: Tue, 11 Dec 2012 04:29:52 +0200 Subject: [PATCH] Reworked --- qml/PostCaptureImage.qml | 44 ------------------- qml/PostCaptureItem.qml | 37 +++++----------- qml/PostCapturePage.qml | 37 +++------------- qml/PostCaptureVideo.qml | 40 ----------------- src/quillitem.cpp | 92 +++++++++++++++++++--------------------- src/quillitem.h | 16 +++---- 6 files changed, 67 insertions(+), 199 deletions(-) delete mode 100644 qml/PostCaptureImage.qml delete mode 100644 qml/PostCaptureVideo.qml diff --git a/qml/PostCaptureImage.qml b/qml/PostCaptureImage.qml deleted file mode 100644 index f5c96c0..0000000 --- a/qml/PostCaptureImage.qml +++ /dev/null @@ -1,44 +0,0 @@ -// -*- qml -*- - -/*! - * This file is part of CameraPlus. - * - * Copyright (C) 2012 Mohammed Sameer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -import QtQuick 1.1 -import com.nokia.meego 1.1 -import CameraPlus 1.0 - -QuillItem { - id: item - source: url - mimeType: mimetype - - Component.onCompleted: console.log("Created " + url) - - function stop() { - // No-op - } - - MouseArea { - id: mouse - anchors.fill: parent - enabled: true - onClicked: toolBar.visible = !toolBar.visible - } -} diff --git a/qml/PostCaptureItem.qml b/qml/PostCaptureItem.qml index fec2165..3d63b4a 100644 --- a/qml/PostCaptureItem.qml +++ b/qml/PostCaptureItem.qml @@ -28,43 +28,28 @@ Item { id: item property bool isImage: mimetype.toLowerCase().search("video") < 0 property bool error: false - property bool currentItem: PathView.isCurrentItem - onCurrentItemChanged: { - if (currentItem) { - page.currentItem = item - } - } - - function stop() { - if (loader.item) { - loader.item.stop(); - } - } Label { anchors.fill: parent - visible: (loader.status == Loader.Error || item.error) && page.status == PageStatus.Active + visible: image.error && page.status == PageStatus.Active text: qsTr("Failed to load preview"); verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pixelSize: 32 } - Loader { - id: loader + QuillItem { + id: image anchors.fill: parent - source: isImage ? Qt.resolvedUrl("PostCaptureImage.qml") : Qt.resolvedUrl("PostCaptureVideo.qml") - } + visible: page.status == PageStatus.Activating || page.status == PageStatus.Active - Binding { - target: loader.item - value: page.status == PageStatus.Activating || page.status == PageStatus.Active - property: "visible" - } + Component.onCompleted: initialize(url, mimetype); - Binding { - target: item - value: loader.item ? loader.item.error : false - property: "error" + MouseArea { + id: mouse + anchors.fill: parent + enabled: true + onClicked: toolBar.visible = !toolBar.visible + } } } diff --git a/qml/PostCapturePage.qml b/qml/PostCapturePage.qml index 0a8b989..b6a672a 100644 --- a/qml/PostCapturePage.qml +++ b/qml/PostCapturePage.qml @@ -36,36 +36,9 @@ import CameraPlus 1.0 CameraPage { id: page - property Item currentItem: null - property Item previousItem: null - controlsVisible: false policyMode: CameraResources.PostCapture - needsPipeline: true - - onCurrentItemChanged: { - if (previousItem) { - previousItem.stop(); - } - - previousItem = currentItem - } - - onStatusChanged: { - if (status == PageStatus.Active) { - cam.stop(); - } - } - - Connections { - // Unlikely that we need this. - target: cam - onIdleChanged: { - if (cam.idle && page.status == PageStatus.Active) { - cam.stop(); - } - } - } + needsPipeline: false Rectangle { color: "black" @@ -83,16 +56,16 @@ CameraPage { anchors.fill: parent path: Path { - startX: 0 + startX: - view.width startY: view.height / 2 - PathLine { x: view.width; y: view.height / 2 } + PathLine { x: view.width * 2; y: view.height / 2 } } flickDeceleration: 999999 // Insanely high value to prevent panning multiple images preferredHighlightBegin: 0.5 preferredHighlightEnd: 0.5 highlightRangeMode: PathView.StrictlyEnforceRange - pathItemCount: 1 + pathItemCount: 3 model: SparqlListModel { // This is the exact query used by Harmattan gallery. @@ -125,7 +98,7 @@ CameraPage { anchors.bottom: parent.bottom tools: ToolBarLayout { id: layout - ToolIcon { iconId: "icon-m-toolbar-back"; onClicked: { page.stop(); pageStack.pop(); } } + ToolIcon { iconId: "icon-m-toolbar-back"; onClicked: { pageStack.pop(); } } } } diff --git a/qml/PostCaptureVideo.qml b/qml/PostCaptureVideo.qml deleted file mode 100644 index d010f53..0000000 --- a/qml/PostCaptureVideo.qml +++ /dev/null @@ -1,40 +0,0 @@ -// -*- qml -*- - -/*! - * This file is part of CameraPlus. - * - * Copyright (C) 2012 Mohammed Sameer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -import QtQuick 1.1 -import QtMultimediaKit 1.1 - -Video { - id: video - source: url - - Component.onCompleted: console.log("Created " + url) - onError: console.log("ERROR"); - - MouseArea { - anchors.fill: parent - onClicked: { - video.play() - console.log("DDDDDDDDDDDDDDDDDDDDD " + url) - } - } -} diff --git a/src/quillitem.cpp b/src/quillitem.cpp index be9667f..1a16e70 100644 --- a/src/quillitem.cpp +++ b/src/quillitem.cpp @@ -37,51 +37,9 @@ QuillItem::~QuillItem() { void QuillItem::componentComplete() { QDeclarativeItem::componentComplete(); - - recreate(); -} - -QUrl QuillItem::source() const { - return m_url; -} - -void QuillItem::setSource(const QUrl& src) { - if (src == source()) { - return; - } - - m_url = src; - - if (isComponentComplete()) { - recreate(); - } - - emit sourceChanged(); -} - -QString QuillItem::mimeType() const { - return m_type; -} - -void QuillItem::setMimeType(const QString& mime) { - if (mimeType() == mime) { - return; - } - - m_type = mime; - - if (isComponentComplete()) { - recreate(); - } - - emit mimeTypeChanged(); -} - -bool QuillItem::error() const { - return m_error; } -void QuillItem::recreate() { +void QuillItem::initialize(const QUrl& url, const QString& mimeType) { if (m_error) { m_error = false; emit errorChanged(); @@ -91,12 +49,12 @@ void QuillItem::recreate() { m_file->deleteLater(); } - m_file = new QuillFile(m_url.toLocalFile(), m_type); + m_file = new QuillFile(url.toLocalFile(), mimeType); QObject::connect(m_file, SIGNAL(error(QuillError)), - this, SLOT(fileError()), Qt::QueuedConnection); + this, SLOT(fileError()), Qt::QueuedConnection); QObject::connect(m_file, SIGNAL(imageAvailable(QuillImageList)), - this, SLOT(fileLoaded()), Qt::QueuedConnection); + this, SLOT(fileLoaded()), Qt::QueuedConnection); QObject::connect(m_file, SIGNAL(removed()), m_file, SLOT(deleteLater()), Qt::QueuedConnection); @@ -111,21 +69,41 @@ void QuillItem::recreate() { } } +bool QuillItem::error() const { + return m_error; +} + void QuillItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(widget); + QRectF rect = boundingRect(); + painter->fillRect(rect, Qt::black); + if (!m_file) { return; } - QImage image = m_file->image(0); + if (m_image.isNull()) { + return; + } - if (!image.isNull()) { - painter->drawImage(option->rect, image); + QPoint pos((rect.width() - m_image.width()) / 2, (rect.height() - m_image.height()) / 2); + if (!m_image.isNull()) { + painter->drawImage(pos, m_image); } } +void QuillItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) { + // TODO: rotation animation looks weird + QDeclarativeItem::geometryChanged(newGeometry, oldGeometry); + + m_image = QImage(); + + updateImage(); +} + void QuillItem::fileLoaded() { + updateImage(); update(); } @@ -142,6 +120,7 @@ bool QuillItem::fileError() { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QString, err.errorData())); + m_file->deleteLater(); m_file = 0; if (!m_error) { @@ -155,3 +134,18 @@ bool QuillItem::fileError() { return false; } + +void QuillItem::updateImage() { + if (!m_file) { + return; + } + + QImage image = m_file->image(0); + + if (image.isNull()) { + return; + } + + m_image = image.scaled(boundingRect().size().toSize(), + Qt::KeepAspectRatio, Qt::SmoothTransformation); +} diff --git a/src/quillitem.h b/src/quillitem.h index 5c3d586..25cdc3f 100644 --- a/src/quillitem.h +++ b/src/quillitem.h @@ -30,43 +30,43 @@ class QuillFile; class QuillItem : public QDeclarativeItem { Q_OBJECT - Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged); - Q_PROPERTY(QString mimeType READ mimeType WRITE setMimeType NOTIFY mimeTypeChanged); Q_PROPERTY(bool error READ error NOTIFY errorChanged); public: QuillItem(QDeclarativeItem *parent = 0); ~QuillItem(); - QUrl source() const; - void setSource(const QUrl& src); - - QString mimeType() const; - void setMimeType(const QString& mime); - void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); virtual void componentComplete(); bool error() const; +public slots: + void initialize(const QUrl& url, const QString& mimeType); + signals: void sourceChanged(); void error(const QString& err); void mimeTypeChanged(); void errorChanged(); +protected: + void geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry); + private slots: void fileLoaded(); bool fileError(); private: void recreate(); + void updateImage(); QuillFile *m_file; QUrl m_url; QString m_type; bool m_error; + QImage m_image; }; #endif /* QUILL_ITEM_H */ -- 2.25.1