From 829620e5c5a23312468451f25206c98012ad4a85 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 23 Dec 2024 13:06:41 +0100 Subject: [PATCH] diff: fix "Show All Files in One Diff View" not working for VCS Log preview GitOrigin-RevId: 8639ee150dae3d7bb2f5cc1a6b7e42a47790499e --- platform/diff-impl/api-dump-experimental.txt | 1 + .../tools/combined/CombinedDiffRegistry.kt | 13 +++++++ .../vcs/log/ui/frame/FrameDiffPreview.kt | 36 +++++++++++-------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/platform/diff-impl/api-dump-experimental.txt b/platform/diff-impl/api-dump-experimental.txt index 19c74132c4ff..9c07d17fd70b 100644 --- a/platform/diff-impl/api-dump-experimental.txt +++ b/platform/diff-impl/api-dump-experimental.txt @@ -100,6 +100,7 @@ f:com.intellij.diff.tools.combined.CombinedDiffKeysKt - a:goPrevDiff():V *f:com.intellij.diff.tools.combined.CombinedDiffRegistry - sf:INSTANCE:com.intellij.diff.tools.combined.CombinedDiffRegistry +- f:addStateListener(java.lang.Runnable,com.intellij.openapi.Disposable):V - f:getFilesLimit():I - f:getMaxBlockCountInMemory():I - f:getPreloadedBlocksCount():I diff --git a/platform/diff-impl/src/com/intellij/diff/tools/combined/CombinedDiffRegistry.kt b/platform/diff-impl/src/com/intellij/diff/tools/combined/CombinedDiffRegistry.kt index d2b1b94380d4..e00e3d456db8 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/combined/CombinedDiffRegistry.kt +++ b/platform/diff-impl/src/com/intellij/diff/tools/combined/CombinedDiffRegistry.kt @@ -4,6 +4,8 @@ package com.intellij.diff.tools.combined import com.intellij.diff.editor.DiffEditorViewerFileEditor.Companion.reloadDiffEditorsForFiles import com.intellij.diff.editor.DiffViewerVirtualFile import com.intellij.idea.AppMode +import com.intellij.openapi.Disposable +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.options.advanced.AdvancedSettings import com.intellij.openapi.options.advanced.AdvancedSettingsChangeListener import com.intellij.openapi.project.ProjectManager @@ -27,6 +29,17 @@ object CombinedDiffRegistry { fun getMaxBlockCountInMemory(): Int = Registry.intValue("combined.diff.loaded.content.limit") fun getFilesLimit(): Int = Registry.intValue("combined.diff.files.limit") + + fun addStateListener(onEnabledChange: Runnable, disposable: Disposable) { + ApplicationManager.getApplication().messageBus.connect(disposable) + .subscribe(AdvancedSettingsChangeListener.TOPIC, object : AdvancedSettingsChangeListener { + override fun advancedSettingChanged(id: String, oldValue: Any, newValue: Any) { + if (id == COMBINED_DIFF_SETTING_ID) { + onEnabledChange.run() + } + } + }) + } } internal class CombinedDiffAdvancedSettingsChangeListener : AdvancedSettingsChangeListener { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/FrameDiffPreview.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/FrameDiffPreview.kt index 661be3fb259d..a5a8a067f0a6 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/FrameDiffPreview.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/FrameDiffPreview.kt @@ -2,6 +2,7 @@ package com.intellij.vcs.log.ui.frame import com.intellij.diff.impl.DiffEditorViewer +import com.intellij.diff.tools.combined.CombinedDiffRegistry import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.ActionToolbar import com.intellij.openapi.application.invokeLater @@ -17,11 +18,13 @@ import org.jetbrains.annotations.NonNls import javax.swing.JComponent import kotlin.math.roundToInt -internal abstract class FrameDiffPreview(uiProperties: VcsLogUiProperties, - mainComponent: JComponent, - @NonNls splitterProportionKey: String, - defaultProportion: Float = 0.7f, - parentDisposable: Disposable) : Disposable { +internal abstract class FrameDiffPreview( + val uiProperties: VcsLogUiProperties, + mainComponent: JComponent, + @NonNls splitterProportionKey: String, + defaultProportion: Float = 0.7f, + parentDisposable: Disposable, +) : Disposable { private val previewDiffSplitter: Splitter = OnePixelSplitter(uiProperties[MainVcsLogUiProperties.DIFF_PREVIEW_VERTICAL_SPLIT], splitterProportionKey, defaultProportion) @@ -35,14 +38,15 @@ internal abstract class FrameDiffPreview(uiProperties: VcsLogUiProperties, uiProperties.onPropertyChange(this) { p -> if (CommonUiProperties.SHOW_DIFF_PREVIEW == p) { - showDiffPreview(uiProperties[CommonUiProperties.SHOW_DIFF_PREVIEW]) + updateDiffPreviewState() } else if (MainVcsLogUiProperties.DIFF_PREVIEW_VERTICAL_SPLIT == p) { changeDiffPreviewOrientation(uiProperties[MainVcsLogUiProperties.DIFF_PREVIEW_VERTICAL_SPLIT]) } } - invokeLater { showDiffPreview(uiProperties[CommonUiProperties.SHOW_DIFF_PREVIEW]) } + CombinedDiffRegistry.addStateListener({ updateDiffPreviewState(forceRecreate = true) }, this) + invokeLater { updateDiffPreviewState() } Disposer.register(parentDisposable, this) } @@ -59,13 +63,20 @@ internal abstract class FrameDiffPreview(uiProperties: VcsLogUiProperties, return diffViewer?.preferredFocusedComponent } - private fun showDiffPreview(state: Boolean) { + private fun updateDiffPreviewState(forceRecreate: Boolean = false) { if (isDisposed) return + val shouldBeShown = uiProperties[CommonUiProperties.SHOW_DIFF_PREVIEW] val isShown = diffViewer != null - if (state == isShown) return + if (!forceRecreate && shouldBeShown == isShown) return - if (state) { + if (diffViewer != null) { + previewDiffSplitter.secondComponent = null + Disposer.dispose(diffViewer!!.disposable) + diffViewer = null + } + + if (shouldBeShown) { val newDiffViewer = createViewer() val component = newDiffViewer.component previewDiffSplitter.secondComponent = component @@ -75,11 +86,6 @@ internal abstract class FrameDiffPreview(uiProperties: VcsLogUiProperties, defaultMinimumSize.height.coerceAtMost((actionButtonSize.height * 1.5f).roundToInt())) diffViewer = newDiffViewer } - else { - previewDiffSplitter.secondComponent = null - Disposer.dispose(diffViewer!!.disposable) - diffViewer = null - } } private fun changeDiffPreviewOrientation(bottom: Boolean) {