move ThemeBuilder
This commit is contained in:
parent
120797fe96
commit
dc70104676
126
vtm-playground/src/org/oscim/test/ThemeBuilder.java
Normal file
126
vtm-playground/src/org/oscim/test/ThemeBuilder.java
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
package org.oscim.test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import org.oscim.theme.RenderTheme;
|
||||||
|
import org.oscim.theme.rule.Rule;
|
||||||
|
import org.oscim.theme.rule.Rule.Element;
|
||||||
|
import org.oscim.theme.rule.RuleBuilder;
|
||||||
|
import org.oscim.theme.rule.RuleBuilder.RuleType;
|
||||||
|
import org.oscim.theme.styles.AreaStyle.AreaBuilder;
|
||||||
|
import org.oscim.theme.styles.LineStyle.LineBuilder;
|
||||||
|
import org.oscim.theme.styles.RenderStyle;
|
||||||
|
import org.oscim.theme.styles.TextStyle.TextBuilder;
|
||||||
|
|
||||||
|
public class ThemeBuilder {
|
||||||
|
protected final ArrayList<RuleBuilder> mRulesList = new ArrayList<RuleBuilder>();
|
||||||
|
protected final Stack<RuleBuilder> mRuleStack = new Stack<RuleBuilder>();
|
||||||
|
|
||||||
|
protected int mLevels = 0;
|
||||||
|
protected int mMapBackground = 0xffffffff;
|
||||||
|
protected float mBaseTextSize = 1;
|
||||||
|
|
||||||
|
protected RuleBuilder mCurrentRule;
|
||||||
|
|
||||||
|
public RenderTheme build() {
|
||||||
|
int[] layer = new int[1];
|
||||||
|
|
||||||
|
Rule[] rules = new Rule[mRulesList.size()];
|
||||||
|
for (int i = 0, n = rules.length; i < n; i++)
|
||||||
|
rules[i] = mRulesList.get(i).onComplete(layer);
|
||||||
|
|
||||||
|
RenderTheme theme = new RenderTheme(mMapBackground, mBaseTextSize, rules, mLevels);
|
||||||
|
|
||||||
|
mRulesList.clear();
|
||||||
|
mRuleStack.clear();
|
||||||
|
|
||||||
|
return theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThemeBuilder pop() {
|
||||||
|
|
||||||
|
mRuleStack.pop();
|
||||||
|
if (mRuleStack.empty()) {
|
||||||
|
mRulesList.add(mCurrentRule);
|
||||||
|
} else {
|
||||||
|
mCurrentRule = mRuleStack.peek();
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThemeBuilder push(RuleBuilder rule) {
|
||||||
|
if (!mRuleStack.empty())
|
||||||
|
mCurrentRule.addSubRule(rule);
|
||||||
|
|
||||||
|
mCurrentRule = rule;
|
||||||
|
mRuleStack.push(mCurrentRule);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThemeBuilder rules(RuleBuilder... rb) {
|
||||||
|
for (RuleBuilder r : rb) {
|
||||||
|
mRulesList.add(r);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RuleBuilder pushParse(String keys, String values) {
|
||||||
|
|
||||||
|
return RuleBuilder.create(mRuleStack, keys, values)
|
||||||
|
.zoom(~0)
|
||||||
|
.element(Element.ANY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThemeBuilder addStyle(RenderStyle style) {
|
||||||
|
mCurrentRule.addStyle(style);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void rules() {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public static LineBuilder line(int color, float width) {
|
||||||
|
return new LineBuilder()
|
||||||
|
.color(color)
|
||||||
|
.width(width);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AreaBuilder area(int color) {
|
||||||
|
return new AreaBuilder()
|
||||||
|
.color(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TextBuilder wayText(float size, int color) {
|
||||||
|
return new TextBuilder()
|
||||||
|
.setFontSize(size)
|
||||||
|
.setColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TextBuilder nodeText(float size, int color) {
|
||||||
|
return new TextBuilder()
|
||||||
|
.setFontSize(size)
|
||||||
|
.setColor(color)
|
||||||
|
.setCaption(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RuleBuilder matchKey(String key) {
|
||||||
|
return new RuleBuilder(RuleType.POSITIVE,
|
||||||
|
new String[] { key },
|
||||||
|
new String[] {});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RuleBuilder matchValue(String value) {
|
||||||
|
return new RuleBuilder(RuleType.POSITIVE,
|
||||||
|
new String[] {},
|
||||||
|
new String[] { value });
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RuleBuilder matchKeyValue(String key, String value) {
|
||||||
|
return new RuleBuilder(RuleType.POSITIVE,
|
||||||
|
new String[] { key },
|
||||||
|
new String[] { value });
|
||||||
|
}
|
||||||
|
}
|
61
vtm-playground/src/org/oscim/test/ThemeBuilderTest.java
Normal file
61
vtm-playground/src/org/oscim/test/ThemeBuilderTest.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package org.oscim.test;
|
||||||
|
|
||||||
|
import org.oscim.backend.canvas.Color;
|
||||||
|
import org.oscim.backend.canvas.Paint.Cap;
|
||||||
|
import org.oscim.gdx.GdxMap;
|
||||||
|
import org.oscim.gdx.GdxMapApp;
|
||||||
|
import org.oscim.layers.tile.vector.VectorTileLayer;
|
||||||
|
import org.oscim.layers.tile.vector.labeling.LabelLayer;
|
||||||
|
import org.oscim.theme.RenderTheme;
|
||||||
|
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class ThemeBuilderTest extends GdxMap {
|
||||||
|
|
||||||
|
final Logger log = LoggerFactory.getLogger(MeshTest.class);
|
||||||
|
|
||||||
|
static class MyTheme extends ThemeBuilder {
|
||||||
|
public MyTheme() {
|
||||||
|
rules(
|
||||||
|
matchKeyValue("natural", "water")
|
||||||
|
.style(area(Color.BLUE)),
|
||||||
|
|
||||||
|
matchKeyValue("landuse", "forest")
|
||||||
|
.style(area(Color.GREEN)),
|
||||||
|
|
||||||
|
matchKeyValue("landuse", "residential")
|
||||||
|
.style(area(Color.LTGRAY)),
|
||||||
|
|
||||||
|
matchKey("highway")
|
||||||
|
.rules(matchValue("residential")
|
||||||
|
.style(line(Color.DKGRAY, 1.2f),
|
||||||
|
line(Color.WHITE, 1.1f)
|
||||||
|
.cap(Cap.ROUND)))
|
||||||
|
|
||||||
|
.style(line(Color.BLACK, 1)
|
||||||
|
.blur(0.5f)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createLayers() {
|
||||||
|
|
||||||
|
VectorTileLayer l = mMap.setBaseMap(new OSciMap4TileSource());
|
||||||
|
|
||||||
|
RenderTheme t = new MyTheme().build();
|
||||||
|
|
||||||
|
mMap.setTheme(t);
|
||||||
|
//mMap.setTheme(VtmThemes.DEFAULT);
|
||||||
|
|
||||||
|
mMap.layers().add(new LabelLayer(mMap, l));
|
||||||
|
|
||||||
|
mMap.setMapPosition(53.08, 8.82, 1 << 17);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
GdxMapApp.init();
|
||||||
|
GdxMapApp.run(new ThemeBuilderTest(), null, 400);
|
||||||
|
}
|
||||||
|
}
|
@ -1,125 +0,0 @@
|
|||||||
package org.oscim.theme;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Stack;
|
|
||||||
|
|
||||||
import org.oscim.core.GeometryBuffer.GeometryType;
|
|
||||||
import org.oscim.core.Tag;
|
|
||||||
import org.oscim.core.TagSet;
|
|
||||||
import org.oscim.theme.rule.Element;
|
|
||||||
import org.oscim.theme.rule.Rule;
|
|
||||||
import org.oscim.theme.rule.RuleBuilder;
|
|
||||||
import org.oscim.theme.rule.Selector;
|
|
||||||
import org.oscim.theme.rule.SingleKeyMatcher;
|
|
||||||
import org.oscim.theme.rule.SingleValueMatcher;
|
|
||||||
import org.oscim.theme.styles.AreaStyle;
|
|
||||||
import org.oscim.theme.styles.LineStyle;
|
|
||||||
import org.oscim.theme.styles.RenderStyle;
|
|
||||||
|
|
||||||
public class ThemeBuilder {
|
|
||||||
protected final ArrayList<RuleBuilder> mRulesList = new ArrayList<RuleBuilder>();
|
|
||||||
protected final Stack<RuleBuilder> mRuleStack = new Stack<RuleBuilder>();
|
|
||||||
|
|
||||||
protected int mLevels = 0;
|
|
||||||
protected int mMapBackground = 0xffffffff;
|
|
||||||
protected float mBaseTextSize = 1;
|
|
||||||
|
|
||||||
protected RuleBuilder mCurrentRule;
|
|
||||||
|
|
||||||
protected RenderTheme build() {
|
|
||||||
|
|
||||||
Rule[] rules = new Rule[mRulesList.size()];
|
|
||||||
for (int i = 0, n = rules.length; i < n; i++)
|
|
||||||
rules[i] = mRulesList.get(i).onComplete();
|
|
||||||
|
|
||||||
RenderTheme theme = new RenderTheme(mMapBackground, mBaseTextSize, rules, mLevels);
|
|
||||||
|
|
||||||
mRulesList.clear();
|
|
||||||
mRuleStack.clear();
|
|
||||||
|
|
||||||
return theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ThemeBuilder pop() {
|
|
||||||
|
|
||||||
mRuleStack.pop();
|
|
||||||
if (mRuleStack.empty()) {
|
|
||||||
mRulesList.add(mCurrentRule);
|
|
||||||
} else {
|
|
||||||
mCurrentRule = mRuleStack.peek();
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ThemeBuilder push(RuleBuilder rule) {
|
|
||||||
if (!mRuleStack.empty())
|
|
||||||
mCurrentRule.addSubRule(rule);
|
|
||||||
|
|
||||||
mCurrentRule = rule;
|
|
||||||
mRuleStack.push(mCurrentRule);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ThemeBuilder push(String key, String value) {
|
|
||||||
RuleBuilder b = new RuleBuilder(true, Element.ANY, ~0, 0,
|
|
||||||
key == null ? null : new SingleKeyMatcher(key),
|
|
||||||
value == null ? null : new SingleValueMatcher(value));
|
|
||||||
push(b);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RuleBuilder pushParse(String keys, String values) {
|
|
||||||
|
|
||||||
return RuleBuilder.create(mRuleStack, keys, values)
|
|
||||||
.zoom(~0)
|
|
||||||
.element(Element.ANY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ThemeBuilder addStyle(RenderStyle style) {
|
|
||||||
mCurrentRule.addStyle(style);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
|
|
||||||
ThemeBuilder b = new ThemeBuilder();
|
|
||||||
|
|
||||||
//b.pushParse("highway", "residential|primary|motorway")
|
|
||||||
|
|
||||||
b.push(RuleBuilder.get().select(Selector.FIRST))
|
|
||||||
.push("highway", null)
|
|
||||||
.addStyle(new LineStyle(1, 1, 1))
|
|
||||||
.pop()
|
|
||||||
|
|
||||||
.push(RuleBuilder.get().select(Selector.WHEN_MATCHED))
|
|
||||||
.addStyle(new AreaStyle(1, 1))
|
|
||||||
.pop()
|
|
||||||
.pop();
|
|
||||||
|
|
||||||
RenderTheme t = b.build();
|
|
||||||
TagSet tags = new TagSet(1);
|
|
||||||
RenderStyle[] styles;
|
|
||||||
|
|
||||||
tags.add(new Tag("ahighway", "residential"));
|
|
||||||
styles = t.matchElement(GeometryType.LINE, tags, 1);
|
|
||||||
System.out.println(Arrays.deepToString(styles));
|
|
||||||
|
|
||||||
// tags.clear();
|
|
||||||
// tags.add(new Tag("highway", "motorway"));
|
|
||||||
// styles = t.matchElement(GeometryType.LINE, tags, 1);
|
|
||||||
// out.println(styles);
|
|
||||||
//
|
|
||||||
// tags.clear();
|
|
||||||
// tags.add(new Tag("sup", "wup"));
|
|
||||||
// styles = t.matchElement(GeometryType.LINE, tags, 1);
|
|
||||||
// out.println(styles);
|
|
||||||
//
|
|
||||||
// tags.clear();
|
|
||||||
// tags.add(new Tag("highway", "motorway"));
|
|
||||||
// styles = t.matchElement(GeometryType.LINE, tags, 1);
|
|
||||||
// out.println(styles);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user