GUI, preferences: improved theme switch at runtime (fixed main menu update);

This commit is contained in:
Oleg Agafonov 2024-07-03 23:46:12 +04:00
parent feaa30f616
commit 2631b31b8a
5 changed files with 56 additions and 26 deletions

View file

@ -6,6 +6,7 @@ public enum MageComponents {
NEW_TABLE_OK_BUTTON("btnOK"),
TABLE_WAITING_START_BUTTON("btnStart"),
DESKTOP_PANE("desktopPane"),
DESKTOP_TOOLBAR("desktopToolbar"),
CARD_INFO_PANE("cardInfoPane"),
POPUP_CONTAINER("popupContainer"),
CARD_PREVIEW_PANE("cardPreviewPane"),

View file

@ -3,18 +3,22 @@ package mage.client.components;
import mage.util.ThreadUtils;
import org.apache.log4j.Logger;
import java.awt.Component;
import javax.swing.*;
import java.awt.*;
import java.util.EnumMap;
import java.util.Map;
import java.util.concurrent.*;
import javax.swing.JButton;
/**
* GUI helper class to store global/shared components list like menus, buttons, panels
* See MageComponents for all shared components
*/
public class MageUI {
private static final Logger logger = Logger.getLogger(MageUI.class);
private final Map<MageComponents, Component> ui = new EnumMap<>(MageComponents.class);
private final Map<MageComponents, Object> sync = new EnumMap<>(MageComponents.class);
private final Map<MageComponents, Component> ui = new EnumMap<>(MageComponents.class); // components list
private final Map<MageComponents, Object> sync = new EnumMap<>(MageComponents.class); // waiting for components init
public static final ThreadPoolExecutor threadPoolPopups;
private static int threadCount;
@ -69,24 +73,33 @@ public class MageUI {
}
public Component getComponent(MageComponents name) throws InterruptedException {
return getComponent(name, true);
}
public Component getComponent(MageComponents name, boolean waitComponentInit) throws InterruptedException {
Object componentSync;
synchronized (ui) {
if (ui.containsKey(name)) {
return ui.get(name);
} else {
componentSync = new Object();
}
}
if (waitComponentInit) {
// start waiting until component init from other places like plugins
componentSync = new Object();
synchronized (sync) {
sync.put(name, componentSync);
}
}
synchronized (componentSync) {
componentSync.wait();
if (!ui.containsKey(name)) {
throw new IllegalStateException("Component wasn't initialized. This should not happen.");
synchronized (componentSync) {
componentSync.wait();
if (!ui.containsKey(name)) {
throw new IllegalStateException("Component wasn't initialized. This should not happen.");
}
return ui.get(name);
}
return ui.get(name);
}
return null;
}
public void addButton(MageComponents name, JButton button) {