1 #ifndef DALI_TOOLKIT_INTERNAL_BUILDER_H
2 #define DALI_TOOLKIT_INTERNAL_BUILDER_H
5 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/integration-api/debug.h>
23 #include <dali/public-api/actors/actor.h>
24 #include <dali/public-api/common/vector-wrapper.h>
25 #include <dali/public-api/object/base-object.h>
26 #include <dali/public-api/object/property-map.h>
27 #include <dali/public-api/render-tasks/render-task.h>
33 #include <dali-toolkit/devel-api/builder/builder.h>
34 #include <dali-toolkit/devel-api/builder/json-parser.h>
35 #include <dali-toolkit/internal/builder/builder-declarations.h>
36 #include <dali-toolkit/internal/builder/style.h>
38 // Warning messages usually displayed
39 #define DALI_SCRIPT_WARNING(format, ...) \
40 DALI_LOG_WARNING("Script:" format, ##__VA_ARGS__)
42 // Info messages are usually debug build
43 #define DALI_SCRIPT_INFO(format, ...) \
44 DALI_LOG_INFO(Dali::Toolkit::Internal::gFilterScript, Debug::General, "Script:" format, ##__VA_ARGS__)
46 // Info Verbose need to be swiched on in gFilterScript filter constructor (by default set to General)
47 #define DALI_SCRIPT_VERBOSE(format, ...) \
48 DALI_LOG_INFO(Dali::Toolkit::Internal::gFilterScript, Debug::Verbose, "Script:" format, ##__VA_ARGS__)
61 #if defined(DEBUG_ENABLED)
62 extern Dali::Integration::Log::Filter* gFilterScript;
69 * @copydoc Toolkit::Builder
71 class Builder : public Dali::BaseObject
77 * @copydoc Toolkit::Builder::LoadFromString
79 void LoadFromString(const std::string& data,
80 Dali::Toolkit::Builder::UIFormat rep = Dali::Toolkit::Builder::JSON);
83 * @copydoc Toolkit::Builder::AddConstants
85 void AddConstants(const Property::Map& map);
88 * @copydoc Toolkit::Builder::AddConstant
90 void AddConstant(const std::string& key, const Property::Value& value);
93 * @copydoc Toolkit::Builder::GetConfigurations
95 const Property::Map& GetConfigurations() const;
98 * @copydoc Toolkit::Builder::GetConstants
100 const Property::Map& GetConstants() const;
103 * @copydoc Toolkit::Builder::GetConstant
105 const Property::Value& GetConstant(const std::string& key) const;
108 * @copydoc Toolkit::Builder::CreateAnimation( const std::string& animationName );
110 Animation CreateAnimation(const std::string& animationName);
113 * @copydoc Toolkit::Builder::CreateAnimation( const std::string& animationName, const Property::Map& map );
115 Animation CreateAnimation(const std::string& animationName, const Property::Map& map);
118 * @copydoc Toolkit::Builder::CreateAnimation( const std::string&,Dali::Actor);
120 Animation CreateAnimation(const std::string& animationName, Dali::Actor sourceActor);
123 * @copydoc Toolkit::Builder::CreateAnimation( const std::string&,const Property::Map&, Dali::Actor);
125 Animation CreateAnimation(const std::string& animationName, const Property::Map& map, Dali::Actor sourceActor);
128 * @copydoc Toolkit::Builder::Create( const std::string& templateName );
130 BaseHandle Create(const std::string& templateName);
133 * @copydoc Toolkit::Builder::Create( const std::string& templateName, const Property::Map& map );
135 BaseHandle Create(const std::string& templateName, const Property::Map& map);
138 * @copydoc Toolkit::Builder::CreateFromJson( const std::string& json );
140 BaseHandle CreateFromJson(const std::string& json);
143 * @copydoc Toolkit::Builder::ApplyFromJson( Handle& handle, const std::string& json );
145 bool ApplyFromJson(Handle& handle, const std::string& json);
148 * @copydoc Toolkit::Builder::ApplyStyle
150 bool ApplyStyle(const std::string& styleName, Handle& handle);
153 * Lookup the stylename in builder. If it's found in the parse tree,
155 * @param[in] styleName The style name to search for
156 * @return true if the stylename exists
158 bool LookupStyleName(const std::string& styleName);
161 * Lookup the stylename in the recorded Styles - if it exists,
162 * performs a shallow copy to the passed in style and returns true.
163 * Otherwise it returns false.
165 * @param[in] styleName The stylename to search for
166 * @return A const pointer to the style object
168 const StylePtr GetStyle(const std::string& styleName);
171 * @copydoc Toolkit::Builder::AddActors
173 void AddActors(Actor toActor);
176 * @copydoc Toolkit::Builder::AddActors
178 void AddActors(const std::string& sectionName, Actor toActor);
181 * @copydoc Toolkit::Builder::CreateRenderTask
183 void CreateRenderTask(const std::string& name);
186 * @copydoc Toolkit::Builder::GetPath
188 Path GetPath(const std::string& name);
191 * @copydoc Toolkit::Builder::GetPathConstrainer
193 Dali::PathConstrainer GetPathConstrainer(const std::string& name);
196 * Check if a given constrainer is of type PathConstrainer
197 * @param[in] name The name of the constrainer
198 * @return True if constainer is of type PathConstrainer, False otherwise
201 bool IsPathConstrainer(const std::string& name);
204 * @copydoc Toolkit::Builder::GetLinearConstrainer
206 Dali::LinearConstrainer GetLinearConstrainer(const std::string& name);
209 * Check if a given constrainer is of type LinearConstrainer
210 * @param[in] name The name of the constrainer
211 * @return True if constainer is of type LinearConstrainer, False otherwise
214 bool IsLinearConstrainer(const std::string& name);
217 * @copydoc Toolkit::Builder::QuitSignal
219 Toolkit::Builder::BuilderSignalType& QuitSignal();
222 * Emits the quit signal
224 void EmitQuitSignal();
230 typedef std::vector<const char*> KeyStack;
231 typedef std::vector<TreeNode::KeyNodePair> MappingsLut;
235 Dali::LinearConstrainer linearConstrainer;
236 } LinearConstrainerEntry;
237 typedef std::vector<LinearConstrainerEntry> LinearConstrainerLut;
241 Dali::PathConstrainer pathConstrainer;
242 } PathConstrainerEntry;
243 typedef std::vector<PathConstrainerEntry> PathConstrainerLut;
244 typedef std::map<const std::string, Path> PathLut;
248 Builder(const Builder&);
251 Builder& operator=(const Builder& rhs);
253 void LoadConstants(const TreeNode& root, Property::Map& intoMap);
255 void LoadConfiguration(const TreeNode& root, Property::Map& intoMap);
257 Animation CreateAnimation(const std::string& animationName,
258 const Replacement& replacement,
259 Dali::Actor sourceActor);
261 BaseHandle Create(const std::string& templateName,
262 const Replacement& constant);
264 BaseHandle DoCreate(const TreeNode& root,
265 const TreeNode& node,
267 const Replacement& replacements);
269 void SetupTask(RenderTask& task,
270 const Toolkit::TreeNode& node,
271 const Replacement& replacement);
273 bool ApplyStyle(const std::string& styleName,
275 const Replacement& replacement);
277 void ApplyAllStyleProperties(const TreeNode& root,
278 const TreeNode& node,
279 Dali::Handle& handle,
280 const Replacement& constant);
282 void RecordStyles(const char* styleName,
283 const TreeNode& node,
284 Dali::Handle& handle,
285 const Replacement& replacements);
287 void RecordStyle(StylePtr style,
288 const TreeNode& node,
289 Dali::Handle& handle,
290 const Replacement& replacements);
292 void RecordTransitions(const TreeNode::KeyNodePair& keyValue,
293 Property::Array& transitions,
294 const Replacement& replacements);
296 void RecordTransitionData(const TreeNode::KeyNodePair& keyNode,
297 Toolkit::TransitionData& transitionData,
298 const Replacement& replacements);
300 void ApplyProperties(const TreeNode& root,
301 const TreeNode& node,
302 Dali::Handle& handle,
303 const Replacement& constant);
305 void ApplySignals(const TreeNode& root,
306 const TreeNode& node,
307 Dali::Handle& handle);
309 void ApplyStylesByActor(const TreeNode& root,
310 const TreeNode& node,
311 Dali::Handle& handle,
312 const Replacement& constant);
314 void SetProperties(const TreeNode& node,
316 const Replacement& constant);
318 bool MapToTargetProperty(Handle& propertyObject,
319 const std::string& key,
320 const TreeNode& node,
321 const Replacement& constant,
322 Property::Index& index,
323 Property::Value& value);
326 * Find the key in the mapping table, if it's present, then generate
327 * a property value for it (of the given type if available),
328 * recursing as necessary, and stopping if any cycles are detected.
330 * @param[in] mappingRoot The JSON node containing the mappings
331 * @param[in] theKey The key to search for
332 * @param[in] propertyType The property type if known, or NONE
333 * @param[in,out] value The string value to test and write back to.
335 bool GetPropertyMap(const TreeNode& mappingRoot,
337 Property::Type propertyType,
338 Property::Value& value);
340 void SetCustomProperties(const TreeNode& node,
342 const Replacement& constant,
343 const std::string& childName,
344 Property::AccessMode accessMode);
347 * Find the key in the mapping table, if it's present, then generate
348 * a property value for it (of the given type if available),
349 * recursing as necessary, and stopping if any cycles are detected.
351 * @param[in] mappingRoot The JSON node containing the mappings
352 * @param[in] theKey The key to search for
353 * @param[in,out] keyStack the stack of visited keys
354 * @param[in] propertyType The property type if known, or NONE
355 * @param[in,out] value The string value to test and write back to.
357 bool RecursePropertyMap(const TreeNode& mappingRoot,
360 Property::Type propertyType,
361 Property::Value& value);
364 * Tests if the value is a string delimited by <>. If it is, then it attempts to
365 * change the value to the mapping from a matching key in the mappings table.
366 * @param[in] mappingRoot The JSON node containing the mappings
367 * @param[in,out] keyStack the stack of visited keys
368 * @param[in,out] value The string value to test and write back to.
369 * @return true if the value was converted, false otherwise.
371 bool ConvertChildValue(const TreeNode& mappingRoot,
373 Property::Value& value);
376 Toolkit::JsonParser mParser;
378 PathConstrainerLut mPathConstrainerLut;
379 LinearConstrainerLut mLinearConstrainerLut;
380 SlotDelegate<Builder> mSlotDelegate;
381 Property::Map mReplacementMap;
382 Property::Map mConfigurationMap;
383 MappingsLut mCompleteMappings;
384 Dictionary<StylePtr> mStyles; // State based styles
385 Toolkit::Builder::BuilderSignalType mQuitSignal;
388 } // namespace Internal
390 inline Internal::Builder& GetImpl(Dali::Toolkit::Builder& obj)
392 DALI_ASSERT_ALWAYS(obj);
394 Dali::BaseObject& handle = obj.GetBaseObject();
396 return static_cast<Internal::Builder&>(handle);
399 inline const Internal::Builder& GetImpl(const Dali::Toolkit::Builder& obj)
401 DALI_ASSERT_ALWAYS(obj);
403 const Dali::BaseObject& handle = obj.GetBaseObject();
405 return static_cast<const Internal::Builder&>(handle);
408 } // namespace Toolkit
412 #endif // DALI_TOOLKIT_INTERNAL_BUILDER_H