From a35e83ede7dff49cb17c09a9f88affa43aa0ee34 Mon Sep 17 00:00:00 2001 From: bubblobill <45483160+bubblobill@users.noreply.github.com> Date: Tue, 16 Jan 2024 17:00:51 +0800 Subject: [PATCH 1/4] Added tooltip strings for edit token properties panel headings --- .../net/rptools/maptool/language/i18n.properties | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/resources/net/rptools/maptool/language/i18n.properties b/src/main/resources/net/rptools/maptool/language/i18n.properties index 8d45afe06d..fde31afab5 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n.properties @@ -797,6 +797,14 @@ campaignPropertiesTable.column.gmStatSheet = GM campaignPropertiesTable.column.ownerStatSheet = Owner campaignPropertiesTable.column.defaultValue = Default +AddcampaignPropertiesTable.column.name.tooltip = The actual name of the property, used by the application. +campaignPropertiesTable.column.shortName.tooltip = Short version of the property name. Used in stat-sheets and character sheets. +campaignPropertiesTable.column.displayName.tooltip = Display version of the property name. Used in stat-sheets and character sheets. +campaignPropertiesTable.column.statSheet.tooltip = Show the property on the stat-sheet. +campaignPropertiesTable.column.gm.tooltip = Restrict visibility to the GM view of the stat-sheet. +campaignPropertiesTable.column.owner.tooltip = Restrict visibility to the owner's view of the stat-sheet. +campaignPropertiesTable.column.default.tooltip = The default value assigned to the property. + # Bar propertyType CampaignPropertiesDialog.combo.bars.type.twoImages = Two Images CampaignPropertiesDialog.combo.bars.type.singleImage = Single Image @@ -1116,7 +1124,7 @@ CampaignPropertiesDialog.label.mouse = Mouseover: CampaignPropertiesDialog.label.order = Order: CampaignPropertiesDialog.label.order.tooltip = Position in the list of states, change to move up or down the list. CampaignPropertiesDialog.label.else = Everybody Else -CampaginPropertiesDialog.label.owner = Owner +CampaignPropertiesDialog.label.owner = Owner TextureChooserPanel.title = Texture @@ -1128,6 +1136,8 @@ TokenPropertiesPanel.button.setAsDefault = Set as Default TokenPropertiesPanel.defaultPropertyType = Default Property Type + + # Token terrain modifier operations Token.TerrainModifierOperation.NONE = None Token.TerrainModifierOperation.MULTIPLY = Multiply From fc483b78885bfdfa917f434ad9c8787cb7e659fc Mon Sep 17 00:00:00 2001 From: bubblobill <45483160+bubblobill@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:30:46 +0800 Subject: [PATCH 2/4] moved all the properties buttons into one group at the top, added some styling, shuffled the column order,and set columns to user resizable. --- .../TokenPropertiesManagementPanel.java | 62 +++- .../TokenPropertiesManagementPanelView.form | 304 ++++++++++++++---- .../TokenPropertiesTableModel.java | 40 +-- .../rptools/maptool/language/i18n.properties | 14 +- 4 files changed, 319 insertions(+), 101 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 c2e744b88b..e680ee002d 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 @@ -21,12 +21,14 @@ import java.util.*; import java.util.List; import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; import net.rptools.CaseInsensitiveHashMap; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.swing.AbeillePanel; import net.rptools.maptool.client.swing.TextFieldEditorButtonTableCellEditor; import net.rptools.maptool.client.ui.campaignproperties.TokenPropertiesTableModel.LargeEditableText; import net.rptools.maptool.client.ui.sheet.stats.StatSheetComboBoxRenderer; +import net.rptools.maptool.client.ui.theme.ThemeSupport; import net.rptools.maptool.language.I18N; import net.rptools.maptool.model.Campaign; import net.rptools.maptool.model.CampaignProperties; @@ -35,9 +37,11 @@ import net.rptools.maptool.model.sheet.stats.StatSheetLocation; import net.rptools.maptool.model.sheet.stats.StatSheetManager; import net.rptools.maptool.model.sheet.stats.StatSheetProperties; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class TokenPropertiesManagementPanel extends AbeillePanel { - + private static final Logger log = LogManager.getLogger(TokenPropertiesManagementPanel.class); private Map> tokenTypeMap; private final Map tokenTypeStatSheetMap = new HashMap<>(); private String editingType; @@ -310,8 +314,60 @@ public void initPropertyTable() { < getTokenPropertiesTable().getRowCount() - 1); }); propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - propertyTable.getColumnModel().getColumn(0).setPreferredWidth(80); - propertyTable.getColumnModel().getColumn(2).setPreferredWidth(100); + + propertyTable.getTableHeader().setResizingAllowed(true); + + propertyTable.setShowHorizontalLines(true); + propertyTable.setIntercellSpacing(new Dimension(4, 3)); + + DefaultTableCellRenderer myCellRenderer = new DefaultTableCellRenderer(); + myCellRenderer.setBackground(new Color(0f, 0f, 0f, 0.027f)); + + propertyTable.setGridColor(ThemeSupport.getThemeColor(ThemeSupport.ThemeColor.YELLOW).darker()); + + for (int i = 0; i < propertyTable.getColumnCount(); i++) { + propertyTable.getColumnModel().getColumn(i).sizeWidthToFit(); + switch (i) { + case 0, 1, 2 -> { + myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setMinWidth(65); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(80); + propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + } + case 3 -> { + myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + propertyTable.getColumnModel().getColumn(i).setCellRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(160); + propertyTable.getColumnModel().getColumn(i).setMinWidth(80); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(120); + propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); + } + case 4 -> { + myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setMinWidth(50); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(100); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(90); + } + case 5 -> { + myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + propertyTable.getColumnModel().getColumn(i).setCellRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setMinWidth(80); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(220); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(160); + } + case 6 -> { + myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setMinWidth(180); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(320); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(220); + + propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); + } + } + } } 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 ae73b67967..60bccdb883 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 @@ -1,16 +1,16 @@
- + - + - + @@ -26,7 +26,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -52,61 +52,9 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -137,9 +85,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -154,25 +256,17 @@ - - - - - - - - - + - + - + @@ -182,7 +276,7 @@ - + @@ -191,8 +285,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 ccffc1589c..53de84163a 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 @@ -71,15 +71,15 @@ public Object getValueAt(int rowIndex, int columnIndex) { var properties = tokenTypeMap.get(tokenType); var property = properties.get(rowIndex); return switch (columnIndex) { - case 0 -> property.getName(); - case 1 -> property.getShortName(); - case 2 -> { + case 0 -> property.isShowOnStatSheet(); + case 1 -> property.isGMOnly() & property.isShowOnStatSheet(); + case 2 -> property.isOwnerOnly() & property.isShowOnStatSheet(); + case 3 -> property.getName(); + case 4 -> property.getShortName(); + case 5 -> { 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(); case 6 -> property.getDefaultValue(); default -> null; }; @@ -88,12 +88,12 @@ public Object getValueAt(int rowIndex, int columnIndex) { @Override 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.displayName"); - case 3 -> I18N.getText("campaignPropertiesTable.column.onStatSheet"); - case 4 -> I18N.getText("campaignPropertiesTable.column.gmStatSheet"); - case 5 -> I18N.getText("campaignPropertiesTable.column.ownerStatSheet"); + case 0 -> I18N.getText("campaignPropertiesTable.column.onStatSheet"); + case 1 -> I18N.getText("campaignPropertiesTable.column.gmStatSheet"); + case 2 -> I18N.getText("campaignPropertiesTable.column.ownerStatSheet"); + case 3 -> I18N.getText("campaignPropertiesTable.column.name"); + case 4 -> I18N.getText("campaignPropertiesTable.column.shortName"); + case 5 -> I18N.getText("campaignPropertiesTable.column.displayName"); case 6 -> I18N.getText("campaignPropertiesTable.column.defaultValue"); default -> null; }; @@ -102,8 +102,8 @@ public String getColumnName(int column) { @Override public Class getColumnClass(int columnIndex) { return switch (columnIndex) { - case 0, 1, 2 -> String.class; - case 3, 4, 5 -> Boolean.class; + case 0, 1, 2 -> Boolean.class; + case 3, 4, 5 -> String.class; case 6 -> LargeEditableText.class; default -> null; }; @@ -125,15 +125,15 @@ public void setValueAt(Object aValue, int rowIndex, int columnIndex) { var properties = tokenTypeMap.get(tokenType); var tokenProperty = properties.get(rowIndex); switch (columnIndex) { - case 0 -> tokenProperty.setName((String) aValue); - case 1 -> tokenProperty.setShortName((String) aValue); - case 2 -> tokenProperty.setDisplayName((String) aValue); - case 3 -> { + case 0 -> { tokenProperty.setShowOnStatSheet((Boolean) aValue); fireTableRowsUpdated(rowIndex, rowIndex); } - case 4 -> tokenProperty.setGMOnly((Boolean) aValue); - case 5 -> tokenProperty.setOwnerOnly((Boolean) aValue); + case 1 -> tokenProperty.setGMOnly((Boolean) aValue); + case 2 -> tokenProperty.setOwnerOnly((Boolean) aValue); + case 3 -> tokenProperty.setName((String) aValue); + case 4 -> tokenProperty.setShortName((String) aValue); + case 5 -> tokenProperty.setDisplayName((String) aValue); case 6 -> tokenProperty.setDefaultValue((String) aValue); } } diff --git a/src/main/resources/net/rptools/maptool/language/i18n.properties b/src/main/resources/net/rptools/maptool/language/i18n.properties index fde31afab5..6937506302 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n.properties @@ -797,13 +797,13 @@ campaignPropertiesTable.column.gmStatSheet = GM campaignPropertiesTable.column.ownerStatSheet = Owner campaignPropertiesTable.column.defaultValue = Default -AddcampaignPropertiesTable.column.name.tooltip = The actual name of the property, used by the application. -campaignPropertiesTable.column.shortName.tooltip = Short version of the property name. Used in stat-sheets and character sheets. -campaignPropertiesTable.column.displayName.tooltip = Display version of the property name. Used in stat-sheets and character sheets. -campaignPropertiesTable.column.statSheet.tooltip = Show the property on the stat-sheet. -campaignPropertiesTable.column.gm.tooltip = Restrict visibility to the GM view of the stat-sheet. -campaignPropertiesTable.column.owner.tooltip = Restrict visibility to the owner's view of the stat-sheet. -campaignPropertiesTable.column.default.tooltip = The default value assigned to the property. +campaignPropertiesTable.column.name.description = The actual name of the property, used by the application. +campaignPropertiesTable.column.shortName.description = Short version of the property name. Used in stat-sheets and character sheets. +campaignPropertiesTable.column.displayName.description = Display version of the property name. Used in stat-sheets and character sheets. +campaignPropertiesTable.column.statSheet.description = Show the property on the stat-sheet. +campaignPropertiesTable.column.gm.description = Restrict visibility to the GM view of the stat-sheet. +campaignPropertiesTable.column.owner.description = Restrict visibility to the owner's view of the stat-sheet. +campaignPropertiesTable.column.default.description = The default value assigned to the property. # Bar propertyType CampaignPropertiesDialog.combo.bars.type.twoImages = Two Images From 2da87f73ae4a4de024a40eba0c76bd1ccbef0ade Mon Sep 17 00:00:00 2001 From: bubblobill <45483160+bubblobill@users.noreply.github.com> Date: Wed, 17 Jan 2024 22:09:08 +0800 Subject: [PATCH 3/4] Cell alignment changes --- .../TokenPropertiesManagementPanel.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 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 e680ee002d..9c6707c7df 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 @@ -320,8 +320,12 @@ public void initPropertyTable() { propertyTable.setShowHorizontalLines(true); propertyTable.setIntercellSpacing(new Dimension(4, 3)); - DefaultTableCellRenderer myCellRenderer = new DefaultTableCellRenderer(); - myCellRenderer.setBackground(new Color(0f, 0f, 0f, 0.027f)); + DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer(); + cellRenderer.setBackground(new Color(0f, 0f, 0f, 0.027f)); + cellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer(); + headerRenderer.setBackground(new Color(0f, 0f, 0f, 0.027f)); + headerRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); propertyTable.setGridColor(ThemeSupport.getThemeColor(ThemeSupport.ThemeColor.YELLOW).darker()); @@ -329,37 +333,32 @@ public void initPropertyTable() { propertyTable.getColumnModel().getColumn(i).sizeWidthToFit(); switch (i) { case 0, 1, 2 -> { - myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); - propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); propertyTable.getColumnModel().getColumn(i).setMinWidth(65); propertyTable.getColumnModel().getColumn(i).setMaxWidth(80); propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); } case 3 -> { - myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); - propertyTable.getColumnModel().getColumn(i).setCellRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); propertyTable.getColumnModel().getColumn(i).setMaxWidth(160); propertyTable.getColumnModel().getColumn(i).setMinWidth(80); propertyTable.getColumnModel().getColumn(i).setPreferredWidth(120); propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); } case 4 -> { - myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); - propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); propertyTable.getColumnModel().getColumn(i).setMinWidth(50); propertyTable.getColumnModel().getColumn(i).setMaxWidth(100); propertyTable.getColumnModel().getColumn(i).setPreferredWidth(90); } case 5 -> { - myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); - propertyTable.getColumnModel().getColumn(i).setCellRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); propertyTable.getColumnModel().getColumn(i).setMinWidth(80); propertyTable.getColumnModel().getColumn(i).setMaxWidth(220); propertyTable.getColumnModel().getColumn(i).setPreferredWidth(160); } case 6 -> { - myCellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); - propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(myCellRenderer); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); propertyTable.getColumnModel().getColumn(i).setMinWidth(180); propertyTable.getColumnModel().getColumn(i).setMaxWidth(320); propertyTable.getColumnModel().getColumn(i).setPreferredWidth(220); From 4d51d506a9f8ca4d8def4014e22fa6d1afd966b8 Mon Sep 17 00:00:00 2001 From: bubblobill <45483160+bubblobill@users.noreply.github.com> Date: Sat, 20 Jan 2024 14:10:42 +0800 Subject: [PATCH 4/4] Refactored typo in getAllCompoments() Changed labels to textareas to allow wrapping of descriptions. Added "Help" button that shows the help text (normally hidden). Checked on dark theme and large-print. Seems to work. Added "Copy" button to token type actions that duplicates selected type. Wrapped column names in HTML to allow text wrap. Fiddled with trying to make the table pretty. Alpha-sorted all the button string keys --- .../maptool/client/swing/AbeillePanel.java | 2 +- .../CampaignPropertiesDialog.java | 1 + .../TokenPropertiesManagementPanel.java | 220 ++++++--- .../TokenPropertiesManagementPanelView.form | 454 +++++++++++------- .../TokenPropertiesManagementPanelView.java | 1 - .../TokenPropertiesTableModel.java | 59 +-- .../client/ui/exportdialog/ExportDialog.java | 4 +- .../rptools/maptool/language/i18n.properties | 49 +- 8 files changed, 505 insertions(+), 285 deletions(-) diff --git a/src/main/java/net/rptools/maptool/client/swing/AbeillePanel.java b/src/main/java/net/rptools/maptool/client/swing/AbeillePanel.java index 0685319dc9..874d855c6a 100644 --- a/src/main/java/net/rptools/maptool/client/swing/AbeillePanel.java +++ b/src/main/java/net/rptools/maptool/client/swing/AbeillePanel.java @@ -229,7 +229,7 @@ public JTextField getTextField(String name) { return (JTextField) getComponent(name); } - public Collection getAllCompoments() { + public Collection getAllComponents() { if (componentMap == null) { createComponentMap(); } diff --git a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/CampaignPropertiesDialog.java b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/CampaignPropertiesDialog.java index 068de794bc..b206858957 100644 --- a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/CampaignPropertiesDialog.java +++ b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/CampaignPropertiesDialog.java @@ -132,6 +132,7 @@ public void actionPerformed(ActionEvent e) { private void initTokenPropertiesDialog(AbeillePanel panel) { tokenPropertiesPanel = new TokenPropertiesManagementPanel(); panel.replaceComponent("propertiesPanel", "tokenPropertiesPanel", tokenPropertiesPanel); + tokenPropertiesPanel.prettify(); } public JTextField getNewServerTextField() { 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 9c6707c7df..d720458539 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 @@ -28,7 +28,6 @@ import net.rptools.maptool.client.swing.TextFieldEditorButtonTableCellEditor; import net.rptools.maptool.client.ui.campaignproperties.TokenPropertiesTableModel.LargeEditableText; import net.rptools.maptool.client.ui.sheet.stats.StatSheetComboBoxRenderer; -import net.rptools.maptool.client.ui.theme.ThemeSupport; import net.rptools.maptool.language.I18N; import net.rptools.maptool.model.Campaign; import net.rptools.maptool.model.CampaignProperties; @@ -108,6 +107,10 @@ public JButton getTypeDeleteButton() { return (JButton) getComponent("typeDeleteButton"); } + public JButton getTypeDuplicateButton() { + return (JButton) getComponent("typeDuplicateButton"); + } + public JButton getPropertyMoveUpButton() { return (JButton) getComponent("propertyMoveUpButton"); } @@ -140,10 +143,22 @@ public JButton getTypeSetAsDefault() { return (JButton) getComponent("typeDefaultButton"); } + public JButton getHelpButton() { + return (JButton) getComponent("helpButton"); + } + + public JPanel getDescriptionContainer() { + return (JPanel) getComponent("descriptionContainer"); + } + public TokenPropertiesTableModel getTokenPropertiesTableModel() { return (TokenPropertiesTableModel) getTokenPropertiesTable().getModel(); } + public JScrollPane getTableScrollPane() { + return (JScrollPane) getComponent("tokenPropertiesTableScrollPane"); + } + public void initTypeAddButton() { getTypeAddButton() .addActionListener( @@ -288,6 +303,41 @@ public void initPropertyDeleteButton() { button.setEnabled(false); } + public void initTypeDuplicateButton() { + var button = getTypeDuplicateButton(); + button.addActionListener( + e -> + EventQueue.invokeLater( + () -> { + log.info("Type Duplicate - button action"); + var propertyType = (String) getTokenTypeList().getSelectedValue(); + if (propertyType != null) { + String newName = propertyType + "@"; + tokenTypeMap.put(newName, tokenTypeMap.get(propertyType)); + updateTypeList(); + getTokenTypeList().setSelectedValue(newName, true); + button.setEnabled(true); + } + })); + button.setEnabled(false); + } + + public void initDescriptionContainer() { + getDescriptionContainer().setVisible(false); + } + + public void initHelpButton() { + var button = getHelpButton(); + button.addActionListener( + e -> + EventQueue.invokeLater( + () -> { + JPanel helpText = getDescriptionContainer(); + helpText.setVisible(!helpText.isVisible()); + })); + button.setEnabled(true); + } + public void initPropertyTable() { var propertyTable = getTokenPropertiesTable(); propertyTable.setModel(new TokenPropertiesTableModel()); @@ -313,60 +363,6 @@ public void initPropertyTable() { getTokenPropertiesTable().getSelectedRow() < getTokenPropertiesTable().getRowCount() - 1); }); - propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - propertyTable.getTableHeader().setResizingAllowed(true); - - propertyTable.setShowHorizontalLines(true); - propertyTable.setIntercellSpacing(new Dimension(4, 3)); - - DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer(); - cellRenderer.setBackground(new Color(0f, 0f, 0f, 0.027f)); - cellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); - DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer(); - headerRenderer.setBackground(new Color(0f, 0f, 0f, 0.027f)); - headerRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); - - propertyTable.setGridColor(ThemeSupport.getThemeColor(ThemeSupport.ThemeColor.YELLOW).darker()); - - for (int i = 0; i < propertyTable.getColumnCount(); i++) { - propertyTable.getColumnModel().getColumn(i).sizeWidthToFit(); - switch (i) { - case 0, 1, 2 -> { - propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); - propertyTable.getColumnModel().getColumn(i).setMinWidth(65); - propertyTable.getColumnModel().getColumn(i).setMaxWidth(80); - propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - } - case 3 -> { - propertyTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); - propertyTable.getColumnModel().getColumn(i).setMaxWidth(160); - propertyTable.getColumnModel().getColumn(i).setMinWidth(80); - propertyTable.getColumnModel().getColumn(i).setPreferredWidth(120); - propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); - } - case 4 -> { - propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); - propertyTable.getColumnModel().getColumn(i).setMinWidth(50); - propertyTable.getColumnModel().getColumn(i).setMaxWidth(100); - propertyTable.getColumnModel().getColumn(i).setPreferredWidth(90); - } - case 5 -> { - propertyTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); - propertyTable.getColumnModel().getColumn(i).setMinWidth(80); - propertyTable.getColumnModel().getColumn(i).setMaxWidth(220); - propertyTable.getColumnModel().getColumn(i).setPreferredWidth(160); - } - case 6 -> { - propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); - propertyTable.getColumnModel().getColumn(i).setMinWidth(180); - propertyTable.getColumnModel().getColumn(i).setMaxWidth(320); - propertyTable.getColumnModel().getColumn(i).setPreferredWidth(220); - - propertyTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); - } - } - } } public void initTokenTypeName() { @@ -420,6 +416,7 @@ public void initTypeList() { reset(); getPropertyAddButton().setEnabled(false); getTypeDeleteButton().setEnabled(false); + getTypeDuplicateButton().setEnabled(false); getTokenTypeName().setEditable(false); getStatSheetComboBox().setEnabled(false); getStatSheetLocationComboBox().setEnabled(false); @@ -427,6 +424,7 @@ public void initTypeList() { } else { bind((String) getTokenTypeList().getSelectedValue()); getPropertyAddButton().setEnabled(true); + getTypeDuplicateButton().setEnabled(true); getTokenTypeName().setEditable(true); // Can't delete the default property if (propertyType.equals(defaultPropertyType)) { @@ -667,6 +665,118 @@ private List parseTokenProperties(String propertyText) return propertyList; } + public void prettify() { + + /* fix text areas to look like labels + * dig down to the appropriate container level + * then set the backgrounds to transparent + */ + JPanel jPanel = (JPanel) super.getComponent("descriptionContainer"); + List jPanels = + Arrays.stream(jPanel.getComponents()).filter(c -> c instanceof JPanel).toList(); + + Color transparent = new Color(0, 0, 0, 1); + for (Component panel : jPanels) { + JPanel jp = (JPanel) panel; + Component[] components = jp.getComponents(); + Arrays.stream(components).toList().forEach(c -> c.setBackground(transparent)); + } + + JTable propertyTable = getTokenPropertiesTable(); + /* prettify - take cell background colour and adjust the luminance for cell contrast. + change the hue and saturation for the grid line colour + */ + Color bg, bgSmall, gridColour; + bg = propertyTable.getTableHeader().getComponent(0).getBackground(); // get background colour + float[] hsbComponents = new float[3]; + Color.RGBtoHSB(bg.getRed(), bg.getGreen(), bg.getBlue(), hsbComponents); // convert to HSB + + boolean lighten = hsbComponents[2] < 0.5f; // to determine direction of change + hsbComponents[2] = + lighten + ? hsbComponents[2] + 0.015f + : hsbComponents[2] - 0.025f; // small change in brilliance + bgSmall = new Color(Color.HSBtoRGB(hsbComponents[0], hsbComponents[1], hsbComponents[2])); + + hsbComponents[2] = + lighten + ? hsbComponents[2] + 0.04f + : hsbComponents[2] - 0.02f; // bigger change in brilliance + bg = new Color(Color.HSBtoRGB(hsbComponents[0], hsbComponents[1], hsbComponents[2])); + + hsbComponents[0] = + hsbComponents[0] < 0.5 + ? hsbComponents[0] + 0.5f + : hsbComponents[0] - 0.5f; // change hue 180 degrees + hsbComponents[1] = + hsbComponents[1] < 0.25 + ? hsbComponents[1] + 0.25f // increase saturation if it is low + : hsbComponents[1]; + gridColour = new Color(Color.HSBtoRGB(hsbComponents[0], hsbComponents[1], hsbComponents[2])); + + DefaultTableCellRenderer cellRenderer = + new DefaultTableCellRenderer(); // cell renderer for contrasting cells + cellRenderer.setBackground(bgSmall); + cellRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + + DefaultTableCellRenderer headerRenderer = + new DefaultTableCellRenderer(); // cell renderer for contrasting headings + headerRenderer.setBackground(bg); + headerRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); + headerRenderer.setVerticalAlignment(SwingConstants.TOP); + + DefaultTableCellRenderer headerRenderer2 = new DefaultTableCellRenderer(); + headerRenderer2.setVerticalAlignment(SwingConstants.TOP); + headerRenderer2.setHorizontalAlignment(SwingConstants.CENTER); + + DefaultTableCellRenderer rowHeaderRenderer = + new DefaultTableCellRenderer(); // cell renderer for contrasting headings + headerRenderer.setBackground(bg); + headerRenderer.setHorizontalAlignment(DefaultTableCellRenderer.LEFT); + + propertyTable.setGridColor(gridColour); + propertyTable.setIntercellSpacing(new Dimension(2, 2)); + propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + propertyTable.setShowHorizontalLines(true); + propertyTable.getTableHeader().setResizingAllowed(true); + propertyTable.setFillsViewportHeight(true); + + for (int i = 0; i < propertyTable.getColumnCount(); i++) { + + switch (i) { // set column shading + case 0, 2, 4, 6 -> propertyTable + .getColumnModel() + .getColumn(i) + .setHeaderRenderer(headerRenderer); + case 1, 3 -> { + propertyTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); + propertyTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer2); + } + } + + switch (i) { // set column sizes + case 0, 2, 3 -> { + propertyTable.getColumnModel().getColumn(i).setMinWidth(60); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(80); + } + case 1 -> { + propertyTable.getColumnModel().getColumn(i).setMinWidth(45); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(100); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(55); + } + case 4, 5, 6 -> { + propertyTable.getColumnModel().getColumn(i).setMinWidth(50); + propertyTable.getColumnModel().getColumn(i).setMaxWidth(80); + propertyTable.getColumnModel().getColumn(i).setPreferredWidth(50); + } + } + } + Font hFont = propertyTable.getTableHeader().getComponent(0).getFont(); + Dimension headerDim = propertyTable.getTableHeader().getSize(); + headerDim.height = (int) (hFont.getSize() * 3.41); + propertyTable.getTableHeader().setPreferredSize(headerDim); + } + private class TypeListModel extends AbstractListModel { public Object getElementAt(int index) { List names = new ArrayList(tokenTypeMap.keySet()); 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 60bccdb883..7cc80c1055 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 @@ -1,32 +1,19 @@
- + - + - + + + + - - - - - - - - - - - - - - - - - + @@ -42,224 +29,299 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + - - - + + + - - - - - - - - + - + - + - + - + - - + + + + + + + - + - + - + + - + - + - - + + + + + + + - + - + - + - + - + - + + - + - + - + + - - - - - - - - - - - + - + - - + + + + + + + - + - + - + + + + + + + - + + + + + + + + + + + - + - + - + - + - + - + - + - + + - + - + - - + + + + + + + - + - + - + + + + + + + - + - + - + + + + + + + - - - - - - + - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + - - + + + + + + + + + + + + - + @@ -305,56 +367,96 @@ + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + - + - + - + - - - - - + + + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.java b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.java index dd4062c594..a84456677c 100644 --- a/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.java +++ b/src/main/java/net/rptools/maptool/client/ui/campaignproperties/TokenPropertiesManagementPanelView.java @@ -14,7 +14,6 @@ */ package net.rptools.maptool.client.ui.campaignproperties; -import java.awt.*; import javax.swing.*; public class TokenPropertiesManagementPanelView { 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 53de84163a..159083f65d 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 @@ -71,40 +71,43 @@ public Object getValueAt(int rowIndex, int columnIndex) { var properties = tokenTypeMap.get(tokenType); var property = properties.get(rowIndex); return switch (columnIndex) { - case 0 -> property.isShowOnStatSheet(); - case 1 -> property.isGMOnly() & property.isShowOnStatSheet(); - case 2 -> property.isOwnerOnly() & property.isShowOnStatSheet(); - case 3 -> property.getName(); - case 4 -> property.getShortName(); - case 5 -> { + case 0 -> property.getName(); + case 1 -> property.getShortName(); + case 2 -> { var displayName = property.getDisplayName(); yield displayName == null || displayName.isBlank() ? null : displayName; } - case 6 -> property.getDefaultValue(); + case 3 -> property.getDefaultValue(); + case 4 -> property.isShowOnStatSheet(); + case 5 -> property.isGMOnly() & property.isShowOnStatSheet(); + case 6 -> property.isOwnerOnly() & property.isShowOnStatSheet(); default -> null; }; } @Override public String getColumnName(int column) { - return switch (column) { - case 0 -> I18N.getText("campaignPropertiesTable.column.onStatSheet"); - case 1 -> I18N.getText("campaignPropertiesTable.column.gmStatSheet"); - case 2 -> I18N.getText("campaignPropertiesTable.column.ownerStatSheet"); - case 3 -> I18N.getText("campaignPropertiesTable.column.name"); - case 4 -> I18N.getText("campaignPropertiesTable.column.shortName"); - case 5 -> I18N.getText("campaignPropertiesTable.column.displayName"); - case 6 -> I18N.getText("campaignPropertiesTable.column.defaultValue"); - default -> null; - }; + String cName = ""; + String htmlWrap = "
###
"; + switch (column) { + case 0 -> cName = I18N.getText("campaignPropertiesTable.column.name"); + case 1 -> cName = I18N.getText("campaignPropertiesTable.column.shortName"); + case 2 -> cName = I18N.getText("campaignPropertiesTable.column.displayName"); + case 3 -> cName = I18N.getText("campaignPropertiesTable.column.defaultValue"); + case 4 -> cName = I18N.getText("campaignPropertiesTable.column.onStatSheet"); + case 5 -> cName = I18N.getText("campaignPropertiesTable.column.gmStatSheet"); + case 6 -> cName = I18N.getText("campaignPropertiesTable.column.ownerStatSheet"); + } + ; + return htmlWrap.replace("###", cName); } @Override public Class getColumnClass(int columnIndex) { return switch (columnIndex) { - case 0, 1, 2 -> Boolean.class; - case 3, 4, 5 -> String.class; - case 6 -> LargeEditableText.class; + case 0, 1, 2 -> String.class; + case 3 -> LargeEditableText.class; + case 4, 5, 6 -> Boolean.class; default -> null; }; } @@ -114,7 +117,7 @@ public boolean isCellEditable(int rowIndex, int columnIndex) { var properties = tokenTypeMap.get(tokenType); var tokenProperty = properties.get(rowIndex); return switch (columnIndex) { - case 4, 5 -> tokenProperty + case 5, 6 -> tokenProperty .isShowOnStatSheet(); // GM, Owner only editable if show on stat sheet is set default -> true; }; @@ -125,16 +128,16 @@ public void setValueAt(Object aValue, int rowIndex, int columnIndex) { var properties = tokenTypeMap.get(tokenType); var tokenProperty = properties.get(rowIndex); switch (columnIndex) { - case 0 -> { + case 0 -> tokenProperty.setName((String) aValue); + case 1 -> tokenProperty.setShortName((String) aValue); + case 2 -> tokenProperty.setDisplayName((String) aValue); + case 3 -> tokenProperty.setDefaultValue((String) aValue); + case 4 -> { tokenProperty.setShowOnStatSheet((Boolean) aValue); fireTableRowsUpdated(rowIndex, rowIndex); } - case 1 -> tokenProperty.setGMOnly((Boolean) aValue); - case 2 -> tokenProperty.setOwnerOnly((Boolean) aValue); - case 3 -> tokenProperty.setName((String) aValue); - case 4 -> tokenProperty.setShortName((String) aValue); - case 5 -> tokenProperty.setDisplayName((String) aValue); - case 6 -> tokenProperty.setDefaultValue((String) aValue); + case 5 -> tokenProperty.setGMOnly((Boolean) aValue); + case 6 -> tokenProperty.setOwnerOnly((Boolean) aValue); } } diff --git a/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java b/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java index c7eccbd5f4..4ec0f65da0 100644 --- a/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java +++ b/src/main/java/net/rptools/maptool/client/ui/exportdialog/ExportDialog.java @@ -664,7 +664,7 @@ public void run() { public Map getExportSettings() { Map settings = new HashMap<>(16); - for (var component : interactPanel.getAllCompoments()) { + for (var component : interactPanel.getAllComponents()) { if (component instanceof JToggleButton jtb) { settings.put(jtb.getName(), jtb.isSelected()); } @@ -677,7 +677,7 @@ public Map getExportSettings() { * turned on, since {@link #enforceButtonRules()} will turn them back on as appropriate. */ private void resetExportSettings() { - for (var component : interactPanel.getAllCompoments()) { + for (var component : interactPanel.getAllComponents()) { if (component instanceof JToggleButton jtb) { jtb.setSelected(false); } diff --git a/src/main/resources/net/rptools/maptool/language/i18n.properties b/src/main/resources/net/rptools/maptool/language/i18n.properties index 6937506302..4864a4d0fb 100644 --- a/src/main/resources/net/rptools/maptool/language/i18n.properties +++ b/src/main/resources/net/rptools/maptool/language/i18n.properties @@ -100,34 +100,39 @@ Color.none = None Color.custom = Custom Color.default = Default -Button.ok = OK -Button.cancel = Cancel -Button.refresh = Refresh -Button.rescan = Rescan -Button.revert = Revert -Button.close = Close -Button.import = Import -Button.export = Export -Button.delete = Delete +Button.accept = Accept Button.add = Add -Button.new = New -Button.browse = Browse -Button.update = Update Button.apply = APPLY -Button.accept = Accept -Button.up = Move Up -Button.down = Move Down Button.background = Background -Button.map = Map -Button.fog = Fog +Button.browse = Browse +Button.cancel = Cancel Button.clear = Clear Button.clearall = Clear All -Button.yes = Yes -Button.no = No +Button.close = Close +Button.delete = Delete +Button.down = Move Down +Button.edit = Edit +# For editing raw text +Button.editRaw = Edit Raw +Button.editRaw.tooltip = Edit the raw text +Button.export = Export +Button.fog = Fog +Button.hide = Hide +Button.import = Import Button.install = Install +Button.map = Map +Button.new = New +Button.no = No +Button.ok = OK +Button.refresh = Refresh +Button.rescan = Rescan +Button.revert = Revert Button.runmacro = RUN MACRO -Button.hide = Hide +Button.up = Move Up +Button.update = Update +Button.yes = Yes +Label.label = Label: Label.lights = Vision: Label.name = Name: Label.gmname = GM Name: @@ -788,7 +793,7 @@ campaignPropertiesDialog.tokenTypeNameChangeTitle = Token Type Name Change campaignPropertiesDialog.tokenTypeNameDeleteTitle = Delete Token Type {0} campaignPropertiesDialog.tokenTypeNameDeleteMessage =Change existing Tokens to: campaignPropertiesDialog.tokenTypeNameRename = Renaming Token Types... -campaignProperties.macroEditDialog.default.title = Default value for Property +campaignProperties.macroEditDialog.default.title = Default value for property campaignPropertiesTable.column.name = Name campaignPropertiesTable.column.shortName = Short Name campaignPropertiesTable.column.displayName = Display Name @@ -2964,7 +2969,7 @@ EditTokenDialog.button.movepbltoggle.tooltip=Include Pit Vision Blocking Layer ( EditTokenDialog.button.movecbltoggle.tooltip=Include Cover Vision Blocking Layer (Cover VBL) during move or copy EditTokenDialog.button.movefrommap.tooltip=Move or Copy selected blocking layer from Map EditTokenDialog.button.movetomap.tooltip=Move or Copy selected blocking layer to Map -Label.label=Label: + # StatSheet token.statSheet.legacyStatSheetDescription = Legacy (pre 1.14) Stat Sheet