GUI, preferences: improved theme switch at runtime (fixed skip and step buttons update);

This commit is contained in:
Oleg Agafonov 2024-07-05 18:11:09 +04:00
parent 6c0f7ebb90
commit 9864cdd46c
5 changed files with 186 additions and 155 deletions

View file

@ -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.
* <p>
* 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));

View file

@ -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<Key, BufferedImage> THEME_BUTTON_IMAGES_CACHE;
private static final SoftValuesLoadingCache<Key, Image> 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<String, Image> phasesImages; // theme depends
}