|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * |
|
16 * Version : %version: 1 % |
|
17 */ |
|
18 #include <QList> |
|
19 #include "hglogger.h" |
|
20 #include <hbicon.h> |
|
21 #include "mydataprovider.h" |
|
22 |
|
23 //#include "x:\sf\mw\qt\src\openvg\qpixmapdata_vg_p.h" |
|
24 //typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR); |
|
25 |
|
26 const int KItemIdRole = Qt::UserRole+1; |
|
27 |
|
28 const int KThumbnailsPriority = EPriorityLess; //standard priority |
|
29 |
|
30 |
|
31 MyDataProvider::MyDataProvider(QObject *parent) : |
|
32 HgDataProviderModel(parent), |
|
33 mDefaultIcon(new HbIcon(QIcon(QPixmap(":/icons/default.png")))), |
|
34 mScheduler(new CActiveSchedulerWait()), |
|
35 mWrapper( new ThumbnailManager() ), |
|
36 mThumbnailRequestPending(false), |
|
37 mThumbnailRequestIndex(-1), |
|
38 mThumbnailRequestID(-1), |
|
39 mThumbnailsize(ThumbnailManager::ThumbnailMedium), |
|
40 mMDSLoadInProgress(false) |
|
41 { |
|
42 // TX_ENTRY |
|
43 Q_UNUSED(parent); |
|
44 mWrapper->setThumbnailSize( mThumbnailsize ); |
|
45 mWrapper->setQualityPreference( ThumbnailManager::OptimizeForPerformance ); |
|
46 |
|
47 QObject::connect( mWrapper, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ), |
|
48 this, SLOT( thumbnailReady( QPixmap , void* , int , int ))); |
|
49 |
|
50 doResetModel(); //will read mds data |
|
51 } |
|
52 |
|
53 MyDataProvider::~MyDataProvider() |
|
54 { |
|
55 // TX_ENTRY |
|
56 delete mDefaultIcon; |
|
57 delete mWrapper; |
|
58 delete mScheduler; |
|
59 // TX_EXIT |
|
60 } |
|
61 |
|
62 void MyDataProvider::changeIconSize(ThumbnailManager::ThumbnailSize aThumbnailsize) |
|
63 { |
|
64 // TX_ENTRY |
|
65 // we could remove all iconsfrom cache and put default ones, but probably that would be waste of time, and it's better just to load new icons with correct sizes. |
|
66 mThumbnailsize = aThumbnailsize; |
|
67 mWrapper->setThumbnailSize( mThumbnailsize ); |
|
68 // TX_EXIT |
|
69 } |
|
70 |
|
71 void MyDataProvider::doRequestData(QList<int> list, bool silent) |
|
72 { |
|
73 TX_ENTRY |
|
74 Q_UNUSED(silent); |
|
75 QString items = "Requested items:"; |
|
76 int i = 0; |
|
77 for (int idx=0; idx<list.count(); idx++){ |
|
78 i = list[idx]; |
|
79 if (containsRole(i, KItemIdRole) && !containsRole(i, Qt::DecorationRole)) {//if there is icon, don't request new one |
|
80 items += QString("%0 ").arg(i); |
|
81 mWaitingThumbnails.append(i); |
|
82 } |
|
83 } |
|
84 TX_LOG_ARGS(items); |
|
85 getNextThumbnail(); |
|
86 TX_EXIT |
|
87 } |
|
88 |
|
89 void MyDataProvider::getNextThumbnail() |
|
90 { |
|
91 // TX_ENTRY |
|
92 if ( !mThumbnailRequestPending && mWaitingThumbnails.count()){ |
|
93 int i = mWaitingThumbnails.takeFirst(); |
|
94 if (i >=0 && i < count() && containsRole(i, KItemIdRole)) { |
|
95 int id = (data(i, KItemIdRole)).toInt(); |
|
96 unsigned long int uId = (unsigned long int)id; |
|
97 // TX_LOG_ARGS(QString("getThumbnail for index:%0 uID:%1").arg(i).arg(uId)); |
|
98 void *clientData = reinterpret_cast<void *>(i); |
|
99 mThumbnailRequestID = mWrapper->getThumbnail(uId, clientData, KThumbnailsPriority); |
|
100 mThumbnailRequestIndex = i; |
|
101 mThumbnailRequestPending = true; |
|
102 } |
|
103 } |
|
104 // TX_EXIT |
|
105 } |
|
106 |
|
107 void MyDataProvider::readMDSData() |
|
108 { |
|
109 mMDSLoadInProgress = true; |
|
110 } |
|
111 |
|
112 void MyDataProvider::thumbnailReady( QPixmap pixmap, void* data, int id, int error ) |
|
113 { |
|
114 // TX_ENTRY |
|
115 Q_UNUSED(id); |
|
116 if (!error && pixmap.rect().height()>0 && pixmap.rect().width()>0 ){ |
|
117 int idx = reinterpret_cast<int>(data); |
|
118 // TX_LOG_ARGS(QString("thumbnailReady idx = %0").arg(idx)); |
|
119 updateIcon(idx, createIcon(idx, pixmap)); |
|
120 } else { |
|
121 TX_LOG_ARGS(QString("error:%0 id:%0").arg(error).arg(id)); |
|
122 } |
|
123 mThumbnailRequestIndex = -1; |
|
124 mThumbnailRequestID = -1; |
|
125 mThumbnailRequestPending = false; |
|
126 getNextThumbnail(); |
|
127 // TX_EXIT |
|
128 } |
|
129 |
|
130 void MyDataProvider::doReleaseData(QList<int> list, bool silent) |
|
131 { |
|
132 // TX_ENTRY |
|
133 Q_UNUSED(silent); |
|
134 int i = 0; |
|
135 QString items = "Released items:"; |
|
136 for (int idx=0;idx<list.count(); idx++){ |
|
137 i = list[idx]; |
|
138 if (mThumbnailRequestPending && mThumbnailRequestIndex==i ){ |
|
139 TX_LOG_ARGS( QString("Cancel also thumbnail request for item %0").arg(i)); |
|
140 mWrapper->cancelRequest(mThumbnailRequestID); |
|
141 mThumbnailRequestIndex = -1; |
|
142 mThumbnailRequestID = -1; |
|
143 mThumbnailRequestPending = false; |
|
144 } |
|
145 items += QString("%0 ").arg(i); |
|
146 mWaitingThumbnails.removeAll(i); |
|
147 releasePixmap(i); |
|
148 } |
|
149 TX_LOG_ARGS(items); |
|
150 |
|
151 getNextThumbnail(); |
|
152 // TX_EXIT |
|
153 } |
|
154 |
|
155 QVariant MyDataProvider::defaultIcon() const |
|
156 { |
|
157 return *mDefaultIcon; |
|
158 } |
|
159 |
|
160 void MyDataProvider::HandleSessionOpened(CMdESession& aSession, TInt aError) |
|
161 { |
|
162 Q_UNUSED(aSession); |
|
163 Q_UNUSED(aError); |
|
164 mScheduler->AsyncStop(); |
|
165 } |
|
166 |
|
167 // ---------------------------------------------------------------------------- |
|
168 // HandleQueryCompleted |
|
169 // ---------------------------------------------------------------------------- |
|
170 // |
|
171 void MyDataProvider::HandleQueryCompleted(CMdEQuery& aQuery, TInt aError) |
|
172 { |
|
173 Q_UNUSED(aError); |
|
174 clearCache(); |
|
175 mMDSLoadInProgress = false; |
|
176 int size = aQuery.ResultIds().Count(); |
|
177 |
|
178 for(int i = 0; i < size ; i++){ |
|
179 QList< QPair< QVariant, int > > list; |
|
180 unsigned long int id = aQuery.ResultId(i); |
|
181 QVariant v; |
|
182 v.setValue(id); |
|
183 list.append( QPair< QVariant, int >(v, KItemIdRole) ); |
|
184 int a = count(); |
|
185 int b = -count(); |
|
186 int c = a/4 + b/10 + i%30 + i/2; |
|
187 QString s = QString("ITEM%1 %2 %3").arg(c).arg(a).arg(b); |
|
188 if (i%2){ |
|
189 s = s.toLower(); |
|
190 } |
|
191 list.append( QPair< QVariant, int >(s, Qt::DisplayRole) ); |
|
192 list.append( QPair< QVariant, int >(QVariant(a), Qt::UserRole+2) ); |
|
193 list.append( QPair< QVariant, int >(QVariant(b), Qt::UserRole+3) ); |
|
194 list.append( QPair< QVariant, int >(QVariant(c), Qt::UserRole+4) ); |
|
195 |
|
196 newItem(&list); |
|
197 } |
|
198 |
|
199 TX_LOG_ARGS( QString("size=%1").arg(count()) ); |
|
200 |
|
201 mScheduler->AsyncStop(); |
|
202 } |
|
203 |
|
204 void MyDataProvider::doResetModel() |
|
205 { |
|
206 |
|
207 if (mThumbnailRequestPending && mThumbnailRequestID!=-1){ |
|
208 mWrapper->cancelRequest(mThumbnailRequestID); |
|
209 } |
|
210 mThumbnailRequestIndex = -1; |
|
211 mThumbnailRequestID = -1; |
|
212 mThumbnailRequestPending = false; |
|
213 mWaitingThumbnails.clear(); |
|
214 |
|
215 //read MDS data once again |
|
216 TRAP_IGNORE( |
|
217 CMdESession* session = CMdESession::NewL( *this ); |
|
218 mScheduler->Start(); |
|
219 |
|
220 CMdENamespaceDef& namespaceDef = session->GetDefaultNamespaceDefL(); |
|
221 |
|
222 CMdEObjectDef& objectDef = namespaceDef.GetObjectDefL(_L("Image")); |
|
223 |
|
224 CMdEObjectQuery* imageQuery = session->NewObjectQueryL( namespaceDef, objectDef, this ); |
|
225 CleanupStack::PushL( imageQuery ); |
|
226 imageQuery->SetResultMode( EQueryResultModeId ); |
|
227 imageQuery->FindL( ); |
|
228 mScheduler->Start(); |
|
229 CleanupStack::PopAndDestroy( 1 ); |
|
230 delete session; |
|
231 ); |
|
232 |
|
233 |
|
234 // TX_EXIT |
|
235 } |
|
236 |