summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/util')
-rw-r--r--src/main/java/cuchaz/enigma/gui/util/ScaleChangeListener.java8
-rw-r--r--src/main/java/cuchaz/enigma/gui/util/ScaleUtil.java104
2 files changed, 112 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/util/ScaleChangeListener.java b/src/main/java/cuchaz/enigma/gui/util/ScaleChangeListener.java
new file mode 100644
index 0000000..d045c6d
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/util/ScaleChangeListener.java
@@ -0,0 +1,8 @@
1package cuchaz.enigma.gui.util;
2
3@FunctionalInterface
4public interface ScaleChangeListener {
5
6 void onScaleChanged(float scale, float oldScale);
7
8}
diff --git a/src/main/java/cuchaz/enigma/gui/util/ScaleUtil.java b/src/main/java/cuchaz/enigma/gui/util/ScaleUtil.java
new file mode 100644
index 0000000..8bc826f
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/util/ScaleUtil.java
@@ -0,0 +1,104 @@
1package cuchaz.enigma.gui.util;
2
3import java.awt.Dimension;
4import java.awt.Font;
5import java.io.IOException;
6import java.lang.reflect.Field;
7import java.util.ArrayList;
8import java.util.List;
9
10import javax.swing.UIManager;
11
12import com.github.swingdpi.UiDefaultsScaler;
13import com.github.swingdpi.plaf.BasicTweaker;
14import com.github.swingdpi.plaf.MetalTweaker;
15import com.github.swingdpi.plaf.NimbusTweaker;
16import com.github.swingdpi.plaf.WindowsTweaker;
17import cuchaz.enigma.config.Config;
18import de.sciss.syntaxpane.DefaultSyntaxKit;
19
20public class ScaleUtil {
21
22 private static List<ScaleChangeListener> listeners = new ArrayList<>();
23
24 public static float getScaleFactor() {
25 return Config.getInstance().scaleFactor;
26 }
27
28 public static void setScaleFactor(float scaleFactor) {
29 float oldScale = getScaleFactor();
30 float clamped = Math.min(Math.max(0.25f, scaleFactor), 10.0f);
31 Config.getInstance().scaleFactor = clamped;
32 try {
33 Config.getInstance().saveConfig();
34 } catch (IOException e) {
35 e.printStackTrace();
36 }
37 listeners.forEach(l -> l.onScaleChanged(clamped, oldScale));
38 }
39
40 public static void addListener(ScaleChangeListener listener) {
41 listeners.add(listener);
42 }
43
44 public static void removeListener(ScaleChangeListener listener) {
45 listeners.remove(listener);
46 }
47
48 public static Dimension getDimension(int width, int height) {
49 return new Dimension(scale(width), scale(height));
50 }
51
52 public static Font getFont(String fontName, int plain, int fontSize) {
53 return scaleFont(new Font(fontName, plain, fontSize));
54 }
55
56 public static Font scaleFont(Font font) {
57 return createTweakerForCurrentLook(getScaleFactor()).modifyFont("", font);
58 }
59
60 public static float scale(float f) {
61 return f * getScaleFactor();
62 }
63
64 public static float invert(float f) {
65 return f / getScaleFactor();
66 }
67
68 public static int scale(int i) {
69 return (int) (i * getScaleFactor());
70 }
71
72 public static int invert(int i) {
73 return (int) (i / getScaleFactor());
74 }
75
76 public static void applyScaling() {
77 float scale = getScaleFactor();
78 UiDefaultsScaler.updateAndApplyGlobalScaling((int) (100 * scale), true);
79 try {
80 Field defaultFontField = DefaultSyntaxKit.class.getDeclaredField("DEFAULT_FONT");
81 defaultFontField.setAccessible(true);
82 Font font = (Font) defaultFontField.get(null);
83 font = font.deriveFont(12 * scale);
84 defaultFontField.set(null, font);
85 } catch (NoSuchFieldException | IllegalAccessException e) {
86 e.printStackTrace();
87 }
88 }
89
90 private static BasicTweaker createTweakerForCurrentLook(float dpiScaling) {
91 String testString = UIManager.getLookAndFeel().getName().toLowerCase();
92 if (testString.contains("windows")) {
93 return new WindowsTweaker(dpiScaling, testString.contains("classic"));
94 }
95 if (testString.contains("metal")) {
96 return new MetalTweaker(dpiScaling);
97 }
98 if (testString.contains("nimbus")) {
99 return new NimbusTweaker(dpiScaling);
100 }
101 return new BasicTweaker(dpiScaling);
102 }
103
104}