diff --git a/Mage.Client/src/main/java/mage/client/components/HoverButton.java b/Mage.Client/src/main/java/mage/client/components/HoverButton.java index ae420739d1f..094d025d7a7 100644 --- a/Mage.Client/src/main/java/mage/client/components/HoverButton.java +++ b/Mage.Client/src/main/java/mage/client/components/HoverButton.java @@ -353,6 +353,10 @@ public class HoverButton extends JPanel implements MouseListener { this.isSelected = !this.isSelected; } + public String getText() { + return this.text; + } + public void setText(String text) { this.text = text; } @@ -365,13 +369,17 @@ public class HoverButton extends JPanel implements MouseListener { this.drawSet = true; } + public void update(String text, Image image) { + update(text, image, this.hoverImage, this.selectedImage, this.disabledImage, this.imageSize); + } + public void update(String text, Image image, Image hover, Image selected, Image disabled, Rectangle size) { + this.text = text; this.image = image; this.hoverImage = hover; this.selectedImage = selected; this.disabledImage = disabled; this.imageSize = size; - this.text = text; repaint(); } diff --git a/Mage.Client/src/main/java/mage/client/components/KeyboundButton.java b/Mage.Client/src/main/java/mage/client/components/KeyboundButton.java index 0054cb51d70..a205d9c2c4d 100644 --- a/Mage.Client/src/main/java/mage/client/components/KeyboundButton.java +++ b/Mage.Client/src/main/java/mage/client/components/KeyboundButton.java @@ -1,30 +1,43 @@ package mage.client.components; -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import javax.swing.JButton; import mage.client.dialog.PreferencesDialog; +import javax.swing.*; +import java.awt.*; + /** + * GUI component: button with hotkey info on it * - * @author Campbell Suter + * @author Campbell Suter , JayDi85 */ public class KeyboundButton extends JButton { - private final String text; + private final String key; + private boolean showKey; + private String drawingText; private static final Font keyFont = new Font(Font.SANS_SERIF, Font.BOLD, 13); private boolean tinting = false; - public KeyboundButton(String key, boolean drawText) { - if (drawText) { - text = PreferencesDialog.getCachedKeyText(key); + public KeyboundButton(String key, boolean showKey) { + this.key = key; + this.showKey = showKey; + updateDrawingText(); + } + + private void updateDrawingText() { + if (this.showKey) { + this.drawingText = PreferencesDialog.getCachedKeyText(key); } else { - text = ""; + this.drawingText = ""; } } + public void setShowKey(boolean showKey) { + this.showKey = showKey; + updateDrawingText(); + } + @Override protected void paintComponent(Graphics g) { if (ui != null && g != null) { @@ -34,17 +47,17 @@ public class KeyboundButton extends JButton { if (tinting) { sg.setColor(new Color(0, 0, 0, 32)); - sg.fillRoundRect(2, 2, getWidth() - 4 , getHeight() - 4, 6, 6); + sg.fillRoundRect(2, 2, getWidth() - 4, getHeight() - 4, 6, 6); } sg.setColor(tinting ? Color.lightGray : Color.white); - if (!text.isEmpty()) { + if (!this.drawingText.isEmpty()) { sg.setFont(keyFont); - int textWidth = sg.getFontMetrics(keyFont).stringWidth(text); + int textWidth = sg.getFontMetrics(keyFont).stringWidth(this.drawingText); int centerX = (getWidth() - textWidth) / 2; - sg.drawString(text, centerX, 28); + sg.drawString(this.drawingText, centerX, 28); } } finally { sg.dispose(); diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index fecbd56614c..ee4112a20e7 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -106,7 +106,7 @@ public final class GamePanel extends javax.swing.JPanel { private final Map loadedCards = new HashMap<>(); private int storedHeight; - private Map hoverButtons; + private final Map phaseButtons = new LinkedHashMap<>(); // phase name, phase button private MageDialogState choiceWindowState; @@ -452,6 +452,39 @@ public final class GamePanel extends javax.swing.JPanel { pnlShortCuts.setPreferredSize(newDimension); pnlShortCuts.setMinimumSize(newDimension); pnlShortCuts.setMaximumSize(newDimension); + + reloadThemeRelatedGraphic(); + } + + private void reloadThemeRelatedGraphic() { + // skip buttons + btnCancelSkip.setIcon(new ImageIcon(ImageManagerImpl.instance.getCancelSkipButtonImage())); + btnSkipToNextTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipNextTurnButtonImage())); + btnSkipToEndTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipEndTurnButtonImage())); + btnSkipToEndStepBeforeYourTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipEndStepBeforeYourTurnButtonImage())); + btnSkipToYourTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipYourNextTurnButtonImage())); + btnSkipToNextMain.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipMainButtonImage())); + btnSkipStack.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipStackButtonImage())); + btnConcede.setIcon(new ImageIcon(ImageManagerImpl.instance.getConcedeButtonImage())); + btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getToggleRecordMacroButtonImage())); + btnSwitchHands.setIcon(new ImageIcon(ImageManagerImpl.instance.getSwitchHandsButtonImage())); + btnStopWatching.setIcon(new ImageIcon(ImageManagerImpl.instance.getStopWatchButtonImage())); + + // hotkeys for skip buttons + boolean displayButtonText = PreferencesDialog.getCurrentTheme().isShortcutsVisibleForSkipButtons(); + btnCancelSkip.setShowKey(displayButtonText); + btnSkipToNextTurn.setShowKey(displayButtonText); + btnSkipToEndTurn.setShowKey(displayButtonText); + btnSkipToEndStepBeforeYourTurn.setShowKey(displayButtonText); + btnSkipToYourTurn.setShowKey(displayButtonText); + btnSkipToNextMain.setShowKey(displayButtonText); + btnSkipStack.setShowKey(displayButtonText); + btnToggleMacro.setShowKey(displayButtonText); + + // phase buttons + phaseButtons.forEach((phaseName, phaseButton) -> { + phaseButton.update(phaseButton.getText(), ImageManagerImpl.instance.getPhaseImage(phaseName)); + }); } private void saveDividerLocations() { @@ -1260,8 +1293,8 @@ public final class GamePanel extends javax.swing.JPanel { } private void updateButton(String name) { - if (hoverButtons.containsKey(name)) { - currentStep = hoverButtons.get(name); + if (phaseButtons.containsKey(name)) { + currentStep = phaseButtons.get(name); prevPoint = currentStep.getLocation(); currentStep.setLocation(prevPoint.x - 15, prevPoint.y); } @@ -1979,7 +2012,6 @@ public final class GamePanel extends javax.swing.JPanel { txtHoldPriority.setVisible(false); boolean displayButtonText = PreferencesDialog.getCurrentTheme().isShortcutsVisibleForSkipButtons(); - btnToggleMacro = new KeyboundButton(KEY_CONTROL_TOGGLE_MACRO, displayButtonText); btnCancelSkip = new KeyboundButton(KEY_CONTROL_CANCEL_SKIP, displayButtonText); // F3 btnSkipToNextTurn = new KeyboundButton(KEY_CONTROL_NEXT_TURN, displayButtonText); // F4 @@ -2081,7 +2113,6 @@ public final class GamePanel extends javax.swing.JPanel { btnToggleMacro.setContentAreaFilled(false); btnToggleMacro.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getToggleRecordMacroButtonImage())); btnToggleMacro.setToolTipText("Toggle Record Macro (" + getCachedKeyText(KEY_CONTROL_TOGGLE_MACRO) + ")."); btnToggleMacro.setFocusable(false); @@ -2109,10 +2140,10 @@ public final class GamePanel extends javax.swing.JPanel { }); // SKIP BUTTONS (button's hint/state is dynamic) + // button icons setup in setGUISize btnCancelSkip.setContentAreaFilled(false); btnCancelSkip.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnCancelSkip.setIcon(new ImageIcon(ImageManagerImpl.instance.getCancelSkipButtonImage())); btnCancelSkip.setToolTipText("CANCEL all skips"); btnCancelSkip.setFocusable(false); btnCancelSkip.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2120,7 +2151,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSkipToNextTurn.setContentAreaFilled(false); btnSkipToNextTurn.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnSkipToNextTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipNextTurnButtonImage())); btnSkipToNextTurn.setToolTipText("dynamic"); btnSkipToNextTurn.setFocusable(false); btnSkipToNextTurn.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2138,7 +2168,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSkipToEndTurn.setContentAreaFilled(false); btnSkipToEndTurn.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnSkipToEndTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipEndTurnButtonImage())); btnSkipToEndTurn.setToolTipText("dynamic"); btnSkipToEndTurn.setFocusable(false); btnSkipToEndTurn.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2166,7 +2195,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSkipToNextMain.setContentAreaFilled(false); btnSkipToNextMain.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnSkipToNextMain.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipMainButtonImage())); btnSkipToNextMain.setToolTipText("dynamic"); btnSkipToNextMain.setFocusable(false); btnSkipToNextMain.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2184,7 +2212,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSkipToYourTurn.setContentAreaFilled(false); btnSkipToYourTurn.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnSkipToYourTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipYourNextTurnButtonImage())); btnSkipToYourTurn.setToolTipText("dynamic"); btnSkipToYourTurn.setFocusable(false); btnSkipToYourTurn.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2202,7 +2229,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSkipToEndStepBeforeYourTurn.setContentAreaFilled(false); btnSkipToEndStepBeforeYourTurn.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnSkipToEndStepBeforeYourTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipEndStepBeforeYourTurnButtonImage())); btnSkipToEndStepBeforeYourTurn.setToolTipText("dynamic"); btnSkipToEndStepBeforeYourTurn.setFocusable(false); btnSkipToEndStepBeforeYourTurn.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2220,7 +2246,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSkipStack.setContentAreaFilled(false); btnSkipStack.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnSkipStack.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipStackButtonImage())); btnSkipStack.setToolTipText("dynamic"); btnSkipStack.setFocusable(false); btnSkipStack.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2238,7 +2263,6 @@ public final class GamePanel extends javax.swing.JPanel { btnConcede.setContentAreaFilled(false); btnConcede.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnConcede.setIcon(new ImageIcon(ImageManagerImpl.instance.getConcedeButtonImage())); btnConcede.setToolTipText("CONCEDE current game"); btnConcede.setFocusable(false); btnConcede.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2368,7 +2392,6 @@ public final class GamePanel extends javax.swing.JPanel { btnSwitchHands.setContentAreaFilled(false); btnSwitchHands.setBorder(new EmptyBorder(0, 0, 0, 0)); - btnSwitchHands.setIcon(new ImageIcon(ImageManagerImpl.instance.getSwitchHandsButtonImage())); btnSwitchHands.setFocusable(false); btnSwitchHands.setToolTipText("Switch between your hand cards and hand cards of controlled players."); btnSwitchHands.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2376,7 +2399,6 @@ public final class GamePanel extends javax.swing.JPanel { btnStopWatching.setContentAreaFilled(false); btnStopWatching.setBorder(new EmptyBorder(0, 0, 0, 0)); - btnStopWatching.setIcon(new ImageIcon(ImageManagerImpl.instance.getStopWatchButtonImage())); btnStopWatching.setFocusable(false); btnStopWatching.setToolTipText("Stop watching this game."); btnStopWatching.addMouseListener(new FirstButtonMousePressedAction(e -> @@ -2506,14 +2528,13 @@ public final class GamePanel extends javax.swing.JPanel { } int i = 0; - for (String name : hoverButtons.keySet()) { - HoverButton hoverButton = hoverButtons.get(name); + for (String name : phaseButtons.keySet()) { + HoverButton hoverButton = phaseButtons.get(name); hoverButton.setAlignmentX(LEFT_ALIGNMENT); hoverButton.setBounds(X_PHASE_WIDTH - 36, i * 36, 36, 36); jPhases.add(hoverButton); i++; } - jPhases.addMouseListener(phasesMouseAdapter); pnlReplay.setOpaque(false); @@ -2657,8 +2678,8 @@ public final class GamePanel extends javax.swing.JPanel { for (MouseListener ml : this.jPhases.getMouseListeners()) { this.jPhases.removeMouseListener(ml); } - for (String name : hoverButtons.keySet()) { - HoverButton hoverButton = hoverButtons.get(name); + for (String name : phaseButtons.keySet()) { + HoverButton hoverButton = phaseButtons.get(name); for (MouseListener ml : hoverButton.getMouseListeners()) { hoverButton.removeMouseListener(ml); } @@ -2878,15 +2899,12 @@ public final class GamePanel extends javax.swing.JPanel { } private void createPhaseButton(String name, MouseAdapter mouseAdapter) { - if (hoverButtons == null) { - hoverButtons = new LinkedHashMap<>(); - } Rectangle rect = new Rectangle(36, 36); HoverButton button = new HoverButton("", ImageManagerImpl.instance.getPhaseImage(name), rect); button.setToolTipText(name.replaceAll("_", " ")); button.setPreferredSize(new Dimension(36, 36)); button.addMouseListener(mouseAdapter); - hoverButtons.put(name, button); + phaseButtons.put(name, button); } // Event listener for the ShowCardsDialog @@ -3047,7 +3065,6 @@ public final class GamePanel extends javax.swing.JPanel { private mage.client.components.ability.AbilityPicker abilityPicker; private mage.client.cards.BigCard bigCard; - // private JPanel cancelSkipPanel; private KeyboundButton btnToggleMacro; private KeyboundButton btnCancelSkip; private KeyboundButton btnSkipToNextTurn; // F4 diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java index 9518461689b..1b65b52e299 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java @@ -9,7 +9,6 @@ import mage.view.CardView; import net.java.truevfs.access.TFile; import net.java.truevfs.access.TFileInputStream; import org.apache.log4j.Logger; -import org.mage.card.arcane.CardPanelRenderModeImage; import org.mage.plugins.card.dl.sources.DirectLinksForDownload; import org.mage.plugins.card.utils.CardImageUtils; import org.mage.plugins.card.utils.impl.ImageManagerImpl; @@ -25,6 +24,8 @@ import java.util.regex.Pattern; * This class stores ALL card images in a cache with soft values. This means * that the images may be garbage collected when they are not needed any more, * but will be kept as long as possible. + *

+ * It used to refresh themes at runtime too. Use GUISizeHelper.refreshGUIAndCards() * * @author JayDi85 */ @@ -160,7 +161,8 @@ public final class ImageCache { } } - /** Find image for current side + /** + * Find image for current side */ public static ImageCacheData getCardImageOriginal(CardView card) { return getCardImage(getKey(card, card.getName(), 0)); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java index a2e04f28ef8..f46ff7d20a9 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java @@ -2,6 +2,8 @@ package org.mage.plugins.card.utils.impl; import mage.abilities.icon.CardIconColor; import mage.client.dialog.PreferencesDialog; +import mage.client.util.ImageCaches; +import mage.client.util.SoftValuesLoadingCache; import mage.client.util.gui.BufferedImageBuilder; import org.apache.log4j.Logger; import org.mage.card.arcane.SvgUtils; @@ -16,32 +18,109 @@ import java.net.URL; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.Objects; +/** + * GUI plugin: images and icons with theme support + * + * @author JayDi85 + */ public enum ImageManagerImpl implements ImageManager { instance; private static final Logger logger = Logger.getLogger(ImageManagerImpl.class); - ImageManagerImpl() { - init(); + private static BufferedImage appImage; + private static BufferedImage appSmallImage; + private static BufferedImage appImageFlashed; + + private static BufferedImage imageSickness; + private static BufferedImage imageDay; + private static BufferedImage imageNight; + + private static BufferedImage imageTokenIcon; + private static BufferedImage triggeredAbilityIcon; + private static BufferedImage activatedAbilityIcon; + private static BufferedImage lookedAtIcon; + private static BufferedImage revealedIcon; + private static BufferedImage exileIcon; + private static BufferedImage imageCopyIcon; + private static BufferedImage imageCounterGreen; + private static BufferedImage imageCounterGrey; + private static BufferedImage imageCounterRed; + private static BufferedImage imageCounterViolet; + + private static BufferedImage imageDlgAcceptButton; + private static BufferedImage imageDlgActiveAcceptButton; + private static BufferedImage imageDlgCancelButton; + private static BufferedImage imageDlgActiveCancelButton; + private static BufferedImage imageDlgPrevButton; + private static BufferedImage imageDlgActivePrevButton; + private static BufferedImage imageDlgNextButton; + private static BufferedImage imageDlgActiveNextButton; + + private static final SoftValuesLoadingCache THEME_BUTTON_IMAGES_CACHE; + private static final SoftValuesLoadingCache PHASE_THEME_BUTTON_IMAGES_CACHE; + static { + THEME_BUTTON_IMAGES_CACHE = ImageCaches.register(SoftValuesLoadingCache.from(ImageManagerImpl::createThemeButtonImage)); + PHASE_THEME_BUTTON_IMAGES_CACHE = ImageCaches.register(SoftValuesLoadingCache.from(ImageManagerImpl::createPhaseThemeButtonImage)); } - public void init() { - String[] phases = {"Untap", "Upkeep", "Draw", "Main1", - "Combat_Start", "Combat_Attack", "Combat_Block", "Combat_Damage", "Combat_End", - "Main2", "Cleanup", "Next_Turn"}; - phasesImages = new HashMap<>(); - for (String name : phases) { - Image image = getImageFromResource( - PreferencesDialog.getCurrentTheme().getPhasePath("phase_" + name.toLowerCase(Locale.ENGLISH) + ".png"), - new Rectangle(36, 36)); - phasesImages.put(name, image); + private static final class Key { + + final String resourceName; + + public Key(String resourceName) { + this.resourceName = resourceName; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 53 * hash + Objects.hashCode(this.resourceName); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ImageManagerImpl.Key other = (ImageManagerImpl.Key) obj; + if (!this.resourceName.equals(other.resourceName)) { + return false; + } + return true; } } + private static BufferedImage createThemeButtonImage(ImageManagerImpl.Key key) { + return getBufferedImageFromResource(PreferencesDialog.getCurrentTheme().getButtonPath(key.resourceName)); + } + + private static Image createPhaseThemeButtonImage(ImageManagerImpl.Key key) { + return getImageFromResource( + PreferencesDialog.getCurrentTheme().getPhasePath("phase_" + key.resourceName.toLowerCase(Locale.ENGLISH) + ".png"), + new Rectangle(36, 36) + ); + } + + ImageManagerImpl() { + } + + public BufferedImage getThemeButton(String resourceName) { + return THEME_BUTTON_IMAGES_CACHE.getOrThrow(new ImageManagerImpl.Key(resourceName)); + } + @Override - public Image getPhaseImage(String phase) { - return phasesImages.get(phase); + public Image getPhaseImage(String phaseName) { + return PHASE_THEME_BUTTON_IMAGES_CACHE.getOrThrow(new ImageManagerImpl.Key(phaseName)); } @Override @@ -266,101 +345,57 @@ public enum ImageManagerImpl implements ImageManager { @Override public Image getConcedeButtonImage() { - if (imageConcedeButton == null) { - imageConcedeButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("concede.png")); - } - return imageConcedeButton; + return getThemeButton("concede.png"); } @Override public Image getSwitchHandsButtonImage() { - if (imageSwitchHandsButton == null) { - imageSwitchHandsButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("switch_hands.png")); - } - return imageSwitchHandsButton; + return getThemeButton("switch_hands.png"); } @Override public Image getStopWatchButtonImage() { - if (imageStopWatchingButton == null) { - imageStopWatchingButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("stop_watching.png")); - } - return imageStopWatchingButton; + return getThemeButton("stop_watching.png"); } @Override public Image getCancelSkipButtonImage() { - if (imageCancelSkipButton == null) { - imageCancelSkipButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("cancel_skip.png")); - } - return imageCancelSkipButton; + return getThemeButton("cancel_skip.png"); } @Override public Image getSkipNextTurnButtonImage() { - if (imageSkipNextTurnButton == null) { - imageSkipNextTurnButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("skip_turn.png")); - } - return imageSkipNextTurnButton; + return getThemeButton("skip_turn.png"); } @Override public Image getSkipEndTurnButtonImage() { - if (imageSkipToEndTurnButton == null) { - imageSkipToEndTurnButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("skip_to_end.png")); - } - return imageSkipToEndTurnButton; + return getThemeButton("skip_to_end.png"); } @Override public Image getSkipMainButtonImage() { - if (imageSkipToMainButton == null) { - imageSkipToMainButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("skip_to_main.png")); - } - return imageSkipToMainButton; + return getThemeButton("skip_to_main.png"); } @Override public Image getSkipStackButtonImage() { - if (imageSkipStackButton == null) { - imageSkipStackButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("skip_stack.png")); - } - return imageSkipStackButton; + return getThemeButton("skip_stack.png"); } @Override public Image getSkipEndStepBeforeYourTurnButtonImage() { - if (imageSkipUntilEndStepBeforeYourTurnButton == null) { - imageSkipUntilEndStepBeforeYourTurnButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("skip_to_previous_end.png")); - } - return imageSkipUntilEndStepBeforeYourTurnButton; + return getThemeButton("skip_to_previous_end.png"); } @Override public Image getSkipYourNextTurnButtonImage() { - if (imageSkipYourNextTurnButton == null) { - imageSkipYourNextTurnButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("skip_all.png")); - } - return imageSkipYourNextTurnButton; + return getThemeButton("skip_all.png"); } @Override public Image getToggleRecordMacroButtonImage() { - if (imageToggleRecordMacroButton == null) { - imageToggleRecordMacroButton = getBufferedImageFromResource( - PreferencesDialog.getCurrentTheme().getButtonPath("toggle_macro.png")); - } - return imageToggleRecordMacroButton; + return getThemeButton("toggle_macro.png"); } @Override @@ -432,48 +467,4 @@ public enum ImageManagerImpl implements ImageManager { WritableRaster raster = bi.copyData(null); return new BufferedImage(cm, raster, isAlphaPremultiplied, null); } - - private static BufferedImage appImage; - private static BufferedImage appSmallImage; - private static BufferedImage appImageFlashed; - - private static BufferedImage imageSickness; - private static BufferedImage imageDay; - private static BufferedImage imageNight; - - private static BufferedImage imageTokenIcon; - private static BufferedImage triggeredAbilityIcon; - private static BufferedImage activatedAbilityIcon; - private static BufferedImage lookedAtIcon; - private static BufferedImage revealedIcon; - private static BufferedImage exileIcon; - private static BufferedImage imageCopyIcon; - private static BufferedImage imageCounterGreen; - private static BufferedImage imageCounterGrey; - private static BufferedImage imageCounterRed; - private static BufferedImage imageCounterViolet; - - private static BufferedImage imageDlgAcceptButton; - private static BufferedImage imageDlgActiveAcceptButton; - private static BufferedImage imageDlgCancelButton; - private static BufferedImage imageDlgActiveCancelButton; - private static BufferedImage imageDlgPrevButton; - private static BufferedImage imageDlgActivePrevButton; - private static BufferedImage imageDlgNextButton; - private static BufferedImage imageDlgActiveNextButton; - - // TODO: enable buttons and related GUI refresh on theme change - private static BufferedImage imageCancelSkipButton; // theme depends - private static BufferedImage imageSwitchHandsButton; // theme depends - private static BufferedImage imageStopWatchingButton; // theme depends - private static BufferedImage imageConcedeButton; // theme depends - private static BufferedImage imageSkipNextTurnButton; // theme depends - private static BufferedImage imageSkipToEndTurnButton; // theme depends - private static BufferedImage imageSkipToMainButton; // theme depends - private static BufferedImage imageSkipStackButton; // theme depends - private static BufferedImage imageSkipUntilEndStepBeforeYourTurnButton; // theme depends - private static BufferedImage imageSkipYourNextTurnButton; // theme depends - private static BufferedImage imageToggleRecordMacroButton; // theme depends - - private static Map phasesImages; // theme depends }