Skip to content
11 changes: 11 additions & 0 deletions src/main/java/net/rptools/maptool/client/MapToolUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import java.awt.Color;
import java.security.SecureRandom;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
Expand All @@ -24,6 +25,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.rptools.lib.MD5Key;
import net.rptools.lib.StringUtil;
import net.rptools.maptool.client.utilities.RandomSuffixFactory;
import net.rptools.maptool.language.I18N;
Expand Down Expand Up @@ -265,6 +267,15 @@ public static Set<String> getColorNames() {
return COLOR_MAP.keySet();
}

public static void uploadAssetIds(Collection<MD5Key> assetIds) {
for (var assetId : assetIds) {
var asset = AssetManager.getAsset(assetId);
if (asset != null) {
uploadAsset(asset);
}
}
}

public static void uploadTexture(DrawablePaint paint) {
if (paint == null) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,34 +68,29 @@ public Object childEvaluate(

StringBuilder assetId = new StringBuilder("asset://");

if (over instanceof SingleImageBarTokenOverlay) {
assetId.append(((SingleImageBarTokenOverlay) over).getAssetId().toString());

} else if (over instanceof TwoImageBarTokenOverlay) {
if (value != null) {
if (value.doubleValue() > 0.5) {
assetId.append(((TwoImageBarTokenOverlay) over).getTopAssetId().toString());
} else {
assetId.append(((TwoImageBarTokenOverlay) over).getBottomAssetId().toString());
}
if (over instanceof SingleImageBarTokenOverlay one) {
assetId.append(one.getAssetId().toString());
} else if (over instanceof TwoImageBarTokenOverlay two) {
if (value != null && value.doubleValue() > 0.5) {
assetId.append(two.getTopAssetId().toString());
} else {
assetId.append(((TwoImageBarTokenOverlay) over).getBottomAssetId().toString());
assetId.append(two.getBottomAssetId().toString());
}
} else if (over instanceof MultipleImageBarTokenOverlay) {
} else if (over instanceof MultipleImageBarTokenOverlay many) {
int increment = 0;
int max_increments = ((MultipleImageBarTokenOverlay) over).getAssetIds().length;
int max_increments = many.getAssetIds().size();
if (value != null) {
increment = Math.max(Math.min(over.findIncrement(value.doubleValue()), max_increments), 0);
increment = Math.clamp(over.findIncrement(value.doubleValue()), 0, max_increments);
}
assetId.append(((MultipleImageBarTokenOverlay) over).getAssetIds()[increment].toString());
assetId.append(many.getAssetIds().get(increment).toString());
} else {
throw new ParserException(
I18N.getText("macro.function.barImage.notImage", functionName, barName));
}
// control flow should be the same with this code being outside of the if statement

if (size != null && size.intValue() != 0) {
assetId.append("-");
int i = Math.max(Math.min(size.intValue(), 500), 1);
int i = Math.clamp(size.intValue(), 1, 500);
assetId.append(i);
}
return assetId.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
import java.math.BigDecimal;
import java.util.List;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.ui.token.AbstractImageTokenOverlay;
import net.rptools.maptool.client.ui.token.BooleanTokenOverlay;
import net.rptools.maptool.client.ui.token.ImageTokenOverlay;
import net.rptools.maptool.language.I18N;
import net.rptools.parser.Parser;
import net.rptools.parser.ParserException;
Expand Down Expand Up @@ -59,9 +59,9 @@ public Object childEvaluate(
throw new ParserException(
I18N.getText("macro.function.stateImage.unknownState", "getStateImage()", stateName));
}
if (over instanceof ImageTokenOverlay) {
if (over instanceof AbstractImageTokenOverlay imageOverlay) {
StringBuilder assetId = new StringBuilder("asset://");
assetId.append(((ImageTokenOverlay) over).getAssetId().toString());
assetId.append(imageOverlay.getAssetId().toString());
if (size != null && size.intValue() != 0) {
assetId.append("-");
// Constrain it slightly, so its between 1 and 500 :)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -411,15 +411,20 @@ private JsonObject getCampaignInfo() throws ParserException {
state.addProperty("isShowOwner", bto.isShowOwner() ? BigDecimal.ONE : BigDecimal.ZERO);
state.addProperty("isShowOthers", bto.isShowOthers() ? BigDecimal.ONE : BigDecimal.ZERO);
state.addProperty(
"isImageOverlay", (bto instanceof ImageTokenOverlay) ? BigDecimal.ONE : BigDecimal.ZERO);
"isImageOverlay",
(bto instanceof AbstractImageTokenOverlay) ? BigDecimal.ONE : BigDecimal.ZERO);
state.addProperty("mouseOver", bto.isMouseover() ? BigDecimal.ONE : BigDecimal.ZERO);
state.addProperty("opacity", bto.getOpacity());
state.addProperty("order", bto.getOrder());
if (bto instanceof FlowColorDotTokenOverlay) {
state.addProperty("gridSize", ((FlowColorDotTokenOverlay) bto).getGrid());

if (bto instanceof AbstractFlowShapeTokenOverlay flow) {
state.addProperty("gridSize", flow.getGrid());
}
if (bto instanceof FlowImageTokenOverlay flow) {
state.addProperty("gridSize", flow.getGrid());
}
if (bto instanceof CornerImageTokenOverlay) {
state.addProperty("corner", ((CornerImageTokenOverlay) bto).getCorner().name());
if (bto instanceof CornerImageTokenOverlay cornerImage) {
state.addProperty("corner", cornerImage.getCorner().name());
}

sgroup.add(state);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ public void execute(MacroContext context, String aMacro, MapToolMacroContext exe
MapTool.addLocalMessage(e.getMessage());
return;
}
MapToolUtil.uploadAssetIds(tokenOverlay.getAssetIds());
MapTool.getCampaign().getTokenStatesMap().put(tokenOverlay.getName(), tokenOverlay);

MapTool.addLocalMessage(I18N.getText("addtokenstate.added", tokenOverlay.getName()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import javax.swing.JFileChooser;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.MapToolMacroContext;
import net.rptools.maptool.client.MapToolUtil;
import net.rptools.maptool.client.macro.Macro;
import net.rptools.maptool.client.macro.MacroContext;
import net.rptools.maptool.client.macro.MacroDefinition;
Expand Down Expand Up @@ -72,6 +73,7 @@ public void execute(MacroContext context, String macro, MapToolMacroContext exec
List<BooleanTokenOverlay> overlays = (List<BooleanTokenOverlay>) decoder.readObject();
decoder.close();
for (BooleanTokenOverlay overlay : overlays) {
MapToolUtil.uploadAssetIds(overlay.getAssetIds());
MapTool.getCampaign().getTokenStatesMap().put(overlay.getName(), overlay);
} // endfor
MapTool.addLocalMessage(I18N.getText("loadtokenstates.loaded", overlays.size()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import net.rptools.lib.MD5Key;
import net.rptools.maptool.client.AppConstants;
import net.rptools.maptool.client.AppPreferences;
import net.rptools.maptool.client.MapToolUtil;
import net.rptools.maptool.client.swing.AbeillePanel;
import net.rptools.maptool.client.swing.ColorWell;
import net.rptools.maptool.client.ui.PreviewPanelFileChooser;
Expand Down Expand Up @@ -603,23 +604,18 @@ public void valueChanged(ListSelectionEvent e) {
} // endif

// Handle images
MD5Key[] assetIds = null;
if (bar instanceof TwoImageBarTokenOverlay) {
assetIds =
new MD5Key[] {
((TwoImageBarTokenOverlay) bar).getBottomAssetId(),
((TwoImageBarTokenOverlay) bar).getTopAssetId()
};
var assetIds = bar.getAssetIds();
if (bar instanceof TwoImageBarTokenOverlay two) {
type = 0;
} else if (bar instanceof SingleImageBarTokenOverlay) {
assetIds = new MD5Key[] {((SingleImageBarTokenOverlay) bar).getAssetId()};
} else if (bar instanceof SingleImageBarTokenOverlay one) {
type = 1;
} else if (bar instanceof MultipleImageBarTokenOverlay) {
assetIds = ((MultipleImageBarTokenOverlay) bar).getAssetIds();
} else if (bar instanceof MultipleImageBarTokenOverlay many) {
type = 2;
}
DefaultListModel<MD5Key> model = new DefaultListModel<>();
if (assetIds != null) for (MD5Key key : assetIds) model.addElement(key);
for (MD5Key key : assetIds) {
model.addElement(key);
}
formPanel.getList(IMAGES).setModel(model);
formPanel.getList(IMAGES).repaint();

Expand Down Expand Up @@ -738,6 +734,8 @@ public void copyUIToCampaign(Campaign campaign) {
BarTokenOverlay overlay = model.getElementAt(i);
overlay.setOrder(i);
states.put(overlay.getName(), overlay);

MapToolUtil.uploadAssetIds(overlay.getAssetIds());
}
campaign.getTokenBarsMap().clear();
campaign.getTokenBarsMap().putAll(states);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import net.rptools.lib.StringUtil;
import net.rptools.maptool.client.AppConstants;
import net.rptools.maptool.client.AppPreferences;
import net.rptools.maptool.client.MapToolUtil;
import net.rptools.maptool.client.swing.AbeillePanel;
import net.rptools.maptool.client.swing.ColorWell;
import net.rptools.maptool.client.ui.PreviewPanelFileChooser;
Expand Down Expand Up @@ -511,57 +512,81 @@ public void valueChanged(ListSelectionEvent e) {
formPanel.getCheckBox(SHOW_OTHERS).setSelected(s.isShowOthers());

// Get most of the colors and all of the widths from the XTokenOverlay
OverlayType type = OverlayType.Image;
if (s instanceof XTokenOverlay xTokenOverlay) {
type = OverlayType.X;
formPanel.getSpinner(WIDTH).setValue(xTokenOverlay.getWidth());
((ColorWell) formPanel.getComponent(COLOR)).setColor(xTokenOverlay.getColor());
} // endif
OverlayType type;
switch (s) {
case ColorDotTokenOverlay colorDotTokenOverlay -> {
type = OverlayType.Dot;
((ColorWell) formPanel.getComponent(COLOR)).setColor(colorDotTokenOverlay.getColor());
formPanel
.getComboBox(CORNER)
.setSelectedIndex(colorDotTokenOverlay.getCorner().ordinal());
}
case ShadedTokenOverlay shadedTokenOverlay -> {
type = OverlayType.Shaded;
((ColorWell) formPanel.getComponent(COLOR)).setColor(shadedTokenOverlay.getColor());
}

// Get the the flow grid for most components from FlowColorDotTokenOverlay
if (s instanceof FlowColorDotTokenOverlay flowColorDotTokenOverlay) {
type = OverlayType.GridDot;
int size = flowColorDotTokenOverlay.getGrid();
formPanel.getSpinner(FLOW_GRID).setValue(size + "x" + size);
} // endif
// region AbstractImageTokenOverlay

// Handle the
if (s instanceof CornerImageTokenOverlay cornerImageTokenOverlay) {
type = OverlayType.CornerImage;
formPanel
.getComboBox(CORNER)
.setSelectedIndex(cornerImageTokenOverlay.getCorner().ordinal());
} else if (s instanceof FlowImageTokenOverlay flowImageTokenOverlay) {
type = OverlayType.GridImage;
int size = flowImageTokenOverlay.getGrid(); // Still need grid size
formPanel.getSpinner(FLOW_GRID).setValue(size + "x" + size);
} else if (s instanceof ImageTokenOverlay) {
type = OverlayType.Image;
} else if (s instanceof ColorDotTokenOverlay colorDotTokenOverlay) {
type = OverlayType.Dot;
formPanel.getComboBox(CORNER).setSelectedIndex(colorDotTokenOverlay.getCorner().ordinal());
} else if (s instanceof OTokenOverlay) {
type = OverlayType.Circle;
} else if (s instanceof ShadedTokenOverlay shadedTokenOverlay) {
type = OverlayType.Shaded;
((ColorWell) formPanel.getComponent(COLOR)).setColor(shadedTokenOverlay.getColor());
} else if (s instanceof CrossTokenOverlay) {
type = OverlayType.Cross;
} else if (s instanceof DiamondTokenOverlay) {
type = OverlayType.Diamond;
} else if (s instanceof FlowDiamondTokenOverlay) {
type = OverlayType.GridDiamond;
} else if (s instanceof YieldTokenOverlay) {
type = OverlayType.Yield;
} else if (s instanceof FlowYieldTokenOverlay) {
type = OverlayType.GridYield;
} else if (s instanceof TriangleTokenOverlay) {
type = OverlayType.Triangle;
} else if (s instanceof FlowTriangleTokenOverlay) {
type = OverlayType.GridTriangle;
} else if (s instanceof FlowColorSquareTokenOverlay) {
type = OverlayType.GridSquare;
} // endif
case AbstractImageTokenOverlay imageTokenOverlay0 -> {
switch (imageTokenOverlay0) {
case ImageTokenOverlay imageTokenOverlay -> {
type = OverlayType.Image;
}
case CornerImageTokenOverlay cornerImageTokenOverlay -> {
type = OverlayType.CornerImage;
formPanel
.getComboBox(CORNER)
.setSelectedIndex(cornerImageTokenOverlay.getCorner().ordinal());
}
case FlowImageTokenOverlay flowImageTokenOverlay -> {
type = OverlayType.GridImage;
int size = flowImageTokenOverlay.getGrid(); // Still need grid size
formPanel.getSpinner(FLOW_GRID).setValue(size + "x" + size);
}
}
}

// endregion

// region AbstractFlowShapeTokenOverlay

case AbstractFlowShapeTokenOverlay flowShapeTokenOverlay -> {
int size = flowShapeTokenOverlay.getGrid();
formPanel.getSpinner(FLOW_GRID).setValue(size + "x" + size);

type =
switch (flowShapeTokenOverlay) {
case FlowColorDotTokenOverlay flowColorDotTokenOverlay -> OverlayType.GridDot;
case FlowColorSquareTokenOverlay flowColorSquareTokenOverlay ->
OverlayType.GridSquare;
case FlowDiamondTokenOverlay flowDiamondTokenOverlay -> OverlayType.GridDiamond;
case FlowTriangleTokenOverlay flowTriangleTokenOverlay -> OverlayType.GridTriangle;
case FlowYieldTokenOverlay flowYieldTokenOverlay -> OverlayType.GridYield;
};
}

// endregion

// region AbstractShapeTokenOverlay

case AbstractShapeTokenOverlay shapeTokenOverlay -> {
formPanel.getSpinner(WIDTH).setValue(shapeTokenOverlay.getWidth());
((ColorWell) formPanel.getComponent(COLOR)).setColor(shapeTokenOverlay.getColor());

type =
switch (shapeTokenOverlay) {
case CrossTokenOverlay crossTokenOverlay -> OverlayType.Cross;
case DiamondTokenOverlay diamondTokenOverlay -> OverlayType.Diamond;
case OTokenOverlay oTokenOverlay -> OverlayType.Circle;
case TriangleTokenOverlay triangleTokenOverlay -> OverlayType.Triangle;
case YieldTokenOverlay yieldTokenOverlay -> OverlayType.Yield;
case XTokenOverlay xTokenOverlay -> OverlayType.X;
};
}

// endregion
}

// Set the type and change components
formPanel.getComboBox(TYPE).setSelectedIndex(type.ordinal());
Expand Down Expand Up @@ -665,6 +690,8 @@ public void copyUIToCampaign(Campaign campaign) {
BooleanTokenOverlay overlay = (BooleanTokenOverlay) model.getElementAt(i);
overlay.setOrder(i);
states.put(overlay.getName(), overlay);

MapToolUtil.uploadAssetIds(overlay.getAssetIds());
}
campaign.getTokenStatesMap().clear();
campaign.getTokenStatesMap().putAll(states);
Expand Down Expand Up @@ -747,9 +774,8 @@ public BooleanTokenOverlay createTokenOverlay(BooleanTokenOverlay updatedOverlay
fName = fName.length() == 0 ? null : fName;
if (updatedOverlay == null || fName != null) {
assetId = loadAsssetFile(fName, formPanel);
} else {
if (updatedOverlay instanceof ImageTokenOverlay)
assetId = ((ImageTokenOverlay) updatedOverlay).getAssetId();
} else if (updatedOverlay instanceof AbstractImageTokenOverlay imageOverlay) {
assetId = imageOverlay.getAssetId();
} // endif

// Create all of the image overlays
Expand Down
Loading
Loading