60
|
1 |
/*
|
|
2 |
* Copyright (c) 2007-2008 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: The effect control for the slideshow
|
|
15 |
*
|
|
16 |
*/
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
// CLASS HEADER
|
|
22 |
#include "shweffectcontrol.h"
|
|
23 |
|
|
24 |
// EXTERNAL INCLUDES
|
|
25 |
#include <mglxvisuallist.h>
|
|
26 |
#include <mglxmedialist.h>
|
|
27 |
#include <glxlog.h>
|
|
28 |
#include <glxtracer.h>
|
|
29 |
#include <AknUtils.h>
|
|
30 |
// INTERNAL INCLUDES
|
|
31 |
#include "shweffectmanager.h"
|
|
32 |
#include "shweffect.h"
|
|
33 |
#include "shwthumbnailloader.h"
|
|
34 |
#include "shwslideshowenginepanic.h"
|
|
35 |
#include "shwcallback.h"
|
|
36 |
#include "shwtimer.h"
|
|
37 |
#include "shwconstants.h"
|
|
38 |
|
|
39 |
using namespace NShwSlideshow;
|
|
40 |
|
|
41 |
// LOCAL NAMESPACE
|
|
42 |
namespace
|
|
43 |
{
|
|
44 |
// local constants, the visual list range
|
|
45 |
const TInt KRangeLeftFromFocus = -1;
|
|
46 |
const TInt KRangeRightFromFocus = 1;
|
|
47 |
}
|
|
48 |
|
|
49 |
// LOCAL FUNCTIONS AND CONSTANTS
|
|
50 |
// -----------------------------------------------------------------------------
|
|
51 |
// C++ Constructor. Save a few bits of rom with inlining
|
|
52 |
// -----------------------------------------------------------------------------
|
|
53 |
inline CShwEffectControl::CShwEffectControl(
|
|
54 |
MShwEffectManager& aEffectManager,
|
|
55 |
MGlxVisualList& aVisualList,
|
|
56 |
MGlxMediaList& aMediaList,
|
|
57 |
TSize aScreenSize )
|
|
58 |
: iEffectManager( aEffectManager ),
|
|
59 |
iVisualList( aVisualList ),
|
|
60 |
iMediaList( aMediaList ),
|
|
61 |
iEffectLoopRestarted( EFalse ),
|
|
62 |
iFailedThumbnailIndex( KErrNotFound ),
|
|
63 |
iHDMIFirstDecoded(EFalse),
|
|
64 |
iTNReadyReceived(EFalse)
|
|
65 |
{
|
|
66 |
// initialize the default layout chain
|
|
67 |
iDefaultIconLayout.SetOpacity( KMaxOpacity, 0 );
|
|
68 |
iDefaultIconLayout.SetSize( aScreenSize.iWidth, aScreenSize.iHeight, 0 );
|
|
69 |
// initialise the not visible layout
|
|
70 |
iNotVisibleLayout.SetOpacity(KMinOpacity,0);
|
|
71 |
iNotVisibleLayout.SetSize( 0, 0, 0 );
|
|
72 |
iSplitter.SetDefaultLayout(&iNotVisibleLayout);
|
|
73 |
// initialise the paused layout
|
|
74 |
iPausedLayout.SetOpacity( KMaxOpacity, 0);
|
|
75 |
iPausedLayout.SetSize( aScreenSize.iWidth, aScreenSize.iHeight, 0 );
|
|
76 |
}
|
|
77 |
|
|
78 |
// -----------------------------------------------------------------------------
|
|
79 |
// NewL. Static construction
|
|
80 |
// -----------------------------------------------------------------------------
|
|
81 |
CShwEffectControl* CShwEffectControl::NewL(
|
|
82 |
MShwEffectManager& aEffectManager,
|
|
83 |
MGlxVisualList& aVisualList,
|
|
84 |
MGlxMediaList& aMediaList,
|
|
85 |
TSize aScreenSize )
|
|
86 |
{
|
|
87 |
TRACER("CShwEffectControl* CShwEffectControl::NewL");
|
|
88 |
GLX_LOG_INFO( "CShwEffectControl::NewL" );
|
|
89 |
CShwEffectControl* self =
|
|
90 |
new( ELeave ) CShwEffectControl(
|
|
91 |
aEffectManager,
|
|
92 |
aVisualList,
|
|
93 |
aMediaList,
|
|
94 |
aScreenSize );
|
|
95 |
|
|
96 |
// 2nd phase construct
|
|
97 |
CleanupStack::PushL( self );
|
|
98 |
self->ConstructL();
|
|
99 |
CleanupStack::Pop( self );
|
|
100 |
return self;
|
|
101 |
}
|
|
102 |
|
|
103 |
// -----------------------------------------------------------------------------
|
|
104 |
// Destructor.
|
|
105 |
// -----------------------------------------------------------------------------
|
|
106 |
CShwEffectControl::~CShwEffectControl()
|
|
107 |
{
|
|
108 |
TRACER("CShwEffectControl::~CShwEffectControl()");
|
|
109 |
GLX_LOG_INFO( "CShwEffectControl::~CShwEffectControl" );
|
|
110 |
|
|
111 |
iPausedVisuals.Close();
|
|
112 |
|
|
113 |
// stop observing the visual list
|
|
114 |
iVisualList.RemoveObserver( this );
|
|
115 |
// delete timer, it cancels itself
|
|
116 |
delete iTransitionTimer;
|
|
117 |
// remove viewing context
|
|
118 |
iVisualList.RemoveContext( iContextId );
|
|
119 |
// delete the thumbnail loader
|
|
120 |
delete iThumbnailLoader;
|
|
121 |
}
|
|
122 |
|
|
123 |
// -----------------------------------------------------------------------------
|
|
124 |
// ConstructL.
|
|
125 |
// -----------------------------------------------------------------------------
|
|
126 |
void CShwEffectControl::ConstructL()
|
|
127 |
{
|
|
128 |
TRACER("CShwEffectControl::ConstructL()");
|
|
129 |
GLX_LOG_INFO( "CShwEffectControl::ConstructL" );
|
|
130 |
|
|
131 |
// create thumbnail loader for the medialist
|
|
132 |
iThumbnailLoader = CShwThumbnailLoader::NewL( iMediaList, *this );
|
|
133 |
|
|
134 |
// create the timer to end the transition phase
|
|
135 |
iTransitionTimer = CShwTimer::NewL( CActive::EPriorityStandard );
|
|
136 |
|
|
137 |
// add us as visual list observer
|
|
138 |
iVisualList.AddObserverL( this );
|
|
139 |
|
|
140 |
// specify viewing range for the visual list
|
|
141 |
iContextId = iVisualList.AddContextL(
|
|
142 |
KRangeLeftFromFocus, KRangeRightFromFocus );
|
|
143 |
|
|
144 |
// initialize splitter
|
|
145 |
iSplitter.SetVisualListL( &iVisualList );
|
|
146 |
// add the splitter layout on the bottom
|
|
147 |
//subhasis commented 1 line
|
|
148 |
//API depricated in visual list manager
|
|
149 |
iVisualList.AddLayoutL( &iSplitter );
|
|
150 |
}
|
|
151 |
|
|
152 |
// -----------------------------------------------------------------------------
|
|
153 |
// SendTransitionReadyL.
|
|
154 |
// -----------------------------------------------------------------------------
|
|
155 |
TInt CShwEffectControl::SendTransitionReadyL()
|
|
156 |
{
|
|
157 |
TRACER("CShwEffectControl::SendTransitionReadyL()");
|
|
158 |
GLX_LOG_INFO( "CShwEffectControl::SendTransitionReadyL" );
|
|
159 |
// cancel the timer
|
|
160 |
iTransitionTimer->Cancel();
|
|
161 |
// we need to remove the high quality thumbnails we dont plan
|
|
162 |
// to show in near future, so focus minus range to left
|
|
163 |
// is the first to unload
|
|
164 |
TInt indexToUnloadBackwards = NextListIndex( KRangeLeftFromFocus );
|
|
165 |
// check that this index is not in focus or next from focus
|
|
166 |
// this can happen if the list to play is really short
|
|
167 |
TInt focusIndex = iMediaList.FocusIndex();
|
|
168 |
if( ( indexToUnloadBackwards != focusIndex )&&
|
|
169 |
( indexToUnloadBackwards != NextListIndex( KNavigateForwards ) ) )
|
|
170 |
{
|
|
171 |
// ok, not visible so can unload
|
|
172 |
iThumbnailLoader->Unload( indexToUnloadBackwards );
|
|
173 |
}
|
|
174 |
// send the event
|
|
175 |
TShwEventTransitionReady transitionReady;
|
|
176 |
SendEventL( &transitionReady );
|
|
177 |
// return KErrNone, return value is ignored by CPeriodic
|
|
178 |
return KErrNone;
|
|
179 |
}
|
|
180 |
|
|
181 |
// -----------------------------------------------------------------------------
|
|
182 |
// NotifyL.
|
|
183 |
// -----------------------------------------------------------------------------
|
|
184 |
void CShwEffectControl::NotifyL( MShwEvent* aEvent )
|
|
185 |
{
|
|
186 |
TRACER("CShwEffectControl::NotifyL");
|
|
187 |
// we got an event
|
|
188 |
// is it initialize
|
|
189 |
TShwEventInitialize* init =
|
|
190 |
dynamic_cast<TShwEventInitialize*>( aEvent );
|
|
191 |
// is it start view
|
|
192 |
TShwEventStartView* viewEvent =
|
|
193 |
dynamic_cast<TShwEventStartView*>( aEvent );
|
|
194 |
// is it start transition
|
|
195 |
TShwEventStartTransition* transEvent =
|
|
196 |
dynamic_cast<TShwEventStartTransition*>( aEvent );
|
|
197 |
// was it a pause or resume event
|
|
198 |
TShwEventPause* pauseEvent =
|
|
199 |
dynamic_cast<TShwEventPause*>( aEvent );
|
|
200 |
TShwEventResume* resumeEvent =
|
|
201 |
dynamic_cast<TShwEventResume*>( aEvent );
|
|
202 |
// or was it a navigation event
|
|
203 |
TShwEventNextImage* nextImageEvent =
|
|
204 |
dynamic_cast< TShwEventNextImage* >( aEvent );
|
|
205 |
TShwEventPreviousImage* previousImageEvent =
|
|
206 |
dynamic_cast< TShwEventPreviousImage* >( aEvent );
|
|
207 |
TShwEventToggleControlUi* toggleControlUiEvent =
|
|
208 |
dynamic_cast< TShwEventToggleControlUi* >( aEvent );
|
|
209 |
TShwEventHDMIDisConnected* hdmiDisConnectEvent =
|
|
210 |
dynamic_cast< TShwEventHDMIDisConnected* >( aEvent );
|
|
211 |
TShwEventHDMIFirstImageDecodingCompleted* hdmiDecodeImageEvent =
|
|
212 |
dynamic_cast< TShwEventHDMIFirstImageDecodingCompleted* >( aEvent );
|
|
213 |
|
|
214 |
// process init event
|
|
215 |
if( init )
|
|
216 |
{
|
|
217 |
// prepare the first effect and load the correct size thumbnail
|
|
218 |
// thumbnail loader ensures that the size attribute is available
|
|
219 |
PrepareAndLoadImageToViewL();
|
|
220 |
}
|
|
221 |
// process start view event
|
|
222 |
else if( viewEvent )
|
|
223 |
{
|
|
224 |
HandleStartViewEventL( *viewEvent );
|
|
225 |
}
|
|
226 |
// process start transition event
|
|
227 |
else if( transEvent )
|
|
228 |
{
|
|
229 |
HandleStartTransitionEventL( *transEvent );
|
|
230 |
}
|
|
231 |
// process pause event
|
|
232 |
else if( pauseEvent )
|
|
233 |
{
|
|
234 |
HandlePauseEventL();
|
|
235 |
}
|
|
236 |
// process resume event
|
|
237 |
else if( resumeEvent )
|
|
238 |
{
|
|
239 |
HandleResumeEventL();
|
|
240 |
}
|
|
241 |
// process user navigate to next
|
|
242 |
else if( nextImageEvent )
|
|
243 |
{
|
|
244 |
HandleNextImageEventL();
|
|
245 |
}
|
|
246 |
// process toggling UI by pressing selection key
|
|
247 |
else if( toggleControlUiEvent )
|
|
248 |
{
|
|
249 |
HandleToggleControlUiEventL();
|
|
250 |
}
|
|
251 |
// process user navigate to previous
|
|
252 |
else if ( previousImageEvent )
|
|
253 |
{
|
|
254 |
HandlePreviousImageEventL();
|
|
255 |
}
|
|
256 |
else if(hdmiDecodeImageEvent || hdmiDisConnectEvent)
|
|
257 |
{
|
|
258 |
iHDMIFirstDecoded = ETrue;
|
|
259 |
if(iTNReadyReceived)
|
|
260 |
{
|
|
261 |
TShwEventReadyToView readyToView;
|
|
262 |
SendEventL(&readyToView);
|
|
263 |
}
|
|
264 |
}
|
|
265 |
// no other events are interesting for us
|
|
266 |
}
|
|
267 |
|
|
268 |
// -----------------------------------------------------------------------------
|
|
269 |
// HandleFocusChangedL.
|
|
270 |
// -----------------------------------------------------------------------------
|
|
271 |
void CShwEffectControl::HandleFocusChangedL(
|
|
272 |
TInt aFocusIndex, TReal32 /*aItemsPerSecond*/, MGlxVisualList* /*aList*/,
|
|
273 |
NGlxListDefs::TFocusChangeType /*aType*/ )
|
|
274 |
{
|
|
275 |
TRACER("CShwEffectControl::HandleFocusChangedL");
|
|
276 |
GLX_LOG_INFO1( "CShwEffectControl::HandleFocusChangedL %d", aFocusIndex );
|
|
277 |
// set current as previous
|
|
278 |
iPreviousVisual = iCurrentVisual;
|
|
279 |
// take new current
|
|
280 |
iCurrentVisual = iVisualList.Visual( aFocusIndex );
|
|
281 |
// we need to remove the high quality thumbnails we dont plan
|
|
282 |
// to show in near future, so focus minus range to left minus one
|
|
283 |
// is the first to unload
|
|
284 |
TInt indexToUnloadBackwards = NextListIndex( KRangeLeftFromFocus - 1 );
|
|
285 |
// check that this index is not in focus or next from focus
|
|
286 |
// this can happen if the list to play is really short
|
|
287 |
if( ( indexToUnloadBackwards != aFocusIndex )&&
|
|
288 |
( indexToUnloadBackwards != NextListIndex( KNavigateForwards ) ) )
|
|
289 |
{
|
|
290 |
// ok, not visible so can unload
|
|
291 |
iThumbnailLoader->Unload( indexToUnloadBackwards );
|
|
292 |
}
|
|
293 |
// unload also range + 1 as user might navigate backwards fast
|
|
294 |
TInt indexToUnloadForwards = NextListIndex( KRangeRightFromFocus + 1 );
|
|
295 |
// check that this index is not in focus or next from focus
|
|
296 |
// this can happen if the list to play is really short
|
|
297 |
if( ( indexToUnloadForwards != aFocusIndex )&&
|
|
298 |
( indexToUnloadForwards != NextListIndex( KNavigateForwards ) ) )
|
|
299 |
{
|
|
300 |
// ok, not visible so can unload
|
|
301 |
iThumbnailLoader->Unload( indexToUnloadForwards );
|
|
302 |
}
|
|
303 |
}
|
|
304 |
|
|
305 |
// -----------------------------------------------------------------------------
|
|
306 |
// HandleSizeChanged.
|
|
307 |
// -----------------------------------------------------------------------------
|
|
308 |
void CShwEffectControl::HandleSizeChanged(
|
|
309 |
const TSize& /*aSize*/, MGlxVisualList* /*aList*/ )
|
|
310 |
{
|
|
311 |
// nothing to be done
|
|
312 |
}
|
|
313 |
// -----------------------------------------------------------------------------
|
|
314 |
// HandleToggleControlUiEventL.
|
|
315 |
// -----------------------------------------------------------------------------
|
|
316 |
void CShwEffectControl::HandleToggleControlUiEventL()
|
|
317 |
{
|
|
318 |
// nothing to be done
|
|
319 |
}
|
|
320 |
|
|
321 |
// -----------------------------------------------------------------------------
|
|
322 |
// HandleVisualRemoved.
|
|
323 |
// -----------------------------------------------------------------------------
|
|
324 |
void CShwEffectControl::HandleVisualRemoved(
|
|
325 |
const CAlfVisual* aVisual, MGlxVisualList* /*aList*/ )
|
|
326 |
{
|
|
327 |
TRACER("CShwEffectControl::HandleVisualRemoved");
|
|
328 |
GLX_LOG_INFO( "CShwEffectControl::HandleVisualRemoved" );
|
|
329 |
// remove the layout for this visual just to make sure we dont use it
|
|
330 |
//subhasis commented 1 line
|
|
331 |
//API depricated in visual list manager
|
|
332 |
iSplitter.RemoveLayout( aVisual );
|
|
333 |
}
|
|
334 |
|
|
335 |
// -----------------------------------------------------------------------------
|
|
336 |
// HandleVisualAddedL.
|
|
337 |
// -----------------------------------------------------------------------------
|
|
338 |
void CShwEffectControl::HandleVisualAddedL(
|
|
339 |
CAlfVisual* /*aVisual*/, TInt /*aIndex*/, MGlxVisualList* /*aList*/ )
|
|
340 |
{
|
|
341 |
// nothing to be done
|
|
342 |
}
|
|
343 |
|
|
344 |
// -----------------------------------------------------------------------------
|
|
345 |
// HandleThumbnailLoadedL.
|
|
346 |
// -----------------------------------------------------------------------------
|
|
347 |
void CShwEffectControl::HandleThumbnailLoadedL( TInt aIndex )
|
|
348 |
{
|
|
349 |
TRACER("CShwEffectControl::HandleThumbnailLoadedL");
|
|
350 |
TInt focus = iVisualList.FocusIndex();
|
|
351 |
GLX_LOG_INFO2(
|
|
352 |
"CShwEffectControl::HandleThumbnailLoadedL %d, focus %d", aIndex, focus );
|
|
353 |
// check the index
|
|
354 |
// was it on focus, we cannot check the state as it can be either
|
|
355 |
// view or transition because of user navigation
|
|
356 |
if( aIndex == focus )
|
|
357 |
{
|
|
358 |
GLX_LOG_INFO(
|
|
359 |
"HandleThumbnailLoadedL - sending TShwEventReadyToView" );
|
|
360 |
iTNReadyReceived = ETrue;
|
|
361 |
// its focus index so lets send ready to view
|
|
362 |
// send ready to view event
|
|
363 |
if(iHDMIFirstDecoded)
|
|
364 |
{
|
|
365 |
TShwEventReadyToView readyToView;
|
|
366 |
SendEventL( &readyToView );
|
|
367 |
}
|
|
368 |
}
|
|
369 |
// is it next from focus
|
|
370 |
else if( aIndex == NextListIndex( KNavigateForwards ) )
|
|
371 |
{
|
|
372 |
GLX_LOG_INFO(
|
|
373 |
"HandleThumbnailLoadedL - sending TShwEventReadyToAdvance" );
|
|
374 |
// send ready to advance command,
|
|
375 |
// it tells the observers that we are ready to advance to next image
|
|
376 |
TShwEventReadyToAdvance readyToAdvance;
|
|
377 |
SendEventL( &readyToAdvance );
|
|
378 |
}
|
|
379 |
}
|
|
380 |
|
|
381 |
// -----------------------------------------------------------------------------
|
|
382 |
// HandleThumbnailLoadFailureL.
|
|
383 |
// -----------------------------------------------------------------------------
|
|
384 |
void CShwEffectControl::HandleThumbnailLoadFailureL( TInt aIndex )
|
|
385 |
{
|
|
386 |
TRACER("CShwEffectControl::HandleThumbnailLoadFailureL");
|
|
387 |
GLX_LOG_INFO1( "CShwEffectControl::HandleThumbnailLoadFailureL %d", aIndex );
|
|
388 |
// We cant remove the errornous item from the medialist so
|
|
389 |
// at the moment we just proceed as normal
|
|
390 |
// user will then see a broken icon for a while
|
|
391 |
// we need to remember this index however as we dont want to start the
|
|
392 |
// effect for it
|
|
393 |
iFailedThumbnailIndex = aIndex;
|
|
394 |
TInt focus = iVisualList.FocusIndex();
|
|
395 |
if (aIndex == focus)
|
|
396 |
{
|
|
397 |
iHDMIFirstDecoded = ETrue;
|
|
398 |
}
|
|
399 |
HandleThumbnailLoadedL( aIndex );
|
|
400 |
}
|
|
401 |
|
|
402 |
// -----------------------------------------------------------------------------
|
|
403 |
// HandleMediaListEmpty
|
|
404 |
// -----------------------------------------------------------------------------
|
|
405 |
void CShwEffectControl::HandleMediaListEmpty()
|
|
406 |
{
|
|
407 |
TRACER("CShwEffectControl::HandleMediaListEmpty");
|
|
408 |
GLX_LOG_INFO( "CShwEffectControl::HandleMediaListEmpty" );
|
|
409 |
// need to remove the contexts from medialist as closing down will
|
|
410 |
// take a while
|
|
411 |
// stop observing the visual list
|
|
412 |
iVisualList.RemoveObserver( this );
|
|
413 |
// delete the thumbnail loader
|
|
414 |
delete iThumbnailLoader;
|
|
415 |
// set to NULL to prevent double delete
|
|
416 |
iThumbnailLoader = NULL;
|
|
417 |
// send fatal error message
|
|
418 |
TShwEventFatalError errmessage;
|
|
419 |
// need to TRAP as we cannot leave
|
|
420 |
TRAPD( error, SendEventL( &errmessage ) );
|
|
421 |
// was there an error
|
|
422 |
if( error != KErrNone )
|
|
423 |
{
|
|
424 |
// panic engine as nothing else can be done
|
|
425 |
NShwEngine::Panic( NShwEngine::EEngineFatalError );
|
|
426 |
}
|
|
427 |
}
|
|
428 |
|
|
429 |
// -----------------------------------------------------------------------------
|
|
430 |
// PrepareAndLoadImageToViewL
|
|
431 |
// -----------------------------------------------------------------------------
|
|
432 |
void CShwEffectControl::PrepareAndLoadImageToViewL()
|
|
433 |
{
|
|
434 |
TRACER("CShwEffectControl::PrepareAndLoadImageToViewL");
|
|
435 |
// get current index
|
|
436 |
TInt currentIndex = iVisualList.FocusIndex();
|
|
437 |
// get current effect
|
|
438 |
MShwEffect* currentEffect = iEffectManager.CurrentEffect();
|
|
439 |
__ASSERT_ALWAYS(
|
|
440 |
currentEffect, NShwEngine::Panic( NShwEngine::ENullCurrentEffect ) );
|
|
441 |
// set the current visual, since on first time there has not been navigation
|
|
442 |
iCurrentVisual = iVisualList.Visual( currentIndex );
|
|
443 |
/// get the image size from thumbnail loader
|
|
444 |
TSize imgSize = iThumbnailLoader->ImageSizeL( currentIndex );
|
|
445 |
// tell the effect to prepare for viewing current visual
|
|
446 |
// thumbnail size is returned
|
|
447 |
TSize thumbnailSize =
|
|
448 |
currentEffect->PrepareViewL( iCurrentVisual, imgSize );
|
|
449 |
// ask the thumbnail loader to load the thumbnail
|
|
450 |
// once the thumbnail is loaded, we get a callback
|
|
451 |
iThumbnailLoader->LoadAndNotifyL(
|
|
452 |
currentIndex, thumbnailSize );
|
|
453 |
}
|
|
454 |
|
|
455 |
// -----------------------------------------------------------------------------
|
|
456 |
// HandleStartViewEventL.
|
|
457 |
// -----------------------------------------------------------------------------
|
|
458 |
void CShwEffectControl::HandleStartViewEventL( TShwEventStartView& aEvent )
|
|
459 |
{
|
|
460 |
TRACER("CShwEffectControl::HandleStartViewEventL");
|
|
461 |
GLX_LOG_INFO( "CShwEffectControl::HandleStartViewEventL" );
|
|
462 |
|
|
463 |
// remember the current view length, it is packaged into the event
|
|
464 |
iViewDuration = aEvent.Parameter();
|
|
465 |
|
|
466 |
// update the state
|
|
467 |
iState = EShwEffectStateInView;
|
|
468 |
|
|
469 |
//following code commented to remove layout dependency
|
|
470 |
//! to be refactored
|
|
471 |
|
|
472 |
// get the focus index
|
|
473 |
TInt currentIndex = iVisualList.FocusIndex();
|
|
474 |
// tell effect to exit transition
|
|
475 |
// if we got view event and loop is already started
|
|
476 |
if( iEffectLoopRestarted )
|
|
477 |
{
|
|
478 |
// exit transition for the previous effect and visual
|
|
479 |
// this is done first since the next effect may be same
|
|
480 |
// as previous
|
|
481 |
iPreviousEffect->ExitTransition( iPreviousVisual );
|
|
482 |
// remove layout from splitter
|
|
483 |
iSplitter.RemoveLayout( iPreviousVisual );
|
|
484 |
}
|
|
485 |
else
|
|
486 |
{
|
|
487 |
// get the current effect
|
|
488 |
MShwEffect* currentEffect = iEffectManager.CurrentEffect();
|
|
489 |
// remove the old layout
|
|
490 |
iSplitter.RemoveLayout( iCurrentVisual );
|
|
491 |
// check if this thumbnail was succesfully loaded
|
|
492 |
if ( iFailedThumbnailIndex == currentIndex )
|
|
493 |
{
|
|
494 |
// set the temporary layout for default icon
|
|
495 |
iSplitter.SetLayoutL( &iDefaultIconLayout, iCurrentVisual );
|
|
496 |
}
|
|
497 |
else
|
|
498 |
{
|
|
499 |
// enter the view mode for visual
|
|
500 |
// ask the layout chain and set that to the current visual
|
|
501 |
// set also effect fade-in
|
|
502 |
iSplitter.SetLayoutL(
|
|
503 |
currentEffect->EnterViewL(
|
|
504 |
iCurrentVisual,
|
|
505 |
iViewDuration,
|
|
506 |
KFirstEffectFadeInDuration ),
|
|
507 |
iCurrentVisual );
|
|
508 |
}
|
|
509 |
// bring the focus visual to the front
|
|
510 |
iCurrentVisual->MoveToFront();
|
|
511 |
}
|
|
512 |
//parts of the code commented to remove layout dependency
|
|
513 |
//! to be refactored
|
|
514 |
// get next index forwards
|
|
515 |
TInt nextIndex = NextListIndex( KNavigateForwards );
|
|
516 |
// need to tell the next effect to prepare for the view
|
|
517 |
// get next effect
|
|
518 |
MShwEffect* nextEffect = iEffectManager.Effect( KNavigateForwards );
|
|
519 |
// get next visual
|
|
520 |
CAlfVisual* nextVisual = iVisualList.Visual( nextIndex );
|
|
521 |
// get the real size of the image
|
|
522 |
TSize imgSize = iThumbnailLoader->ImageSizeL( nextIndex );
|
|
523 |
// tell the effect to prepare to view the next visual
|
|
524 |
// thumbnail size is returned
|
|
525 |
TSize thumbnailSize =
|
|
526 |
nextEffect->PrepareViewL( nextVisual, imgSize );
|
|
527 |
// ask the thumbnail loader to load next thumbnail
|
|
528 |
iThumbnailLoader->LoadAndNotifyL( nextIndex, thumbnailSize );
|
|
529 |
}
|
|
530 |
|
|
531 |
// -----------------------------------------------------------------------------
|
|
532 |
// HandleStartTransitionEventL.
|
|
533 |
// -----------------------------------------------------------------------------
|
|
534 |
void CShwEffectControl::HandleStartTransitionEventL(
|
|
535 |
TShwEventStartTransition& aEvent )
|
|
536 |
{
|
|
537 |
TRACER("CShwEffectControl::HandleStartTransitionEventL");
|
|
538 |
GLX_LOG_INFO( "CShwEffectControl::HandleStartTransitionEventL" );
|
|
539 |
//following code was commented to remove layout dependency
|
|
540 |
//! to be refactored
|
|
541 |
// update the state
|
|
542 |
iState = EShwEffectStateInTransition;
|
|
543 |
|
|
544 |
// duration is in event parameters
|
|
545 |
TInt duration = aEvent.Parameter();
|
|
546 |
// enter current effects transition mode for current visual
|
|
547 |
// get current effect
|
|
548 |
MShwEffect* currentEffect = iEffectManager.CurrentEffect();
|
|
549 |
// inform the effect that view mode ended
|
|
550 |
currentEffect->ExitView( iCurrentVisual );
|
|
551 |
// remove the view layout
|
|
552 |
iSplitter.RemoveLayout( iCurrentVisual );
|
|
553 |
// add the layout chain to the current visual
|
|
554 |
iSplitter.SetLayoutL(
|
|
555 |
currentEffect->EnterTransitionL(
|
|
556 |
iCurrentVisual, duration ), iCurrentVisual );
|
|
557 |
// ok, now we have the loop started so next time we get view_event
|
|
558 |
// we stop this transition
|
|
559 |
iEffectLoopRestarted = ETrue;
|
|
560 |
|
|
561 |
// enter next effects view mode for next visual
|
|
562 |
// get next effect, given the direction stored in the event
|
|
563 |
MShwEffect* nextEffect = iEffectManager.Effect( KNavigateForwards );
|
|
564 |
// get next list index forwards
|
|
565 |
TInt nextIndex = NextListIndex( KNavigateForwards );
|
|
566 |
GLX_LOG_INFO1( "CShwEffectControl::NextVisual, %d", nextIndex );
|
|
567 |
// get next visual, focus plus 1 modulo itemcount
|
|
568 |
CAlfVisual* nextVisual = iVisualList.Visual( nextIndex );
|
|
569 |
|
|
570 |
// remove old layout
|
|
571 |
iSplitter.RemoveLayout( nextVisual );
|
|
572 |
// Check if the next thumbnail was succesfully loaded
|
|
573 |
if ( iFailedThumbnailIndex == nextIndex )
|
|
574 |
{
|
|
575 |
TAlfTimedValue opacity(KMaxOpacity,0);
|
|
576 |
// Set Opacity to make it visible
|
|
577 |
nextVisual->SetOpacity(opacity);
|
|
578 |
// set the temporary layout for default icon
|
|
579 |
iSplitter.SetLayoutL( &iDefaultIconLayout, nextVisual );
|
|
580 |
}
|
|
581 |
else
|
|
582 |
{
|
|
583 |
// enter view mode for the effect
|
|
584 |
// add the layout chain to the current visual
|
|
585 |
iSplitter.SetLayoutL(
|
|
586 |
nextEffect->EnterViewL( nextVisual, iViewDuration, duration ),
|
|
587 |
nextVisual );
|
|
588 |
}
|
|
589 |
|
|
590 |
|
|
591 |
// proceed on the list, 1 step forward
|
|
592 |
NavigateListL( KNavigateForwards );
|
|
593 |
|
|
594 |
|
|
595 |
// fix for EVTY-7H8BV5
|
|
596 |
// When transition is happening from current to next visual, we are seeing next to next visual
|
|
597 |
// which is not needed so making next to next visual to invisible
|
|
598 |
TInt nextToNextIndex = NextListIndex( KNavigateForwards );
|
|
599 |
CAlfVisual* nextToNextVisual = iVisualList.Visual( nextToNextIndex );
|
|
600 |
if(nextToNextVisual != iPreviousVisual)
|
|
601 |
{
|
|
602 |
TAlfTimedValue opacity(KMinOpacity,0);
|
|
603 |
nextToNextVisual->SetOpacity(opacity);
|
|
604 |
}
|
|
605 |
|
|
606 |
// need to send ready to view as in the normal case we already are
|
|
607 |
// (the image is already there)
|
|
608 |
TShwEventReadyToView readyToView;
|
|
609 |
SendEventL( &readyToView );
|
|
610 |
|
|
611 |
// need to start timer to send the transition ready
|
|
612 |
iTransitionTimer->Start(duration, duration, TShwCallBack<
|
|
613 |
CShwEffectControl, &CShwEffectControl::SendTransitionReadyL> (
|
|
614 |
this));
|
|
615 |
}
|
|
616 |
|
|
617 |
// -----------------------------------------------------------------------------
|
|
618 |
// HandlePauseEventL.
|
|
619 |
// -----------------------------------------------------------------------------
|
|
620 |
void CShwEffectControl::HandlePauseEventL()
|
|
621 |
{
|
|
622 |
TRACER("CShwEffectControl::HandlePauseEventL");
|
|
623 |
GLX_LOG_INFO( "CShwEffectControl::HandlePauseEventL" );
|
|
624 |
|
|
625 |
// Need to know if user navigates during pause
|
|
626 |
iUserNavigated = EFalse;
|
|
627 |
|
|
628 |
// if we are in transition, pause the timer
|
|
629 |
if ( iState == EShwEffectStateInTransition )
|
|
630 |
{
|
|
631 |
iTransitionTimer->Pause();
|
|
632 |
iPausedVisuals.AppendL(iPreviousVisual);
|
|
633 |
}
|
|
634 |
// Store the current visual
|
|
635 |
iPausedVisuals.AppendL(iCurrentVisual);
|
|
636 |
//subhasis commented 1 line
|
|
637 |
//API depricated in visual list manager
|
|
638 |
iSplitter.RemoveLayout( iCurrentVisual );
|
|
639 |
iSplitter.SetLayoutL( &iPausedLayout, iCurrentVisual );
|
|
640 |
// we need to pause all effects as user may navigate while we are in pause
|
|
641 |
// and user navigation may change the current and next effect
|
|
642 |
RPointerArray< MShwEffect > effects;
|
|
643 |
// need to close the array in case of a leave
|
|
644 |
CleanupClosePushL( effects );
|
|
645 |
iEffectManager.GetActiveEffectsL( effects );
|
|
646 |
// loop through all active ones
|
|
647 |
for( TInt i = 0; i < effects.Count(); ++i )
|
|
648 |
{
|
|
649 |
// get the effect and pause it
|
|
650 |
effects[ i ]->PauseL();
|
|
651 |
}
|
|
652 |
CleanupStack::PopAndDestroy( &effects );
|
|
653 |
}
|
|
654 |
|
|
655 |
// -----------------------------------------------------------------------------
|
|
656 |
// HandleResumeEventL.
|
|
657 |
// -----------------------------------------------------------------------------
|
|
658 |
void CShwEffectControl::HandleResumeEventL()
|
|
659 |
{
|
|
660 |
TRACER("CShwEffectControl::HandleResumeEventL");
|
|
661 |
GLX_LOG_INFO( "CShwEffectControl::HandleResumeEventL" );
|
|
662 |
// we need to resume all effects as user may navigate while we are in pause
|
|
663 |
// and user navigation may change the current and next effect
|
|
664 |
RPointerArray< MShwEffect > effects;
|
|
665 |
// need to close the array in case of a leave
|
|
666 |
CleanupClosePushL( effects );
|
|
667 |
iEffectManager.GetActiveEffectsL( effects );
|
|
668 |
// loop through all active ones
|
|
669 |
for( TInt i = 0; i < effects.Count(); ++i )
|
|
670 |
{
|
|
671 |
// get the effect and pause it
|
|
672 |
effects[ i ]->Resume();
|
|
673 |
}
|
|
674 |
CleanupStack::PopAndDestroy( &effects );
|
|
675 |
|
|
676 |
if( iUserNavigated )
|
|
677 |
{ // user navigated while paused
|
|
678 |
// resume and cancel the transition timer for its next use
|
|
679 |
// if user navigates while pause
|
|
680 |
// we never continue from transition so we need
|
|
681 |
// to resume the timer, otherwise it stays paused forever
|
|
682 |
iTransitionTimer->Resume();
|
|
683 |
iTransitionTimer->Cancel();
|
|
684 |
}
|
|
685 |
// if we are in transition, resume the timer
|
|
686 |
else if ( iState == EShwEffectStateInTransition )
|
|
687 |
{
|
|
688 |
// restart timer to continue the transition
|
|
689 |
iTransitionTimer->Resume();
|
|
690 |
TInt count = iPausedVisuals.Count();
|
|
691 |
if (count > 0)
|
|
692 |
{
|
|
693 |
while (count > 0)
|
|
694 |
{
|
|
695 |
//remove the visuals
|
|
696 |
iPausedVisuals.Remove(--count);
|
|
697 |
}
|
|
698 |
}
|
|
699 |
}
|
|
700 |
}
|
|
701 |
|
|
702 |
// -----------------------------------------------------------------------------
|
|
703 |
// HandleNextImageEventL.
|
|
704 |
// -----------------------------------------------------------------------------
|
|
705 |
void CShwEffectControl::HandleNextImageEventL()
|
|
706 |
{
|
|
707 |
TRACER("CShwEffectControl::HandleNextImageEventL");
|
|
708 |
GLX_LOG_INFO( "CShwEffectControl::HandleNextImageEventL" );
|
|
709 |
|
|
710 |
// reset the flag so that we do prepare and start view for the visual
|
|
711 |
iEffectLoopRestarted = EFalse;
|
|
712 |
// set user navigate flag so that we do ExitView in resume
|
|
713 |
iUserNavigated = ETrue;
|
|
714 |
|
|
715 |
// get current effect
|
|
716 |
MShwEffect* currentEffect = iEffectManager.CurrentEffect();
|
|
717 |
// inform the effect that view mode ended
|
|
718 |
currentEffect->ExitView( iCurrentVisual );
|
|
719 |
// remove the view layout
|
|
720 |
//subhasis commented 1 line
|
|
721 |
//API depricated in visual list manager
|
|
722 |
iSplitter.RemoveLayout( iCurrentVisual );
|
|
723 |
// were we in transition
|
|
724 |
if ( iState == EShwEffectStateInTransition )
|
|
725 |
{
|
|
726 |
// we're in transition so the navigation is complete but we
|
|
727 |
// want to view to the current visual immediately
|
|
728 |
// in transition two effects exist, previous and current
|
|
729 |
// and we're moving from the previous visual to the current visual
|
|
730 |
|
|
731 |
// remove the layout from previous
|
|
732 |
//subhasis commented 1 line
|
|
733 |
//API depricated in visual list manager
|
|
734 |
iSplitter.RemoveLayout( iPreviousVisual );
|
|
735 |
// cancel the timer to prevent a duplicate start view event
|
|
736 |
iTransitionTimer->Cancel();
|
|
737 |
}
|
|
738 |
else
|
|
739 |
{
|
|
740 |
// we're in the view state
|
|
741 |
// so we want to stop viewing the current visual
|
|
742 |
// and show the next one
|
|
743 |
|
|
744 |
// proceed on the list, 1 step forward
|
|
745 |
NavigateListL( KNavigateForwards );
|
|
746 |
|
|
747 |
// set the temporary layout for default icon
|
|
748 |
iSplitter.SetLayoutL( &iDefaultIconLayout, iCurrentVisual );
|
|
749 |
}
|
|
750 |
|
|
751 |
// call prepareview for the effect and load the image
|
|
752 |
PrepareAndLoadImageToViewL();
|
|
753 |
}
|
|
754 |
|
|
755 |
// -----------------------------------------------------------------------------
|
|
756 |
// HandlePreviousImageEventL.
|
|
757 |
// -----------------------------------------------------------------------------
|
|
758 |
void CShwEffectControl::HandlePreviousImageEventL()
|
|
759 |
{
|
|
760 |
TRACER("CShwEffectControl::HandlePreviousImageEventL");
|
|
761 |
GLX_LOG_INFO( "CShwEffectControl::HandlePreviousImageEventL" );
|
|
762 |
|
|
763 |
// reset the flag so that we do prepare and start view for the visual
|
|
764 |
iEffectLoopRestarted = EFalse;
|
|
765 |
// set user navigate flag so that we do EnterView in next StartView
|
|
766 |
iUserNavigated = ETrue;
|
|
767 |
|
|
768 |
// ExitView - current
|
|
769 |
// get current effect
|
|
770 |
MShwEffect* currentEffect = iEffectManager.CurrentEffect();
|
|
771 |
// inform the effect that view mode ended
|
|
772 |
currentEffect->ExitView( iCurrentVisual );
|
|
773 |
// remove the current layout
|
|
774 |
//subhasis commented 1 line
|
|
775 |
//API depricated in visual list manager
|
|
776 |
iSplitter.RemoveLayout( iCurrentVisual );
|
|
777 |
// remove the previous layout as well, its no-op if there wasnt one
|
|
778 |
iSplitter.RemoveLayout( iPreviousVisual );
|
|
779 |
// proceed on the list, 1 step backwards
|
|
780 |
NavigateListL( KNavigateBackwards );
|
|
781 |
|
|
782 |
// were we in transition
|
|
783 |
if ( iState == EShwEffectStateInTransition )
|
|
784 |
{
|
|
785 |
// as we're in transition, the focus index has already been
|
|
786 |
// updated to the next item so we need to step back
|
|
787 |
|
|
788 |
// cancel the timer to prevent a duplicate start view event
|
|
789 |
iTransitionTimer->Cancel();
|
|
790 |
}
|
|
791 |
else
|
|
792 |
{
|
|
793 |
// EnterView - previous
|
|
794 |
// set the temporary layout for default icon
|
|
795 |
iSplitter.SetLayoutL( &iDefaultIconLayout, iCurrentVisual );
|
|
796 |
}
|
|
797 |
|
|
798 |
// call prepareview for the effect and load the image
|
|
799 |
PrepareAndLoadImageToViewL();
|
|
800 |
}
|
|
801 |
|
|
802 |
// -----------------------------------------------------------------------------
|
|
803 |
// NavigateListL.
|
|
804 |
// -----------------------------------------------------------------------------
|
|
805 |
void CShwEffectControl::NavigateListL( TInt aDirection )
|
|
806 |
{
|
|
807 |
TRACER("CShwEffectControl::NavigateListL");
|
|
808 |
// reset the failed index value as the failure might be temporary
|
|
809 |
iFailedThumbnailIndex = KErrNotFound;
|
|
810 |
// navigate the visual list
|
|
811 |
iVisualList.NavigateL( aDirection );
|
|
812 |
// store current effect as previous
|
|
813 |
iPreviousEffect = iEffectManager.CurrentEffect();
|
|
814 |
// navigate to the next effect
|
|
815 |
iEffectManager.ProceedToEffect( aDirection );
|
|
816 |
}
|
|
817 |
|
|
818 |
// -----------------------------------------------------------------------------
|
|
819 |
// NextListIndex.
|
|
820 |
// -----------------------------------------------------------------------------
|
|
821 |
TInt CShwEffectControl::NextListIndex( TInt aDirection )
|
|
822 |
{
|
|
823 |
TRACER("CShwEffectControl::NextListIndex");
|
|
824 |
// next index in list is focus plus direction and then wrap around
|
|
825 |
TInt newIndex =
|
|
826 |
( iVisualList.FocusIndex() + aDirection ) % iVisualList.ItemCount();
|
|
827 |
if( newIndex < 0 )
|
|
828 |
{
|
|
829 |
// navigating left
|
|
830 |
// sign for modulo is the same as left side so need to add itemcount
|
|
831 |
newIndex += iVisualList.ItemCount();
|
|
832 |
}
|
|
833 |
return newIndex;
|
|
834 |
}
|