Skip to content

Commit 8f97a5f

Browse files
author
Markus Fleischauer
committed
fix incomplete scaling, allow OS scaling, implemented fractional scaling
(cherry picked from commit 983f778)
1 parent 7fec43e commit 8f97a5f

File tree

5 files changed

+60
-33
lines changed

5 files changed

+60
-33
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ allprojects {
162162
group = 'io.sirius-ms'
163163

164164
jxbrowser {
165-
version='8.8.0'
165+
version='8.12.0'
166166
}
167167

168168
repositories {

sirius_gui/src/main/java/de/unijena/bioinf/ms/gui/settings/GerneralSettingsPanel.java renamed to sirius_gui/src/main/java/de/unijena/bioinf/ms/gui/settings/GeneralSettingsPanel.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,14 @@
5050
/**
5151
* @author Markus Fleischauer (markus.fleischauer@gmail.com)
5252
*/
53-
public class GerneralSettingsPanel extends TwoColumnPanel implements SettingsPanel {
53+
public class GeneralSettingsPanel extends TwoColumnPanel implements SettingsPanel {
5454
public static final String DO_NOT_SHOW_AGAIN_ACTIVATE_LIBRARY_TAB = "de.unijena.bioinf.sirius.settings.activateSpectralLibraryTab.dontAskAgain";
5555

5656
private Properties props;
57+
private final boolean scalingEnable;
58+
private final JCheckBox scalingEnableBox;
5759
final JSpinner scalingSpinner;
58-
final int scaling;
60+
final double scaling;
5961
private boolean enableAllSoftwareTours = false;
6062

6163
final String theme;
@@ -71,7 +73,7 @@ public class GerneralSettingsPanel extends TwoColumnPanel implements SettingsPan
7173
private boolean restartRequired = false;
7274
private SiriusGui gui;
7375

74-
public GerneralSettingsPanel(Properties properties, SiriusGui gui) {
76+
public GeneralSettingsPanel(Properties properties, SiriusGui gui) {
7577
super();
7678
this.props = properties;
7779
this.gui = gui;
@@ -84,11 +86,19 @@ public GerneralSettingsPanel(Properties properties, SiriusGui gui) {
8486
themeBox.setToolTipText("Set theme of the Graphical User Interface");
8587
addNamed("UI Theme", themeBox);
8688

87-
scaling = Integer.parseInt(props.getProperty("sun.java2d.uiScale", System.getProperty("sun.java2d.uiScale", "1")));
89+
double currenScalinFactor = GuiUtils.getScaleFactor(gui.getMainFrame());
90+
scaling = Double.parseDouble(props.getProperty("sun.java2d.uiScale", System.getProperty("sun.java2d.uiScale", String.valueOf(currenScalinFactor))));
8891

89-
SpinnerNumberModel model = new SpinnerNumberModel(scaling, 1, 5, 1);
92+
SpinnerNumberModel model = new SpinnerNumberModel(scaling, 1d, 5d, .25);
9093
scalingSpinner = new JSpinner(model);
9194
scalingSpinner.setToolTipText(GuiUtils.formatToolTip("Set scaling factor of the Graphical User Interface"));
95+
scalingEnable = Boolean.parseBoolean(props.getProperty("de.unijena.bioinf.sirius.customUiScale", "false"));
96+
scalingEnableBox = new JCheckBox("(Current Scaling: "+ currenScalinFactor +")");
97+
scalingEnableBox.setSelected(scalingEnable);
98+
scalingEnableBox.addActionListener(evt -> scalingSpinner.setEnabled(scalingEnableBox.isSelected()));
99+
scalingSpinner.setEnabled(scalingEnableBox.isSelected());
100+
101+
addNamed("Enable custom scaling", scalingEnableBox);
92102
addNamed("Scaling Factor", scalingSpinner);
93103

94104
add(new JXTitledSeparator("Display settings"));
@@ -226,8 +236,14 @@ public void saveProperties() {
226236
} else {
227237
LoggerFactory.getLogger(this.getClass()).warn("Specified path is not a directory ({}). Directory not Changed!", dir);
228238
}
229-
if (scaling != (int) scalingSpinner.getValue()) {
230-
props.setProperty("sun.java2d.uiScale", String.valueOf((int) scalingSpinner.getValue()));
239+
240+
if (scalingEnable != scalingEnableBox.isSelected()){
241+
props.setProperty("de.unijena.bioinf.sirius.customUiScale", String.valueOf(scalingEnableBox.isSelected()));
242+
restartRequired = true;
243+
}
244+
245+
if (scaling != (double) scalingSpinner.getValue()) {
246+
props.setProperty("sun.java2d.uiScale", String.valueOf((double) scalingSpinner.getValue()));
231247
restartRequired = true;
232248
}
233249

sirius_gui/src/main/java/de/unijena/bioinf/ms/gui/settings/SettingsDialog.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class SettingsDialog extends JDialog implements ActionListener {
4747
private final Properties nuProps;
4848
private AdductSettingsPanel addSettings;
4949
private NetworkSettingsPanel proxSettings;
50-
private GerneralSettingsPanel genSettings;
50+
private GeneralSettingsPanel genSettings;
5151
private ProjectSettingsPanel projectSettings;
5252
private JTabbedPane settingsPane;
5353

@@ -70,7 +70,7 @@ public SettingsDialog(SiriusGui gui, int activeTab) {
7070

7171
//============= CENTER =================
7272
settingsPane = new JTabbedPane();
73-
genSettings = new GerneralSettingsPanel(nuProps, gui);
73+
genSettings = new GeneralSettingsPanel(nuProps, gui);
7474
genSettings.addVerticalGlue();
7575
settingsPane.add(genSettings.name(), genSettings);
7676

sirius_gui/src/main/java/de/unijena/bioinf/ms/gui/utils/GuiUtils.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,19 @@
2222
import com.formdev.flatlaf.FlatDarculaLaf;
2323
import com.formdev.flatlaf.FlatIntelliJLaf;
2424
import de.unijena.bioinf.ChemistryBase.utils.DescriptiveOptions;
25+
import de.unijena.bioinf.ChemistryBase.utils.Utils;
26+
import de.unijena.bioinf.ms.frontend.core.SiriusProperties;
2527
import de.unijena.bioinf.ms.gui.SiriusGui;
2628
import de.unijena.bioinf.ms.gui.configs.Colors;
2729
import de.unijena.bioinf.ms.gui.configs.Fonts;
2830
import de.unijena.bioinf.ms.gui.configs.Icons;
2931
import de.unijena.bioinf.ms.gui.dialogs.ExceptionDialog;
30-
import io.sirius.ms.gui.webView.BrowserPanelProvider;
3132
import de.unijena.bioinf.ms.properties.PropertyManager;
33+
import io.sirius.ms.gui.webView.BrowserPanelProvider;
3234
import it.unimi.dsi.fastutil.Pair;
35+
import lombok.extern.slf4j.Slf4j;
3336
import org.jetbrains.annotations.NotNull;
3437
import org.jetbrains.annotations.Nullable;
35-
import org.slf4j.LoggerFactory;
3638

3739
import javax.swing.*;
3840
import java.awt.*;
@@ -41,8 +43,8 @@
4143
import java.awt.event.WindowEvent;
4244
import java.io.IOException;
4345
import java.net.URI;
44-
import java.util.List;
4546
import java.util.*;
47+
import java.util.List;
4648
import java.util.function.Function;
4749
import java.util.stream.Collectors;
4850
import java.util.stream.Stream;
@@ -53,30 +55,36 @@
5355
/**
5456
* @author Markus Fleischauer (markus.fleischauer@gmail.com)
5557
*/
58+
@Slf4j
5659
public class GuiUtils {
5760

5861
public final static int SMALL_GAP = 5;
5962
public final static int MEDIUM_GAP = 10;
6063
public final static int LARGE_GAP = 20;
6164

6265
public static void initUI() {
66+
//override with stored value if available
67+
if (SiriusProperties.getBoolean("de.unijena.bioinf.sirius.customUiScale", false)) {
68+
String scale = SiriusProperties.getProperty("sun.java2d.uiScale");
69+
if (Utils.notNullOrBlank(scale))
70+
System.setProperty("sun.java2d.uiScale", scale);
71+
}
6372

6473
switch (Colors.THEME()) {
6574
case DARK:
6675
try {
6776
UIManager.setLookAndFeel(new FlatDarculaLaf());
6877
break;
6978
} catch (UnsupportedLookAndFeelException e) {
70-
e.printStackTrace();
79+
log.error("Unsupported look and feel!", e);
7180
}
7281
case LIGHT:
7382
default:
7483
try {
7584
UIManager.setLookAndFeel(new FlatIntelliJLaf());
7685
break;
7786
} catch (UnsupportedLookAndFeelException e) {
78-
LoggerFactory.getLogger(GuiUtils.class).error("Error when configuring look and feel!", e);
79-
e.printStackTrace();
87+
log.error("Error when configuring look and feel!", e);
8088
}
8189
}
8290

@@ -89,6 +97,22 @@ public static void initUI() {
8997
ToolTipManager.sharedInstance().setDismissDelay(60000);
9098
}
9199

100+
/**
101+
* Gets the current UI scale factor for a given component.
102+
* This method should be called after the component has been added to a frame and displayed.
103+
*
104+
* @param component The component to check the scale factor for.
105+
* @return The scale factor (e.g., 1.0 for 100%, 2.0 for 200%). Returns 1.0 if undetected.
106+
*/
107+
public static double getScaleFactor(Component component) {
108+
GraphicsConfiguration gc = component.getGraphicsConfiguration();
109+
if (gc != null) {
110+
// The default transform contains the scaling information
111+
return gc.getDefaultTransform().getScaleX();
112+
}
113+
return 1.0;
114+
}
115+
92116
public static void drawListStatusElement(boolean isComputing, Graphics2D g2, Component c) {
93117
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
94118

@@ -263,11 +287,11 @@ public static void openURL(@Nullable Window owner, @NotNull URI url, @Nullable S
263287
Desktop.getDesktop().browse(url);
264288
return;
265289
} else {
266-
LoggerFactory.getLogger(GuiUtils.class).error(
290+
log.error(
267291
"Could not Open URL in System Browser. Trying SIRIUS WebView or try visit page manually: {}", url);
268292
}
269293
} catch (Exception e) {
270-
LoggerFactory.getLogger(GuiUtils.class).error(
294+
log.error(
271295
"Unexpected Error when opening URL in System Browser. Trying SIRIUS WebView or try visit page manually: {}", url, e);
272296
}
273297
}

sirius_rest_service/src/main/java/de/unijena/bioinf/ms/middleware/SiriusMiddlewareApplication.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import de.unijena.bioinf.ms.frontend.workflow.InstanceBufferFactory;
3939
import de.unijena.bioinf.ms.frontend.workflow.WorkflowBuilder;
4040
import de.unijena.bioinf.ms.gui.compute.jjobs.Jobs;
41+
import de.unijena.bioinf.ms.gui.utils.GuiUtils;
4142
import de.unijena.bioinf.ms.middleware.service.gui.GuiService;
4243
import de.unijena.bioinf.ms.middleware.service.projects.ProjectsProvider;
4344
import de.unijena.bioinf.ms.properties.PropertyManager;
@@ -200,21 +201,7 @@ public static void main(String[] args) {
200201
Splash splashScreen = null;
201202
if (!headless) { // ignore gui option if headless is enabled
202203
if (Arrays.stream(args).anyMatch(it -> it.equalsIgnoreCase("--gui") || it.equalsIgnoreCase("-g"))) {
203-
Path propsFile = Workspace.siriusPropsFile;
204-
//override VM defaults from OS
205-
if (!System.getProperties().containsKey("sun.java2d.uiScale"))
206-
System.setProperty("sun.java2d.uiScale", "1");
207-
//override with stored value if available
208-
if (Files.exists(propsFile)) {
209-
Properties props = new Properties();
210-
try (BufferedReader r = Files.newBufferedReader(propsFile)) {
211-
props.load(r);
212-
if (props.containsKey("sun.java2d.uiScale"))
213-
System.setProperty("sun.java2d.uiScale", props.getProperty("sun.java2d.uiScale"));
214-
} catch (IOException e) {
215-
log.error("Error when initializing Splash.", e);
216-
}
217-
}
204+
GuiUtils.initUI();
218205
splashScreen = new Splash(true, false);
219206
} else {
220207
splashScreen = new Splash(true, true);

0 commit comments

Comments
 (0)