Add ability to audit cards and card image data.

README version info fixup.
This commit is contained in:
Tim Scott
2019-03-03 10:00:10 -06:00
parent 62cf8533e0
commit e67b55d3cf
4 changed files with 157 additions and 1 deletions

View File

@@ -165,7 +165,7 @@ SNAPSHOT builds can be built via the Maven integration in Eclipse.
2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View. 2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View.
The resulting snapshot will be found at: forge-gui-desktop/target/forge-gui-desktop-1.6.22-SNAPSHOT The resulting snapshot will be found at: forge-gui-desktop/target/forge-gui-desktop-[version]-SNAPSHOT
# IntelliJ # IntelliJ

View File

@@ -53,6 +53,11 @@ public enum CSubmenuDownloaders implements ICDoc {
VSubmenuDownloaders.SINGLETON_INSTANCE.showHowToPlay(); VSubmenuDownloaders.SINGLETON_INSTANCE.showHowToPlay();
} }
}; };
private final UiCommand cmdListImageData = new UiCommand() {
@Override public void run() {
VSubmenuDownloaders.SINGLETON_INSTANCE.showCardandImageAuditData();
}
};
private final UiCommand cmdImportPictures = new UiCommand() { private final UiCommand cmdImportPictures = new UiCommand() {
@Override public void run() { @Override public void run() {
new ImportDialog(null, null).show(); new ImportDialog(null, null).show();
@@ -78,6 +83,7 @@ public enum CSubmenuDownloaders implements ICDoc {
view.setDownloadSetPicsCommand(cmdSetDownload); view.setDownloadSetPicsCommand(cmdSetDownload);
view.setDownloadQuestImagesCommand(cmdQuestImages); view.setDownloadQuestImagesCommand(cmdQuestImages);
view.setDownloadAchievementImagesCommand(cmdAchievementImages); view.setDownloadAchievementImagesCommand(cmdAchievementImages);
view.setListImageDataCommand(cmdListImageData);
view.setReportBugCommand(cmdReportBug); view.setReportBugCommand(cmdReportBug);
view.setImportPicturesCommand(cmdImportPictures); view.setImportPicturesCommand(cmdImportPictures);
view.setHowToPlayCommand(cmdHowToPlay); view.setHowToPlayCommand(cmdHowToPlay);

View File

@@ -1,25 +1,36 @@
package forge.screens.home.settings; package forge.screens.home.settings;
import forge.ImageKeys;
import forge.StaticData;
import forge.UiCommand; import forge.UiCommand;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.card.CardDb;
import forge.card.CardEdition;
import forge.card.CardEdition.CardInSet;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab; import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
import forge.item.PaperCard;
import forge.properties.ForgeConstants; import forge.properties.ForgeConstants;
import forge.screens.home.EMenuGroup; import forge.screens.home.EMenuGroup;
import forge.screens.home.IVSubmenu; import forge.screens.home.IVSubmenu;
import forge.screens.home.VHomeUI; import forge.screens.home.VHomeUI;
import forge.toolbox.*; import forge.toolbox.*;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.ImageUtil;
import forge.util.Localizer; import forge.util.Localizer;
import forge.util.RuntimeVersion; import forge.util.RuntimeVersion;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
/** /**
* Assembles Swing components of utilities submenu singleton. * Assembles Swing components of utilities submenu singleton.
@@ -46,6 +57,7 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
private final FLabel btnDownloadQuestImages = _makeButton(localizer.getMessage("btnDownloadQuestImages")); private final FLabel btnDownloadQuestImages = _makeButton(localizer.getMessage("btnDownloadQuestImages"));
private final FLabel btnDownloadAchievementImages = _makeButton(localizer.getMessage("btnDownloadAchievementImages")); private final FLabel btnDownloadAchievementImages = _makeButton(localizer.getMessage("btnDownloadAchievementImages"));
private final FLabel btnReportBug = _makeButton(localizer.getMessage("btnReportBug")); private final FLabel btnReportBug = _makeButton(localizer.getMessage("btnReportBug"));
private final FLabel btnListImageData = _makeButton(localizer.getMessage("btnListImageData"));
private final FLabel btnImportPictures = _makeButton(localizer.getMessage("btnImportPictures")); private final FLabel btnImportPictures = _makeButton(localizer.getMessage("btnImportPictures"));
private final FLabel btnHowToPlay = _makeButton(localizer.getMessage("btnHowToPlay")); private final FLabel btnHowToPlay = _makeButton(localizer.getMessage("btnHowToPlay"));
private final FLabel btnDownloadPrices = _makeButton(localizer.getMessage("btnDownloadPrices")); private final FLabel btnDownloadPrices = _makeButton(localizer.getMessage("btnDownloadPrices"));
@@ -94,6 +106,9 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px"); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px");
} }
pnlContent.add(btnListImageData, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblListImageData")), constraintsLBL);
pnlContent.add(btnImportPictures, constraintsBTN); pnlContent.add(btnImportPictures, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblImportPictures")), constraintsLBL); pnlContent.add(_makeLabel(localizer.getMessage("lblImportPictures")), constraintsLBL);
@@ -144,6 +159,7 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
public void setDownloadQuestImagesCommand(UiCommand command) { btnDownloadQuestImages.setCommand(command); } public void setDownloadQuestImagesCommand(UiCommand command) { btnDownloadQuestImages.setCommand(command); }
public void setDownloadAchievementImagesCommand(UiCommand command) { btnDownloadAchievementImages.setCommand(command); } public void setDownloadAchievementImagesCommand(UiCommand command) { btnDownloadAchievementImages.setCommand(command); }
public void setReportBugCommand(UiCommand command) { btnReportBug.setCommand(command); } public void setReportBugCommand(UiCommand command) { btnReportBug.setCommand(command); }
public void setListImageDataCommand(UiCommand command) { btnListImageData.setCommand(command); }
public void setImportPicturesCommand(UiCommand command) { btnImportPictures.setCommand(command); } public void setImportPicturesCommand(UiCommand command) { btnImportPictures.setCommand(command); }
public void setHowToPlayCommand(UiCommand command) { btnHowToPlay.setCommand(command); } public void setHowToPlayCommand(UiCommand command) { btnHowToPlay.setCommand(command); }
public void setDownloadPricesCommand(UiCommand command) { btnDownloadPrices.setCommand(command); } public void setDownloadPricesCommand(UiCommand command) { btnDownloadPrices.setCommand(command); }
@@ -180,6 +196,137 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
} }
}); });
} }
/**
* Loops through the editions and card databases, looking for missing images and unimplemented cards.
*
* @param tar - Text area to report info
* @param scr
*/
public void auditUpdate(FTextArea tar, FScrollPane scr) {
// Get top-level Forge objects
CardDb cardDb = StaticData.instance().getCommonCards();
CardEdition.Collection editions = StaticData.instance().getEditions();
int missingCount = 0;
int notImplementedCount = 0;
int internalErrorCount = 0;
final StringBuffer sb = new StringBuffer();
for (CardEdition e : editions) {
sb.append("Edition: " + e.getName() + "\n");
String lastName = null;
int artIndex = 1;
ArrayList<String> cis = new ArrayList<String>();
for (CardInSet c : e.getCards()) {
cis.add(c.name);
}
Collections.sort(cis.subList(1, cis.size()));
for (String c : cis) {
if ((lastName != null) && (c.contentEquals(lastName))) {
artIndex++;
} else {
artIndex = 1;
}
PaperCard cp = cardDb.getCard(c, e.getCode(), artIndex);
if (cp != null) {
String imagePath;
//
// check the front image
//
imagePath = ImageUtil.getImageRelativePath(cp, false, true, false);
if (imagePath != null) {
File file = ImageKeys.getImageFile(imagePath);
if (file == null) {
sb.append(" NIF: " + imagePath + "\n");
missingCount++;
}
} else {
sb.append(" ERR: " + c + "\n");
internalErrorCount++;
}
//
// check the back face
//
if (ImageUtil.hasBackFacePicture(cp)) {
imagePath = ImageUtil.getImageRelativePath(cp, true, true, false);
if (imagePath != null) {
File file = ImageKeys.getImageFile(imagePath);
if (file == null) {
sb.append(" NIF: " + imagePath + "\n");
missingCount++;
}
} else {
sb.append(" ERR: " + c + "\n");
internalErrorCount++;
}
}
} else {
sb.append(" CNI: " + c + "\n");
notImplementedCount++;
}
lastName = c;
}
}
// TODO: Audit token images here...
String totalStats = "NIF count: " + missingCount + "\nCNI count: " + notImplementedCount + "\nERR count: "
+ internalErrorCount + "\n";
sb.append("\n-----------\n");
sb.append(totalStats);
sb.append("-----------\n\n");
sb.append(
"NIF = 'no image graphic found'\nCNI = 'card not implemented in Forge'\nERR = 'internal error detected'\n");
tar.setText(sb.toString());
tar.setCaretPosition(0); // this will move scroll view to the top...
final FButton btnClipboardCopy = new FButton(localizer.getMessage("btnCopyToClipboard"));
btnClipboardCopy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(sb.toString()), null);
SOverlayUtils.hideOverlay();
}
});
scr.getParent().add(btnClipboardCopy, "w 200!, h pref+12!, center, gaptop 10");
FOverlay.SINGLETON_INSTANCE.getPanel().validate();
FOverlay.SINGLETON_INSTANCE.getPanel().repaint();
}
public void showCardandImageAuditData() {
final FTextArea tar = new FTextArea("Auditing card and image data. Please wait...");
tar.setOpaque(true);
tar.setLineWrap(true);
tar.setWrapStyleWord(true);
tar.setEditable(false);
tar.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
tar.setFont(FSkin.getRelativeFixedFont(16));
tar.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
tar.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
final FScrollPane scr = new FScrollPane(tar, true, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
_showDialog(scr, new Runnable() {
@Override
public void run() {
auditUpdate(tar, scr);
scr.getViewport().setViewPosition(new Point(0, 0));
}
});
}
public void showLicensing() { public void showLicensing() {
String license = "<html>Forge License Information<br><br>" String license = "<html>Forge License Information<br><br>"

View File

@@ -12,6 +12,7 @@ btnDeleteWorkshopUI = Reset Workshop Layout
btnUserProfileUI = Open User Directory btnUserProfileUI = Open User Directory
btnContentDirectoryUI = Open Content Directory btnContentDirectoryUI = Open Content Directory
btnResetJavaFutureCompatibilityWarnings = Reset Java Compatibility Warnings btnResetJavaFutureCompatibilityWarnings = Reset Java Compatibility Warnings
btnCopyToClipboard= Copy to Clipboard
cbRemoveSmall = Remove Small Creatures cbRemoveSmall = Remove Small Creatures
cbCardBased = Include Card-based Deck Generation cbCardBased = Include Card-based Deck Generation
cbSingletons = Singleton Mode cbSingletons = Singleton Mode
@@ -138,6 +139,7 @@ btnDownloadPics = Download LQ Card Pictures
btnDownloadQuestImages = Download Quest Images btnDownloadQuestImages = Download Quest Images
btnDownloadAchievementImages = Download Achievement Images btnDownloadAchievementImages = Download Achievement Images
btnReportBug =Report a Bug btnReportBug =Report a Bug
btnListImageData =Audit Card and Image Data
btnImportPictures = Import Data btnImportPictures = Import Data
btnHowToPlay = How To Play btnHowToPlay = How To Play
btnDownloadPrices = Download Card Prices btnDownloadPrices = Download Card Prices
@@ -153,6 +155,7 @@ lblYoureRunning = You're running
lblYouNeedAtLeastJavaVersion = You need at least version 1.8.0_101. lblYouNeedAtLeastJavaVersion = You need at least version 1.8.0_101.
lblImportPictures = Import data from a local directory. lblImportPictures = Import data from a local directory.
lblReportBug = Something broken? lblReportBug = Something broken?
lblListImageData = Audit cards not implemented by Forge and missing card images
lblHowToPlay = Rules of the Game. lblHowToPlay = Rules of the Game.
lblLicensing = Forge legal. lblLicensing = Forge legal.
ContentDownloaders = Content Downloaders ContentDownloaders = Content Downloaders