/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
*/
-// FILE HEADER
-
+// CLASS HEADER
#include "relayout-controller-impl.h"
// EXTERNAL INCLUDES
#endif // defined(DEBUG_ENABLED)
// INTERNAL INCLUDES
-#include <dali/public-api/actors/layer.h>
-#include <dali/public-api/common/stage.h>
#include <dali/integration-api/debug.h>
#include <dali/integration-api/render-controller.h>
#include <dali/public-api/object/type-registry.h>
#include <dali/public-api/object/object-registry.h>
#include <dali/internal/event/actors/actor-impl.h>
+#include <dali/internal/event/common/stage-impl.h>
+#include <dali/internal/event/common/system-overlay-impl.h>
#include <dali/internal/event/common/thread-local-storage.h>
namespace Dali
if ( gLogFilter->IsEnabledFor( Debug::Verbose ) )
{
DALI_LOG_INFO( gLogFilter, Debug::Verbose, "---------- ROOT LAYER ----------\n" );
- PrintChildren( Dali::Stage().GetCurrent().GetRootLayer(), 0 );
+ PrintChildren( Stage::GetCurrent()->GetRootLayer(), 0 );
}
}
} // unnamed namespace
-RelayoutController* RelayoutController::Get()
-{
- return &ThreadLocalStorage::Get().GetRelayoutController();
-}
-
RelayoutController::RelayoutController( Integration::RenderController& controller )
: mRenderController( controller ),
mRelayoutInfoAllocator(),
mSlotDelegate( this ),
mRelayoutStack( new MemoryPoolRelayoutContainer( mRelayoutInfoAllocator ) ),
+ mStageSize(), // zero initialized
mRelayoutConnection( false ),
mRelayoutFlag( false ),
mEnabled( false ),
delete mRelayoutStack;
}
+RelayoutController* RelayoutController::Get()
+{
+ return &ThreadLocalStorage::Get().GetRelayoutController();
+}
+
+void RelayoutController::SetStageSize( unsigned int width, unsigned int height )
+{
+ mStageSize.width = width;
+ mStageSize.height = height;
+}
+
void RelayoutController::QueueActor( Dali::Actor& actor, RelayoutContainer& actors, Vector2 size )
{
if( GetImplementation( actor ).RelayoutRequired() )
}
}
- // Request this actor as head of sub-tree if it is not dependent on a parent that is dirty
- Dali::Actor subTreeActor = topOfSubTreeStack.back();
- Dali::Actor parent = subTreeActor.GetParent();
- if( !parent || !( GetImplementation( subTreeActor ).RelayoutDependentOnParent() && GetImplementation( parent ).RelayoutRequired() ) )
+ while( !topOfSubTreeStack.empty() )
{
- // Add sub tree root to relayout list
- AddRequest( subTreeActor );
+ // Request this actor as head of sub-tree if it is not dependent on a parent that is dirty
+ Dali::Actor subTreeActor = topOfSubTreeStack.back();
+ topOfSubTreeStack.pop_back();
- // Flag request for end of frame
- Request();
- }
- else
- {
- potentialRedundantSubRoots.push_back( subTreeActor );
+ Dali::Actor parent = subTreeActor.GetParent();
+ if( !parent || !( GetImplementation( subTreeActor ).RelayoutDependentOnParent() && GetImplementation( parent ).RelayoutRequired() ) )
+ {
+ // Add sub tree root to relayout list
+ AddRequest( subTreeActor );
+
+ // Flag request for end of frame
+ Request();
+ }
+ else
+ {
+ potentialRedundantSubRoots.push_back( subTreeActor );
+ }
}
// Remove any redundant sub-tree heads
if ( !mProcessingCoreEvents )
{
- mRenderController.RequestProcessEventsOnIdle();
+ mRenderController.RequestProcessEventsOnIdle( false );
}
}
// Spread the dirty flag through whole tree - don't need to explicity
// add request on rootLayer as it will automatically be added below.
- Dali::Actor rootLayer = Dali::Stage::GetCurrent().GetRootLayer();
+ Dali::Stage stage = Dali::Stage::GetCurrent();
+ Dali::Actor rootLayer = stage.GetRootLayer();
RequestRelayoutTree( rootLayer );
+ // Also add request on the root of system overlay
+ Dali::Internal::SystemOverlay* systemOverlay = GetImplementation(stage).GetSystemOverlayInternal();
+ if( systemOverlay )
+ {
+ Dali::Internal::Actor& systemOverlayInternalRoot = systemOverlay->GetDefaultRootActor();
+ Dali::Actor systemOverlayRoot = Dali::Actor(&systemOverlayInternalRoot);
+ RequestRelayoutTree( systemOverlayRoot );
+ }
+
// Flag request for end of frame
Request();
}
// 1. Finds all top-level controls from the dirty list and allocate them the size of the stage
// These controls are paired with the parent/stage size and added to the stack.
- const Vector2 stageSize = Dali::Stage::GetCurrent().GetSize();
-
for( RawActorList::Iterator it = mDirtyLayoutSubTrees.Begin(), itEnd = mDirtyLayoutSubTrees.End(); it != itEnd; ++it )
{
BaseObject* dirtyActor = *it;
if( actor.OnStage() )
{
Dali::Actor parent = actor.GetParent();
- QueueActor( actor, *mRelayoutStack, ( parent ) ? Vector2( parent.GetTargetSize() ) : stageSize );
+ QueueActor( actor, *mRelayoutStack, ( parent ) ? Vector2( parent.GetTargetSize() ) : mStageSize );
}
}
}
// 3. Negotiate the size with the current actor. Pass it an empty container which the actor
// has to fill with all the actors it has not done any size negotiation for.
+
actorImpl.NegotiateSize( size, *mRelayoutStack );
+
+ // Reset the flag so that size negotiation will respect the actor's original resize policy
+ actorImpl.SetUseAssignedSize( false );
}
}