Skip to content

Commit

Permalink
[core] Support for list in FallbackAttributes
Browse files Browse the repository at this point in the history
> Implement list fallback in FallbackAttributes
  • Loading branch information
GabrielBRDeveloper committed Aug 1, 2024
1 parent 8283877 commit 672ab6a
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 26 deletions.
89 changes: 68 additions & 21 deletions core/src/br/nullexcept/mux/res/FallbackAttributes.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,47 @@
import br.nullexcept.mux.graphics.fonts.Typeface;
import br.nullexcept.mux.lang.Function;
import br.nullexcept.mux.lang.xml.XmlElement;
import br.nullexcept.mux.utils.Log;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

class FallbackAttributes implements AttributeList {
private final Resources resources;
private final Map<String, String> map;
private final FallbackAttributes fallback;
private final ArrayList<AttributeList> fallbacks;

public FallbackAttributes(Map<String, String> attrs, FallbackAttributes fallback, Resources res){
public FallbackAttributes(Map<String, String> attrs, List<AttributeList> fallbacks, Resources res){
this.resources = res;
this.map = attrs;
this.fallback = fallback;
this.fallbacks = new ArrayList<>();
for (AttributeList attr: fallbacks) {
if (attr == null) continue;
this.fallbacks.add(attr);
}
}

public FallbackAttributes(XmlElement xml, FallbackAttributes fallback, Resources res){
this(xml.attrs(), fallback, res);
public FallbackAttributes(XmlElement xml, List<AttributeList> fallbacks, Resources res){
this(xml.attrs(), fallbacks, res);
}

private String resolve(String value){
if (value.startsWith("?")){
if (value != null && value.startsWith("?")){
String name = value.substring(1);
if (map.containsKey(name)){
return resolve(map.get(name));
}
if (fallback != null){
return fallback.resolve(value);
String[] resolved = new String[1];
for (AttributeList fallback: fallbacks) {
try {
fallback.searchRaw(name, v -> resolved[0] = v);
if (resolved[0] != null) {
return resolved[0];
}
} catch (Exception e){
// Don't do anything because call undefined resolve from other FallbackAttributes
}
}
throw new RuntimeException("Cannot resolve reference: "+name);
}
Expand Down Expand Up @@ -86,8 +101,15 @@ public void searchFloat(String name, Function<Float> apply) {
public void searchRaw(String name, Function<String> apply) {
if (contains(name)){
apply.call(resolve(map.get(name)));
} else if (fallback != null){
fallback.searchRaw(name, apply);
} else {
String[] data = new String[1];
for (AttributeList fallback : fallbacks) {
fallback.searchRaw(name, value -> data[0] = value);
if (data[0] != null) {
apply.call(data[0]);
break;
}
}
}
}

Expand All @@ -103,15 +125,20 @@ public String[] names() {

@Override
public String getRawValue(String name) {
return map.get(name);
return (map.get(name));
}

@Override
public CharSequence getText(String name) {
if (contains(name)){
return Parser.parseText(resources, resolve(map.get(name)));
} else if (fallback != null){
return fallback.getText(name);
} else {
for (AttributeList fallback : fallbacks) {
CharSequence seq = fallback.getText(name);
if (seq != null) {
return seq;
}
}
}
return null;
}
Expand All @@ -120,8 +147,13 @@ public CharSequence getText(String name) {
public int getColor(String name, int defaultValue) {
if (contains(name)){
return Parser.parseColor(resolve(map.get(name)));
} else if (fallback != null){
return fallback.getColor(name, defaultValue);
} else {
for (AttributeList fallback : fallbacks) {
int color = fallback.getColor(name, Integer.MAX_VALUE);
if (color != Integer.MAX_VALUE) {
return color;
}
}
}
return defaultValue;
}
Expand All @@ -130,8 +162,13 @@ public int getColor(String name, int defaultValue) {
public float getDimension(String name, float defaultValue) {
if (contains(name)){
return Parser.parseDimension(resources, resolve(map.get(name)));
} else if (fallback != null){
return fallback.getDimension(name, defaultValue);
} else {
for (AttributeList fallback: fallbacks) {
float dimension = fallback.getDimension(name, Float.MAX_VALUE);
if (dimension != Float.MAX_VALUE) {
return dimension;
}
}
}
return defaultValue;
}
Expand All @@ -140,8 +177,13 @@ public float getDimension(String name, float defaultValue) {
public Drawable getDrawable(String name) {
if (contains(name)){
return Parser.parseDrawable(resources, resolve(map.get(name)));
} else if (fallback != null){
return fallback.getDrawable(name);
} else {
for (AttributeList fallback : fallbacks) {
Drawable drawable = fallback.getDrawable(name);
if (drawable != null) {
return drawable;
}
}
}
return null;
}
Expand All @@ -150,8 +192,13 @@ public Drawable getDrawable(String name) {
public ColorStateList getColorList(String name) {
if (contains(name)) {
return Parser.parseColorState(resources, resolve(map.get(name)));
} else if (fallback != null) {
return fallback.getColorList(name);
} else {
for (AttributeList fallback: fallbacks) {
ColorStateList color = fallback.getColorList(name);
if (color != null) {
return fallback.getColorList(name);
}
}
}
return null;
}
Expand Down
8 changes: 5 additions & 3 deletions core/src/br/nullexcept/mux/res/LayoutInflater.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import br.nullexcept.mux.view.ViewGroup;
import br.nullexcept.mux.widget.*;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;

import static br.nullexcept.mux.view.AttrList.*;
Expand Down Expand Up @@ -44,10 +46,10 @@ private <T extends View> T inflate(XmlElement xml){
throw new RuntimeException("Invalid view class " + xml.name() + " you need register class before use.");
}
}
FallbackAttributes agent = new FallbackAttributes(xml, (FallbackAttributes) res.obtainStyled("Widget."+viewName), res);
FallbackAttributes attrs = new FallbackAttributes(xml, Collections.singletonList(res.obtainStyled("Widget." + viewName)), res);
ViewRegister register = registers.get(viewName);
View view = register.create(context,agent);
view.setLayoutParams(parseLayoutParams(agent));
View view = register.create(context,attrs);
view.setLayoutParams(parseLayoutParams(attrs));
if (view instanceof ViewGroup){
for (int i = 0; i < xml.childCount(); i++){
((ViewGroup) view).addChild(inflate(xml.childAt(i)));
Expand Down
4 changes: 3 additions & 1 deletion core/src/br/nullexcept/mux/res/Resources.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import br.nullexcept.mux.lang.xml.XmlElement;

import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;

Expand Down Expand Up @@ -103,7 +105,7 @@ private void importStylesheet(XmlElement xml){
}

public AttributeList obtainStyled(XmlElement xml){
return new FallbackAttributes(xml, theme, this);
return new FallbackAttributes(xml, Collections.singletonList(theme), this);
}

public AttributeList obtainStyled(String name){
Expand Down
4 changes: 3 additions & 1 deletion core/src/br/nullexcept/mux/res/StylePreset.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import br.nullexcept.mux.lang.xml.XmlElement;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

Expand Down Expand Up @@ -30,6 +32,6 @@ public FallbackAttributes generate(FallbackAttributes fallback){
if (parent != null){
fallback = resources.obtainStyle(parent).generate(fallback);
}
return new FallbackAttributes(presets,fallback,resources);
return new FallbackAttributes(presets, Collections.singletonList(fallback),resources);
}
}

0 comments on commit 672ab6a

Please sign in to comment.