From 4a6c0ef2d7f5c1dfa53ad35c3fe84ecef1037ab4 Mon Sep 17 00:00:00 2001 From: cwisniew Date: Thu, 3 Aug 2023 20:00:55 +0930 Subject: [PATCH 1/4] Add display name to token property type and dto --- .../rptools/maptool/model/TokenProperty.java | 22 +++++++++++++++++-- src/main/proto/data_transfer_objects.proto | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/rptools/maptool/model/TokenProperty.java b/src/main/java/net/rptools/maptool/model/TokenProperty.java index da2ce8f2eb..d62a2d4608 100644 --- a/src/main/java/net/rptools/maptool/model/TokenProperty.java +++ b/src/main/java/net/rptools/maptool/model/TokenProperty.java @@ -26,6 +26,8 @@ public class TokenProperty implements Serializable { private boolean gmOnly; private String defaultValue; + private String displayName; + public TokenProperty() { // For serialization } @@ -100,6 +102,14 @@ public String getName() { return name; } + public boolean hasDisplayName() { + return displayName != null; + } + + public String getDisplayName() { + return displayName; + } + public void setName(String name) { this.name = name; } @@ -136,17 +146,25 @@ public static TokenProperty fromDto(TokenPropertyDto dto) { prop.ownerOnly = dto.getOwnerOnly(); prop.gmOnly = dto.getGmOnly(); prop.defaultValue = dto.hasDefaultValue() ? dto.getDefaultValue().getValue() : null; + prop.displayName = dto.hasDisplayName() ? dto.getDisplayName().getValue() : null; return prop; } public TokenPropertyDto toDto() { var dto = TokenPropertyDto.newBuilder(); dto.setName(name); - if (shortName != null) dto.setShortName(StringValue.of(shortName)); + if (shortName != null) { + dto.setShortName(StringValue.of(shortName)); + } dto.setHighPriority(highPriority); dto.setOwnerOnly(ownerOnly); dto.setGmOnly(gmOnly); - if (defaultValue != null) dto.setDefaultValue(StringValue.of(defaultValue)); + if (defaultValue != null) { + dto.setDefaultValue(StringValue.of(defaultValue)); + } + if (hasDisplayName()) { + dto.setDisplayName(StringValue.of(displayName)); + } return dto.build(); } } diff --git a/src/main/proto/data_transfer_objects.proto b/src/main/proto/data_transfer_objects.proto index 36602d00b1..03bbe08b7b 100644 --- a/src/main/proto/data_transfer_objects.proto +++ b/src/main/proto/data_transfer_objects.proto @@ -150,6 +150,7 @@ message TokenPropertyDto { bool owner_only = 4; bool gm_only = 5; google.protobuf.StringValue default_value = 6; + google.protobuf.StringValue display_name = 7; } message TokenOverlayDto { From ff3ff27a66b29c691517c979173e48f15a7eb2f3 Mon Sep 17 00:00:00 2001 From: cwisniew Date: Thu, 3 Aug 2023 20:41:20 +0930 Subject: [PATCH 2/4] Added token property display name to UI --- .../TokenPropertiesManagementPanel.java | 2 ++ .../TokenPropertiesManagementPanelView.form | 12 ++----- .../TokenPropertiesTableModel.java | 35 ++++++++++--------- .../rptools/maptool/model/TokenProperty.java | 5 +++ .../rptools/maptool/language/i18n.properties | 1 + 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanel.java b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanel.java index e3751d7167..3639437eb1 100644 --- a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanel.java +++ b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanel.java @@ -260,6 +260,8 @@ public void initPropertyTable() { button.setEnabled(getTokenPropertiesTable().getSelectedRow() >= 0); }); propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + propertyTable.getColumnModel().getColumn(0).setPreferredWidth(80); + propertyTable.getColumnModel().getColumn(2).setPreferredWidth(100); } public void initTokenTypeName() { diff --git a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.form b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.form index abbb2807e5..860ca20ab7 100644 --- a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.form +++ b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.form @@ -3,19 +3,11 @@ - + - - - - - - - - @@ -27,6 +19,7 @@ + @@ -44,6 +37,7 @@ + diff --git a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java index cb62562a1d..ae83386953 100644 --- a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java +++ b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java @@ -62,7 +62,7 @@ public int getRowCount() { @Override public int getColumnCount() { - return 6; + return 7; } @Override @@ -72,10 +72,11 @@ public Object getValueAt(int rowIndex, int columnIndex) { return switch (columnIndex) { case 0 -> property.getName(); case 1 -> property.getShortName(); - case 2 -> property.isShowOnStatSheet(); - case 3 -> property.isGMOnly() & property.isShowOnStatSheet(); - case 4 -> property.isOwnerOnly() & property.isShowOnStatSheet(); - case 5 -> property.getDefaultValue(); + case 2 -> property.getDisplayName(); + case 3 -> property.isShowOnStatSheet(); + case 4 -> property.isGMOnly() & property.isShowOnStatSheet(); + case 5 -> property.isOwnerOnly() & property.isShowOnStatSheet(); + case 6 -> property.getDefaultValue(); default -> null; }; } @@ -85,10 +86,11 @@ public String getColumnName(int column) { return switch (column) { case 0 -> I18N.getText("campaignPropertiesTable.column.name"); case 1 -> I18N.getText("campaignPropertiesTable.column.shortName"); - case 2 -> I18N.getText("campaignPropertiesTable.column.onStatSheet"); - case 3 -> I18N.getText("campaignPropertiesTable.column.gmStatSheet"); - case 4 -> I18N.getText("campaignPropertiesTable.column.ownerStatSheet"); - case 5 -> I18N.getText("campaignPropertiesTable.column.defaultValue"); + case 2 -> I18N.getText("campaignPropertiesTable.column.displayName"); + case 3 -> I18N.getText("campaignPropertiesTable.column.onStatSheet"); + case 4 -> I18N.getText("campaignPropertiesTable.column.gmStatSheet"); + case 5 -> I18N.getText("campaignPropertiesTable.column.ownerStatSheet"); + case 6 -> I18N.getText("campaignPropertiesTable.column.defaultValue"); default -> null; }; } @@ -96,9 +98,9 @@ public String getColumnName(int column) { @Override public Class getColumnClass(int columnIndex) { return switch (columnIndex) { - case 0, 1 -> String.class; - case 2, 3, 4 -> Boolean.class; - case 5 -> LargeEditableText.class; + case 0, 1, 2 -> String.class; + case 3, 4, 5 -> Boolean.class; + case 6 -> LargeEditableText.class; default -> null; }; } @@ -121,13 +123,14 @@ public void setValueAt(Object aValue, int rowIndex, int columnIndex) { switch (columnIndex) { case 0 -> tokenProperty.setName((String) aValue); case 1 -> tokenProperty.setShortName((String) aValue); - case 2 -> { + case 2 -> tokenProperty.setDisplayName((String) aValue); + case 3 -> { tokenProperty.setShowOnStatSheet((Boolean) aValue); fireTableRowsUpdated(rowIndex, rowIndex); } - case 3 -> tokenProperty.setGMOnly((Boolean) aValue); - case 4 -> tokenProperty.setOwnerOnly((Boolean) aValue); - case 5 -> tokenProperty.setDefaultValue((String) aValue); + case 4 -> tokenProperty.setGMOnly((Boolean) aValue); + case 5 -> tokenProperty.setOwnerOnly((Boolean) aValue); + case 6 -> tokenProperty.setDefaultValue((String) aValue); } } diff --git a/src/main/java/net/rptools/maptool/model/TokenProperty.java b/src/main/java/net/rptools/maptool/model/TokenProperty.java index d62a2d4608..40ddd86506 100644 --- a/src/main/java/net/rptools/maptool/model/TokenProperty.java +++ b/src/main/java/net/rptools/maptool/model/TokenProperty.java @@ -80,6 +80,7 @@ public TokenProperty(TokenProperty prop) { this.ownerOnly = prop.ownerOnly; this.gmOnly = prop.gmOnly; this.defaultValue = prop.defaultValue; + this.displayName = prop.displayName; } public boolean isOwnerOnly() { @@ -138,6 +139,10 @@ public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + public static TokenProperty fromDto(TokenPropertyDto dto) { var prop = new TokenProperty(); prop.name = dto.getName(); diff --git a/src/main/resources/net/rptools/maptool/language/i18n.properties b/src/main/resources/net/rptools/maptool/language/i18n.properties index 4bed6535ec..e6304d28c3 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n.properties @@ -791,6 +791,7 @@ campaignPropertiesDialog.tokenTypeNameRename = Renaming Token Types... campaignProperties.macroEditDialog.default.title = Default value for Property campaignPropertiesTable.column.name = Name campaignPropertiesTable.column.shortName = Short Name +campaignPropertiesTable.column.displayName = Display Name campaignPropertiesTable.column.onStatSheet = Stat Sheet campaignPropertiesTable.column.gmStatSheet = GM campaignPropertiesTable.column.ownerStatSheet = Owner From 1ffb75a38e5d690828089d156f919a69ea3d6d1e Mon Sep 17 00:00:00 2001 From: cwisniew Date: Thu, 3 Aug 2023 22:51:12 +0930 Subject: [PATCH 3/4] Add getPropertyDisplayName macro function --- .../functions/TokenPropertyFunctions.java | 30 ++++++++++++++++++- .../rptools/maptool/language/i18n.properties | 2 ++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/rptools/maptool/client/functions/TokenPropertyFunctions.java b/src/main/java/net/rptools/maptool/client/functions/TokenPropertyFunctions.java index f3ce66822e..b8a85b2310 100644 --- a/src/main/java/net/rptools/maptool/client/functions/TokenPropertyFunctions.java +++ b/src/main/java/net/rptools/maptool/client/functions/TokenPropertyFunctions.java @@ -119,7 +119,8 @@ private TokenPropertyFunctions() { "setTokenSnapToGrid", "getAllowsURIAccess", "setAllowsURIAccess", - "getDefaultPropertyType"); + "getDefaultPropertyType", + "getPropertyDisplayName"); } public static TokenPropertyFunctions getInstance() { @@ -1024,6 +1025,33 @@ public Object childEvaluate( return MapTool.getCampaign().getCampaignProperties().getDefaultTokenPropertyType(); } + /* + * getPropertyDisplayName(Token Type Name, Property Name) + */ + if (functionName.equalsIgnoreCase("getPropertyDisplayName")) { + FunctionUtil.checkNumberParam(functionName, parameters, 2, 2); + var props = MapTool.getCampaign().getTokenTypeMap().get(parameters.get(0).toString()); + if (props == null) { + throw new ParserException( + I18N.getText( + "macro.function.general.unknownPropertyType", + functionName, + parameters.get(0).toString())); + } + final var propName = parameters.get(1).toString(); + for (var prop : props) { + if (prop.getName().equals(propName)) { + return prop.hasDisplayName() ? prop.getDisplayName() : prop.getName(); + } + } + throw new ParserException( + I18N.getText( + "macro.function.general.unknownProperty", + functionName, + parameters.get(1).toString(), + parameters.get(0).toString())); + } + throw new ParserException(I18N.getText("macro.function.general.unknownFunction", functionName)); } diff --git a/src/main/resources/net/rptools/maptool/language/i18n.properties b/src/main/resources/net/rptools/maptool/language/i18n.properties index e6304d28c3..47d8b0c833 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n.properties @@ -1799,6 +1799,8 @@ macro.function.general.onlyGM = Only the GM can call the "{ macro.function.general.tooManyParam = Function "{0}" requires no more than {1} parameters; {2} were provided. macro.function.general.unknownFunction = Unknown function name "{0}". macro.function.general.unknownToken = Error executing "{0}": the token name or id "{1}" is unknown. +macro.function.general.unknownPropertyType = Error executing "{0}": the property type "{1}" is unknown. +macro.function.general.unknownProperty = Error executing "{0}": the property "{1}" is unknown for type "{2}". macro.function.general.unknownTokenOnMap = Error executing "{0}": the token name or id "{1}" is unknown on map "{2}". macro.function.general.wrongNumParam = Function "{0}" requires exactly {1} parameters; {2} were provided. macro.function.general.listCannotBeEmpty = {0}: string list at argument {1} cannot be empty From a8e6da4328c8f81bff5b36b84c80504992893630 Mon Sep 17 00:00:00 2001 From: cwisniew Date: Thu, 3 Aug 2023 23:19:33 +0930 Subject: [PATCH 4/4] send property display name to statsheet --- .../TokenPropertiesTableModel.java | 7 +++-- .../model/sheet/stats/StatSheetContext.java | 29 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java index ae83386953..7de03395b9 100644 --- a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java +++ b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesTableModel.java @@ -72,7 +72,10 @@ public Object getValueAt(int rowIndex, int columnIndex) { return switch (columnIndex) { case 0 -> property.getName(); case 1 -> property.getShortName(); - case 2 -> property.getDisplayName(); + case 2 -> { + var displayName = property.getDisplayName(); + yield displayName == null || displayName.isBlank() ? null : displayName; + } case 3 -> property.isShowOnStatSheet(); case 4 -> property.isGMOnly() & property.isShowOnStatSheet(); case 5 -> property.isOwnerOnly() & property.isShowOnStatSheet(); @@ -110,7 +113,7 @@ public boolean isCellEditable(int rowIndex, int columnIndex) { var properties = tokenTypeMap.get(tokenType); var tokenProperty = properties.get(rowIndex); return switch (columnIndex) { - case 3, 4 -> tokenProperty + case 4, 5 -> tokenProperty .isShowOnStatSheet(); // GM, Owner only editable if show on stat sheet is set default -> true; }; diff --git a/src/main/java/net/rptools/maptool/model/sheet/stats/StatSheetContext.java b/src/main/java/net/rptools/maptool/model/sheet/stats/StatSheetContext.java index 63e9889b05..663a75bb28 100644 --- a/src/main/java/net/rptools/maptool/model/sheet/stats/StatSheetContext.java +++ b/src/main/java/net/rptools/maptool/model/sheet/stats/StatSheetContext.java @@ -17,6 +17,7 @@ import java.awt.Dimension; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import net.rptools.lib.MD5Key; import net.rptools.maptool.client.AppPreferences; import net.rptools.maptool.client.AppUtil; @@ -34,6 +35,9 @@ public class StatSheetContext { /** Class that represents a token property on a stat sheet. */ static class Property { /** Name of the property. */ + private final String name; + + /** Display Name of the property. */ private final String displayName; /** Value of the property. */ private final Object value; @@ -46,13 +50,15 @@ static class Property { /** * Creates a new instance of the class. * - * @param displayName Name of the property. + * @param name Name of the property. + * @param displayName Display Name of the property. * @param value Value of the property. * @param gmOnly True if the property is GM only. * @note GM only properties are only extracted if the player is a GM. */ - Property(String displayName, String shortName, Object value, boolean gmOnly) { - this.displayName = displayName; + Property(String name, String displayName, String shortName, Object value, boolean gmOnly) { + this.name = name; + this.displayName = Objects.requireNonNullElse(displayName, name); this.shortName = shortName; this.value = value; this.gmOnly = gmOnly; @@ -63,6 +69,15 @@ static class Property { * * @return The name of the property. */ + public String getName() { + return name; + } + + /** + * Returns the display name of the property. + * + * @return The display name of the property. + */ public String getDisplayName() { return displayName; } @@ -193,7 +208,13 @@ public StatSheetContext(Token token, Player player, StatSheetLocation location) return; } } - properties.add(new Property(tp.getName(), tp.getShortName(), value, tp.isGMOnly())); + properties.add( + new Property( + tp.getName(), + tp.getDisplayName(), + tp.getShortName(), + value, + tp.isGMOnly())); } });