diff: fix "Show All Files in One Diff View" not working for VCS Log preview

GitOrigin-RevId: 8639ee150dae3d7bb2f5cc1a6b7e42a47790499e
This commit is contained in:
Aleksey Pivovarov
2024-12-23 13:29:30 +00:00
committed by intellij-monorepo-bot
parent 2cd6fbda37
commit 829620e5c5
3 changed files with 35 additions and 15 deletions
@@ -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
@@ -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 {
@@ -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) {