Another slight refactor of the skin engine internals:
Previously:
Code: Select all
registerSkinPropertyHandler(#Null, "transition", #PG_Skin_ValueType_Transition, SizeOf(SkinValueTransition), @skinParse_Transition(), @skinAllocate_Transition(), @skinCopy_Transition(), @skinFree_Transition())
*border = registerSkinPropertyHandler(#Null, "border", #PG_Skin_ValueType_Border, SizeOf(SkinValueBorder), @skinParse_Border(), @skinAllocate_Border(), @skinCopy_Border(), @skinFree_Border())
registerSkinPropertyHandler(*border, "border-style", #PG_Skin_ValueType_Border_Style, SizeOf(SkinValueBorder), @skinParse_Border_Style(), @skinAllocate_Border(), @skinCopy_Border_Style(), @skinFree_Border())
*radius = registerSkinPropertyHandler(*border, "border-radius", #PG_Skin_ValueType_Border_Radius, SizeOf(SkinValueBorder), @skinParse_Border_Radius(), @skinAllocate_Border(), @skinCopy_Border_Radius(), @skinFree_Border())
registerSkinPropertyHandler(*radius, "border-top-left-radius", #PG_Skin_ValueType_Border_Radius_TopLeft, SizeOf(SkinValueBorder), @skinParse_Border_Radius_TopLeft(), @skinAllocate_Border(), @skinCopy_Border_Radius_TopLeft(), @skinFree_Border(), @skinTransition_Border_Radius_TopLeft(), #True)
registerSkinPropertyHandler(*radius, "border-top-right-radius", #PG_Skin_ValueType_Border_Radius_TopRight, SizeOf(SkinValueBorder), @skinParse_Border_Radius_TopRight(), @skinAllocate_Border(), @skinCopy_Border_Radius_TopRight(), @skinFree_Border(), @skinTransition_Border_Radius_TopRight(), #True)
registerSkinPropertyHandler(*radius, "border-bottom-left-radius", #PG_Skin_ValueType_Border_Radius_BottomLeft, SizeOf(SkinValueBorder), @skinParse_Border_Radius_BottomLeft(), @skinAllocate_Border(), @skinCopy_Border_Radius_BottomLeft(), @skinFree_Border(), @skinTransition_Border_Radius_BottomLeft(), #True)
registerSkinPropertyHandler(*radius, "border-bottom-right-radius", #PG_Skin_ValueType_Border_Radius_BottomRight, SizeOf(SkinValueBorder), @skinParse_Border_Radius_BottomRight(), @skinAllocate_Border(), @skinCopy_Border_Radius_BottomRight(), @skinFree_Border(), @skinTransition_Border_Radius_BottomRight(), #True)
*color = registerSkinPropertyHandler(*border, "border-color", #PG_Skin_ValueType_Border_Color, SizeOf(SkinValueBorder), @skinParse_Border_Color(), @skinAllocate_Border(), @skinCopy_Border_Color(), @skinFree_Border(), #Null, #True)
registerSkinPropertyHandler(*color, "border-top-color", #PG_Skin_ValueType_Border_Top_Color, SizeOf(SkinValueBorder), @skinParse_Border_Top_Color(), @skinAllocate_Border(), @skinCopy_Border_Top_Color(), @skinFree_Border(), @skinTransition_Border_Top_Color(), #True)
registerSkinPropertyHandler(*color, "border-right-color", #PG_Skin_ValueType_Border_Right_Color, SizeOf(SkinValueBorder), @skinParse_Border_Right_Color(), @skinAllocate_Border(), @skinCopy_Border_Right_Color(), @skinFree_Border(), @skinTransition_Border_Right_Color(), #True)
registerSkinPropertyHandler(*color, "border-bottom-color", #PG_Skin_ValueType_Border_Bottom_Color, SizeOf(SkinValueBorder), @skinParse_Border_Bottom_Color(), @skinAllocate_Border(), @skinCopy_Border_Bottom_Color(), @skinFree_Border(), @skinTransition_Border_Bottom_Color(), #True)
registerSkinPropertyHandler(*color, "border-left-color", #PG_Skin_ValueType_Border_Left_Color, SizeOf(SkinValueBorder), @skinParse_Border_Left_Color(), @skinAllocate_Border(), @skinCopy_Border_Left_Color(), @skinFree_Border(), @skinTransition_Border_Left_Color(), #True)
registerSkinPropertyHandler(*border, "border-top-width", #PG_Skin_ValueType_Border_Top_Width, SizeOf(SkinValueBorder), @skinParse_Border_Top_Width(), @skinAllocate_Border(), @skinCopy_Border_Top_Width(), @skinFree_Border(), @skinTransition_Border_Top_Width(), #True)
registerSkinPropertyHandler(*border, "border-right-width", #PG_Skin_ValueType_Border_Right_Width, SizeOf(SkinValueBorder), @skinParse_Border_Right_Width(), @skinAllocate_Border(), @skinCopy_Border_Right_Width(), @skinFree_Border(), @skinTransition_Border_Right_Width(), #True)
registerSkinPropertyHandler(*border, "border-bottom-width", #PG_Skin_ValueType_Border_Bottom_Width, SizeOf(SkinValueBorder), @skinParse_Border_Bottom_Width(), @skinAllocate_Border(), @skinCopy_Border_Bottom_Width(), @skinFree_Border(), @skinTransition_Border_Bottom_Width(), #True)
registerSkinPropertyHandler(*border, "border-left-width", #PG_Skin_ValueType_Border_Left_Width, SizeOf(SkinValueBorder), @skinParse_Border_Left_Width(), @skinAllocate_Border(), @skinCopy_Border_Left_Width(), @skinFree_Border(), @skinTransition_Border_Left_Width(), #True)
Currently:
Code: Select all
registerSkinProperty("transition", #PG_Skin_Type_Transition, SizeOf(SkinValueTransition), @skinParse_Transition(), @skinAllocate_Transition(), @skinCopy_Transition(), @skinFree_Transition())
*border = registerSkinProperty("border", #PG_Skin_Type_Border, SizeOf(SkinValueBorder), @skinParse_Border(), @skinAllocate_Border(), @skinCopy_Border(), @skinFree_Border())
registerSkinSubProperty(*border, "border-style", 1, @skinParse_Border_Style(), @skinCopy_Border_Style())
registerSkinSubProperty(*border, "border-top-style", 2, @skinParse_Border_Top_Style(), @skinCopy_Border_Style())
registerSkinSubProperty(*border, "border-right-style", 2, @skinParse_Border_Right_Style(), @skinCopy_Border_Style())
registerSkinSubProperty(*border, "border-bottom-style", 2, @skinParse_Border_Bottom_Style(), @skinCopy_Border_Style())
registerSkinSubProperty(*border, "border-left-style", 2, @skinParse_Border_Left_Style(), @skinCopy_Border_Style())
registerSkinSubProperty(*border, "border-radius", 1, @skinParse_Border_Radius(), @skinCopy_Border_Radius())
registerSkinSubProperty(*border, "border-top-left-radius", 2, @skinParse_Border_Radius_TopLeft(), @skinCopy_Border_Radius_TopLeft(), @skinTransition_Border_Radius_TopLeft(), "border-radius")
registerSkinSubProperty(*border, "border-top-right-radius", 2, @skinParse_Border_Radius_TopRight(), @skinCopy_Border_Radius_TopRight(), @skinTransition_Border_Radius_TopRight(), "border-radius")
registerSkinSubProperty(*border, "border-bottom-left-radius", 2, @skinParse_Border_Radius_BottomLeft(), @skinCopy_Border_Radius_BottomLeft(), @skinTransition_Border_Radius_BottomLeft(), "border-radius")
registerSkinSubProperty(*border, "border-bottom-right-radius", 2, @skinParse_Border_Radius_BottomRight(), @skinCopy_Border_Radius_BottomRight(), @skinTransition_Border_Radius_BottomRight(), "border-radius")
registerSkinSubProperty(*border, "border-color", 1, @skinParse_Border_Color(), @skinCopy_Border_Color())
registerSkinSubProperty(*border, "border-top", 2, @skinParse_Border_Top(), @skinCopy_Border_Top())
registerSkinSubProperty(*border, "border-top-color", 3, @skinParse_Border_Top_Color(), @skinCopy_Border_Top_Color(), @skinTransition_Border_Top_Color(), "border-top, border-color, border")
registerSkinSubProperty(*border, "border-right-color", 3, @skinParse_Border_Right_Color(), @skinCopy_Border_Right_Color(), @skinTransition_Border_Right_Color(), "border-right, border-color, border")
registerSkinSubProperty(*border, "border-bottom-color", 3, @skinParse_Border_Bottom_Color(), @skinCopy_Border_Bottom_Color(), @skinTransition_Border_Bottom_Color(), "border-bottom, border-color, border")
registerSkinSubProperty(*border, "border-left-color", 3, @skinParse_Border_Left_Color(), @skinCopy_Border_Left_Color(), @skinTransition_Border_Left_Color(), "border-left, border-color, border")
registerSkinSubProperty(*border, "border-top-width", 3, @skinParse_Border_Top_Width(), @skinCopy_Border_Top_Width(), @skinTransition_Border_Top_Width(), "border-top, border-width, border")
registerSkinSubProperty(*border, "border-right-width", 3, @skinParse_Border_Right_Width(), @skinCopy_Border_Right_Width(), @skinTransition_Border_Right_Width(), "border-right, border-width, border")
registerSkinSubProperty(*border, "border-bottom-width", 3, @skinParse_Border_Bottom_Width(), @skinCopy_Border_Bottom_Width(), @skinTransition_Border_Bottom_Width(), "border-bottom, border-width, border")
registerSkinSubProperty(*border, "border-left-width", 3, @skinParse_Border_Left_Width(), @skinCopy_Border_Left_Width(), @skinTransition_Border_Left_Width(), "border-left, border-width, border")
There were some issues with the previous parent / child hierarchy of the property handlers and how CSS works. It mostly worked but then ran into issues with properties like 'border-top', 'border-color'. 'border-top-color' can be a child of 'border-top' but 'border-top' can't be a child of 'border-color' (because 'border-top' sets the top border style, color and width). So now the new registerSkinSubProperty() command has a cascade order parameter and if it has a transition function defined there is an optional transitionOrder string parameter that is a comma separated list of fall-back transition parameters that can animate it. For example:
Code: Select all
registerSkinSubProperty(*border, "border-top-width", 3, @skinParse_Border_Top_Width(), @skinCopy_Border_Top_Width(), @skinTransition_Border_Top_Width(), "border-top, border-width, border")
First 'border-top-width' is checked in the transition property (SkinSetValue("testContainer.testWidget", "transition", "background-color 2s, border 1s, border-radius 1s, border-top-left-radius 3s, border-bottom-right-radius 3s")) then 'border-top', 'border-width' and 'border'.
You shouldn't have to worry about this at all but I will be opening up these commands down the line for advanced usage (you need custom skin property handlers for some reason).