From 1893964afa23a04df463798559f75bb0eeff0aba Mon Sep 17 00:00:00 2001 From: Kirill Kirichenko Date: Tue, 14 Jan 2020 11:54:03 +0300 Subject: [PATCH] IDEA-228866 Add theme switch delay and restoration of original theme on Escape GitOrigin-RevId: 4498e1a376c921d0b20785a996c1418a4e7a5608 --- .../ide/actions/QuickChangeLookAndFeel.java | 27 +++++++++++++++---- .../util/resources/misc/registry.properties | 2 ++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java b/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java index 498a1dde7c06..39454b5f7ee9 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java @@ -10,11 +10,14 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.popup.JBPopupListener; +import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.registry.Registry; +import com.intellij.util.Alarm; import com.intellij.util.ui.StartupUiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,32 +28,46 @@ import javax.swing.*; * @author max */ public class QuickChangeLookAndFeel extends QuickSwitchSchemeAction { + private UIManager.LookAndFeelInfo initialLaf; + private final Alarm switchAlarm = new Alarm(); @Override protected void fillActions(Project project, @NotNull DefaultActionGroup group, @NotNull DataContext dataContext) { LafManager lafMan = LafManager.getInstance(); UIManager.LookAndFeelInfo[] lfs = lafMan.getInstalledLookAndFeels(); - UIManager.LookAndFeelInfo currentLaf = lafMan.getCurrentLookAndFeel(); + initialLaf = lafMan.getCurrentLookAndFeel(); for (UIManager.LookAndFeelInfo lf : lfs) { - group.add(new LafChangeAction(lf, currentLaf == lf)); + group.add(new LafChangeAction(lf, initialLaf == lf)); } } @Override protected void showPopup(AnActionEvent e, ListPopup popup) { + switchAlarm.cancelAllRequests(); if (Registry.is("ide.instant.theme.switch")) { - LafManager lafMan = LafManager.getInstance(); popup.addListSelectionListener(event -> { JList list = (JList)event.getSource(); Object item = list.getSelectedValue(); if (item instanceof AnActionHolder) { - LafChangeAction action = (LafChangeAction)((AnActionHolder)item).getAction(); - switchLafAndUpdateUI(lafMan, action.myLookAndFeelInfo, false); + switchAlarm.cancelAllRequests(); + switchAlarm.addRequest(() -> { + LafChangeAction action = (LafChangeAction)((AnActionHolder)item).getAction(); + switchLafAndUpdateUI(LafManager.getInstance(), action.myLookAndFeelInfo, false); + }, Registry.get("ide.instant.theme.switch.delay").asInteger()); } }); } + popup.addListener(new JBPopupListener() { + @Override + public void onClosed(@NotNull LightweightWindowEvent event) { + if (Registry.is("ide.instant.theme.switch") && !event.isOk()) { + switchLafAndUpdateUI(LafManager.getInstance(), initialLaf, false); + } + } + }); + super.showPopup(e, popup); } diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 945bbda3428a..6d2190074c3f 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -1169,6 +1169,8 @@ ide.find.in.file.highlight.usages=false ide.find.in.file.highlight.usages.description=Delegate FindUsagesInFile action to HighlightUsagesInFile ide.instant.theme.switch=true ide.instant.theme.switch.description=Switch theme in the quick switcher instantly, upon selection +ide.instant.theme.switch.delay=500 +ide.instant.theme.switch.delay.description=Instant theme switch delay in milliseconds git.execute.with.mediator=true git.execute.with.mediator.description=Use wrapper executable on Windows to support soft Git process cancellation.