From 83ba8da37dcd06c099989d169461bf8248f8181b Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:29:17 -0800 Subject: [PATCH 1/6] Embedded DevTools zoom matches IDE zoom --- .../src/io/flutter/devtools/DevToolsUrl.java | 18 ------- .../flutter/jxbrowser/EmbeddedJxBrowser.java | 53 +++++++++++++++++++ .../src/io/flutter/view/EmbeddedBrowser.java | 21 +++++++- .../io/flutter/view/EmbeddedJcefBrowser.java | 7 +++ .../src/io/flutter/view/EmbeddedTab.java | 2 + 5 files changed, 82 insertions(+), 19 deletions(-) diff --git a/flutter-idea/src/io/flutter/devtools/DevToolsUrl.java b/flutter-idea/src/io/flutter/devtools/DevToolsUrl.java index c89c49ee5e..4f524d0474 100644 --- a/flutter-idea/src/io/flutter/devtools/DevToolsUrl.java +++ b/flutter-idea/src/io/flutter/devtools/DevToolsUrl.java @@ -25,7 +25,6 @@ public class DevToolsUrl { public String colorHexCode; public Boolean isBright; public String widgetId; - public Float fontSize; public String hide; private final FlutterSdkVersion flutterSdkVersion; private final FlutterSdkUtil sdkUtil; @@ -45,7 +44,6 @@ public static class Builder { private String page; private Boolean embed; private String widgetId; - private Float fontSize; private String hide; private FlutterSdkVersion flutterSdkVersion; @@ -88,11 +86,6 @@ public Builder setWidgetId(String widgetId) { return this; } - public Builder setFontSize(Float fontSize) { - this.fontSize = fontSize; - return this; - } - public Builder setHide(String hide) { this.hide = hide; return this; @@ -147,7 +140,6 @@ private DevToolsUrl(Builder builder) { if (builder.embed) { this.colorHexCode = builder.devToolsUtils.getColorHexCode(); this.isBright = builder.devToolsUtils.getIsBackgroundBright(); - this.fontSize = builder.devToolsUtils.getFontSize(); } this.hide = builder.hide; this.widgetId = builder.widgetId; @@ -196,9 +188,6 @@ public String getUrlString() { } } } - if (fontSize != null) { - params.add("fontSize=" + fontSize); - } if (ideFeature != null) { params.add("ideFeature=" + ideFeature.value); } @@ -226,11 +215,4 @@ public void maybeUpdateColor() { colorHexCode = newColor; isBright = devToolsUtils.getIsBackgroundBright(); } - - public void maybeUpdateFontSize() { - final Float newFontSize = devToolsUtils.getFontSize(); - if (fontSize == null || !fontSize.equals(newFontSize)) { - fontSize = newFontSize; - } - } } diff --git a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java index 534207fc37..56affb44a3 100644 --- a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java +++ b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java @@ -30,6 +30,8 @@ import io.flutter.utils.LabelInput; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.teamdev.jxbrowser.zoom.Zoom; +import com.teamdev.jxbrowser.zoom.ZoomLevel; import javax.swing.*; import java.awt.*; @@ -39,10 +41,15 @@ import java.util.Objects; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; +import java.util.HashMap; +import java.util.Map; +import static java.util.Map.entry; class EmbeddedJxBrowserTab implements EmbeddedTab { private final Engine engine; private Browser browser; + private Zoom zoom; + private final ZoomLevelSelector zoomSelector = new ZoomLevelSelector(); private static final Logger LOG = Logger.getInstance(EmbeddedJxBrowserTab.class); public EmbeddedJxBrowserTab(Engine engine) { @@ -50,6 +57,7 @@ public EmbeddedJxBrowserTab(Engine engine) { try { this.browser = engine.newBrowser(); + this.zoom = this.browser.zoom(); this.browser.settings().enableTransparentBackground(); this.browser.on(ConsoleMessageReceived.class, event -> { final ConsoleMessage consoleMessage = event.consoleMessage(); @@ -74,6 +82,15 @@ public void close() { this.browser.close(); } + @Override + public void zoom(int zoomPercent) { + final Zoom zoom = this.browser.zoom(); + if (zoom != null) { + final ZoomLevel zoomLevel = zoomSelector.getClosestZoomLevel(zoomPercent); + zoom.level(zoomLevel); + } + } + @Override public JComponent getTabComponent(ContentManager contentManager) { // Creating Swing component for rendering web content @@ -243,3 +260,39 @@ protected void handleJxBrowserInstallationFailed(ContentManager contentManager) showLabelsWithUrlLink(inputs, contentManager); } } + +class ZoomLevelSelector { + @NotNull final Map zoomLevels = Map.ofEntries( + entry(25, ZoomLevel.P_25), + entry(33, ZoomLevel.P_33), + entry(50, ZoomLevel.P_50), + entry(67, ZoomLevel.P_67), + entry(75, ZoomLevel.P_75), + entry(80, ZoomLevel.P_80), + entry(90, ZoomLevel.P_90), + entry(100, ZoomLevel.P_100), + entry(110, ZoomLevel.P_110), + entry(125, ZoomLevel.P_125), + entry(150, ZoomLevel.P_150), + entry(175, ZoomLevel.P_175), + entry(200, ZoomLevel.P_200), + entry(250, ZoomLevel.P_250), + entry(300, ZoomLevel.P_300), + entry(400, ZoomLevel.P_400), + entry(500, ZoomLevel.P_500) + ); + + public @NotNull ZoomLevel getClosestZoomLevel(int zoomPercent) { + ZoomLevel closest = ZoomLevel.P_100; + int minDifference = Integer.MAX_VALUE; + + for (Map.Entry entry : zoomLevels.entrySet()) { + int currentDifference = Math.abs(zoomPercent - entry.getKey()); + if (currentDifference < minDifference) { + minDifference = currentDifference; + closest = entry.getValue(); + } + } + + return closest; + }} \ No newline at end of file diff --git a/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java b/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java index 96649b1306..94f3e6daed 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java @@ -17,6 +17,7 @@ import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; import com.intellij.util.ui.JBUI; +import com.intellij.ide.ui.UISettingsUtils; import icons.FlutterIcons; import io.flutter.devtools.DevToolsUrl; import io.flutter.utils.AsyncUtils; @@ -140,6 +141,7 @@ public void openPanel(ToolWindow toolWindow, String tabName, DevToolsUrl devTool tab.content.setIcon(FlutterIcons.Phone); tab.contentManager.addContent(tab.content); tab.contentManager.setSelectedContent(tab.content, true); + matchIdeZoom(tab); }); } @@ -262,8 +264,8 @@ public void refresh(String toolWindowId) { tab.devToolsUrlFuture.thenAccept(devToolsUrl -> { if (devToolsUrl == null) return; devToolsUrl.maybeUpdateColor(); - devToolsUrl.maybeUpdateFontSize(); tab.embeddedTab.loadUrl(devToolsUrl.getUrlString()); + matchIdeZoom(tab); }); }); } @@ -290,8 +292,25 @@ private void updateUrlAndReload(Function newDevToolsUr return; } tab.embeddedTab.loadUrl(devToolsUrl.getUrlString()); + matchIdeZoom(tab); }); }); }); } + + /** + * Zoom the browser tab to match the IDE zoom level. + * Note: This needs to be called after the tab content has loaded. + */ + private void matchIdeZoom(@NotNull BrowserTab tab) { + final EmbeddedTab embeddedTab = tab.embeddedTab; + if (embeddedTab == null) return; + embeddedTab.zoom(getIdeZoomPercent()); + } + + private int getIdeZoomPercent() { + final UISettingsUtils uiSettingsUtils = UISettingsUtils.getInstance(); + final float ideScale = uiSettingsUtils.getCurrentIdeScale(); + return Math.round(ideScale * 100); + } } diff --git a/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java b/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java index afc6835114..feb6c73cf5 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java @@ -9,6 +9,8 @@ import com.intellij.openapi.project.Project; import com.intellij.ui.content.ContentManager; import com.intellij.ui.jcef.JBCefBrowser; +import com.teamdev.jxbrowser.zoom.Zoom; +import com.teamdev.jxbrowser.zoom.ZoomLevel; import io.flutter.jxbrowser.JxBrowserManager; import org.jetbrains.annotations.NotNull; @@ -33,6 +35,11 @@ public void close() { } + @Override + public void zoom(int zoomPercent) { + + } + @Override public JComponent getTabComponent(ContentManager contentManager) { browser.getComponent().setPreferredSize(new Dimension(contentManager.getComponent().getWidth(), contentManager.getComponent().getHeight())); diff --git a/flutter-idea/src/io/flutter/view/EmbeddedTab.java b/flutter-idea/src/io/flutter/view/EmbeddedTab.java index 4bc99ad7d7..ea3d7553c1 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedTab.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedTab.java @@ -14,5 +14,7 @@ public interface EmbeddedTab { void close(); + void zoom(int zoomPercent); + JComponent getTabComponent(ContentManager contentManager); } From 376aea1682463740048d866c8e6f3cfc717ddd09 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 5 Feb 2025 15:04:50 -0800 Subject: [PATCH 2/6] Move zoom logic --- .../flutter/jxbrowser/EmbeddedJxBrowser.java | 18 ++++++++++----- .../src/io/flutter/view/EmbeddedBrowser.java | 22 +++---------------- .../io/flutter/view/EmbeddedJcefBrowser.java | 2 +- .../src/io/flutter/view/EmbeddedTab.java | 2 +- 4 files changed, 17 insertions(+), 27 deletions(-) diff --git a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java index 56affb44a3..3835cf7ff5 100644 --- a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java +++ b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java @@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nullable; import com.teamdev.jxbrowser.zoom.Zoom; import com.teamdev.jxbrowser.zoom.ZoomLevel; +import com.intellij.ide.ui.UISettingsUtils; import javax.swing.*; import java.awt.*; @@ -83,14 +84,19 @@ public void close() { } @Override - public void zoom(int zoomPercent) { - final Zoom zoom = this.browser.zoom(); - if (zoom != null) { - final ZoomLevel zoomLevel = zoomSelector.getClosestZoomLevel(zoomPercent); - zoom.level(zoomLevel); + public void matchIdeZoom() { + if (this.zoom != null) { + final ZoomLevel zoomLevel = zoomSelector.getClosestZoomLevel(getIdeZoomPercent()); + this.zoom.level(zoomLevel); } } + private int getIdeZoomPercent() { + final UISettingsUtils uiSettingsUtils = UISettingsUtils.getInstance(); + final float ideScale = uiSettingsUtils.getCurrentIdeScale(); + return Math.round(ideScale * 100); + } + @Override public JComponent getTabComponent(ContentManager contentManager) { // Creating Swing component for rendering web content @@ -295,4 +301,4 @@ class ZoomLevelSelector { } return closest; - }} \ No newline at end of file + }} diff --git a/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java b/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java index 94f3e6daed..2efe2c263d 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java @@ -141,7 +141,7 @@ public void openPanel(ToolWindow toolWindow, String tabName, DevToolsUrl devTool tab.content.setIcon(FlutterIcons.Phone); tab.contentManager.addContent(tab.content); tab.contentManager.setSelectedContent(tab.content, true); - matchIdeZoom(tab); + tab.embeddedTab.matchIdeZoom(); }); } @@ -265,7 +265,7 @@ public void refresh(String toolWindowId) { if (devToolsUrl == null) return; devToolsUrl.maybeUpdateColor(); tab.embeddedTab.loadUrl(devToolsUrl.getUrlString()); - matchIdeZoom(tab); + tab.embeddedTab.matchIdeZoom(); }); }); } @@ -292,25 +292,9 @@ private void updateUrlAndReload(Function newDevToolsUr return; } tab.embeddedTab.loadUrl(devToolsUrl.getUrlString()); - matchIdeZoom(tab); + tab.embeddedTab.matchIdeZoom(); }); }); }); } - - /** - * Zoom the browser tab to match the IDE zoom level. - * Note: This needs to be called after the tab content has loaded. - */ - private void matchIdeZoom(@NotNull BrowserTab tab) { - final EmbeddedTab embeddedTab = tab.embeddedTab; - if (embeddedTab == null) return; - embeddedTab.zoom(getIdeZoomPercent()); - } - - private int getIdeZoomPercent() { - final UISettingsUtils uiSettingsUtils = UISettingsUtils.getInstance(); - final float ideScale = uiSettingsUtils.getCurrentIdeScale(); - return Math.round(ideScale * 100); - } } diff --git a/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java b/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java index feb6c73cf5..4446c44a5e 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java @@ -36,7 +36,7 @@ public void close() { } @Override - public void zoom(int zoomPercent) { + public void matchIdeZoom() { } diff --git a/flutter-idea/src/io/flutter/view/EmbeddedTab.java b/flutter-idea/src/io/flutter/view/EmbeddedTab.java index ea3d7553c1..b9d16014c4 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedTab.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedTab.java @@ -14,7 +14,7 @@ public interface EmbeddedTab { void close(); - void zoom(int zoomPercent); + void matchIdeZoom(); JComponent getTabComponent(ContentManager contentManager); } From b779efb8f5976e5959758f5d651d2c690013b595 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 5 Feb 2025 15:07:55 -0800 Subject: [PATCH 3/6] Clean up --- flutter-idea/src/io/flutter/view/EmbeddedBrowser.java | 1 - flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java b/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java index 2efe2c263d..35766f6d72 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedBrowser.java @@ -17,7 +17,6 @@ import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; import com.intellij.util.ui.JBUI; -import com.intellij.ide.ui.UISettingsUtils; import icons.FlutterIcons; import io.flutter.devtools.DevToolsUrl; import io.flutter.utils.AsyncUtils; diff --git a/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java b/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java index 4446c44a5e..bf56b1fbb7 100644 --- a/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java +++ b/flutter-idea/src/io/flutter/view/EmbeddedJcefBrowser.java @@ -9,8 +9,6 @@ import com.intellij.openapi.project.Project; import com.intellij.ui.content.ContentManager; import com.intellij.ui.jcef.JBCefBrowser; -import com.teamdev.jxbrowser.zoom.Zoom; -import com.teamdev.jxbrowser.zoom.ZoomLevel; import io.flutter.jxbrowser.JxBrowserManager; import org.jetbrains.annotations.NotNull; From f32c9b70448faee392a213165ed3c5fee4f8c287 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 5 Feb 2025 15:51:22 -0800 Subject: [PATCH 4/6] Fix test --- .../io/flutter/devtools/DevToolsUrlTest.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/flutter-idea/testSrc/unit/io/flutter/devtools/DevToolsUrlTest.java b/flutter-idea/testSrc/unit/io/flutter/devtools/DevToolsUrlTest.java index 52bdfc8ab1..1701ef49cf 100644 --- a/flutter-idea/testSrc/unit/io/flutter/devtools/DevToolsUrlTest.java +++ b/flutter-idea/testSrc/unit/io/flutter/devtools/DevToolsUrlTest.java @@ -34,7 +34,6 @@ public void testGetUrlStringWithoutColor() { final DevToolsUtils noColorUtils = mock(DevToolsUtils.class); when(noColorUtils.getColorHexCode()).thenReturn(null); when(noColorUtils.getIsBackgroundBright()).thenReturn(null); - when(noColorUtils.getFontSize()).thenReturn(null); assertEquals( "http://127.0.0.1:9100/timeline?ide=IntelliJ-IDEA&uri=http%3A%2F%2F127.0.0.1%3A50224%2FWTFTYus3IPU%3D%2F", @@ -163,7 +162,6 @@ public final void testGetUrlStringWithColor() { final DevToolsUtils lightUtils = mock(DevToolsUtils.class); when(lightUtils.getColorHexCode()).thenReturn("ffffff"); when(lightUtils.getIsBackgroundBright()).thenReturn(true); - when(lightUtils.getFontSize()).thenReturn(null); assertEquals( "http://127.0.0.1:9100/timeline?ide=IntelliJ-IDEA&backgroundColor=ffffff&theme=light&embed=true&uri=http%3A%2F%2F127.0.0.1%3A50224%2FWTFTYus3IPU%3D%2F", @@ -181,29 +179,11 @@ public final void testGetUrlStringWithColor() { .getUrlString() ); - when(lightUtils.getFontSize()).thenReturn(12f); - assertEquals( - "http://127.0.0.1:9100/timeline?ide=IntelliJ-IDEA&backgroundColor=ffffff&theme=light&embed=true&fontSize=12.0&uri=http%3A%2F%2F127.0.0.1%3A50224%2FWTFTYus3IPU%3D%2F", - new DevToolsUrl.Builder() - .setDevToolsHost(devtoolsHost) - .setDevToolsPort(devtoolsPort) - .setVmServiceUri(serviceProtocolUri) - .setEmbed(true) - .setPage(page) - .setFlutterSdkVersion(newVersion) - .setWorkspaceCache(notBazelWorkspaceCache) - .setFlutterSdkUtil(mockSdkUtil) - .setDevToolsUtils(lightUtils) - .build() - .getUrlString() - ); - when(mockSdkUtil.getFlutterHostEnvValue()).thenReturn("Android-Studio"); final DevToolsUtils darkUtils = mock(DevToolsUtils.class); when(darkUtils.getColorHexCode()).thenReturn("3c3f41"); when(darkUtils.getIsBackgroundBright()).thenReturn(false); - when(darkUtils.getFontSize()).thenReturn(null); assertEquals( "http://127.0.0.1:9100/timeline?ide=Android-Studio&backgroundColor=3c3f41&theme=dark&embed=true&uri=http%3A%2F%2F127.0.0.1%3A50224%2FWTFTYus3IPU%3D%2F", From d84bbd21b2eca8b92fcf8e789bca4f2586078db7 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 5 Feb 2025 16:15:52 -0800 Subject: [PATCH 5/6] Move ZoomLevelSelector to utils and add test --- .../flutter/jxbrowser/EmbeddedJxBrowser.java | 42 +--------------- .../io/flutter/utils/ZoomLevelSelector.java | 49 +++++++++++++++++++ .../unit/io/flutter/FlutterUtilsTest.java | 20 +++++++- 3 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 flutter-idea/src/io/flutter/utils/ZoomLevelSelector.java diff --git a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java index 3835cf7ff5..038966df53 100644 --- a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java +++ b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java @@ -25,6 +25,7 @@ import io.flutter.settings.FlutterSettings; import io.flutter.utils.AsyncUtils; import io.flutter.utils.JxBrowserUtils; +import io.flutter.utils.ZoomLevelSelector; import io.flutter.view.EmbeddedBrowser; import io.flutter.view.EmbeddedTab; import io.flutter.utils.LabelInput; @@ -42,9 +43,6 @@ import java.util.Objects; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; -import java.util.HashMap; -import java.util.Map; -import static java.util.Map.entry; class EmbeddedJxBrowserTab implements EmbeddedTab { private final Engine engine; @@ -265,40 +263,4 @@ protected void handleJxBrowserInstallationFailed(ContentManager contentManager) showLabelsWithUrlLink(inputs, contentManager); } -} - -class ZoomLevelSelector { - @NotNull final Map zoomLevels = Map.ofEntries( - entry(25, ZoomLevel.P_25), - entry(33, ZoomLevel.P_33), - entry(50, ZoomLevel.P_50), - entry(67, ZoomLevel.P_67), - entry(75, ZoomLevel.P_75), - entry(80, ZoomLevel.P_80), - entry(90, ZoomLevel.P_90), - entry(100, ZoomLevel.P_100), - entry(110, ZoomLevel.P_110), - entry(125, ZoomLevel.P_125), - entry(150, ZoomLevel.P_150), - entry(175, ZoomLevel.P_175), - entry(200, ZoomLevel.P_200), - entry(250, ZoomLevel.P_250), - entry(300, ZoomLevel.P_300), - entry(400, ZoomLevel.P_400), - entry(500, ZoomLevel.P_500) - ); - - public @NotNull ZoomLevel getClosestZoomLevel(int zoomPercent) { - ZoomLevel closest = ZoomLevel.P_100; - int minDifference = Integer.MAX_VALUE; - - for (Map.Entry entry : zoomLevels.entrySet()) { - int currentDifference = Math.abs(zoomPercent - entry.getKey()); - if (currentDifference < minDifference) { - minDifference = currentDifference; - closest = entry.getValue(); - } - } - - return closest; - }} +} \ No newline at end of file diff --git a/flutter-idea/src/io/flutter/utils/ZoomLevelSelector.java b/flutter-idea/src/io/flutter/utils/ZoomLevelSelector.java new file mode 100644 index 0000000000..e7b85c10e5 --- /dev/null +++ b/flutter-idea/src/io/flutter/utils/ZoomLevelSelector.java @@ -0,0 +1,49 @@ +/* + * Copyright 2025 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +package io.flutter.utils; + +import com.teamdev.jxbrowser.zoom.ZoomLevel; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +import static java.util.Map.entry; + +public class ZoomLevelSelector { + @NotNull final Map zoomLevels = Map.ofEntries( + entry(25, ZoomLevel.P_25), + entry(33, ZoomLevel.P_33), + entry(50, ZoomLevel.P_50), + entry(67, ZoomLevel.P_67), + entry(75, ZoomLevel.P_75), + entry(80, ZoomLevel.P_80), + entry(90, ZoomLevel.P_90), + entry(100, ZoomLevel.P_100), + entry(110, ZoomLevel.P_110), + entry(125, ZoomLevel.P_125), + entry(150, ZoomLevel.P_150), + entry(175, ZoomLevel.P_175), + entry(200, ZoomLevel.P_200), + entry(250, ZoomLevel.P_250), + entry(300, ZoomLevel.P_300), + entry(400, ZoomLevel.P_400), + entry(500, ZoomLevel.P_500) + ); + + public @NotNull ZoomLevel getClosestZoomLevel(int zoomPercent) { + ZoomLevel closest = ZoomLevel.P_100; + int minDifference = Integer.MAX_VALUE; + + for (Map.Entry entry : zoomLevels.entrySet()) { + int currentDifference = Math.abs(zoomPercent - entry.getKey()); + if (currentDifference < minDifference) { + minDifference = currentDifference; + closest = entry.getValue(); + } + } + + return closest; + }} diff --git a/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java b/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java index e056d1607f..c88f456c5b 100644 --- a/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java +++ b/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java @@ -5,12 +5,13 @@ */ package io.flutter; +import com.teamdev.jxbrowser.zoom.ZoomLevel; +import io.flutter.utils.ZoomLevelSelector; import org.junit.Test; import static io.flutter.FlutterUtils.isValidDartIdentifier; import static io.flutter.FlutterUtils.isValidPackageName; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class FlutterUtilsTest { @@ -39,4 +40,19 @@ public void validPackageNames() { assertFalse("expected " + name + " to be invalid", isValidPackageName(name)); } } + + @Test + public void zoomLevelSelector() { + final ZoomLevelSelector zoomLevelSelector = new ZoomLevelSelector(); + assertSame(zoomLevelSelector.getClosestZoomLevel(-70), ZoomLevel.P_25); + assertSame(zoomLevelSelector.getClosestZoomLevel(-10), ZoomLevel.P_25); + assertSame(zoomLevelSelector.getClosestZoomLevel(0), ZoomLevel.P_25); + assertSame(zoomLevelSelector.getClosestZoomLevel(1), ZoomLevel.P_25); + assertSame(zoomLevelSelector.getClosestZoomLevel(20), ZoomLevel.P_25); + assertSame(zoomLevelSelector.getClosestZoomLevel(28), ZoomLevel.P_25); + assertSame(zoomLevelSelector.getClosestZoomLevel(35), ZoomLevel.P_33); + assertSame(zoomLevelSelector.getClosestZoomLevel(222), ZoomLevel.P_200); + assertSame(zoomLevelSelector.getClosestZoomLevel(226), ZoomLevel.P_250); + assertSame(zoomLevelSelector.getClosestZoomLevel(700), ZoomLevel.P_500); + } } From dc330c55008a34c167566226f71ea0a08975590f Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Wed, 5 Feb 2025 16:18:42 -0800 Subject: [PATCH 6/6] More clean up --- flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java | 2 +- flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java index 038966df53..a1ab1fe6f0 100644 --- a/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java +++ b/flutter-idea/src/io/flutter/jxbrowser/EmbeddedJxBrowser.java @@ -263,4 +263,4 @@ protected void handleJxBrowserInstallationFailed(ContentManager contentManager) showLabelsWithUrlLink(inputs, contentManager); } -} \ No newline at end of file +} diff --git a/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java b/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java index c88f456c5b..6a0a50177f 100644 --- a/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java +++ b/flutter-idea/testSrc/unit/io/flutter/FlutterUtilsTest.java @@ -11,7 +11,9 @@ import static io.flutter.FlutterUtils.isValidDartIdentifier; import static io.flutter.FlutterUtils.isValidPackageName; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; public class FlutterUtilsTest {