From 04b01512c124c76f3b3d99ba07ef30ea6a90b52f Mon Sep 17 00:00:00 2001 From: 2xsaiko Date: Fri, 24 Apr 2020 18:39:57 +0200 Subject: Add a configurable scale factor (#230) * Add swing-dpi dependency * Implement scale factor * Improve custom scale dialog, fix crash * Remove use of $ in identifiers * Use custom functional interface for scale listeners * Bump version Co-authored-by: modmuss50 --- .../enigma/gui/util/ScaleChangeListener.java | 8 ++ .../java/cuchaz/enigma/gui/util/ScaleUtil.java | 104 +++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/main/java/cuchaz/enigma/gui/util/ScaleChangeListener.java create mode 100644 src/main/java/cuchaz/enigma/gui/util/ScaleUtil.java (limited to 'src/main/java/cuchaz/enigma/gui/util') 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 @@ +package cuchaz.enigma.gui.util; + +@FunctionalInterface +public interface ScaleChangeListener { + + void onScaleChanged(float scale, float oldScale); + +} 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 @@ +package cuchaz.enigma.gui.util; + +import java.awt.Dimension; +import java.awt.Font; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.UIManager; + +import com.github.swingdpi.UiDefaultsScaler; +import com.github.swingdpi.plaf.BasicTweaker; +import com.github.swingdpi.plaf.MetalTweaker; +import com.github.swingdpi.plaf.NimbusTweaker; +import com.github.swingdpi.plaf.WindowsTweaker; +import cuchaz.enigma.config.Config; +import de.sciss.syntaxpane.DefaultSyntaxKit; + +public class ScaleUtil { + + private static List listeners = new ArrayList<>(); + + public static float getScaleFactor() { + return Config.getInstance().scaleFactor; + } + + public static void setScaleFactor(float scaleFactor) { + float oldScale = getScaleFactor(); + float clamped = Math.min(Math.max(0.25f, scaleFactor), 10.0f); + Config.getInstance().scaleFactor = clamped; + try { + Config.getInstance().saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + listeners.forEach(l -> l.onScaleChanged(clamped, oldScale)); + } + + public static void addListener(ScaleChangeListener listener) { + listeners.add(listener); + } + + public static void removeListener(ScaleChangeListener listener) { + listeners.remove(listener); + } + + public static Dimension getDimension(int width, int height) { + return new Dimension(scale(width), scale(height)); + } + + public static Font getFont(String fontName, int plain, int fontSize) { + return scaleFont(new Font(fontName, plain, fontSize)); + } + + public static Font scaleFont(Font font) { + return createTweakerForCurrentLook(getScaleFactor()).modifyFont("", font); + } + + public static float scale(float f) { + return f * getScaleFactor(); + } + + public static float invert(float f) { + return f / getScaleFactor(); + } + + public static int scale(int i) { + return (int) (i * getScaleFactor()); + } + + public static int invert(int i) { + return (int) (i / getScaleFactor()); + } + + public static void applyScaling() { + float scale = getScaleFactor(); + UiDefaultsScaler.updateAndApplyGlobalScaling((int) (100 * scale), true); + try { + Field defaultFontField = DefaultSyntaxKit.class.getDeclaredField("DEFAULT_FONT"); + defaultFontField.setAccessible(true); + Font font = (Font) defaultFontField.get(null); + font = font.deriveFont(12 * scale); + defaultFontField.set(null, font); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + + private static BasicTweaker createTweakerForCurrentLook(float dpiScaling) { + String testString = UIManager.getLookAndFeel().getName().toLowerCase(); + if (testString.contains("windows")) { + return new WindowsTweaker(dpiScaling, testString.contains("classic")); + } + if (testString.contains("metal")) { + return new MetalTweaker(dpiScaling); + } + if (testString.contains("nimbus")) { + return new NimbusTweaker(dpiScaling); + } + return new BasicTweaker(dpiScaling); + } + +} -- cgit v1.2.3