diff options
| author | 2020-04-24 18:39:57 +0200 | |
|---|---|---|
| committer | 2020-04-24 17:39:57 +0100 | |
| commit | 04b01512c124c76f3b3d99ba07ef30ea6a90b52f (patch) | |
| tree | 33ffbe9fba1fd762cc7a7997db9764b181f29d7b /src/main/java/cuchaz/enigma/gui/util | |
| parent | Update darcula to fix dark theme (diff) | |
| download | enigma-fork-04b01512c124c76f3b3d99ba07ef30ea6a90b52f.tar.gz enigma-fork-04b01512c124c76f3b3d99ba07ef30ea6a90b52f.tar.xz enigma-fork-04b01512c124c76f3b3d99ba07ef30ea6a90b52f.zip | |
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 <modmuss50@gmail.com>
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/util')
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/util/ScaleChangeListener.java | 8 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/util/ScaleUtil.java | 104 |
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 @@ | |||
| 1 | package cuchaz.enigma.gui.util; | ||
| 2 | |||
| 3 | @FunctionalInterface | ||
| 4 | public 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 @@ | |||
| 1 | package cuchaz.enigma.gui.util; | ||
| 2 | |||
| 3 | import java.awt.Dimension; | ||
| 4 | import java.awt.Font; | ||
| 5 | import java.io.IOException; | ||
| 6 | import java.lang.reflect.Field; | ||
| 7 | import java.util.ArrayList; | ||
| 8 | import java.util.List; | ||
| 9 | |||
| 10 | import javax.swing.UIManager; | ||
| 11 | |||
| 12 | import com.github.swingdpi.UiDefaultsScaler; | ||
| 13 | import com.github.swingdpi.plaf.BasicTweaker; | ||
| 14 | import com.github.swingdpi.plaf.MetalTweaker; | ||
| 15 | import com.github.swingdpi.plaf.NimbusTweaker; | ||
| 16 | import com.github.swingdpi.plaf.WindowsTweaker; | ||
| 17 | import cuchaz.enigma.config.Config; | ||
| 18 | import de.sciss.syntaxpane.DefaultSyntaxKit; | ||
| 19 | |||
| 20 | public 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 | } | ||