Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: properly implement currentColor #2466

Merged
merged 19 commits into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -99,16 +99,10 @@ public boolean needsCustomLayoutForChildren() {
return true;
}

@ReactProp(name = "tintColor", customType = "Color")
@Override
public void setTintColor(SvgView node, Integer tintColor) {
node.setTintColor(tintColor);
}

@ReactProp(name = "color", customType = "Color")
@Override
public void setColor(SvgView node, Integer color) {
node.setTintColor(color);
node.setCurrentColor(color);
}

@ReactProp(name = "minX")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,16 +103,10 @@ public boolean needsCustomLayoutForChildren() {
return true;
}

@ReactProp(name = "tintColor", customType = "Color")
@Override
public void setTintColor(SvgView node, Integer tintColor) {
node.setTintColor(tintColor);
}

@ReactProp(name = "color", customType = "Color")
@Override
public void setColor(SvgView node, Integer color) {
node.setTintColor(color);
node.setCurrentColor(color);
}

@ReactProp(name = "minX")
Expand Down
23 changes: 22 additions & 1 deletion android/src/main/java/com/horcrux/svg/RenderableView.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.view.ViewParent;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
Expand Down Expand Up @@ -83,6 +84,7 @@ public abstract class RenderableView extends VirtualView implements ReactHitSlop
public Paint.Cap strokeLinecap = Paint.Cap.BUTT;
public Paint.Join strokeLinejoin = Paint.Join.MITER;

private int mCurrentColor = 0;
public @Nullable ReadableArray fill;
public float fillOpacity = 1;
public Path.FillType fillRule = Path.FillType.WINDING;
Expand Down Expand Up @@ -122,6 +124,25 @@ public void setVectorEffect(int vectorEffect) {
invalidate();
}

public void setCurrentColor(Integer color) {
mCurrentColor = color != null ? color : 0;
invalidate();
clearChildCache();
}

int getCurrentColor() {
if (this.mCurrentColor != 0) {
return this.mCurrentColor;
}
ViewParent parent = this.getParent();
if (parent instanceof VirtualView) {
return ((RenderableView) parent).getCurrentColor();
} else if (parent instanceof SvgView) {
return ((SvgView) parent).mCurrentColor;
}
return 0;
}

public void setFill(@Nullable Dynamic fill) {
if (fill == null || fill.isNull()) {
this.fill = null;
Expand Down Expand Up @@ -625,7 +646,7 @@ private void setupPaint(Paint paint, float opacity, ReadableArray colors) {
}
case 2:
{
int color = getSvgView().mTintColor;
int color = this.getCurrentColor();
int alpha = color >>> 24;
alpha = Math.round((float) alpha * opacity);
paint.setColor(alpha << 24 | (color & 0x00ffffff));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1680,6 +1680,11 @@ public void setFilter(T node, String filter) {
node.setFilter(filter);
}

@ReactProp(name = "color", customType = "Color")
public void setColor(T node, Integer color) {
node.setCurrentColor(color);
}

@ReactProp(name = "fill")
public void setFill(T node, @Nullable Dynamic fill) {
node.setFill(fill);
Expand Down
6 changes: 3 additions & 3 deletions android/src/main/java/com/horcrux/svg/SvgView.java
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ public int reactTagForTouch(float touchX, float touchY) {
final Matrix mInvViewBoxMatrix = new Matrix();
private boolean mInvertible = true;
private boolean mRendered = false;
int mTintColor = 0;
int mCurrentColor = 0;

boolean notRendered() {
return !mRendered;
Expand All @@ -209,8 +209,8 @@ private void clearChildCache() {
}
}

public void setTintColor(Integer tintColor) {
mTintColor = tintColor != null ? tintColor : 0;
public void setCurrentColor(Integer color) {
mCurrentColor = color != null ? color : 0;
invalidate();
clearChildCache();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGCircleManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGClipPathManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGEllipseManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGForeignObjectManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGGroupManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGImageManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGLineManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGMarkerManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGMaskManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public interface RNSVGPathManagerInterface<T extends View> {
void setResponsible(T view, boolean value);
void setDisplay(T view, @Nullable String value);
void setPointerEvents(T view, @Nullable String value);
void setColor(T view, @Nullable Integer value);
void setFill(T view, @Nullable ReadableMap value);
void setFillOpacity(T view, float value);
void setFillRule(T view, int value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ColorPropConverter;
import com.facebook.react.bridge.DynamicFromObject;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
Expand Down Expand Up @@ -60,6 +61,9 @@ public void setProperty(T view, String propName, @Nullable Object value) {
case "pointerEvents":
mViewManager.setPointerEvents(view, value == null ? null : (String) value);
break;
case "color":
mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext()));
break;
case "fill":
mViewManager.setFill(view, (ReadableMap) value);
break;
Expand Down
Loading
Loading