105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// NoesisGUI - http://www.noesisengine.com
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __GUI_ADORNERLAYER_H__
							 | 
						||
| 
								 | 
							
								#define __GUI_ADORNERLAYER_H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <NsCore/Noesis.h>
							 | 
						||
| 
								 | 
							
								#include <NsCore/ReflectionDeclare.h>
							 | 
						||
| 
								 | 
							
								#include <NsCore/Vector.h>
							 | 
						||
| 
								 | 
							
								#include <NsCore/HashMap.h>
							 | 
						||
| 
								 | 
							
								#include <NsGui/CoreApi.h>
							 | 
						||
| 
								 | 
							
								#include <NsGui/FrameworkElement.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Noesis
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Adorner;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NS_WARNING_PUSH
							 | 
						||
| 
								 | 
							
								NS_MSVC_WARNING_DISABLE(4251 4275)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								/// Represents a surface for rendering adorners. An adorner layer is guaranteed to be at a higher
							 | 
						||
| 
								 | 
							
								/// Z-order than the elements being adorned, so adorners are always rendered on top of the
							 | 
						||
| 
								 | 
							
								/// adorned elements.
							 | 
						||
| 
								 | 
							
								///
							 | 
						||
| 
								 | 
							
								/// https://docs.microsoft.com/en-us/dotnet/api/system.windows.documents.adornerlayer
							 | 
						||
| 
								 | 
							
								////////////////////////////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								class NS_GUI_CORE_API AdornerLayer: public FrameworkElement
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    AdornerLayer();
							 | 
						||
| 
								 | 
							
								    ~AdornerLayer();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Returns the first adorner layer in the visual tree above a specified Visual
							 | 
						||
| 
								 | 
							
								    static AdornerLayer* GetAdornerLayer(Visual* visual);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Adds an adorner to the adorner layer
							 | 
						||
| 
								 | 
							
								    void Add(Adorner* adorner);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Removes the specified Adorner from the adorner layer
							 | 
						||
| 
								 | 
							
								    void Remove(Adorner* adorner);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Updates the layout and redraws all of the adorners in the adorner layer
							 | 
						||
| 
								 | 
							
								    void Update();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Updates the layout and redraws all of the adorners in the adorner layer that are bound to
							 | 
						||
| 
								 | 
							
								    /// the specified element
							 | 
						||
| 
								 | 
							
								    void Update(UIElement* element);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								    /// From BaseRefCounted
							 | 
						||
| 
								 | 
							
								    //@{
							 | 
						||
| 
								 | 
							
								    int32_t OnDestroy() override;
							 | 
						||
| 
								 | 
							
								    //@}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// From Visual
							 | 
						||
| 
								 | 
							
								    //@{
							 | 
						||
| 
								 | 
							
								    uint32_t GetVisualChildrenCount() const override;
							 | 
						||
| 
								 | 
							
								    Visual* GetVisualChild(uint32_t index) const override;
							 | 
						||
| 
								 | 
							
								    void OnVisualParentChanged(Visual* oldParent) override;
							 | 
						||
| 
								 | 
							
								    //@}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// From FrameworkElement
							 | 
						||
| 
								 | 
							
								    //@{
							 | 
						||
| 
								 | 
							
								    uint32_t GetLogicalChildrenCount() const override;
							 | 
						||
| 
								 | 
							
								    Ptr<BaseComponent> GetLogicalChild(uint32_t index) const override;
							 | 
						||
| 
								 | 
							
								    Size MeasureOverride(const Size& availableSize) override;
							 | 
						||
| 
								 | 
							
								    Size ArrangeOverride(const Size& finalSize) override;
							 | 
						||
| 
								 | 
							
								    //@}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    typedef Vector<Adorner*> AdornerList;
							 | 
						||
| 
								 | 
							
								    void UpdateAdorners();
							 | 
						||
| 
								 | 
							
								    void UpdateAdorners(UIElement* element, const AdornerList& adorners, bool invalidate);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void OnAdornedElementUpdated(Visual* visual);
							 | 
						||
| 
								 | 
							
								    void OnAdornedElementDestroyed(DependencyObject* d);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void Clear(UIElement* adornedElement);
							 | 
						||
| 
								 | 
							
								    AdornerList& RegisterAdornedElement(UIElement* adornedElement);
							 | 
						||
| 
								 | 
							
								    void UnregisterAdornedElement(UIElement* adornedElement, const AdornerList& adorners);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    Vector<Ptr<Adorner>> mAdorners;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef HashMap<UIElement*, AdornerList> AdornedElements;
							 | 
						||
| 
								 | 
							
								    AdornedElements mAdornedElements;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    bool mInvalidated;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    NS_DECLARE_REFLECTION(AdornerLayer, FrameworkElement);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NS_WARNING_POP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |