From 7cb63072b167cc36ee0e9b185692238cd296df89 Mon Sep 17 00:00:00 2001 From: Ivan Semenov Date: Mon, 3 Mar 2025 17:16:02 +0100 Subject: [PATCH] [diff] promote diff navigation actions when navigating in diff over all other actions #IJPL-179930 Fixed GitOrigin-RevId: fc70769864e8347409df4eea792a98d7e61a6539 --- .../resources/META-INF/diff-impl.xml | 2 ++ .../impl/DiffNavigationActionPromoter.kt | 27 +++++++++++++++++++ .../actions/impl/DiffNextDifferenceAction.kt | 12 ++++----- .../diff/actions/impl/DiffNextFileAction.kt | 6 ----- .../impl/DiffPreviousDifferenceAction.kt | 12 ++++----- .../actions/impl/DiffPreviousFileAction.kt | 6 ----- 6 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNavigationActionPromoter.kt diff --git a/platform/diff-impl/resources/META-INF/diff-impl.xml b/platform/diff-impl/resources/META-INF/diff-impl.xml index 5efc5513cf6f..23efadeadc0e 100644 --- a/platform/diff-impl/resources/META-INF/diff-impl.xml +++ b/platform/diff-impl/resources/META-INF/diff-impl.xml @@ -14,6 +14,8 @@ order="before hide-hints"/> + + diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNavigationActionPromoter.kt b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNavigationActionPromoter.kt new file mode 100644 index 000000000000..d2ad3398588f --- /dev/null +++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNavigationActionPromoter.kt @@ -0,0 +1,27 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.diff.actions.impl + +import com.intellij.diff.tools.util.DiffDataKeys +import com.intellij.openapi.actionSystem.ActionPromoter +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.DataContext + +/** + * When iterating over diff, iteration actions take precedence over anything else + */ +internal class DiffNavigationActionPromoter : ActionPromoter { + override fun suppress(actions: List, context: DataContext): List { + if (context.getData(DiffDataKeys.PREV_NEXT_FILE_ITERABLE) != null && actions.any(::isFileNavigationAction)) { + return actions.filterNot(::isFileNavigationAction) + } + + if (context.getData(DiffDataKeys.PREV_NEXT_DIFFERENCE_ITERABLE) != null && actions.any(::isDifferenceNavigationAction)) { + return actions.filterNot(::isDifferenceNavigationAction) + } + return emptyList() + } +} + +private fun isFileNavigationAction(action: AnAction) = action is DiffNextFileAction || action is DiffPreviousFileAction + +private fun isDifferenceNavigationAction(action: AnAction) = action is DiffNextDifferenceAction || action is DiffPreviousDifferenceAction \ No newline at end of file diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextDifferenceAction.kt b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextDifferenceAction.kt index f96fbb01b05c..7a276d1f86fa 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextDifferenceAction.kt +++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextDifferenceAction.kt @@ -2,7 +2,6 @@ package com.intellij.diff.actions.impl import com.intellij.diff.tools.util.DiffDataKeys -import com.intellij.diff.util.DiffUtil import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent @@ -12,14 +11,13 @@ internal open class DiffNextDifferenceAction : AnAction(), DumbAware { override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.EDT override fun update(e: AnActionEvent) { - if (DiffUtil.isFromShortcut(e)) { - e.presentation.setEnabledAndVisible(true) + val iterable = e.getData(DiffDataKeys.PREV_NEXT_DIFFERENCE_ITERABLE) + if (iterable == null) { + e.presentation.setEnabledAndVisible(false) return } - - val iterable = e.getData(DiffDataKeys.PREV_NEXT_DIFFERENCE_ITERABLE) - if (iterable != null && iterable.canGoNext()) { - e.presentation.setEnabled(true) + else if (iterable.canGoNext()) { + e.presentation.setEnabledAndVisible(true) return } diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextFileAction.kt b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextFileAction.kt index 61ed0badb4e4..fa55e1502d8c 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextFileAction.kt +++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffNextFileAction.kt @@ -2,7 +2,6 @@ package com.intellij.diff.actions.impl import com.intellij.diff.tools.util.DiffDataKeys -import com.intellij.diff.util.DiffUtil import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent @@ -12,11 +11,6 @@ internal open class DiffNextFileAction : AnAction(), DumbAware { override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT override fun update(e: AnActionEvent) { - if (DiffUtil.isFromShortcut(e)) { - e.presentation.setEnabledAndVisible(true) - return - } - val iterable = e.getData(DiffDataKeys.PREV_NEXT_FILE_ITERABLE) if (iterable == null) { e.presentation.setEnabledAndVisible(false) diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousDifferenceAction.kt b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousDifferenceAction.kt index 2b8ff690b0f1..4e223475b9f4 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousDifferenceAction.kt +++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousDifferenceAction.kt @@ -2,7 +2,6 @@ package com.intellij.diff.actions.impl import com.intellij.diff.tools.util.DiffDataKeys -import com.intellij.diff.util.DiffUtil import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent @@ -12,14 +11,13 @@ internal open class DiffPreviousDifferenceAction : AnAction(), DumbAware { override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.EDT override fun update(e: AnActionEvent) { - if (DiffUtil.isFromShortcut(e)) { - e.presentation.setEnabledAndVisible(true) + val iterable = e.getData(DiffDataKeys.PREV_NEXT_DIFFERENCE_ITERABLE) + if (iterable == null) { + e.presentation.setEnabledAndVisible(false) return } - - val iterable = e.getData(DiffDataKeys.PREV_NEXT_DIFFERENCE_ITERABLE) - if (iterable != null && iterable.canGoPrev()) { - e.presentation.setEnabled(true) + else if (iterable.canGoPrev()) { + e.presentation.setEnabledAndVisible(true) return } diff --git a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousFileAction.kt b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousFileAction.kt index 7869741eb06e..c77b296a152c 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousFileAction.kt +++ b/platform/diff-impl/src/com/intellij/diff/actions/impl/DiffPreviousFileAction.kt @@ -2,7 +2,6 @@ package com.intellij.diff.actions.impl import com.intellij.diff.tools.util.DiffDataKeys -import com.intellij.diff.util.DiffUtil import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent @@ -12,11 +11,6 @@ internal class DiffPreviousFileAction : AnAction(), DumbAware { override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT override fun update(e: AnActionEvent) { - if (DiffUtil.isFromShortcut(e)) { - e.presentation.setEnabledAndVisible(true) - return - } - val iterable = e.getData(DiffDataKeys.PREV_NEXT_FILE_ITERABLE) if (iterable == null) { e.presentation.setEnabledAndVisible(false)