2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/event/common/property-notification-impl.h>
22 #include <dali/public-api/common/dali-common.h>
23 #include <dali/public-api/math/vector2.h>
24 #include <dali/public-api/math/radian.h>
25 #include <dali/internal/event/actors/actor-impl.h>
26 #include <dali/internal/event/common/property-notification-manager.h>
27 #include <dali/internal/event/common/proxy-object.h>
28 #include <dali/internal/event/common/stage-impl.h>
29 #include <dali/internal/update/manager/update-manager.h>
30 #include <dali/internal/update/common/scene-graph-property-notification.h>
31 #include <dali/internal/event/common/thread-local-storage.h>
33 using Dali::Internal::SceneGraph::UpdateManager;
41 PropertyNotificationPtr PropertyNotification::New(Property& target,
43 const Dali::PropertyCondition& condition)
45 ThreadLocalStorage& tls = ThreadLocalStorage::Get();
47 UpdateManager& updateManager = tls.GetUpdateManager();
49 PropertyNotificationManager& propertyNotificationManager = Stage::GetCurrent()->GetPropertyNotificationManager();
51 PropertyNotificationPtr propertyNotification = new PropertyNotification(updateManager,
52 propertyNotificationManager,
57 return propertyNotification;
60 PropertyNotification::PropertyNotification(UpdateManager& updateManager,
61 PropertyNotificationManager& propertyNotificationManager,
64 const Dali::PropertyCondition& condition)
65 : mUpdateManager(updateManager),
66 mPropertyNotification(NULL),
67 mPropertyNotificationManager(propertyNotificationManager),
68 mProxyPropertyIndex(target.propertyIndex),
69 mPropertyType(Property::NONE),
70 mComponentIndex(componentIndex),
71 mCondition(condition),
72 mNotifyMode(Dali::PropertyNotification::NotifyOnTrue),
75 // Set condition arguments (as simple vector of floats)
76 PropertyCondition::ArgumentContainer arguments = GetImplementation(condition).arguments;
77 PropertyCondition::ArgumentConstIter iter = arguments.begin();
79 while( iter != arguments.end() )
81 const Property::Value& value = *iter;
83 value.Get(floatValue);
85 mRawConditionArgs.PushBack( floatValue );
89 // Observe target proxy and create/destroy notification scene object accordingly.
90 mProxy = dynamic_cast<ProxyObject*>( &GetImplementation(target.object) );
93 mPropertyType = mProxy->GetPropertyType(mProxyPropertyIndex);
95 int internalComponentIndex = mProxy->GetPropertyComponentIndex(mProxyPropertyIndex);
96 if( internalComponentIndex != Property::INVALID_COMPONENT_INDEX )
98 // override the one passed in
99 mComponentIndex = internalComponentIndex;
101 if(mComponentIndex != Property::INVALID_COMPONENT_INDEX)
103 Property::Type type = mProxy->GetPropertyType(mProxyPropertyIndex);
104 if( type == Property::VECTOR2
105 || type == Property::VECTOR3
106 || type == Property::VECTOR4 )
108 mPropertyType = Property::FLOAT;
112 // Check if target scene-object already present, and if so create our notification
114 const SceneGraph::PropertyOwner* object = mProxy->GetSceneObject();
121 // Connect to the property notification manager
122 mPropertyNotificationManager.PropertyNotificationCreated( *this );
125 PropertyNotification::~PropertyNotification()
129 // Guard to disallow use of PropertyNotificationManager after Core has been destroyed
130 if ( Stage::IsInstalled() )
132 // Disconnect from the property notification manager
133 mPropertyNotificationManager.PropertyNotificationDestroyed( *this );
137 Dali::PropertyNotifySignalV2& PropertyNotification::NotifySignal()
139 return mNotifySignal;
142 void PropertyNotification::EmitSignalNotify()
144 Dali::PropertyNotification source(this);
146 mNotifySignal.Emit( source );
149 void PropertyNotification::Enable()
154 void PropertyNotification::Disable()
156 // Guard to allow handle destruction after Core has been destroyed
157 if ( Stage::IsInstalled() )
159 // Stop scene-graph from monitoring the target's properties.
160 DestroySceneObject();
164 void PropertyNotification::SetNotifyResult( bool result )
166 mNotifyResult = result;
169 const Dali::PropertyCondition& PropertyNotification::GetCondition() const
174 Dali::Handle PropertyNotification::GetTarget() const
176 Dali::Handle handle(mProxy);
181 Property::Index PropertyNotification::GetTargetProperty() const
183 return mProxyPropertyIndex;
186 void PropertyNotification::SetNotifyMode( NotifyMode mode )
189 if( mPropertyNotification )
191 PropertyNotificationSetNotifyModeMessage( mUpdateManager, mPropertyNotification, mode );
195 PropertyNotification::NotifyMode PropertyNotification::GetNotifyMode()
200 bool PropertyNotification::GetNotifyResult() const
202 return mNotifyResult;
205 bool PropertyNotification::CompareSceneObject( const SceneGraph::PropertyNotification* sceneObject )
207 return sceneObject && sceneObject == mPropertyNotification;
210 void PropertyNotification::CreateSceneObject()
212 DALI_ASSERT_DEBUG( mPropertyNotification == NULL );
214 // Create a new PropertyNotification, temporarily owned
215 SceneGraph::PropertyNotification* propertyNotification = SceneGraph::PropertyNotification::New( *mProxy,
219 GetImplementation(mCondition).type,
222 // Keep a const pointer to the PropertyNotification.
223 mPropertyNotification = propertyNotification;
225 // Transfer scene object ownership to the update manager through a message
226 AddPropertyNotificationMessage( mUpdateManager, propertyNotification );
229 void PropertyNotification::DestroySceneObject()
231 if ( mPropertyNotification != NULL )
233 // Remove PropertyNotification using a message to the update manager
234 RemovePropertyNotificationMessage( mUpdateManager, *mPropertyNotification );
235 mPropertyNotification = NULL;
239 } // namespace Internal