You.i Engine
YiLayout.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_LAYOUT_H_
3 #define _YI_LAYOUT_H_
4 
6 #include "framework/YiPredef.h"
8 #include "view/YiSceneView.h"
9 
10 class CYILayoutState;
11 
160 {
161 public:
166  {
171 
176  };
177 
179 
180  CYILayout();
181  virtual ~CYILayout();
182 
190  void AttachTo(CYISceneView *pView);
191 
196 
200  void DetachFromNode();
201 
206 
212  void Measure(const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec);
213 
219  void ApplyMeasurements();
220 
226  void SetPositioningMode(POSITIONING_MODE ePositioningMode);
227 
229 
235  virtual void ChildAdded(CYISceneNode *pChild);
236 
242  virtual void ChildRemoved(CYISceneNode *pChild);
243 
249  virtual void ChildVisibilityChanged(CYISceneNode *pChild);
250 
251 
255  void SetPadding(const Padding &padding);
256 
257  const Padding &GetPadding() const;
258 
262  void SetUseReverseChildrenOrder(bool bUseReverseChildrenOrder);
263 
264  bool IsUsingReverseChildrenOrder() const;
265 
277  void SetGravity(const glm::vec3 &vLayoutGravity);
278 
285  void SetGravity(CYILayoutConfig::GRAVITY eGravity);
286 
287  const glm::vec3 &GetGravity() const;
288 
289 
293  static void RegisterAllLayouts();
294 
298  static bool IsLayoutable(const CYISceneNode *pNode);
299 
303  static glm::vec3 GetDefaultSize(const CYISceneNode *pNode, const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec);
304 
312  static void UpdateMeasuredSizeForFitContent(const CYISceneNode *pNode, glm::vec3 *pMeasuredSize, const glm::vec3 &contentSize, const Padding &padding, const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec);
313 
317  static void UnscaleMeasureSpecs(const glm::vec3 &vScale, CYISceneNode::MeasureSpec *pWidthSpec, CYISceneNode::MeasureSpec *pHeightSpec, CYISceneNode::MeasureSpec *pDepthSpec);
318 
322  static float CalculateDimension(const CYISceneNode::MeasureSpec &spec, const CYILayoutConfig::SizeConstraint &constraint, float fCurrentValue);
323 
324 protected:
330  virtual void Configure();
331 
335  virtual void OnSceneViewAttached();
336 
346  virtual void OnMeasure(const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec) = 0;
347 
357  virtual void OnApplyMeasurements() = 0;
358 
362  virtual void OnMeasurementsCalculated(const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec);
363 
367  virtual void OnMeasurementsApplied();
368 
374  virtual const CYIRuntimeTypeInfo &GetLayoutConfigType() const;
375 
383  virtual std::unique_ptr<CYILayoutState> CreateLayoutStateInstance() const;
384 
388  virtual void ApplyPosition(CYISceneNode *pChild, const glm::vec3 &vPosition);
389 
393  virtual void ApplySize(CYISceneNode *pChild, const glm::vec3 &vSize);
394 
400  static void MeasureChildWithMargins(CYISceneNode *pChild, const CYISceneNode::MeasureSpec &parentWidthSpec, const CYISceneNode::MeasureSpec &parentHeightSpec, const CYISceneNode::MeasureSpec &parentDepthSpec, const Padding &padding);
401 
405  static void MeasureChildWithMargins(CYISceneNode *pChild, const CYISceneNode::MeasureSpec &parentWidthSpec, const CYISceneNode::MeasureSpec &parentHeightSpec, const CYISceneNode::MeasureSpec &parentDepthSpec, const Padding &padding, const glm::vec3 &vChildScale);
406 
410  static CYISceneNode::MeasureSpec CalculateChildMeasureSpec(const CYISceneNode::MeasureSpec &parentMeasureSpec, float fPadding, const CYILayoutConfig::SizeConstraint &childConstraint, float fChildScale);
411 
416  {
425  };
426 
439 
445  static void RemeasureChildrenForFillParent(const CYISceneNode *pNode, const glm::vec3 &vParentMeasuredSize, const Padding &padding, DIMENSIONS eDimensionsToRemeasure);
446 
450  void CreateLayoutObjectsFor(CYISceneNode *pNode) const;
451 
455  CYISceneNode *GetChild(uint32_t uIndex) const;
456 
460  static glm::vec3 GetAdjustedPosition(const glm::vec3 &vDesiredTopLeftPosition, const CYISceneNode *pChild);
461 
466  static glm::vec3 GetUnadjustedPosition(const glm::vec3 &vCurrentTopLeftPosition, const CYISceneNode *pChild);
467 
471  static glm::vec3 GetAdjustedMeasuredSize(const CYISceneNode *pChild);
472 
482  static glm::vec3 GetTopLeftPositionWithGravity(const glm::vec3 &vLayoutGravity, const glm::vec3 &vChildGravity, const glm::vec3 &vContainerTopLeft, const glm::vec3 &vContainerSize, const CYILayout::Padding &padding, const glm::vec3 &vChildSize, const CYILayoutConfig::Margin &margin, const glm::vec3 &vCurrentChildPosition);
483 
491  static void MeasureBackgroundChildren(CYISceneNode *pNode, const glm::vec3 &vSize);
492 
499 
505  const Padding &GetPaddingForChild(const CYISceneNode *pChild) const;
506 
508  Padding m_padding;
510  glm::vec3 m_vGravity;
512 
513 private:
514  bool m_bBaseConfigureCalled;
515 
517 
518  YI_TYPE_BASES_WITH_SCRIPTABLE_BASE(CYILayout)
519 };
520 
523 inline CYISceneNode *CYILayout::GetAssociatedSceneNode() const
524 {
525  return m_pNode;
526 }
527 
528 inline glm::vec3 CYILayout::GetUnadjustedPosition(const glm::vec3 &vCurrentTopLeftPosition, const CYISceneNode *pChild)
529 {
530  return vCurrentTopLeftPosition - pChild->GetAnchorPoint();
531 }
532 
533 inline glm::vec3 CYILayout::GetAdjustedMeasuredSize(const CYISceneNode *pChild)
534 {
535  return pChild->GetMeasuredSize() * pChild->GetScale();
536 }
537 
538 inline bool CYILayout::IsLayoutable(const CYISceneNode *pNode)
539 {
540  // Non-visible items are not considered for laying-out
541  if (!pNode->IsVisible())
542  {
543  return false;
544  }
545 
547  if (!pConfig)
548  {
549  // Nodes without layout objects can be laid out. This is to support applying measurements to scene node outside of layouts.
550  return true;
551  }
552 
553  return pConfig->IsLayoutable();
554 }
555 
557 {
558  const CYILayoutConfig *pConfig = pChild->GetLayoutConfig();
559  if (pConfig->IsBackground())
560  {
561  return Padding::zeroInstance;
562  }
563  return m_padding;
564 }
565 
566 #endif // _YI_LAYOUT_H_
void SetUseReverseChildrenOrder(bool bUseReverseChildrenOrder)
POSITIONING_MODE m_ePositioningMode
Definition: YiLayout.h:511
const CYILayoutConfig * GetLayoutConfig(LayoutConfigFetchMode eFetchMode=LAYOUT_CONFIG_LAZY_INSTANTIATE) const
void DetachFromNode()
The base class for an C++ object that has RTTI information and is accesible from script source code...
Definition: YiScriptableRTTIObject.h:28
virtual void ApplyPosition(CYISceneNode *pChild, const glm::vec3 &vPosition)
bool IsVisible() const
Definition: YiSceneNode.h:356
#define YI_DISALLOW_COPY_AND_ASSIGN(TypeName)
Delete the copy constructor and assignment operator (and consequently the move constructor as well) ...
Definition: YiPredef.h:114
static glm::vec3 GetUnadjustedPosition(const glm::vec3 &vCurrentTopLeftPosition, const CYISceneNode *pChild)
Definition: YiLayout.h:528
CYISceneNode * GetAssociatedSceneNode() const
Definition: YiLayout.h:523
static void UpdateMeasuredSizeForFitContent(const CYISceneNode *pNode, glm::vec3 *pMeasuredSize, const glm::vec3 &contentSize, const Padding &padding, const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec)
Definition: YiLayout.h:418
A class used to hold a 3D &#39;cube offset&#39;.
Definition: YiLayoutConfig.h:52
void SetGravity(const glm::vec3 &vLayoutGravity)
DIMENSIONS
Definition: YiLayout.h:415
The base class for all view types. Views are containers of renderable elements that often define inte...
Definition: YiSceneView.h:47
static bool IsLayoutable(const CYISceneNode *pNode)
Definition: YiLayout.h:538
bool IsBackground() const
Definition: YiLayoutConfig.h:317
bool m_bReverseChildrenOrder
Definition: YiLayout.h:509
CYISceneNode * GetChild(uint32_t uIndex) const
virtual void Configure()
Padding m_padding
Definition: YiLayout.h:508
virtual void OnMeasurementsCalculated(const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec)
POSITIONING_MODE
Definition: YiLayout.h:165
void SetPadding(const Padding &padding)
virtual void ChildAdded(CYISceneNode *pChild)
virtual void OnApplyMeasurements()=0
CYISceneView * m_pNode
In most cases, this variable is used as a node (thus the name m_pNode )
Definition: YiLayout.h:507
static void MeasureChildWithMargins(CYISceneNode *pChild, const CYISceneNode::MeasureSpec &parentWidthSpec, const CYISceneNode::MeasureSpec &parentHeightSpec, const CYISceneNode::MeasureSpec &parentDepthSpec, const Padding &padding)
POSITIONING_MODE GetPositioningMode() const
const Padding & GetPaddingForChild(const CYISceneNode *pChild) const
Definition: YiLayout.h:556
static glm::vec3 GetAdjustedMeasuredSize(const CYISceneNode *pChild)
Definition: YiLayout.h:533
static glm::vec3 GetDefaultSize(const CYISceneNode *pNode, const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec)
Definition: YiLayout.h:421
Definition: YiLayout.h:424
Definition: YiLayout.h:420
A class used to hold a size constraint for a specific dimension.
Definition: YiLayoutConfig.h:115
static void RemeasureChildrenForFillParent(const CYISceneNode *pNode, const glm::vec3 &vParentMeasuredSize, const Padding &padding, DIMENSIONS eDimensionsToRemeasure)
void SetPositioningMode(POSITIONING_MODE ePositioningMode)
void ApplyMeasurementsToBackgroundChildren()
virtual std::unique_ptr< CYILayoutState > CreateLayoutStateInstance() const
static void UnscaleMeasureSpecs(const glm::vec3 &vScale, CYISceneNode::MeasureSpec *pWidthSpec, CYISceneNode::MeasureSpec *pHeightSpec, CYISceneNode::MeasureSpec *pDepthSpec)
Definition: YiLayout.h:423
static bool UpdateMeasureSpecsForFitContent(const CYISceneNode *pNode, CYISceneNode::MeasureSpec *widthSpec, CYISceneNode::MeasureSpec *heightSpec, CYISceneNode::MeasureSpec *depthSpec)
A scene node is the base type for all nodes which are used by the scene manager; it is an integral pa...
Definition: YiSceneNode.h:114
Definition: YiLayout.h:175
static glm::vec3 GetTopLeftPositionWithGravity(const glm::vec3 &vLayoutGravity, const glm::vec3 &vChildGravity, const glm::vec3 &vContainerTopLeft, const glm::vec3 &vContainerSize, const CYILayout::Padding &padding, const glm::vec3 &vChildSize, const CYILayoutConfig::Margin &margin, const glm::vec3 &vCurrentChildPosition)
const Padding & GetPadding() const
A class used to hold node-specific layout configuration (such as, for example, Margin).
Definition: YiLayoutConfig.h:24
glm::vec3 m_vGravity
Definition: YiLayout.h:510
static glm::vec3 GetAdjustedPosition(const glm::vec3 &vDesiredTopLeftPosition, const CYISceneNode *pChild)
The abstract runtime representation of a C++ type.
Definition: YiRtti.h:48
virtual void OnMeasurementsApplied()
virtual ~CYILayout()
virtual void ChildVisibilityChanged(CYISceneNode *pChild)
A class used to hold node-specific layout state.
Definition: YiLayoutState.h:16
bool IsUsingReverseChildrenOrder() const
GRAVITY
Definition: YiLayoutConfig.h:31
Definition: YiLayout.h:422
This class defines a layout that can be applied to a scene view. The layout class determines how obje...
Definition: YiLayout.h:159
void ApplyMeasurements()
virtual void OnMeasure(const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec)=0
const glm::vec3 & GetMeasuredSize() const
Definition: YiLayout.h:417
void CreateLayoutObjectsFor(CYISceneNode *pNode) const
const glm::vec3 & GetAnchorPoint() const
virtual void ChildRemoved(CYISceneNode *pChild)
static const CubeOffset zeroInstance
Definition: YiLayoutConfig.h:60
virtual void OnSceneViewAttached()
virtual const CYIRuntimeTypeInfo & GetLayoutConfigType() const
void Measure(const CYISceneNode::MeasureSpec &widthSpec, const CYISceneNode::MeasureSpec &heightSpec, const CYISceneNode::MeasureSpec &depthSpec)
Definition: YiLayout.h:419
static float CalculateDimension(const CYISceneNode::MeasureSpec &spec, const CYILayoutConfig::SizeConstraint &constraint, float fCurrentValue)
const glm::vec3 & GetGravity() const
static void RegisterAllLayouts()
void AttachTo(CYISceneView *pView)
void ConfigureFromAttachedNode()
static void MeasureBackgroundChildren(CYISceneNode *pNode, const glm::vec3 &vSize)
CYILayoutConfig::CubeOffset Padding
Definition: YiLayout.h:178
virtual void ApplySize(CYISceneNode *pChild, const glm::vec3 &vSize)
bool IsLayoutable() const
Definition: YiLayoutConfig.h:307
const glm::vec3 & GetScale() const
static CYISceneNode::MeasureSpec CalculateChildMeasureSpec(const CYISceneNode::MeasureSpec &parentMeasureSpec, float fPadding, const CYILayoutConfig::SizeConstraint &childConstraint, float fChildScale)
Definition: YiLayout.h:170