Merged PR 211: Add csharp classes to SVGLayoutDesigner and add tests

This commit is contained in:
Eric Nguyen 2022-10-10 09:28:47 +00:00
parent 24e47ae240
commit f74af69291
40 changed files with 1346 additions and 13 deletions

View file

@ -0,0 +1,21 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class ActionContainerModel
{
[DataMember(EmitDefaultValue = false)]
public string Id { get; set; }
[DataMember(EmitDefaultValue = false)]
public ImageModel CustomLogo { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Label { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Description { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Action { get; set; }
[DataMember(EmitDefaultValue = false)]
public AddingBehaviorEnumModel AddingBehavior { get; set; }
}
}

View file

@ -0,0 +1,19 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public enum AddingBehaviorEnumModel
{
[EnumMember]
Append,
[EnumMember]
InsertInto,
[EnumMember]
Replace,
[EnumMember]
ReplaceParent,
}
}

View file

@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class ApplicationStateModel
{
[DataMember(EmitDefaultValue = false)]
public string lastAction;
[DataMember(EmitDefaultValue = false)]
public ContainerModel mainContainer;
[DataMember(EmitDefaultValue = false)]
public string selectedContainerId;
[DataMember(EmitDefaultValue = false)]
public Dictionary<string, string> typeCounters;
[DataMember(EmitDefaultValue = false)]
public Dictionary<string, SymbolModel> symbols;
[DataMember(EmitDefaultValue = false)]
public string selectedSymbolId;
}
}

View file

@ -0,0 +1,192 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class AvailableContainerModel
{
/** type */
[DataMember(EmitDefaultValue = false, IsRequired = true)]
public string Type { get; set; }
/** displayed text */
[DataMember(EmitDefaultValue = false)]
public string DisplayedText { get; set; }
/** category */
[DataMember(EmitDefaultValue = false)]
public string Category { get; set; }
/** orientation */
[DataMember(EmitDefaultValue = false)]
public Orientation Orientation { get; set; }
/** horizontal offset */
[DataMember(EmitDefaultValue = false)]
public double? X { get; set; }
/** vertical offset */
[DataMember(EmitDefaultValue = false)]
public double? Y { get; set; }
/** width */
[DataMember(EmitDefaultValue = false)]
public double? Width { get; set; }
/** height */
[DataMember(EmitDefaultValue = false)]
public double? Height { get; set; }
/**
* Minimum width (min=1)
*/
[DataMember(EmitDefaultValue = false)]
public double? MinWidth { get; set; }
/**
* Maximum width
*/
[DataMember(EmitDefaultValue = false)]
public double? MaxWidth { get; set; }
/**
* Minimum height (min=1)
*/
[DataMember(EmitDefaultValue = false)]
public double? MinHeight { get; set; }
/**
* Maximum height
*/
[DataMember(EmitDefaultValue = false)]
public double? MaxHeight { get; set; }
/** margin */
[DataMember(EmitDefaultValue = false)]
public Margin Margin { get; set; }
/** true if anchor, false otherwise */
[DataMember(EmitDefaultValue = false)]
public bool? IsAnchor { get; set; }
/** true if flex, false otherwise */
[DataMember(EmitDefaultValue = false)]
public bool? IsFlex { get; set; }
/**
* Allow to use a Pattern to create the list of children
* Cannot be used with DefaultChildType,
* DefaultChildType will be disabled for this container and the children
*/
[DataMember(EmitDefaultValue = false)]
public string Pattern { get; set; }
/** Method used on container add */
[DataMember(EmitDefaultValue = false)]
public AddingBehaviorEnumModel? AddMethod { get; set; }
/**
* (optional)
* Disabled when Pattern is used.
*
* Replace a <rect> by a customized "SVG". It is not really an svg but it at least allows
* to draw some patterns that can be bind to the properties of the container
* Use {prop} to bind a property. Use {{ styleProp }} to use an object.
* Example :
* ```
* `<rect width="{width}" height="{height}" style="{style}"></rect>
* <rect width="{width}" height="{height}" stroke="black" fill-opacity="0"></rect>
* <line x1="0" y1="0" x2="{width}" y2="{height}" stroke="black" style='{{ "transform":"scaleY(0.5)"}}'></line>
* <line x1="{width}" y1="0" x2="0" y2="{height}" stroke="black" style='{userData.styleLine}'></line>
* `
* ```
*/
[DataMember(EmitDefaultValue = false)]
public string DefaultChildType { get; set; }
/** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */
[DataMember(EmitDefaultValue = false)]
public PositionReferenceEnumModel? PositionReference { get; set; }
[DataMember(EmitDefaultValue = false)]
public bool? HideChildrenInTreeview { get; set; }
/** if true, show the dimension of the container */
[DataMember(EmitDefaultValue = false)]
public Position[] ShowSelfDimensions { get; set; }
/** if true show the overall dimensions of its children */
[DataMember(EmitDefaultValue = false)]
public Position[] ShowChildrenDimensions { get; set; }
/**
* if true, allows a parent dimension borrower to uses its x coordinate for as a reference point for a dimension
*/
[DataMember(EmitDefaultValue = false)]
public Orientation[] MarkPosition { get; set; }
/**
* if true, show a dimension from the edge of the container to end
* and insert dimensions mark
*/
[DataMember(EmitDefaultValue = false)]
public Position[] ShowDimensionWithMarks { get; set; }
/**
* if true, hide the entry in the sidebar (default: false)
*/
[DataMember(EmitDefaultValue = false)]
public bool? IsHidden { get; set; }
/**
* if true, hide the entry in the sidebar (default: false)
*/
[DataMember(EmitDefaultValue = false)]
public string[] Blacklist { get; set; }
/**
* Cannot be used with blacklist. Whitelist will be prioritized.
* To disable the whitelist, Whitelist must be undefined.
* Only allow a set of available container to be added inside
*/
[DataMember(EmitDefaultValue = false)]
public string[] Whitelist { get; set; }
/**
* List of possible actions shown on right-click
*/
[DataMember(EmitDefaultValue = false)]
public List<ActionContainerModel> Actions { get; set; }
/**
* (optional)
* Replace a <rect> by a customized "SVG". It is not really an svg but it at least allows
* to draw some patterns that can be bind to the properties of the container
* Use {prop} to bind a property. Use {{ styleProp }} to use an object.
* Example :
* ```
* `<rect width="{width}" height="{height}" style="{style}"></rect>
* <rect width="{width}" height="{height}" stroke="black" fill-opacity="0"></rect>
* <line x1="0" y1="0" x2="{width}" y2="{height}" stroke="black" style='{{ "transform":"scaleY(0.5)"}}'></line>
* <line x1="{width}" y1="0" x2="0" y2="{height}" stroke="black" style='{userData.styleLine}'></line>
* `
* ```
*/
[DataMember(EmitDefaultValue = false)]
public string CustomSVG { get; set; }
/**
* (optional)
* Style of the <rect>
*/
[DataMember(EmitDefaultValue = false)]
public CSSStyle Style { get; set; }
/**
* (optional)
* User data that can be used for data storage or custom SVG
*/
[DataMember(EmitDefaultValue = false)]
public Dictionary<string, string> UserData { get; set; }
}
}

View file

@ -0,0 +1,18 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class AvailableSymbolModel
{
[DataMember(EmitDefaultValue = false)]
public string Name { get; set; }
[DataMember(EmitDefaultValue = false)]
public ImageModel Image { get; set; }
[DataMember(EmitDefaultValue = false)]
public PositionReferenceEnumModel PositionReference { get; set; }
[DataMember(EmitDefaultValue = false)]
public double Width { get; set; }
[DataMember(EmitDefaultValue = false)]
public double Height { get; set; }
}
}

View file

@ -0,0 +1,19 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class CSSStyle
{
[DataMember(EmitDefaultValue = false)]
public double? strokeWidth;
[DataMember(EmitDefaultValue = false)]
public double? fillOpacity;
[DataMember(EmitDefaultValue = false)]
public string stroke;
[DataMember(EmitDefaultValue = false)]
public string fill;
}
}

View file

@ -0,0 +1,13 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class Category
{
[DataMember(EmitDefaultValue = false)]
public string Type { get; set; }
[DataMember(EmitDefaultValue = false)]
public string DisplayedText { get; set; }
}
}

View file

@ -0,0 +1,32 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class ConfigurationResponseModel
{
public ConfigurationResponseModel(AvailableContainerModel mainContainer)
{
MainContainer = mainContainer;
AvailableContainers = new List<AvailableContainerModel>();
AvailableSymbols = new List<AvailableSymbolModel>();
Categories = new List<Category>();
Patterns = new List<Pattern>();
}
[DataMember(EmitDefaultValue = false)]
public List<AvailableContainerModel> AvailableContainers { get; set; }
[DataMember(EmitDefaultValue = false)]
public List<AvailableSymbolModel> AvailableSymbols { get; set; }
[DataMember(EmitDefaultValue = false)]
public List<Category> Categories { get; set; }
[DataMember(EmitDefaultValue = false)]
public List<Pattern> Patterns { get; set; }
[DataMember(EmitDefaultValue = false, IsRequired = true)]
public AvailableContainerModel MainContainer { get; set; }
}
}

View file

@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class ContainerModel
{
[DataMember(EmitDefaultValue = false)]
public List<ContainerModel> children;
[DataMember(EmitDefaultValue = false)]
public ContainerProperties properties;
[DataMember(EmitDefaultValue = false)]
public Dictionary<string, string> userData;
}
}

View file

@ -0,0 +1,153 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class ContainerProperties
{
/** id of the container */
[DataMember(EmitDefaultValue = false)]
public string id;
/** type matching the configuration on construction */
[DataMember(EmitDefaultValue = false)]
public string type;
/** id of the parent container (null when there is no parent) */
[DataMember(EmitDefaultValue = false)]
public string parentId;
/** id of the linked symbol ('' when there is no parent) */
[DataMember(EmitDefaultValue = false)]
public string linkedSymbolId;
/** Text displayed in the container */
[DataMember(EmitDefaultValue = false)]
public string displayedText;
/** orientation */
[DataMember(EmitDefaultValue =false)]
public Orientation orientation;
/** horizontal offset */
[DataMember(EmitDefaultValue = false)]
public double x;
/** vertical offset */
[DataMember(EmitDefaultValue = false)]
public double y;
/** margin */
[DataMember(EmitDefaultValue = false)]
public Margin margin;
/** width */
[DataMember(EmitDefaultValue = false)]
public double width;
/** height */
[DataMember(EmitDefaultValue = false)]
public double height;
/**
* Minimum width (min=1)
*/
[DataMember(EmitDefaultValue = false)]
public double minWidth;
/**
* Maximum width
*/
[DataMember(EmitDefaultValue = false)]
public double maxWidth;
/**
* Minimum height (min=1)
* Allows the container to set isRigidBody to false when it gets squeezed
* by an anchor
*/
[DataMember(EmitDefaultValue = false)]
public double minHeight;
/**
* Maximum height
*/
[DataMember(EmitDefaultValue = false)]
public double maxHeight;
/** true if anchor, false otherwise */
[DataMember(EmitDefaultValue = false)]
public bool isAnchor;
/** true if flex, false otherwise */
[DataMember(EmitDefaultValue = false)]
public bool isFlex;
/** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */
[DataMember(EmitDefaultValue = false)]
public PositionReferenceEnumModel positionReference;
/** Hide the children in the treeview */
[DataMember(EmitDefaultValue = false)]
public bool hideChildrenInTreeview;
/** if true, show the dimension of the container */
[DataMember(EmitDefaultValue = false)]
public Position[] showSelfDimensions;
/** if true show the overall dimensions of its children */
[DataMember(EmitDefaultValue = false)]
public Position[] showChildrenDimensions;
/**
* if true, allows a parent dimension borrower to borrow its x coordinate
* as a reference point for a dimension
*/
[DataMember(EmitDefaultValue = false)]
public Orientation[] markPosition;
/**
* if true, show a dimension from the edge of the container to end
* and insert dimensions marks at lift up children (see liftDimensionToBorrower)
*/
[DataMember(EmitDefaultValue = false)]
public Position[] showDimensionWithMarks;
/**
* Warnings of a container
*/
[DataMember(EmitDefaultValue = false)]
public string warning;
/**
* (optional)
* Replace a <rect> by a customized "SVG". It is not really an svg but it at least allows
* to draw some patterns that can be bind to the properties of the container
* Use {prop} to bind a property. Use {{ styleProp }} to use an object.
* Example :
* ```
* `<rect width="{width}" height="{height}" style="{style}"></rect>
* <rect width="{width}" height="{height}" stroke="black" fill-opacity="0"></rect>
* <line x1="0" y1="0" x2="{width}" y2="{height}" stroke="black" style='{{ "transform":"scaleY(0.5)"}}'></line>
* <line x1="{width}" y1="0" x2="0" y2="{height}" stroke="black" style='{userData.styleLine}'></line>
* `
* ```
*/
[DataMember(EmitDefaultValue = false)]
public string customSVG;
/**
* (optional)
* Style of the <rect>
*/
[DataMember(EmitDefaultValue = false)]
public CSSStyle style;
/**
* (optional)
* User data that can be used for data storage or custom SVG
*/
[DataMember(EmitDefaultValue = false)]
public object userData;
}
}

View file

@ -0,0 +1,10 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class GetFeedbackRequest
{
[DataMember(EmitDefaultValue = false)]
public ApplicationStateModel ApplicationState { get; set; }
}
}

View file

@ -0,0 +1,11 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class GetFeedbackResponse
{
[DataMember(EmitDefaultValue = false)]
public List<Message> messages { get; set; }
}
}

View file

@ -0,0 +1,16 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class ImageModel
{
[DataMember(EmitDefaultValue = false)]
public string Name { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Url { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Base64Image { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Svg { get; set; }
}
}

View file

@ -0,0 +1,19 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class Margin
{
[DataMember(EmitDefaultValue = false)]
public double? left { get; set; }
[DataMember(EmitDefaultValue = false)]
public double? bottom { get; set; }
[DataMember(EmitDefaultValue = false)]
public double? top { get; set; }
[DataMember(EmitDefaultValue = false)]
public double? right { get; set; }
}
}

View file

@ -0,0 +1,8 @@
namespace SVGLDLibs.Models
{
public class Message
{
public string text { get; set; }
public MessageType type { get; set; }
}
}

View file

@ -0,0 +1,10 @@
namespace SVGLDLibs.Models
{
public enum MessageType
{
Normal,
Success,
Warning,
Error
}
}

View file

@ -0,0 +1,12 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public enum Orientation
{
[EnumMember]
Horizontal,
[EnumMember]
Vertical
}
}

View file

@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class Pattern
{
public Pattern()
{
children = new List<string>();
}
[DataMember(EmitDefaultValue = false)]
public string id { get; set; }
[DataMember(EmitDefaultValue = false)]
public string text { get; set; }
[DataMember(EmitDefaultValue = false)]
public string wrapper { get; set; }
[DataMember(EmitDefaultValue = true, IsRequired = true)]
public List<string> children { get; set; }
}
}

View file

@ -0,0 +1,12 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class PointModel
{
[DataMember(EmitDefaultValue = false)]
public string X { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Y { get; set; }
}
}

View file

@ -0,0 +1,16 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public enum Position
{
[EnumMember]
Left,
[EnumMember]
Down,
[EnumMember]
Up,
[EnumMember]
Right
}
}

View file

@ -0,0 +1,26 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public enum PositionReferenceEnumModel
{
[EnumMember]
TopLeft,
[EnumMember]
TopCenter,
[EnumMember]
TopRight,
[EnumMember]
CenterLeft,
[EnumMember]
CenterCenter,
[EnumMember]
CenterRight,
[EnumMember]
BottomLeft,
[EnumMember]
BottomCenter,
[EnumMember]
BottomRight
}
}

View file

@ -0,0 +1,22 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class SetContainerListRequest
{
[DataMember(EmitDefaultValue = false)]
public ActionContainerModel Action { get; set; }
[DataMember(EmitDefaultValue = false)]
public ContainerModel Container { get; set; }
[DataMember(EmitDefaultValue = false)]
public ContainerModel PreviousContainer { get; set; }
[DataMember(EmitDefaultValue = false)]
public ContainerModel NextContainer { get; set; }
[DataMember(EmitDefaultValue = false)]
public ApplicationStateModel ApplicationState { get; set; }
}
}

View file

@ -0,0 +1,14 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class SetContainerListResponse
{
[DataMember(EmitDefaultValue = false)]
public List<AvailableContainerModel> Containers { get; set; }
[DataMember(EmitDefaultValue = false)]
public AddingBehaviorEnumModel AddingBehavior { get; set; }
}
}

View file

@ -0,0 +1,16 @@
using System.Runtime.Serialization;
namespace SVGLDLibs.Models
{
public class SymbolModel : AvailableSymbolModel
{
[DataMember(EmitDefaultValue = false)]
public string Id { get; set; }
[DataMember(EmitDefaultValue = false)]
public PointModel Point { get; set; }
[DataMember(EmitDefaultValue = false)]
public bool IsLinkedToContainer { get; set; }
[DataMember(EmitDefaultValue = false)]
public string LinkedContainerId { get; set; }
}
}

View file

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
</Project>