Files
Test/Library/PackageCache/com.unity.collab-proxy@4628d2ba6ea4/Editor/Diff/Image/ImageDiffControl.cs
T
2026-11-01 23:39:55 +02:00

222 lines
6.3 KiB
C#

using System;
using Codice.Client.Common.Threading;
using Codice.CM.Client.Differences;
using Codice.CM.Client.Differences.Graphic;
using MergetoolGui;
using Unity.PlasticSCM.Editor.Diff.Text;
using Unity.PlasticSCM.Editor.Diff.Purged;
using Unity.PlasticSCM.Editor.Diff.Texture.Toolbar;
using UnityEngine.Rendering;
using UnityEngine.UIElements;
using XDiffGui;
namespace Unity.PlasticSCM.Editor.Diff.Texture
{
internal class ImageDiffControl : VisualElement, IBigFilePanelListener
{
internal ImageDiffControl(
IBigFileDownloader bigFileDownloader,
IBigFileChecker bigFileChecker)
{
mBigFileDownloader = bigFileDownloader;
mBigFileChecker = bigFileChecker;
CreateGUI();
}
internal void ShowData(DiffViewerData data)
{
mDiffViewerData = data;
ReplaceMainView(mNormalContentPanel);
if (BigFileDiffCalculator.IsBigFileDiff(data, mBigFileDownloader, mBigFileChecker))
{
ShowBigFileMessage();
return;
}
if (data.Left?.IsPurged == true || data.Right?.IsPurged == true)
{
ShowPurgedRevision(data);
return;
}
ShowDiff();
}
internal void Dispose()
{
if (mBigFileMessagePanel != null)
mBigFileMessagePanel.Dispose();
if (mPurgedRevisionControl != null)
mPurgedRevisionControl.Dispose();
mImageDiffToolbar.Dispose();
mImageDiffViewer.Dispose();
}
void IBigFilePanelListener.OnCalculateDifferencesButtonClick()
{
mBigFileMessagePanel.Disable();
IThreadWaiter waiter = ThreadWaiter.GetWaiter(10);
waiter.Execute(
/*threadOperationDelegate*/ delegate
{
mBigFileDownloader.DownloadFiles(mDiffViewerData, null);
},
/*afterOperationDelegate*/ delegate
{
mBigFileMessagePanel.Enable();
if (waiter.Exception != null)
{
MergetoolExceptionsHandler.DisplayException(
waiter.Exception);
return;
}
if (mDiffViewerData.Left?.IsPurged == true ||
mDiffViewerData.Right?.IsPurged == true)
{
ShowPurgedRevision(mDiffViewerData);
return;
}
ShowDiff();
});
}
void ShowDiff()
{
try
{
mImageDiffViewer.SetInfo(
mDiffViewerData.Left.File,
mDiffViewerData.Right.File,
mDiffViewerData.Left.SymbolicName,
mDiffViewerData.Right.SymbolicName);
mMessagePanel.HandleMessage(mDiffViewerData.Message);
EnableToolBar();
ReplaceView(mImageDiffViewer);
}
catch (Exception ex)
{
mMessagePanel.HandleMessage(ex.Message);
DisableToolbar();
}
}
void ShowBigFileMessage()
{
if (mBigFileMessagePanel == null)
mBigFileMessagePanel = new BigFileMessagePanel(this, true);
mBigFileMessagePanel.UpdateDisplayData(
BigFileDisplayData.Build(
mDiffViewerData, mBigFileDownloader));
DisableToolbar();
mMessagePanel.HandleMessage(string.Empty);
ReplaceView(mBigFileMessagePanel);
}
void DisableToolbar()
{
mImageDiffToolbar.SetEnabled(false);
}
void EnableToolBar()
{
mImageDiffToolbar.SetEnabled(true);
}
void ShowPurgedRevision(DiffViewerData data)
{
if (mPurgedRevisionControl == null)
mPurgedRevisionControl = new PurgedRevisionControl();
mPurgedRevisionControl.ShowData(data);
ReplaceMainView(mPurgedRevisionControl);
}
void ReplaceMainView(VisualElement panel)
{
if (hierarchy.childCount == 1 && hierarchy[0] == panel)
return;
Clear();
Add(panel);
}
void ReplaceView(VisualElement view)
{
if (mCurrentView == view)
return;
if (mCurrentView != null)
mContainerPanel.Remove(mCurrentView);
mContainerPanel.Add(view);
mCurrentView = view;
}
void CreateGUI()
{
mMessagePanel = new MessagePanel();
mImageDiffToolbar = new ImageDiffToolbar();
mImageDiffToolbar.ViewModeChanged += OnViewModeChanged;
mImageDiffToolbar.ChannelModeChanged += OnChannelModeChanged;
mImageDiffViewer = new ImageDiffViewer(
mImageDiffToolbar.ModeSwitcher);
mContainerPanel = new VisualElement();
mContainerPanel.style.flexGrow = 1;
style.flexGrow = 1;
mNormalContentPanel = new VisualElement();
mNormalContentPanel.style.flexGrow = 1;
mNormalContentPanel.Add(mMessagePanel);
mNormalContentPanel.Add(mImageDiffToolbar);
mNormalContentPanel.Add(mContainerPanel);
Add(mNormalContentPanel);
ReplaceView(mImageDiffViewer);
}
void OnViewModeChanged(ImageDiffMode mode)
{
mImageDiffViewer.SetViewMode(mode);
}
void OnChannelModeChanged(ColorWriteMask mode)
{
mImageDiffViewer.SetChannelMode(mode);
}
VisualElement mNormalContentPanel;
VisualElement mContainerPanel;
VisualElement mCurrentView;
MessagePanel mMessagePanel;
ImageDiffToolbar mImageDiffToolbar;
ImageDiffViewer mImageDiffViewer;
PurgedRevisionControl mPurgedRevisionControl;
BigFileMessagePanel mBigFileMessagePanel;
DiffViewerData mDiffViewerData;
readonly IBigFileDownloader mBigFileDownloader;
readonly IBigFileChecker mBigFileChecker;
}
}