xmake.repo/packages/n/noesis/latest/Include/NsGui/Shape.h

192 lines
5.8 KiB
C
Raw Normal View History

2024-12-22 19:15:02 +08:00
////////////////////////////////////////////////////////////////////////////////////////////////////
// NoesisGUI - http://www.noesisengine.com
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GUI_SHAPE_H__
#define __GUI_SHAPE_H__
#include <NsCore/Noesis.h>
#include <NsGui/FrameworkElement.h>
namespace Noesis
{
class Brush;
class Pen;
class Geometry;
class MatrixTransform;
NS_WARNING_PUSH
NS_MSVC_WARNING_DISABLE(4251 4275)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Provides a base class for shape elements.
///
/// http://msdn.microsoft.com/en-us/library/system.windows.shapes.shape.aspx
////////////////////////////////////////////////////////////////////////////////////////////////////
class NS_GUI_CORE_API Shape: public FrameworkElement
{
public:
Shape();
Shape(const Shape&) = delete;
Shape& operator=(const Shape&) = delete;
virtual ~Shape() = 0;
/// Gets or sets the Brush that specifies how the shape's interior is painted
//@{
Brush* GetFill() const;
void SetFill(Brush* fill);
//@}
/// Gets or sets a Stretch value that describes how the shape fills its allocated space
//@{
Stretch GetStretch() const;
void SetStretch(Stretch stretch);
//@}
/// Gets or sets the Brush that specifies how the shape's outline is painted
//@{
Brush* GetStroke() const;
void SetStroke(Brush* stroke);
//@}
/// Gets or sets a collection of float values that indicate the pattern of dashes and gaps that
/// is used to outline shapes
//@{
const char* GetStrokeDashArray() const;
void SetStrokeDashArray(const char* dashArray);
//@}
/// Gets or sets a PenLineCap enumeration value that specifies how the ends of a dash are drawn
//@{
PenLineCap GetStrokeDashCap() const;
void SetStrokeDashCap(PenLineCap cap);
//@}
/// Gets or sets a float that specifies the distance within the dash pattern where a dash begins
//@{
float GetStrokeDashOffset() const;
void SetStrokeDashOffset(float offset);
//@}
/// Gets or sets a PenLineCap enumeration value that describes the Shape at the end of a line
//@{
PenLineCap GetStrokeEndLineCap() const;
void SetStrokeEndLineCap(PenLineCap cap);
//@}
/// Gets or sets a PenLineJoin enumeration value that specifies the type of join that is used
/// at the vertices of a Shape
//@{
PenLineJoin GetStrokeLineJoin() const;
void SetStrokeLineJoin(PenLineJoin join);
//@}
/// Gets or sets a limit on the ratio of the miter length to half the StrokeThickness of a
/// Shape element
//@{
float GetStrokeMiterLimit() const;
void SetStrokeMiterLimit(float limit);
//@}
/// Gets or sets a PenLineCap enumeration value describing the Shape at the start of a Stroke
//@{
PenLineCap GetStrokeStartLineCap() const;
void SetStrokeStartLineCap(PenLineCap cap);
//@}
/// Gets or sets the width of the Shape outline
//@{
float GetStrokeThickness() const;
void SetStrokeThickness(float thickness);
//@}
/// Gets or sets the amount to trim the start of the geometry path
//@{
float GetTrimStart() const;
void SetTrimStart(float value);
//@}
/// Gets or sets the amount to trim the end of the geometry path
//@{
float GetTrimEnd() const;
void SetTrimEnd(float value);
//@}
/// Gets or sets the amount to offset trimming the geometry path
//@{
float GetTrimOffset() const;
void SetTrimOffset(float value);
//@}
public:
/// Dependency properties
//@{
static const DependencyProperty* FillProperty;
static const DependencyProperty* StretchProperty;
static const DependencyProperty* StrokeProperty;
static const DependencyProperty* StrokeDashArrayProperty;
static const DependencyProperty* StrokeDashCapProperty;
static const DependencyProperty* StrokeDashOffsetProperty;
static const DependencyProperty* StrokeEndLineCapProperty;
static const DependencyProperty* StrokeLineJoinProperty;
static const DependencyProperty* StrokeMiterLimitProperty;
static const DependencyProperty* StrokeStartLineCapProperty;
static const DependencyProperty* StrokeThicknessProperty;
static const DependencyProperty* TrimStartProperty;
static const DependencyProperty* TrimEndProperty;
static const DependencyProperty* TrimOffsetProperty;
//@}
protected:
/// Gets the geometry used to render this shape
virtual Geometry* GetRenderGeometry() const = 0;
/// Gets stroke thickness validating stroke brush and thickness size
float GetValidStrokeThickness() const;
/// Gets a pen with the shape stroke params set
Pen* GetPen() const;
/// Calculates stretching parameters for the given geometry bounds
void GetStretchInfo(const Rect& bounds, const Size& availableSize,
Point& offset, Point& scale) const;
/// Calculates stretched size for the given geometry bounds
//@{
Size GetStretchSize(const Rect& bounds, const Size& availableSize);
Size GetStretchSize(const Rect& bounds, const Point& scale);
//@}
/// Calculates stretch matrix and returns final arrange size for the given geometry
Size GetArrangeStretch(Geometry* geometry, MatrixTransform* stretchMatrix,
const Size& finalSize);
/// Calculates bounds of the shape for the final size
Rect GetFinalBounds(const Size& finalSize) const;
/// From DependencyObject
//@{
bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override;
//@}
private:
void EnsurePen() const;
private:
mutable Ptr<Pen> mPen;
NS_DECLARE_REFLECTION(Shape, FrameworkElement)
};
NS_WARNING_POP
}
#endif