first commit

This commit is contained in:
lethanhsonvsp
2025-11-17 15:16:36 +07:00
commit a40d0921eb
17012 changed files with 2652386 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
using System;
using Codice.Client.BaseCommands;
using Codice.Client.BaseCommands.CheckIn.Progress;
using Codice.Client.Commands.CheckIn;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow;
namespace Unity.PlasticSCM.Editor.Developer
{
internal class CheckinProgress
{
internal bool CancelPressed;
internal CheckinProgress(WorkspaceInfo wkInfo, WorkspaceWindow workspaceWindow)
{
mWkInfo = wkInfo;
mWorkspaceWindow = workspaceWindow;
mWorkspaceWindow.Progress.CanCancelProgress = true;
mProgressRender = new CheckinUploadProgressRender(
PlasticLocalization.GetString(
PlasticLocalization.Name.CheckinProgressMultiThreadUploading),
PlasticLocalization.GetString(
PlasticLocalization.Name.CheckinProgressMultiThreadNumOfBlocks),
PlasticLocalization.GetString(PlasticLocalization.Name.CheckinProgressUploadingFiles),
PlasticLocalization.GetString(
PlasticLocalization.Name.CheckinProgressUploadingFileData),
PlasticLocalization.GetString(PlasticLocalization.Name.CheckinProgressOf),
PlasticLocalization.GetString(
PlasticLocalization.Name.RemainingProgressMessage));
}
internal void Refresh(
CheckinStatus checkinStatus,
BuildProgressSpeedAndRemainingTime.ProgressData progressData)
{
if (checkinStatus == null)
return;
var progress = mWorkspaceWindow.Progress;
progress.ProgressHeader = checkinStatus.StatusString;
if (checkinStatus.Status >= EnumCheckinStatus.eciConfirming)
progress.CanCancelProgress = false;
if (checkinStatus.Status == EnumCheckinStatus.eciCancelling)
return;
int nowTicks = Environment.TickCount;
progress.TotalProgressMessage = mProgressRender.GetUploadSize(
checkinStatus.TransferredSize, checkinStatus.TotalSize, progressData);
progress.TotalProgressPercent = GetProgressBarPercent.ForTransfer(
checkinStatus.TransferredSize, checkinStatus.TotalSize) / 100f;
progress.ShowCurrentBlock = mProgressRender.
NeedShowCurrentBlockForCheckinStatus(checkinStatus, nowTicks);
string currentFileInfo = mProgressRender.GetCurrentFileInfo(
checkinStatus.CurrentCheckinBlock, mWkInfo.ClientPath);
progress.ProgressHeader = currentFileInfo;
float fileProgressBarValue = GetProgressBarPercent.ForTransfer(
checkinStatus.CurrentCheckinBlock.UploadedSize,
checkinStatus.CurrentCheckinBlock.BlockSize) / 100f;
progress.CurrentBlockProgressPercent = fileProgressBarValue;
progress.CurrentBlockProgressMessage = mProgressRender.GetCurrentBlockUploadSize(
checkinStatus.CurrentCheckinBlock, nowTicks);
}
CheckinUploadProgressRender mProgressRender;
WorkspaceWindow mWorkspaceWindow;
WorkspaceInfo mWkInfo;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a0528634c1324f47b7e2e59266dfa4c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
using PlasticGui.WorkspaceWindow;
namespace Unity.PlasticSCM.Editor.Developer
{
internal class GenericProgress
{
internal GenericProgress(WorkspaceWindow workspaceWindow)
{
mWorkspaceWindow = workspaceWindow;
mWorkspaceWindow.Progress.CanCancelProgress = false;
}
internal void RefreshProgress(ProgressData progressData)
{
var progress = mWorkspaceWindow.Progress;
progress.ProgressHeader = progressData.Status;
progress.TotalProgressMessage = progressData.Details;
progress.TotalProgressPercent = progressData.ProgressValue / 100f;
}
WorkspaceWindow mWorkspaceWindow;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dc0cbec450c3bd54eb12276dcfdc27d3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,124 @@
using UnityEngine;
using Codice.CM.Common;
using PlasticGui.WorkspaceWindow;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI.StatusBar;
using PlasticGui.WorkspaceWindow.PendingChanges;
using Unity.PlasticSCM.Editor.UI;
namespace Unity.PlasticSCM.Editor.Developer
{
internal class IncomingChangesNotification :
StatusBar.IIncomingChangesNotification,
CheckIncomingChanges.IUpdateIncomingChanges
{
internal IncomingChangesNotification(
WorkspaceInfo wkInfo,
IMergeViewLauncher mergeViewLauncher,
PlasticWindow plasticWindow)
{
mWkInfo = wkInfo;
mMergeViewLauncher = mergeViewLauncher;
mPlasticWindow = plasticWindow;
}
internal void SetWorkspaceWindow(WorkspaceWindow workspaceWindow)
{
mWorkspaceWindow = workspaceWindow;
}
bool StatusBar.IIncomingChangesNotification.HasNotification
{
get { return mHasNotification; }
}
void StatusBar.IIncomingChangesNotification.OnGUI()
{
Texture2D icon = mData.Status == PlasticNotification.Status.Conflicts ?
Images.GetConflictedIcon() :
Images.GetOutOfSyncIcon();
StatusBar.DrawIcon(icon);
StatusBar.DrawNotification(new GUIContentNotification(
new GUIContent(mData.InfoText)));
if (StatusBar.DrawButton(new GUIContent(mData.ActionText, mData.TooltipText)))
{
if (mData.HasUpdateAction)
{
mWorkspaceWindow.UpdateWorkspace();
return;
}
ShowIncomingChanges.FromNotificationBar(mWkInfo, mMergeViewLauncher);
}
}
void CheckIncomingChanges.IUpdateIncomingChanges.Hide(WorkspaceInfo wkInfo)
{
if (!wkInfo.Equals(mWkInfo))
return;
PlasticPlugin.SetNotificationStatus(
mPlasticWindow,
PlasticNotification.Status.None);
mData.Clear();
mHasNotification = false;
mPlasticWindow.Repaint();
}
void CheckIncomingChanges.IUpdateIncomingChanges.Show(
WorkspaceInfo wkInfo,
string infoText,
string actionText,
string tooltipText,
CheckIncomingChanges.Severity severity,
CheckIncomingChanges.Action action)
{
if (!wkInfo.Equals(mWkInfo))
return;
PlasticNotification.Status status = GetStatusFromSeverity(severity);
mData.UpdateData(
infoText,
actionText,
tooltipText,
action == CheckIncomingChanges.Action.Update,
status);
mHasNotification = true;
PlasticPlugin.SetNotificationStatus(
mPlasticWindow,
status);
mPlasticWindow.Repaint();
}
static PlasticNotification.Status GetStatusFromSeverity(
CheckIncomingChanges.Severity severity)
{
if (severity == CheckIncomingChanges.Severity.Info)
return PlasticNotification.Status.IncomingChanges;
if (severity == CheckIncomingChanges.Severity.Warning)
return PlasticNotification.Status.Conflicts;
return PlasticNotification.Status.None;
}
bool mHasNotification;
StatusBar.IncomingChangesNotificationData mData =
new StatusBar.IncomingChangesNotificationData();
WorkspaceWindow mWorkspaceWindow;
readonly WorkspaceInfo mWkInfo;
readonly IMergeViewLauncher mMergeViewLauncher;
readonly PlasticWindow mPlasticWindow;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cc9b578c680471e41965738c85cbabbf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,123 @@
using Codice.Client.BaseCommands;
using Codice.Client.Commands.CheckIn;
using Codice.Client.Common;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow;
namespace Unity.PlasticSCM.Editor.Developer
{
internal class ProgressOperationHandler : IProgressOperationHandler
{
internal ProgressOperationHandler(WorkspaceInfo wkInfo, WorkspaceWindow workspaceWindow)
{
mWkInfo = wkInfo;
mWorkspaceWindow = workspaceWindow;
}
bool IProgressOperationHandler.CheckOperationInProgress()
{
if (IsOperationInProgress())
{
GuiMessage.ShowInformation(
PlasticLocalization.GetString(PlasticLocalization.Name.OperationRunning),
PlasticLocalization.GetString(PlasticLocalization.Name.OperationInProgress));
return true;
}
return false;
}
internal void Update(double elapsedSeconds)
{
if (mUpdateProgress == null)
return;
mSecondsSinceLastProgressUpdate += elapsedSeconds;
if (mSecondsSinceLastProgressUpdate > UPDATE_INTERVAL_SECONDS)
{
mUpdateProgress.OnUpdateProgress();
mSecondsSinceLastProgressUpdate -= UPDATE_INTERVAL_SECONDS;
}
}
internal bool IsOperationInProgress()
{
return mProgress != null
|| mUpdateProgress != null
|| mCheckinProgress != null;
}
internal void ShowProgress()
{
mProgress = new GenericProgress(mWorkspaceWindow);
}
internal void RefreshProgress(ProgressData progressData)
{
mProgress.RefreshProgress(progressData);
}
internal void EndProgress()
{
mProgress = null;
mWorkspaceWindow.Progress.ResetProgress();
mWorkspaceWindow.RequestRepaint();
}
internal void ShowUpdateProgress(string title, UpdateNotifier notifier)
{
mUpdateProgress = new UpdateProgress(
notifier, mWkInfo.ClientPath, title, mWorkspaceWindow);
mUpdateProgress.OnUpdateProgress();
mSecondsSinceLastProgressUpdate = 0;
}
internal void ShowCheckinProgress()
{
mCheckinProgress = new CheckinProgress(mWkInfo, mWorkspaceWindow);
}
internal void RefreshCheckinProgress(
CheckinStatus checkinStatus,
BuildProgressSpeedAndRemainingTime.ProgressData progressData)
{
mCheckinProgress.Refresh(checkinStatus, progressData);
}
internal void CancelCheckinProgress()
{
mCheckinProgress.CancelPressed = true;
}
internal void EndUpdateProgress()
{
mUpdateProgress = null;
mWorkspaceWindow.Progress.ResetProgress();
mWorkspaceWindow.RequestRepaint();
}
internal void EndCheckinProgress()
{
mCheckinProgress = null;
mWorkspaceWindow.Progress.ResetProgress();
mWorkspaceWindow.RequestRepaint();
}
internal bool HasCheckinCancelled()
{
return mCheckinProgress.CancelPressed;
}
double mSecondsSinceLastProgressUpdate = 0;
GenericProgress mProgress;
UpdateProgress mUpdateProgress;
CheckinProgress mCheckinProgress;
WorkspaceInfo mWkInfo;
WorkspaceWindow mWorkspaceWindow;
const double UPDATE_INTERVAL_SECONDS = 0.5;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f1b80531a496e644abedd795c21274cb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,129 @@
using UnityEditor;
using UnityEngine;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow;
using PlasticGui.WorkspaceWindow.Topbar;
using PlasticGui.WorkspaceWindow.Merge;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.StatusBar;
namespace Unity.PlasticSCM.Editor.Developer
{
internal class ShelvedChangesNotification :
StatusBar.IShelvedChangesNotification,
CheckShelvedChanges.IUpdateShelvedChangesNotification
{
internal ShelvedChangesNotification(
WorkspaceInfo wkInfo,
RepositorySpec repSpec,
ViewSwitcher viewSwitcher,
PlasticWindow plasticWindow)
{
mWkInfo = wkInfo;
mRepSpec = repSpec;
mViewSwitcher = viewSwitcher;
mPlasticWindow = plasticWindow;
}
bool StatusBar.IShelvedChangesNotification.HasNotification
{
get { return mHasNotification; }
}
void StatusBar.IShelvedChangesNotification.SetWorkspaceWindow(
WorkspaceWindow workspaceWindow)
{
mWorkspaceWindow = workspaceWindow;
}
void StatusBar.IShelvedChangesNotification.SetShelvedChangesUpdater(
IShelvedChangesUpdater shelvedChangesUpdater)
{
mShelvedChangesUpdater = shelvedChangesUpdater;
}
void StatusBar.IShelvedChangesNotification.OnGUI()
{
Texture2D icon = Images.GetInfoBellNotificationIcon();
StatusBar.DrawIcon(icon, UnityConstants.STATUS_BAR_ICON_SIZE - 2);
StatusBar.DrawNotification(
new GUIContentNotification(new GUIContent(
PlasticLocalization.Name.ShelvedChanges.GetString(),
PlasticLocalization.Name.ShelvedChangesExplanation.GetString())));
GenericMenu discardShelveDropdownMenu = new GenericMenu();
discardShelveDropdownMenu.AddItem(
new GUIContent(PlasticLocalization.Name.DiscardShelvedChanges.GetString()),
false,
() =>
{
ShelvedChangesNotificationPanelOperations.DiscardShelvedChanges(
mWkInfo,
mShelveInfo,
this,
mShelvedChangesUpdater,
mViewSwitcher,
mWorkspaceWindow);
});
DrawActionButtonWithMenu.For(
PlasticLocalization.Name.ViewButton.GetString(),
PlasticLocalization.Name.ViewShelvedChangesButtonExplanation.GetString(),
() =>
{
if (mShelveInfo == null || mViewSwitcher == null)
return;
((IMergeViewLauncher)mViewSwitcher).MergeFrom(
mRepSpec,
mShelveInfo,
EnumMergeType.ChangesetCherryPick,
showDiscardChangesButton: true);
},
discardShelveDropdownMenu);
}
void CheckShelvedChanges.IUpdateShelvedChangesNotification.Hide(
WorkspaceInfo wkInfo)
{
if (!wkInfo.Equals(mWkInfo))
return;
mShelveInfo = null;
mHasNotification = false;
mPlasticWindow.Repaint();
}
void CheckShelvedChanges.IUpdateShelvedChangesNotification.Show(
WorkspaceInfo wkInfo,
RepositorySpec repSpec,
ChangesetInfo shelveInfo)
{
if (!wkInfo.Equals(mWkInfo))
return;
mShelveInfo = shelveInfo;
mHasNotification = true;
mPlasticWindow.Repaint();
}
bool mHasNotification;
ChangesetInfo mShelveInfo;
WorkspaceWindow mWorkspaceWindow;
IShelvedChangesUpdater mShelvedChangesUpdater;
readonly WorkspaceInfo mWkInfo;
readonly RepositorySpec mRepSpec;
readonly ViewSwitcher mViewSwitcher;
readonly PlasticWindow mPlasticWindow;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: db6cbe7586694d6fb3c944d67973d313
timeCreated: 1731424512

View File

@@ -0,0 +1,47 @@
using System;
using Codice.Client.BaseCommands;
using Codice.Client.Commands;
using PlasticGui.WorkspaceWindow;
using PlasticGui.WorkspaceWindow.Update;
namespace Unity.PlasticSCM.Editor.Developer
{
internal class UpdateProgress
{
internal UpdateProgress(
UpdateNotifier notifier, string wkPath, string title,
WorkspaceWindow workspaceWindow)
{
mNotifier = notifier;
mWkPath = wkPath;
mWorkspaceWindow = workspaceWindow;
mProgressData = new BuildProgressSpeedAndRemainingTime.ProgressData(DateTime.Now);
mWorkspaceWindow.Progress.ProgressHeader = title;
mWorkspaceWindow.Progress.CanCancelProgress = false;
}
internal void OnUpdateProgress()
{
var progress = mWorkspaceWindow.Progress;
progress.ProgressHeader = UpdateProgressRender.FixNotificationPath(
mWkPath, mNotifier.GetNotificationMessage());
UpdateOperationStatus status = mNotifier.GetUpdateStatus();
progress.TotalProgressMessage = UpdateProgressRender.GetProgressString(
status, mProgressData);
progress.TotalProgressPercent = GetProgressBarPercent.ForTransfer(
status.UpdatedSize, status.TotalSize) / 100f;
}
readonly BuildProgressSpeedAndRemainingTime.ProgressData mProgressData;
readonly WorkspaceWindow mWorkspaceWindow;
readonly string mWkPath;
readonly UpdateNotifier mNotifier;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ce652d891ad5ed540b0d6e474d00130c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cca926c65e360cf4f8637f7c853a7513
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,273 @@
using System.Collections;
using UnityEditor;
using UnityEngine;
using Codice.Client.BaseCommands;
using Codice.Client.Commands;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow.Update;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.Progress;
using Unity.PlasticSCM.Editor.UI.Tree;
namespace Unity.PlasticSCM.Editor.Developer.UpdateReport
{
internal class UpdateReportDialog :
PlasticDialog,
IUpdateReportDialog
{
protected override Rect DefaultRect
{
get
{
var baseRect = base.DefaultRect;
return new Rect(baseRect.x, baseRect.y, 810, 385);
}
}
internal static ResponseType ShowReportDialog(
WorkspaceInfo wkInfo,
IList reportLines,
EditorWindow parentWindow)
{
UpdateReportDialog dialog = Create(
wkInfo,
reportLines,
new ProgressControlsForDialogs());
return dialog.RunModal(parentWindow);
}
protected override void SaveSettings()
{
TreeHeaderSettings.Save(mPathsListView.multiColumnHeader.state,
UnityConstants.DEVELOPER_UPDATE_REPORT_TABLE_SETTINGS_NAME);
}
protected override void OnModalGUI()
{
Title(PlasticLocalization.GetString(PlasticLocalization.Name.UpdateResultsTitle));
Paragraph(PlasticLocalization.GetString(PlasticLocalization.Name.UpdateResultsError));
DoListArea(
mPathsListView,
mErrorDetailsSplitterState);
GUILayout.Space(10);
DoSelectAllArea();
GUILayout.BeginHorizontal();
GUILayout.Space(4);
DrawProgressForDialogs.For(
mProgressControls.ProgressData);
GUILayout.Space(4);
GUILayout.EndHorizontal();
GUILayout.Space(2);
DoButtonsArea(mIsAnyLineChecked);
mProgressControls.ForcedUpdateProgress(this);
}
protected override string GetTitle()
{
return PlasticLocalization.GetString(
PlasticLocalization.Name.UpdateResultsTitle);
}
void IUpdateReportDialog.Reload()
{
SetReportLines(mReportLines);
}
void OnCheckedReportLineChanged()
{
mIsAnyLineChecked =
mPathsListView.IsAnyLineChecked();
mAreAllLinesChecked =
mPathsListView.AreAllLinesChecked();
}
void DoListArea(
UpdateReportListView errorsListView,
object splitterState)
{
EditorGUILayout.BeginVertical();
PlasticSplitterGUILayout.BeginHorizontalSplit(splitterState);
DoErrorsListViewArea(errorsListView);
DoErrorDetailsTextArea(errorsListView.GetSelectedError());
PlasticSplitterGUILayout.EndHorizontalSplit();
EditorGUILayout.EndVertical();
}
static void DoErrorsListViewArea(
UpdateReportListView errorsListView)
{
Rect treeRect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);
errorsListView.OnGUI(treeRect);
}
void DoErrorDetailsTextArea(ReportLine selectedReportLine)
{
string errorDetailsText = selectedReportLine == null ?
string.Empty : selectedReportLine.Message;
EditorGUILayout.BeginVertical();
GUILayout.Space(8);
GUILayout.Label(PlasticLocalization.GetString(PlasticLocalization.Name.ProblemColumn));
mErrorDetailsScrollPosition = GUILayout.BeginScrollView(
mErrorDetailsScrollPosition);
GUILayout.TextArea(
errorDetailsText, UnityStyles.TextFieldWithWrapping,
GUILayout.ExpandHeight(true));
GUILayout.EndScrollView();
EditorGUILayout.EndVertical();
}
void DoSelectAllArea()
{
bool toggleValue = GUILayout.Toggle(
mAreAllLinesChecked,
PlasticLocalization.GetString(
PlasticLocalization.Name.SelectAll));
if (toggleValue != mAreAllLinesChecked && toggleValue)
{
mPathsListView.CheckAllLines();
return;
}
if (toggleValue != mAreAllLinesChecked && !toggleValue)
{
mPathsListView.UnCheckAllLines();
return;
}
}
void DoButtonsArea(bool areUpdateButtonsEneabled)
{
using (new EditorGUILayout.HorizontalScope())
{
DoRetryUpdateButton(areUpdateButtonsEneabled);
DoUpdateForcedButton(areUpdateButtonsEneabled);
GUILayout.FlexibleSpace();
DoCloseButton();
}
}
void DoRetryUpdateButton(bool isEnabled)
{
GUI.enabled = isEnabled;
bool pressed = NormalButton(PlasticLocalization.GetString(
PlasticLocalization.Name.RetryUpdate));
GUI.enabled = true;
if (!pressed)
return;
SelectiveUpdateOperation.SelectiveUpdate(
mWkInfo, mReportLines, mPathsListView.GetCheckedLines(),
UpdateFlags.None, this, mProgressControls);
}
void DoUpdateForcedButton(bool isEnabled)
{
GUI.enabled = isEnabled;
bool pressed = NormalButton(PlasticLocalization.GetString(
PlasticLocalization.Name.UpdateForced));
GUI.enabled = true;
if (!pressed)
return;
SelectiveUpdateOperation.SelectiveUpdate(
mWkInfo, mReportLines, mPathsListView.GetCheckedLines(),
UpdateFlags.Forced, this, mProgressControls);
}
void DoCloseButton()
{
if (!NormalButton(PlasticLocalization.GetString(
PlasticLocalization.Name.CloseButton)))
return;
CancelButtonAction();
}
static UpdateReportDialog Create(
WorkspaceInfo wkInfo,
IList reportLines,
ProgressControlsForDialogs progressControls)
{
var instance = CreateInstance<UpdateReportDialog>();
instance.mWkInfo = wkInfo;
instance.mReportLines = reportLines;
instance.mProgressControls = progressControls;
instance.mEscapeKeyAction = instance.CloseButtonAction;
instance.BuildComponents(wkInfo);
instance.SetReportLines(reportLines);
return instance;
}
void SetReportLines(IList reportLines)
{
mReportLines = reportLines;
mPathsListView.BuildModel(reportLines);
mPathsListView.Reload();
mAreAllLinesChecked = false;
}
void BuildComponents(WorkspaceInfo wkInfo)
{
mErrorDetailsSplitterState = PlasticSplitterGUILayout.InitSplitterState(
new float[] { 0.50f, 0.50f },
new int[] { 100, 100 },
new int[] { 100000, 100000 }
);
UpdateReportListHeaderState errorsListHeaderState =
UpdateReportListHeaderState.GetDefault();
TreeHeaderSettings.Load(errorsListHeaderState,
UnityConstants.DEVELOPER_UPDATE_REPORT_TABLE_SETTINGS_NAME,
UnityConstants.UNSORT_COLUMN_ID);
mPathsListView = new UpdateReportListView(
wkInfo,
errorsListHeaderState,
OnCheckedReportLineChanged);
mPathsListView.Reload();
}
bool mIsAnyLineChecked = false;
bool mAreAllLinesChecked = false;
UpdateReportListView mPathsListView;
object mErrorDetailsSplitterState;
Vector2 mErrorDetailsScrollPosition;
WorkspaceInfo mWkInfo;
IList mReportLines;
ProgressControlsForDialogs mProgressControls;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3cc230fb0050a994480d907e02d3508b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,20 @@
using UnityEditor.IMGUI.Controls;
using Codice.Client.BaseCommands;
using Codice.Client.Commands;
namespace Unity.PlasticSCM.Editor.Developer.UpdateReport
{
internal class UpdateReportLineListViewItem : TreeViewItem
{
internal ReportLine ReportLine { get; private set; }
internal UpdateReportLineListViewItem(int id, ReportLine reportLine)
: base(id, 0)
{
ReportLine = reportLine;
displayName = reportLine.ItemPath;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 146c16184e337574f9f3baf6d467907a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,72 @@
using System;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI.Tree;
namespace Unity.PlasticSCM.Editor.Developer.UpdateReport
{
internal enum ErrorsListColumn
{
Path,
}
[Serializable]
internal class UpdateReportListHeaderState : MultiColumnHeaderState, ISerializationCallbackReceiver
{
internal static UpdateReportListHeaderState GetDefault()
{
return new UpdateReportListHeaderState(BuildColumns());
}
static string GetColumnName(ErrorsListColumn column)
{
switch (column)
{
case ErrorsListColumn.Path:
return PlasticLocalization.GetString(PlasticLocalization.Name.PathColumn);
default:
return null;
}
}
void ISerializationCallbackReceiver.OnAfterDeserialize()
{
if (mHeaderTitles != null)
TreeHeaderColumns.SetTitles(columns, mHeaderTitles);
}
void ISerializationCallbackReceiver.OnBeforeSerialize()
{
}
static Column[] BuildColumns()
{
return new Column[]
{
new Column()
{
width = 605,
headerContent = new GUIContent(
GetColumnName(ErrorsListColumn.Path)),
minWidth = 200,
allowToggleVisibility = false,
canSort = false,
sortingArrowAlignment = TextAlignment.Right
}
};
}
UpdateReportListHeaderState(Column[] columns)
: base(columns)
{
if (mHeaderTitles == null)
mHeaderTitles = TreeHeaderColumns.GetTitles(columns);
}
[SerializeField]
string[] mHeaderTitles;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5b37b989e50b35043bba89d7d660e31e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,255 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using Codice.Client.Commands;
using Codice.Client.Common;
using Codice.CM.Common;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.Tree;
namespace Unity.PlasticSCM.Editor.Developer.UpdateReport
{
internal class UpdateReportListView : PlasticTreeView
{
internal UpdateReportListView(
WorkspaceInfo wkInfo,
UpdateReportListHeaderState headerState,
Action onCheckedReportLineChanged)
{
mWkInfo = wkInfo;
mOnCheckedReportLineChanged = onCheckedReportLineChanged;
multiColumnHeader = new MultiColumnHeader(headerState);
multiColumnHeader.canSort = false;
}
internal List<ReportLine> GetCheckedLines()
{
List<ReportLine> result = new List<ReportLine>();
foreach (UpdateReportLineListViewItem item in mCheckedLines)
result.Add(item.ReportLine);
return result;
}
internal bool IsAnyLineChecked()
{
return mCheckedLines.Count > 0;
}
internal bool AreAllLinesChecked()
{
if (mReportLines.Count == 0)
return false;
return mCheckedLines.Count == mReportLines.Count;
}
internal void CheckAllLines()
{
mCheckedLines.Clear();
foreach (UpdateReportLineListViewItem row in mRows)
{
mCheckedLines.Add(row);
}
mOnCheckedReportLineChanged();
}
internal void UnCheckAllLines()
{
mCheckedLines.Clear();
mOnCheckedReportLineChanged();
}
internal void BuildModel(IList reportLines)
{
mReportLines = reportLines;
mCheckedLines.Clear();
mOnCheckedReportLineChanged();
}
internal ReportLine GetSelectedError()
{
List<ReportLine> selectedErrors = GetSelectedErrors(this);
if (selectedErrors.Count != 1)
return null;
return selectedErrors[0];
}
protected override IList<TreeViewItem> BuildRows(
TreeViewItem rootItem)
{
RegenerateRows(
this, mReportLines, rootItem, mRows);
return mRows;
}
protected override void RowGUI(RowGUIArgs args)
{
if (args.item is UpdateReportLineListViewItem)
{
UpdateReportListViewItemGUI(
mWkInfo.ClientPath,
(UpdateReportLineListViewItem)args.item,
args,
rowHeight,
mReportLines.Count,
mOnCheckedReportLineChanged,
mCheckedLines);
return;
}
base.RowGUI(args);
}
static List<ReportLine> GetSelectedErrors(
UpdateReportListView listView)
{
List<ReportLine> result = new List<ReportLine>();
IList<int> selectedIds = listView.GetSelection();
if (selectedIds.Count == 0)
return result;
foreach (UpdateReportLineListViewItem treeViewItem in
listView.FindRows(selectedIds))
{
result.Add(treeViewItem.ReportLine);
}
return result;
}
static void RegenerateRows(
UpdateReportListView listView,
IList reportLines,
TreeViewItem rootItem,
List<TreeViewItem> rows)
{
ClearRows(rootItem, rows);
if (reportLines.Count == 0)
return;
for (int i = 0; i < reportLines.Count; i++)
{
UpdateReportLineListViewItem errorListViewItem =
new UpdateReportLineListViewItem(i + 1, (ReportLine)reportLines[i]);
rootItem.AddChild(errorListViewItem);
rows.Add(errorListViewItem);
}
listView.SetSelection(new List<int> { 1 });
}
static void ClearRows(
TreeViewItem rootItem,
List<TreeViewItem> rows)
{
if (rootItem.hasChildren)
rootItem.children.Clear();
rows.Clear();
}
static void UpdateReportListViewItemGUI(
string wkPath,
UpdateReportLineListViewItem item,
RowGUIArgs args,
float rowHeight,
int totalLinesCount,
Action onCheckedReportLineChanged,
HashSet<UpdateReportLineListViewItem> checkedLines)
{
for (int visibleColumnIdx = 0; visibleColumnIdx < args.GetNumVisibleColumns(); visibleColumnIdx++)
{
Rect cellRect = args.GetCellRect(visibleColumnIdx);
ErrorsListColumn column =
(ErrorsListColumn)args.GetColumn(visibleColumnIdx);
UpdateReportListViewItemCellGUI(
cellRect,
wkPath,
item,
column,
rowHeight,
args.selected,
args.focused,
totalLinesCount,
onCheckedReportLineChanged,
checkedLines);
}
}
static void UpdateReportListViewItemCellGUI(
Rect rect,
string wkPath,
UpdateReportLineListViewItem item,
ErrorsListColumn column,
float rowHeight,
bool isSelected,
bool isFocused,
int totalLinesCount,
Action onCheckedReportLineChanged,
HashSet<UpdateReportLineListViewItem> checkedLines)
{
string label = WorkspacePath.GetWorkspaceRelativePath(
wkPath,
item.ReportLine.ItemPath);
bool wasChecked = checkedLines.Contains(item);
bool isChecked = DrawTreeViewItem.ForCheckableItemCell(
rect,
rowHeight,
0,
null,
null,
label,
isSelected,
isFocused,
false,
wasChecked);
if (wasChecked != isChecked)
{
UpdateCheckedState(checkedLines, item, isChecked);
onCheckedReportLineChanged();
}
}
static void UpdateCheckedState(
HashSet<UpdateReportLineListViewItem> checkedLines,
UpdateReportLineListViewItem item,
bool isChecked)
{
if (isChecked)
{
checkedLines.Add(item);
return;
}
checkedLines.Remove(item);
}
IList mReportLines = new ArrayList();
HashSet<UpdateReportLineListViewItem> mCheckedLines =
new HashSet<UpdateReportLineListViewItem>();
readonly WorkspaceInfo mWkInfo;
readonly Action mOnCheckedReportLineChanged;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e8bf7425cfbdd094da5dc809a5eaa8ff
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: