From 101ab4a547d344afc6c88da9c5ffc7922cbac753 Mon Sep 17 00:00:00 2001 From: Sleet01 Date: Thu, 2 Jan 2025 12:10:30 -0800 Subject: [PATCH 1/3] Everything works except weapons/equipment - crit issue? --- .../mekhq/resources/MekLabTab.properties | 3 ++ MekHQ/src/mekhq/gui/MekLabTab.java | 42 ++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 MekHQ/resources/mekhq/resources/MekLabTab.properties diff --git a/MekHQ/resources/mekhq/resources/MekLabTab.properties b/MekHQ/resources/mekhq/resources/MekLabTab.properties new file mode 100644 index 0000000000..8cd6f8edda --- /dev/null +++ b/MekHQ/resources/mekhq/resources/MekLabTab.properties @@ -0,0 +1,3 @@ +dialog.saveAs.title=Save As +dialog.saveAs.message.format=%s %s saved to %s +dialog.filter.unitFiles=Unit Files (*.mtf; *.blk; *.hmp) \ No newline at end of file diff --git a/MekHQ/src/mekhq/gui/MekLabTab.java b/MekHQ/src/mekhq/gui/MekLabTab.java index dd16188a3d..5fa78cb57f 100644 --- a/MekHQ/src/mekhq/gui/MekLabTab.java +++ b/MekHQ/src/mekhq/gui/MekLabTab.java @@ -26,6 +26,8 @@ import java.awt.GridBagLayout; import java.awt.Insets; import java.io.File; +import java.util.Properties; +import java.util.ResourceBundle; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -43,6 +45,7 @@ import megamek.logging.MMLogger; import megameklab.MMLConstants; import megameklab.ui.EntitySource; +import megameklab.ui.FileNameManager; import megameklab.ui.battleArmor.BABuildTab; import megameklab.ui.battleArmor.BAEquipmentTab; import megameklab.ui.battleArmor.BAStructureTab; @@ -70,6 +73,7 @@ import megameklab.ui.supportVehicle.SVBuildTab; import megameklab.ui.supportVehicle.SVEquipmentTab; import megameklab.ui.supportVehicle.SVStructureTab; +import megameklab.ui.util.MegaMekLabFileSaver; import megameklab.ui.util.RefreshListener; import megameklab.util.CConfig; import megameklab.util.UnitUtil; @@ -81,6 +85,7 @@ public class MekLabTab extends CampaignGuiTab { private static final MMLogger logger = MMLogger.create(MekLabTab.class); + protected final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.MekLabTab"); CampaignGUI campaignGUI; @@ -100,6 +105,7 @@ public class MekLabTab extends CampaignGuiTab { private JLabel lblCost; private JButton btnRefit; + private JButton btnSaveForLater; private JButton btnClear; private JButton btnRemove; @@ -110,11 +116,13 @@ public class MekLabTab extends CampaignGuiTab { private JLabel lblTons; private JPanel shoppingPanel; + private MegaMekLabFileSaver fileSaver; // region Constructors public MekLabTab(CampaignGUI gui, String name) { super(gui, name); this.campaignGUI = gui; + this.fileSaver = new MegaMekLabFileSaver(logger, resources.getString("dialog.saveAs.title")); this.repaint(); } // endregion Constructors @@ -139,6 +147,12 @@ public void initTab() { } campaignGUI.refitUnit(refit, true); }); + btnSaveForLater = new JButton("Save For Later"); + btnSaveForLater.addActionListener(evt -> { + Entity entity = labPanel.getEntity(); + fileSaver.saveUnitAs(this.getFrame(), entity); + }); + btnClear = new JButton("Clear Changes"); btnClear.addActionListener(evt -> resetUnit()); btnRemove = new JButton("Remove from Lab"); @@ -189,6 +203,8 @@ public void initTab() { c.insets = new Insets(0, 5, 2, 5); summaryPane.add(btnRefit, c); c.gridy++; + summaryPane.add(btnSaveForLater, c); + c.gridy++; summaryPane.add(btnClear, c); c.gridy++; summaryPane.add(btnRemove, c); @@ -333,6 +349,7 @@ public void refreshRefitSummary() { if (tonnage < testEntity.calculateWeight()) { btnRefit.setEnabled(false); btnRefit.setToolTipText("Unit is overweight."); + btnSaveForLater.setEnabled(true); // } else if (entity.getWeight() > testEntity.calculateWeight()) { // Taharqa: We are now going to allow users to build underweight // units, we will just give @@ -342,15 +359,19 @@ public void refreshRefitSummary() { } else if (sb.length() > 0) { btnRefit.setEnabled(false); btnRefit.setToolTipText(sb.toString()); + btnSaveForLater.setEnabled(true); } else if (null != refit.checkFixable()) { btnRefit.setEnabled(false); btnRefit.setToolTipText(refit.checkFixable()); + btnSaveForLater.setEnabled(true); } else if (refit.getRefitClass() == Refit.NO_CHANGE && entity.getWeight() == testEntity.calculateWeight()) { btnRefit.setEnabled(false); btnRefit.setToolTipText("Nothing to change."); + btnSaveForLater.setEnabled(false); } else { btnRefit.setEnabled(true); btnRefit.setToolTipText(null); + btnSaveForLater.setEnabled(true); } lblName.setText("" + unit.getName() + ""); @@ -482,9 +503,11 @@ private EntityPanel getCorrectLab(Entity en) { } } - private abstract static class EntityPanel extends JTabbedPane implements RefreshListener, EntitySource { + private abstract static class EntityPanel extends JTabbedPane implements RefreshListener, EntitySource, FileNameManager { private boolean refreshRequired = false; + private String fileName = ""; + private String originalName = ""; @Override public abstract Entity getEntity(); @@ -497,6 +520,23 @@ public void scheduleRefresh() { SwingUtilities.invokeLater(this::performRefresh); } + @Override + public String getFileName() { + return fileName; + } + + @Override + public boolean hasEntityNameChanged() { + return !MegaMekLabFileSaver.createUnitFilename(getEntity()).equals(originalName); + } + + @Override + public void setFileName(String fileName) { + this.fileName = fileName; + // If the filename is reloaded, restart tracking of the unit name changing. + this.originalName = MegaMekLabFileSaver.createUnitFilename(getEntity()); + } + private void performRefresh() { if (refreshRequired) { refreshRequired = false; From b2f9ad940a26d220ce5c1692b1b16b6c7c5b4d79 Mon Sep 17 00:00:00 2001 From: Sleet01 Date: Fri, 3 Jan 2025 00:13:08 -0800 Subject: [PATCH 2/3] Add criticals updating tab refresh to save-as anonymous function --- MekHQ/src/mekhq/gui/MekLabTab.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MekHQ/src/mekhq/gui/MekLabTab.java b/MekHQ/src/mekhq/gui/MekLabTab.java index 5fa78cb57f..68ec4ebbcc 100644 --- a/MekHQ/src/mekhq/gui/MekLabTab.java +++ b/MekHQ/src/mekhq/gui/MekLabTab.java @@ -150,6 +150,8 @@ public void initTab() { btnSaveForLater = new JButton("Save For Later"); btnSaveForLater.addActionListener(evt -> { Entity entity = labPanel.getEntity(); + UnitUtil.compactCriticals(entity); + labPanel.refreshAll(); // The crits may have moved fileSaver.saveUnitAs(this.getFrame(), entity); }); From 32c54d05f2cf735513ad50e6b3dd264a16fcdfba Mon Sep 17 00:00:00 2001 From: Sleet01 Date: Fri, 3 Jan 2025 16:11:37 -0800 Subject: [PATCH 3/3] Force unit cache refresh so new file is available for refits --- MekHQ/src/mekhq/gui/MekLabTab.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MekHQ/src/mekhq/gui/MekLabTab.java b/MekHQ/src/mekhq/gui/MekLabTab.java index 68ec4ebbcc..d850ea8fa3 100644 --- a/MekHQ/src/mekhq/gui/MekLabTab.java +++ b/MekHQ/src/mekhq/gui/MekLabTab.java @@ -153,6 +153,8 @@ public void initTab() { UnitUtil.compactCriticals(entity); labPanel.refreshAll(); // The crits may have moved fileSaver.saveUnitAs(this.getFrame(), entity); + // Refresh unit cache so newly-saved file is available for refits. + MekSummaryCache.refreshUnitData(false); }); btnClear = new JButton("Clear Changes");