6f17525b410b967b6df94b80e094cab897b356de
[harmattan/cameraplus] / src / quillitem.cpp
1 #include "quillitem.h"
2 #include <QuillFile>
3 #include <QUrl>
4 #include <QPainter>
5 #include <QStyleOptionGraphicsItem>
6 #include <QDir>
7
8 QuillItem::QuillItem(QDeclarativeItem *parent) :
9   QDeclarativeItem(parent), m_file(0), m_error(false) {
10
11   setFlag(QGraphicsItem::ItemHasNoContents, false);
12
13   static bool init = false;
14   if (!init) {
15     Quill::setPreviewLevelCount(1);
16     Quill::setPreviewSize(0, QSize(854, 480)); // TODO:
17     Quill::setMinimumPreviewSize(0, QSize(854, 480)); // TODO:
18     Quill::setThumbnailExtension("jpeg"); // TODO:
19     Quill::setThumbnailFlavorName(0, "screen");
20     Quill::setBackgroundRenderingColor(Qt::black);
21     QString tempPath(QDir::homePath() +  QDir::separator() + ".config" +
22                      QDir::separator() + "quill" + QDir::separator() + "tmp");
23     QDir().mkpath(tempPath);
24     Quill::setTemporaryFilePath(tempPath);
25     init = true;
26   }
27 }
28
29 QuillItem::~QuillItem() {
30   delete m_file; m_file = 0;
31 }
32
33 void QuillItem::componentComplete() {
34   QDeclarativeItem::componentComplete();
35
36   recreate();
37 }
38
39 QUrl QuillItem::source() const {
40   return m_url;
41 }
42
43 void QuillItem::setSource(const QUrl& src) {
44   if (src == source()) {
45     return;
46   }
47
48   m_url = src;
49
50   if (isComponentComplete()) {
51     recreate();
52   }
53
54   emit sourceChanged();
55 }
56
57 QString QuillItem::mimeType() const {
58   return m_type;
59 }
60
61 void QuillItem::setMimeType(const QString& mime) {
62   if (mimeType() == mime) {
63     return;
64   }
65
66   m_type = mime;
67
68   if (isComponentComplete()) {
69     recreate();
70   }
71
72   emit mimeTypeChanged();
73 }
74
75 bool QuillItem::error() const {
76   return m_error;
77 }
78
79 void QuillItem::recreate() {
80   if (m_error) {
81     m_error = false;
82     emit errorChanged();
83   }
84
85   if (m_file) {
86     m_file->deleteLater();
87   }
88
89   m_file = new QuillFile(m_url.toLocalFile(), m_type);
90
91   QObject::connect(m_file, SIGNAL(error(QuillError)),
92           this, SLOT(fileError()), Qt::QueuedConnection);
93   QObject::connect(m_file, SIGNAL(imageAvailable(QuillImageList)),
94           this, SLOT(fileLoaded()), Qt::QueuedConnection);
95   QObject::connect(m_file, SIGNAL(removed()),
96                    m_file, SLOT(deleteLater()), Qt::QueuedConnection);
97
98   if (fileError()) {
99     return;
100   }
101
102   m_file->setDisplayLevel(0);
103
104   if (fileError()) {
105     return;
106   }
107 }
108
109 void QuillItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
110   Q_UNUSED(widget);
111
112   if (!m_file) {
113     return;
114   }
115
116   QImage image = m_file->image(0);
117
118   if (!image.isNull()) {
119     painter->drawImage(option->rect, image);
120   }
121 }
122
123 void QuillItem::fileLoaded() {
124   update();
125 }
126
127 bool QuillItem::fileError() {
128   if (!m_file) {
129     return true;
130   }
131
132   QuillError err = m_file->error();
133
134   if (err.errorCode() != QuillError::NoError) {
135     qWarning() << "Error loading file" << m_file->fileName() << err.errorCode();
136
137     QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
138                               Q_ARG(QString, err.errorData()));
139     m_file->deleteLater(); m_file = 0;
140
141     if (!m_error) {
142       m_error = true;
143
144       emit errorChanged();
145     }
146
147     return true;
148   }
149
150   return false;
151 }