Skip to content

Commit e7b5978

Browse files
committed
feat: define marker element
1 parent 320d377 commit e7b5978

File tree

15 files changed

+511
-1
lines changed

15 files changed

+511
-1
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*
2+
* Copyright (c) 2015-present, Horcrux.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT-style license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
10+
package com.horcrux.svg;
11+
12+
import android.annotation.SuppressLint;
13+
import android.graphics.RectF;
14+
15+
import com.facebook.react.bridge.Dynamic;
16+
import com.facebook.react.bridge.ReactContext;
17+
import com.facebook.react.uimanager.annotations.ReactProp;
18+
19+
@SuppressLint("ViewConstructor")
20+
class MarkerView extends GroupView {
21+
22+
private SVGLength mRefX;
23+
private SVGLength mRefY;
24+
private SVGLength mMarkerWidth;
25+
private SVGLength mMarkerHeight;
26+
private String mMarkerUnits;
27+
private String mOrient;
28+
29+
private float mMinX;
30+
private float mMinY;
31+
private float mVbWidth;
32+
private float mVbHeight;
33+
String mAlign;
34+
int mMeetOrSlice;
35+
36+
public MarkerView(ReactContext reactContext) {
37+
super(reactContext);
38+
}
39+
40+
@ReactProp(name = "refX")
41+
public void setRefX(Dynamic refX) {
42+
mRefX = SVGLength.from(refX);
43+
invalidate();
44+
}
45+
46+
@ReactProp(name = "refY")
47+
public void setRefY(Dynamic refY) {
48+
mRefY = SVGLength.from(refY);
49+
invalidate();
50+
}
51+
52+
@ReactProp(name = "markerWidth")
53+
public void setMarkerWidth(Dynamic markerWidth) {
54+
mMarkerWidth = SVGLength.from(markerWidth);
55+
invalidate();
56+
}
57+
58+
@ReactProp(name = "markerHeight")
59+
public void setMarkerHeight(Dynamic markerHeight) {
60+
mMarkerHeight = SVGLength.from(markerHeight);
61+
invalidate();
62+
}
63+
64+
@ReactProp(name = "markerUnits")
65+
public void setMarkerUnits(String markerUnits) {
66+
mMarkerUnits = markerUnits;
67+
invalidate();
68+
}
69+
70+
@ReactProp(name = "orient")
71+
public void setOrient(String orient) {
72+
mOrient = orient;
73+
invalidate();
74+
}
75+
76+
@ReactProp(name = "minX")
77+
public void setMinX(float minX) {
78+
mMinX = minX;
79+
invalidate();
80+
}
81+
82+
@ReactProp(name = "minY")
83+
public void setMinY(float minY) {
84+
mMinY = minY;
85+
invalidate();
86+
}
87+
88+
@ReactProp(name = "vbWidth")
89+
public void setVbWidth(float vbWidth) {
90+
mVbWidth = vbWidth;
91+
invalidate();
92+
}
93+
94+
@ReactProp(name = "vbHeight")
95+
public void setVbHeight(float vbHeight) {
96+
mVbHeight = vbHeight;
97+
invalidate();
98+
}
99+
100+
@ReactProp(name = "align")
101+
public void setAlign(String align) {
102+
mAlign = align;
103+
invalidate();
104+
}
105+
106+
@ReactProp(name = "meetOrSlice")
107+
public void setMeetOrSlice(int meetOrSlice) {
108+
mMeetOrSlice = meetOrSlice;
109+
invalidate();
110+
}
111+
112+
113+
RectF getViewBox() {
114+
return new RectF(mMinX * mScale, mMinY * mScale, (mMinX + mVbWidth) * mScale, (mMinY + mVbHeight) * mScale);
115+
}
116+
117+
@Override
118+
void saveDefinition() {
119+
if (mName != null) {
120+
SvgView svg = getSvgView();
121+
svg.defineMarker(this, mName);
122+
}
123+
}
124+
}

android/src/main/java/com/horcrux/svg/RenderableViewManager.java

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
*/
5252
class RenderableViewManager extends ViewGroupManager<VirtualView> {
5353

54-
enum SVGClass {
54+
private enum SVGClass {
5555
RNSVGGroup,
5656
RNSVGPath,
5757
RNSVGText,
@@ -70,6 +70,7 @@ enum SVGClass {
7070
RNSVGRadialGradient,
7171
RNSVGPattern,
7272
RNSVGMask,
73+
RNSVGMarker,
7374
}
7475

7576
class RenderableShadowNode extends LayoutShadowNode {
@@ -855,6 +856,72 @@ public void setMaskTransform(MaskView node, @Nullable ReadableArray matrixArray)
855856
}
856857
}
857858

859+
static class MarkerManager extends GroupViewManager {
860+
MarkerManager() {
861+
super(SVGClass.RNSVGMarker);
862+
}
863+
864+
@ReactProp(name = "refX")
865+
public void setRefX(MarkerView node, Dynamic refX) {
866+
node.setRefX(refX);
867+
}
868+
869+
@ReactProp(name = "refY")
870+
public void setRefY(MarkerView node, Dynamic refY) {
871+
node.setRefY(refY);
872+
}
873+
874+
@ReactProp(name = "markerWidth")
875+
public void setMarkerWidth(MarkerView node, Dynamic markerWidth) {
876+
node.setMarkerWidth(markerWidth);
877+
}
878+
879+
@ReactProp(name = "markerHeight")
880+
public void setMarkerHeight(MarkerView node, Dynamic markerHeight) {
881+
node.setMarkerHeight(markerHeight);
882+
}
883+
884+
@ReactProp(name = "markerUnits")
885+
public void setMarkerUnits(MarkerView node, String markerUnits) {
886+
node.setMarkerUnits(markerUnits);
887+
}
888+
889+
@ReactProp(name = "orient")
890+
public void setOrient(MarkerView node, String orient) {
891+
node.setOrient(orient);
892+
}
893+
894+
@ReactProp(name = "minX")
895+
public void setMinX(MarkerView node, float minX) {
896+
node.setMinX(minX);
897+
}
898+
899+
@ReactProp(name = "minY")
900+
public void setMinY(MarkerView node, float minY) {
901+
node.setMinY(minY);
902+
}
903+
904+
@ReactProp(name = "vbWidth")
905+
public void setVbWidth(MarkerView node, float vbWidth) {
906+
node.setVbWidth(vbWidth);
907+
}
908+
909+
@ReactProp(name = "vbHeight")
910+
public void setVbHeight(MarkerView node, float vbHeight) {
911+
node.setVbHeight(vbHeight);
912+
}
913+
914+
@ReactProp(name = "align")
915+
public void setAlign(MarkerView node, String align) {
916+
node.setAlign(align);
917+
}
918+
919+
@ReactProp(name = "meetOrSlice")
920+
public void setMeetOrSlice(MarkerView node, int meetOrSlice) {
921+
node.setMeetOrSlice(meetOrSlice);
922+
}
923+
}
924+
858925
static class LinearGradientManager extends RenderableViewManager {
859926
LinearGradientManager() {
860927
super(SVGClass.RNSVGLinearGradient);
@@ -1162,6 +1229,8 @@ protected VirtualView createViewInstance(@Nonnull ThemedReactContext reactContex
11621229
return new PatternView(reactContext);
11631230
case RNSVGMask:
11641231
return new MaskView(reactContext);
1232+
case RNSVGMarker:
1233+
return new MarkerView(reactContext);
11651234
default:
11661235
throw new IllegalStateException("Unexpected type " + svgClass.toString());
11671236
}

android/src/main/java/com/horcrux/svg/SvgPackage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public List<ViewManager> createViewManagers(@Nonnull ReactApplicationContext rea
4747
new RadialGradientManager(),
4848
new PatternManager(),
4949
new MaskManager(),
50+
new MarkerManager(),
5051
new SvgViewManager());
5152
}
5253

android/src/main/java/com/horcrux/svg/SvgView.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public int reactTagForTouch(float touchX, float touchY) {
133133

134134
private final Map<String, VirtualView> mDefinedClipPaths = new HashMap<>();
135135
private final Map<String, VirtualView> mDefinedTemplates = new HashMap<>();
136+
private final Map<String, VirtualView> mDefinedMarkers = new HashMap<>();
136137
private final Map<String, VirtualView> mDefinedMasks = new HashMap<>();
137138
private final Map<String, Brush> mDefinedBrushes = new HashMap<>();
138139
private Canvas mCanvas;
@@ -412,4 +413,12 @@ void defineMask(VirtualView mask, String maskRef) {
412413
VirtualView getDefinedMask(String maskRef) {
413414
return mDefinedMasks.get(maskRef);
414415
}
416+
417+
void defineMarker(VirtualView marker, String markerRef) {
418+
mDefinedMasks.put(markerRef, marker);
419+
}
420+
421+
VirtualView getDefinedMarker(String markerRef) {
422+
return mDefinedMasks.get(markerRef);
423+
}
415424
}

ios/Elements/RNSVGMarker.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
#import "RNSVGGroup.h"
3+
#import "RNSVGLength.h"
4+
5+
@interface RNSVGMarker : RNSVGGroup
6+
7+
@property (nonatomic, strong) RNSVGLength *refX;
8+
@property (nonatomic, strong) RNSVGLength *refY;
9+
@property (nonatomic, strong) RNSVGLength *markerWidth;
10+
@property (nonatomic, strong) RNSVGLength *markerHeight;
11+
@property (nonatomic, assign) NSString *markerUnits;
12+
@property (nonatomic, assign) NSString *orient;
13+
14+
@property (nonatomic, assign) CGFloat minX;
15+
@property (nonatomic, assign) CGFloat minY;
16+
@property (nonatomic, assign) CGFloat vbWidth;
17+
@property (nonatomic, assign) CGFloat vbHeight;
18+
@property (nonatomic, strong) NSString *align;
19+
@property (nonatomic, assign) RNSVGVBMOS meetOrSlice;
20+
21+
@end

0 commit comments

Comments
 (0)