|
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 */ |
|
17 |
|
18 #include <qfinalstate.h> |
|
19 #include <QDebug> |
|
20 #include <hsmenuservice.h> |
|
21 #include <hbnotificationdialog.h> |
|
22 #include <QAbstractTransition> |
|
23 |
|
24 #include "hsaddappstocollectionstate.h" |
|
25 #include "hsmenuevent.h" |
|
26 #include "hscollectionnamedialog.h" |
|
27 #include "hscollectionslistdialog.h" |
|
28 #include "hsappschecklist.h" |
|
29 |
|
30 /*! |
|
31 \class HsAddAppsToCollectionState |
|
32 \ingroup group_hsmenuworkerstateplugin |
|
33 \brief Manages adding to homescreen state |
|
34 */ |
|
35 |
|
36 /*! |
|
37 \fn void transitToSaveState(const QString &collectionName); |
|
38 Signal emitted when collection name is selected. |
|
39 \param collectionName name of collection. |
|
40 */ |
|
41 |
|
42 /*! |
|
43 \fn void transitToAppsCheckListState(const QString &collectionName); |
|
44 Signal emitted when collection name is selected - version to trigger |
|
45 transition to mAppCheckListState. |
|
46 \param collectionName name of collection. |
|
47 */ |
|
48 |
|
49 /*! |
|
50 \fn void void transitToSaveState(int collectionId); |
|
51 Signal emitted when collection id is selected. |
|
52 \param collectionId id of collection. |
|
53 */ |
|
54 |
|
55 /*! |
|
56 \fn void transitToAppsCheckListState(int collectionId); |
|
57 Signal emitted when collection name is selected - version to trigger |
|
58 transition to mAppCheckListState. |
|
59 \param collectionId id of collection. |
|
60 */ |
|
61 |
|
62 /*! |
|
63 \fn void transitToNewCollectionState(); |
|
64 Signal emitted when user selects creating new collection. |
|
65 */ |
|
66 |
|
67 /*! |
|
68 \fn void transitToSaveState(const QList<int> &appList); |
|
69 Signal emitted when applications are selected. |
|
70 \param appList application list. |
|
71 */ |
|
72 |
|
73 /*! |
|
74 \fn void transitToFinalState(); |
|
75 Signal emitted when user selects cancel. |
|
76 \param collectionName name of collection. |
|
77 */ |
|
78 |
|
79 /*! |
|
80 Constructor. |
|
81 \return \a true on success, \a false otherwise. |
|
82 \param parent Owner. |
|
83 */ |
|
84 HsAddAppsToCollectionState::HsAddAppsToCollectionState(QState *parent) : |
|
85 QState(parent), mCollectionName(0), mCollectionId(0), mAppList(), |
|
86 mShowConfirmation(0), mInitialState(0), mSelectCollectionState(0), |
|
87 mNewCollectionState(0), mAppsCheckListState(0), mActionType( |
|
88 NoActionType), mApplicationsSortAttribute(NoHsSortAttribute), |
|
89 mCollectionsSortAttribute(NoHsSortAttribute), mAppsCheckList(0) |
|
90 { |
|
91 construct(); |
|
92 } |
|
93 |
|
94 /*! |
|
95 Destructor. |
|
96 |
|
97 */ |
|
98 HsAddAppsToCollectionState::~HsAddAppsToCollectionState() |
|
99 { |
|
100 delete mAppsCheckList; |
|
101 } |
|
102 |
|
103 /*! |
|
104 Constructor part. |
|
105 */ |
|
106 void HsAddAppsToCollectionState::construct() |
|
107 { |
|
108 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::construct"); |
|
109 setObjectName("homescreen.nokia.com/state/addappstocollectionstate"); |
|
110 createStates(); |
|
111 connect(this, SIGNAL(exited()),SLOT(stateExited())); |
|
112 |
|
113 mAppsCheckList = new HsAppsCheckList(); |
|
114 connect(mAppsCheckList, SIGNAL(commit(QList<int>)), |
|
115 SLOT(selectApplicationsDone(QList<int>))); |
|
116 |
|
117 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::construct"); |
|
118 } |
|
119 |
|
120 /*! |
|
121 Creates behavioural model i.e states |
|
122 */ |
|
123 void HsAddAppsToCollectionState::createStates() |
|
124 { |
|
125 //child states |
|
126 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::createStates"); |
|
127 |
|
128 mInitialState = new QState(this); |
|
129 QState *saveState = new QState(this); |
|
130 QFinalState *finalState = new QFinalState(this); |
|
131 |
|
132 mSelectCollectionState = new QState(this); |
|
133 mNewCollectionState = new QState(this); |
|
134 mAppsCheckListState = new QState(this); |
|
135 |
|
136 setInitialState(mInitialState); |
|
137 connect(saveState, SIGNAL(entered()),SLOT(save())); |
|
138 connect(finalState, SIGNAL(entered()),SLOT(cleanData())); |
|
139 connect(mNewCollectionState, SIGNAL(entered()),SLOT(newCollection())); |
|
140 connect(mSelectCollectionState, SIGNAL(entered()), |
|
141 SLOT(selectCollection())); |
|
142 connect(mAppsCheckListState, SIGNAL(entered()), |
|
143 SLOT(appsCheckListState())); |
|
144 |
|
145 //child states will gather needed data in parent sate |
|
146 //with signals and slots communication |
|
147 connect(this, SIGNAL(transitToSaveState(int)), |
|
148 SLOT(setCollectionId(int))); |
|
149 connect(this, SIGNAL(transitToSaveState(QString)), |
|
150 SLOT(setCollectionName(QString))); |
|
151 connect(this, SIGNAL(transitToAppsCheckListState(int)), |
|
152 SLOT(setCollectionId(int))); |
|
153 connect(this, SIGNAL(transitToAppsCheckListState(QString)), |
|
154 SLOT(setCollectionName(QString))); |
|
155 connect(this, SIGNAL(transitToSaveState(QList<int>)), |
|
156 SLOT(setAppList(QList<int>))); |
|
157 |
|
158 // Add a specific application to an existing collection |
|
159 // via item specific menu. |
|
160 // Add a specific item to a collection via collection specific menu. |
|
161 // Adding a new collection via the Collections view. |
|
162 mSelectCollectionState->addTransition(this, |
|
163 SIGNAL(transitToNewCollectionState()), mNewCollectionState); |
|
164 mSelectCollectionState->addTransition(this, |
|
165 SIGNAL(transitToSaveState(int)), saveState); |
|
166 mNewCollectionState->addTransition(this, |
|
167 SIGNAL(transitToSaveState(QString)), saveState); |
|
168 |
|
169 // Add one/many applications to an existing/a new collection |
|
170 // via the All view options menu. |
|
171 // Add items to a collection via the collection's view options menu. |
|
172 mSelectCollectionState->addTransition(this, |
|
173 SIGNAL(transitToAppsCheckListState(int)), mAppsCheckListState); |
|
174 mNewCollectionState->addTransition(this, |
|
175 SIGNAL(transitToAppsCheckListState(QString)), mAppsCheckListState); |
|
176 mAppsCheckListState->addTransition(this, |
|
177 SIGNAL(transitToSaveState(QList<int>)), saveState); |
|
178 |
|
179 mSelectCollectionState->addTransition(this, |
|
180 SIGNAL(transitToFinalState()),finalState); |
|
181 mNewCollectionState->addTransition(this, |
|
182 SIGNAL(transitToFinalState()), finalState); |
|
183 mAppsCheckListState->addTransition(this, |
|
184 SIGNAL(transitToFinalState()), finalState); |
|
185 |
|
186 //transition to final state after save |
|
187 saveState->addTransition(finalState); |
|
188 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::createStates"); |
|
189 |
|
190 } |
|
191 |
|
192 /*! |
|
193 Saves data in content arsenal(selected applications in collection). |
|
194 */ |
|
195 void HsAddAppsToCollectionState::save() |
|
196 { |
|
197 qDebug("AddAppsToCollectionState::save() - slot"); |
|
198 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::save"); |
|
199 //Adds new collection. |
|
200 if (!mCollectionName.isEmpty()) { |
|
201 mCollectionId = HsMenuService::createCollection(mCollectionName); |
|
202 } |
|
203 //Adds applications to colection. |
|
204 if ((mCollectionId > 0) && mAppList.count()) { |
|
205 HsMenuService::addApplicationsToCollection(mAppList, mCollectionId); |
|
206 if (mShowConfirmation) { |
|
207 showMessageAppsAdded(mCollectionId); |
|
208 } |
|
209 } |
|
210 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::save"); |
|
211 } |
|
212 |
|
213 /*! |
|
214 Cleans data after cancel() signal. |
|
215 */ |
|
216 void HsAddAppsToCollectionState::cleanData() |
|
217 { |
|
218 qDebug("AddAppsToCollectionState::cleanData() - slot"); |
|
219 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::cleanData"); |
|
220 mCollectionId = 0; |
|
221 mAppList.clear(); |
|
222 mCollectionName.clear(); |
|
223 mShowConfirmation = false; |
|
224 mActionType = NoActionType; |
|
225 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::cleanData"); |
|
226 } |
|
227 |
|
228 /*! |
|
229 Derived from QState. |
|
230 Method invoked when a state is entered. |
|
231 \param event an event causing the entrance the state. |
|
232 */ |
|
233 void HsAddAppsToCollectionState::onEntry(QEvent *event) |
|
234 { |
|
235 qDebug("HsAddAppsToCollectionState::onEntry()"); |
|
236 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::onEntry"); |
|
237 QState::onEntry(event); |
|
238 HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event); |
|
239 QVariantMap data = menuEvent->data(); |
|
240 |
|
241 mApplicationsSortAttribute = static_cast<HsSortAttribute>(data.value( |
|
242 appSortOrderKey()).toInt()); |
|
243 mCollectionsSortAttribute = static_cast<HsSortAttribute>(data.value( |
|
244 collectionSortOrderKey()).toInt()); |
|
245 |
|
246 const int itemId = data.value(itemIdKey()).toInt(); |
|
247 mCollectionId = data.value(collectionIdKey()).toInt(); |
|
248 |
|
249 if (itemId && (mCollectionsSortAttribute != NoHsSortAttribute |
|
250 || mCollectionId)) { |
|
251 //add selected app item form allAppView or collectionView |
|
252 mAppList.append(itemId); |
|
253 |
|
254 mInitialState->addTransition(mSelectCollectionState); |
|
255 |
|
256 mShowConfirmation = true; |
|
257 } else if (mApplicationsSortAttribute != NoHsSortAttribute |
|
258 && mCollectionsSortAttribute != NoHsSortAttribute) { |
|
259 //add apps from allAppView options menu |
|
260 mActionType = ViaAllViewOptionMenuType; |
|
261 |
|
262 mInitialState->addTransition(mSelectCollectionState); |
|
263 |
|
264 mShowConfirmation = true; |
|
265 } else if (mCollectionId) { |
|
266 //add apps from collectionView options menu |
|
267 mApplicationsSortAttribute = AscendingNameHsSortAttribute; |
|
268 mInitialState->addTransition(mAppsCheckListState); |
|
269 } |
|
270 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::onEntry"); |
|
271 } |
|
272 |
|
273 /*! |
|
274 Slot invoked when a state is exited. |
|
275 */ |
|
276 void HsAddAppsToCollectionState::stateExited() |
|
277 { |
|
278 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::stateExited"); |
|
279 QList<QAbstractTransition *> transitionsList = |
|
280 mInitialState->findChildren<QAbstractTransition *> (); |
|
281 if (transitionsList.count()) { |
|
282 mInitialState->removeTransition(transitionsList[0]); |
|
283 } |
|
284 mAppsCheckList->cleanUp(); |
|
285 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::stateExited"); |
|
286 qDebug("AddAppsToCollectionState::stateExited()"); |
|
287 } |
|
288 |
|
289 /*! |
|
290 Slot invoked when new collection state is entered.. |
|
291 */ |
|
292 #ifdef COVERAGE_MEASUREMENT |
|
293 #pragma CTC SKIP |
|
294 #endif //COVERAGE_MEASUREMENT |
|
295 void HsAddAppsToCollectionState::newCollection() |
|
296 { |
|
297 qDebug("HsAddAppsToCollectionState::newCollection"); |
|
298 |
|
299 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::newCollection"); |
|
300 HsCollectionNameDialog editor; |
|
301 HbAction *result = editor.exec(); |
|
302 if (result == editor.primaryAction()) { |
|
303 QString newName(editor.newName(editor.value().toString(), true)); |
|
304 if (mActionType == ViaAllViewOptionMenuType) { |
|
305 qDebug("HsAddAppsToCollectionState::newCollection() " |
|
306 "- emit collectionNameSelectedCl(newName)"); |
|
307 emit transitToAppsCheckListState(newName); |
|
308 } else { |
|
309 qDebug("HsAddAppsToCollectionState::newCollection() " |
|
310 "- emit collectionNameSelected(newName)"); |
|
311 emit transitToSaveState(newName); |
|
312 } |
|
313 } else { |
|
314 qDebug( |
|
315 "HsAddAppsToCollectionState::newCollection() - emit cancel()"); |
|
316 emit transitToFinalState(); |
|
317 } |
|
318 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::newCollection"); |
|
319 } |
|
320 #ifdef COVERAGE_MEASUREMENT |
|
321 #pragma CTC ENDSKIP |
|
322 #endif //COVERAGE_MEASUREMENT |
|
323 |
|
324 /*! |
|
325 Slot invoked when select collection state is entered. |
|
326 */ |
|
327 #ifdef COVERAGE_MEASUREMENT |
|
328 #pragma CTC SKIP |
|
329 #endif //COVERAGE_MEASUREMENT |
|
330 void HsAddAppsToCollectionState::selectCollection() |
|
331 { |
|
332 qDebug("HsAddAppsToCollectionState::selectCollection()"); |
|
333 |
|
334 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::selectCollection"); |
|
335 HsCollectionsListDialog listView(mCollectionsSortAttribute, |
|
336 mCollectionId); |
|
337 if (listView.exec() != listView.secondaryAction()) { |
|
338 int itemId = listView.getItemId(); |
|
339 if (itemId) { |
|
340 if (mActionType == ViaAllViewOptionMenuType) { |
|
341 qDebug("emit collectionSelectedCl(%d)", itemId); |
|
342 emit transitToAppsCheckListState(itemId); |
|
343 } else { |
|
344 qDebug("emit collectionSelected(%d)", itemId); |
|
345 emit transitToSaveState(itemId); |
|
346 } |
|
347 } else { |
|
348 qDebug("emit createNewCollection()"); |
|
349 emit transitToNewCollectionState(); |
|
350 } |
|
351 } else { |
|
352 qDebug("emit cancel()"); |
|
353 emit transitToFinalState(); |
|
354 } |
|
355 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::selectCollection"); |
|
356 } |
|
357 |
|
358 #ifdef COVERAGE_MEASUREMENT |
|
359 #pragma CTC ENDSKIP |
|
360 #endif //COVERAGE_MEASUREMENT |
|
361 /*! |
|
362 Slot connected to saving action of state. |
|
363 It is called when new application are addend to collection. |
|
364 \param id Id of collection to which applications were added. |
|
365 */ |
|
366 void HsAddAppsToCollectionState::showMessageAppsAdded(int id) |
|
367 { |
|
368 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::showMessageAppsAdded"); |
|
369 HbNotificationDialog *notificationDialog = new HbNotificationDialog(); |
|
370 notificationDialog->setAttribute(Qt::WA_DeleteOnClose); |
|
371 notificationDialog->setTitle(hbTrId( |
|
372 "txt_applib_dpopinfo_added_to_collection_1") .arg( |
|
373 HsMenuService::getName(id))); |
|
374 notificationDialog->show(); |
|
375 mShowConfirmation = false; |
|
376 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::showMessageAppsAdded"); |
|
377 } |
|
378 |
|
379 /*! |
|
380 Slot setting collection name. |
|
381 \param collectionName name of collection. |
|
382 */ |
|
383 void HsAddAppsToCollectionState::setCollectionName( |
|
384 const QString &collectionName) |
|
385 { |
|
386 qDebug() << "AddAppsToCollectionState::setCollectionName(" |
|
387 << collectionName << ") - slot"; |
|
388 |
|
389 mCollectionName = collectionName; |
|
390 } |
|
391 |
|
392 /*! |
|
393 Slot setting collection id.. |
|
394 \param collectionId id of collection. |
|
395 */ |
|
396 void HsAddAppsToCollectionState::setCollectionId(int collectionId) |
|
397 { |
|
398 qDebug() << "AddAppsToCollectionState::setCollectionId(" |
|
399 << collectionId << ") - slot"; |
|
400 |
|
401 mCollectionId = collectionId; |
|
402 } |
|
403 |
|
404 /*! |
|
405 Slot sets app list. |
|
406 \param appList list of applications ids. |
|
407 */ |
|
408 void HsAddAppsToCollectionState::setAppList(const QList<int> &appList) |
|
409 { |
|
410 qDebug() << "AddAppsToCollectionState::setAppList(" << appList |
|
411 << ") - slot"; |
|
412 |
|
413 mAppList = appList; |
|
414 } |
|
415 |
|
416 /*! |
|
417 Slot invoked when apps checklist state is entered. |
|
418 */ |
|
419 #ifdef COVERAGE_MEASUREMENT |
|
420 #pragma CTC SKIP |
|
421 #endif //COVERAGE_MEASUREMENT |
|
422 void HsAddAppsToCollectionState::appsCheckListState() |
|
423 { |
|
424 qDebug("HsAddAppsToCollectionState::appsCheckListState()"); |
|
425 HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::appsCheckListState"); |
|
426 if (!mAppsCheckList) { |
|
427 mAppsCheckList = new HsAppsCheckList(); |
|
428 } |
|
429 mAppsCheckList->setSortOrder(mApplicationsSortAttribute); |
|
430 mAppsCheckList->showAppsCheckboxList(mApplicationsSortAttribute); |
|
431 HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::appsCheckListState"); |
|
432 } |
|
433 #ifdef COVERAGE_MEASUREMENT |
|
434 #pragma CTC ENDSKIP |
|
435 #endif //COVERAGE_MEASUREMENT |
|
436 /*! |
|
437 Slot connected trrigger action of secondary soft key of check list box. |
|
438 It is called when done button is selected. |
|
439 */ |
|
440 #ifdef COVERAGE_MEASUREMENT |
|
441 #pragma CTC SKIP |
|
442 #endif //COVERAGE_MEASUREMENT |
|
443 void HsAddAppsToCollectionState::selectApplicationsDone( |
|
444 const QList<int> &appList) |
|
445 { |
|
446 if (appList.count()) { |
|
447 qDebug("AppsCheckListState::selectApplicationsDone() " |
|
448 "- emit appsSelected(mAppList)"); |
|
449 emit transitToSaveState(appList); |
|
450 } else { |
|
451 qDebug( |
|
452 "AppsCheckListState::selectApplicationsDone() - emit cancel()"); |
|
453 emit transitToFinalState(); |
|
454 } |
|
455 } |
|
456 #ifdef COVERAGE_MEASUREMENT |
|
457 #pragma CTC ENDSKIP |
|
458 #endif //COVERAGE_MEASUREMENT |