first commit

This commit is contained in:
SimonSayeBabu
2025-01-17 13:10:20 +01:00
commit bd1057cec0
16967 changed files with 1048699 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,17 @@
using UnityEditor.IMGUI.Controls;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal class ChangeCategoryTreeViewItem : TreeViewItem
{
internal MergeChangesCategory Category { get; private set; }
internal ChangeCategoryTreeViewItem(int id, MergeChangesCategory category)
: base(id, 0, category.CategoryType.ToString())
{
Category = category;
}
}
}

View File

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

View File

@@ -0,0 +1,19 @@
using UnityEditor.IMGUI.Controls;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal class ChangeTreeViewItem : TreeViewItem
{
internal MergeChangeInfo ChangeInfo { get; private set; }
internal ChangeTreeViewItem(int id, MergeChangeInfo change)
: base(id, 1)
{
ChangeInfo = change;
displayName = id.ToString();
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,39 @@
using Codice.Client.BaseCommands.Merge;
using Codice.CM.Common.Merge;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer.DirectoryConflicts
{
internal class ConflictResolutionState
{
internal DirectoryConflictResolveActions ResolveAction { get; set; }
internal string RenameValue { get; set; }
internal bool IsApplyActionsForNextConflictsChecked { get; set; }
internal static ConflictResolutionState Build(
DirectoryConflict directoryConflict,
DirectoryConflictAction[] conflictActions)
{
bool hasRenameOption = DirectoryConflictResolutionInfo.HasRenameOption(
conflictActions);
ConflictResolutionState result = new ConflictResolutionState()
{
IsApplyActionsForNextConflictsChecked = false,
ResolveAction = (hasRenameOption) ?
DirectoryConflictResolveActions.Rename :
DirectoryConflictResolveActions.KeepSource,
};
if (!hasRenameOption)
return result;
result.RenameValue = DirectoryConflictResolutionInfo.GetProposeNewItemName(
directoryConflict, "dst");
return result;
}
}
}

View File

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

View File

@@ -0,0 +1,256 @@
using System;
using UnityEditor;
using UnityEngine;
using Codice.Client.BaseCommands.Merge;
using Codice.CM.Common.Merge;
using PlasticGui;
using PlasticGui.WorkspaceWindow.Merge;
using Unity.PlasticSCM.Editor.UI;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer.DirectoryConflicts
{
internal static class DrawDirectoryResolutionPanel
{
internal static void ForConflict(
MergeChangeInfo conflict,
int pendingConflictsCount,
DirectoryConflictUserInfo conflictUserInfo,
DirectoryConflictAction[] actions,
Action<MergeChangeInfo> resolveConflictAction,
ref ConflictResolutionState state)
{
bool isResolveButtonEnabled;
string validationMessage = null;
GetValidationData(
conflict,
state,
out isResolveButtonEnabled,
out validationMessage);
GUILayout.Space(2);
DoHeader(
conflictUserInfo.ConflictTitle,
conflict,
resolveConflictAction,
isResolveButtonEnabled,
ref state);
DoConflictExplanation(conflictUserInfo.ConflictExplanation);
DoSourceAndDestinationLabels(
conflictUserInfo.SourceOperation,
conflictUserInfo.DestinationOperation);
DoResolutionOptions(
actions,
validationMessage,
ref state);
DoApplyActionsForNextConflictsCheck(pendingConflictsCount, ref state);
GUILayout.Space(10);
}
static void DoHeader(
string conflictName,
MergeChangeInfo conflict,
Action<MergeChangeInfo> resolveConflictAction,
bool isResolveButtonEnabled,
ref ConflictResolutionState state)
{
EditorGUILayout.BeginHorizontal();
GUILayout.Label(conflictName,
UnityStyles.DirectoryConflicts.TitleLabel);
GUI.enabled = isResolveButtonEnabled;
GUILayout.Space(5);
if (GUILayout.Button(PlasticLocalization.GetString(
PlasticLocalization.Name.ResolveDirectoryConflict)))
{
resolveConflictAction(conflict);
}
GUI.enabled = true;
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
}
static void DoConflictExplanation(string explanation)
{
GUILayout.Space(5);
GUILayout.Label(explanation, EditorStyles.wordWrappedLabel);
}
static void DoSourceAndDestinationLabels(
string sourceOperation,
string destinationOperation)
{
GUILayout.Space(5);
GUIStyle boldLabelStyle = UnityStyles.DirectoryConflicts.BoldLabel;
GUIContent srcLabel = new GUIContent(
PlasticLocalization.GetString(
PlasticLocalization.Name.Source));
GUIContent dstLabel = new GUIContent(
PlasticLocalization.GetString(
PlasticLocalization.Name.Destination));
float maxWidth = GetMaxWidth(srcLabel, dstLabel, boldLabelStyle);
EditorGUILayout.BeginHorizontal();
GUILayout.Space(25);
GUILayout.Label(srcLabel, boldLabelStyle, GUILayout.Width(maxWidth));
GUILayout.Label(sourceOperation, EditorStyles.label);
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Space(25);
GUILayout.Label(dstLabel, boldLabelStyle, GUILayout.Width(maxWidth));
GUILayout.Label(destinationOperation, EditorStyles.label);
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
}
static void DoResolutionOptions(
DirectoryConflictAction[] actions,
string validationMessage,
ref ConflictResolutionState state)
{
GUILayout.Space(10);
GUILayout.Label(PlasticLocalization.GetString(
PlasticLocalization.Name.ResolveDirectoryConflictChooseOption));
foreach (DirectoryConflictAction action in actions)
{
EditorGUILayout.BeginHorizontal();
GUILayout.Space(25);
if (GUILayout.Toggle(
state.ResolveAction == action.ActionKind,
action.ActionText,
EditorStyles.radioButton))
{
state.ResolveAction = action.ActionKind;
}
if (action.ActionKind == DirectoryConflictResolveActions.Rename)
{
GUI.enabled = state.ResolveAction == DirectoryConflictResolveActions.Rename;
state.RenameValue = GUILayout.TextField(
state.RenameValue,
UnityStyles.DirectoryConflicts.FileNameTextField,
GUILayout.Width(250));
GUI.enabled = true;
if (!string.IsNullOrEmpty(validationMessage))
{
GUILayout.Label(new GUIContent(
validationMessage,
Images.GetWarnIcon()),
UnityStyles.DirectoryConflictResolution.WarningLabel,
GUILayout.Height(UnityConstants.DIR_CONFLICT_VALIDATION_WARNING_LABEL_HEIGHT));
}
}
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
}
}
static void DoApplyActionsForNextConflictsCheck(
int pendingConflictsCount,
ref ConflictResolutionState state)
{
if (pendingConflictsCount == 0)
return;
GUILayout.Space(5);
bool isCheckEnabled = state.ResolveAction != DirectoryConflictResolveActions.Rename;
bool isChecked = state.IsApplyActionsForNextConflictsChecked & isCheckEnabled;
GUI.enabled = isCheckEnabled;
EditorGUILayout.BeginHorizontal();
state.IsApplyActionsForNextConflictsChecked = !GUILayout.Toggle(
isChecked,
GetApplyActionCheckButtonText(pendingConflictsCount));
if (!isCheckEnabled)
state.IsApplyActionsForNextConflictsChecked = false;
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
GUI.enabled = true;
}
static bool IsValidName(
string name,
DirectoryConflict conflict,
out string errorMessage)
{
if (string.IsNullOrEmpty(name))
{
errorMessage = PlasticLocalization.GetString(
PlasticLocalization.Name.InputItemNameMessage);
return false;
}
if (name == DirectoryConflictResolutionInfo.GetOldItemName(conflict))
{
errorMessage = PlasticLocalization.GetString(
PlasticLocalization.Name.ProvideDifferentItemNameForRenameResolution);
return false;
}
errorMessage = null;
return true;
}
static void GetValidationData(
MergeChangeInfo conflict,
ConflictResolutionState state,
out bool isResolveButtonEnabled,
out string renameWarningMessage)
{
if (state.ResolveAction != DirectoryConflictResolveActions.Rename)
{
renameWarningMessage = string.Empty;
isResolveButtonEnabled = true;
return;
}
isResolveButtonEnabled = IsValidName(
state.RenameValue,
conflict.DirectoryConflict,
out renameWarningMessage);
}
static float GetMaxWidth(
GUIContent label1,
GUIContent label2,
GUIStyle style)
{
Vector2 srcLabelSize = style.CalcSize(label1);
Vector2 dstLabelSize = style.CalcSize(label2);
return Math.Max(srcLabelSize.x, dstLabelSize.x);
}
static string GetApplyActionCheckButtonText(int pendingConflictsCount)
{
if (pendingConflictsCount > 1)
return PlasticLocalization.GetString(
PlasticLocalization.Name.ApplyActionForNextConflictsCheckButtonSingular,
pendingConflictsCount);
return PlasticLocalization.GetString(
PlasticLocalization.Name.ApplyActionForNextConflictsCheckButtonPlural,
pendingConflictsCount);
}
}
}

View File

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

View File

@@ -0,0 +1,44 @@
using System.Collections.Generic;
using PlasticGui.WorkspaceWindow.IncomingChanges;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal static class IncomingChangesSelection
{
internal static List<string> GetPathsFromSelectedFileConflictsIncludingMeta(
IncomingChangesTreeView treeView)
{
List<string> result = new List<string>();
List<MergeChangeInfo> selection =
treeView.GetSelectedFileConflicts();
treeView.FillWithMeta(selection);
foreach (MergeChangeInfo incomingChange in selection)
{
result.Add(incomingChange.GetPath());
}
return result;
}
internal static SelectedIncomingChangesGroupInfo GetSelectedGroupInfo(
IncomingChangesTreeView treeView)
{
List<MergeChangeInfo> selectedIncomingChanges =
treeView.GetSelectedIncomingChanges();
return GetSelectedIncomingChangesGroupInfo.For(
selectedIncomingChanges);
}
internal static MergeChangeInfo GetSingleSelectedIncomingChange(
IncomingChangesTreeView treeView)
{
return treeView.GetSelectedIncomingChange();
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,176 @@
using System;
using System.Collections.Generic;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI.Tree;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal enum IncomingChangesTreeColumn
{
Path,
Size,
Author,
Details,
Resolution,
DateModified,
Comment
}
[Serializable]
internal class IncomingChangesTreeHeaderState : MultiColumnHeaderState, ISerializationCallbackReceiver
{
internal static IncomingChangesTreeHeaderState GetDefault()
{
IncomingChangesTreeHeaderState headerState =
new IncomingChangesTreeHeaderState(BuildColumns());
headerState.visibleColumns = GetDefaultVisibleColumns();
return headerState;
}
internal static List<string> GetColumnNames()
{
List<string> result = new List<string>();
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.PathColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.SizeColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.CreatedByColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.DetailsColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.ResolutionMethodColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.DateModifiedColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.CommentColumn));
return result;
}
internal static string GetColumnName(IncomingChangesTreeColumn column)
{
switch (column)
{
case IncomingChangesTreeColumn.Path:
return PlasticLocalization.GetString(PlasticLocalization.Name.PathColumn);
case IncomingChangesTreeColumn.Size:
return PlasticLocalization.GetString(PlasticLocalization.Name.SizeColumn);
case IncomingChangesTreeColumn.Author:
return PlasticLocalization.GetString(PlasticLocalization.Name.AuthorColumn);
case IncomingChangesTreeColumn.Details:
return PlasticLocalization.GetString(PlasticLocalization.Name.DetailsColumn);
case IncomingChangesTreeColumn.Resolution:
return PlasticLocalization.GetString(PlasticLocalization.Name.ResolutionMethodColumn);
case IncomingChangesTreeColumn.DateModified:
return PlasticLocalization.GetString(PlasticLocalization.Name.DateModifiedColumn);
case IncomingChangesTreeColumn.Comment:
return PlasticLocalization.GetString(PlasticLocalization.Name.CommentColumn);
default:
return null;
}
}
void ISerializationCallbackReceiver.OnAfterDeserialize()
{
if (mHeaderTitles != null)
TreeHeaderColumns.SetTitles(columns, mHeaderTitles);
if (mColumsAllowedToggleVisibility != null)
TreeHeaderColumns.SetVisibilities(columns, mColumsAllowedToggleVisibility);
}
void ISerializationCallbackReceiver.OnBeforeSerialize()
{
}
static int[] GetDefaultVisibleColumns()
{
List<int> result = new List<int>();
result.Add((int)IncomingChangesTreeColumn.Path);
result.Add((int)IncomingChangesTreeColumn.Size);
result.Add((int)IncomingChangesTreeColumn.Author);
result.Add((int)IncomingChangesTreeColumn.DateModified);
result.Add((int)IncomingChangesTreeColumn.Comment);
return result.ToArray();
}
static Column[] BuildColumns()
{
return new Column[]
{
new Column()
{
width = 450,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Path)),
minWidth = 200,
allowToggleVisibility = false,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 150,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Size)),
minWidth = 45,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 150,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Author)),
minWidth = 80,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 200,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Details)),
minWidth = 100,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 250,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Resolution)),
minWidth = 120,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 330,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.DateModified)),
minWidth = 100,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 400,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Comment)),
minWidth = 100,
sortingArrowAlignment = TextAlignment.Right
}
};
}
IncomingChangesTreeHeaderState(Column[] columns)
: base(columns)
{
if (mHeaderTitles == null)
mHeaderTitles = TreeHeaderColumns.GetTitles(columns);
if (mColumsAllowedToggleVisibility == null)
mColumsAllowedToggleVisibility = TreeHeaderColumns.GetVisibilities(columns);
}
[SerializeField]
string[] mHeaderTitles;
[SerializeField]
bool[] mColumsAllowedToggleVisibility;
}
}

View File

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

View File

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

View File

@@ -0,0 +1,223 @@
using UnityEditor;
using UnityEngine;
using Codice.Client.Common.EventTracking;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow.IncomingChanges;
using Unity.PlasticSCM.Editor.Tool;
using Unity.PlasticSCM.Editor.UI;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal class IncomingChangesViewMenu
{
internal interface IMetaMenuOperations
{
void DiffIncomingChanges();
void DiffYoursWithIncoming();
bool SelectionHasMeta();
}
internal IncomingChangesViewMenu(
IIncomingChangesViewMenuOperations incomingChangesViewMenuOperations,
IMetaMenuOperations incomingChangesMetaMenuOperations)
{
mIncomingChangesViewMenuOperations = incomingChangesViewMenuOperations;
mIncomingChangesMetaMenuOperations = incomingChangesMetaMenuOperations;
BuildComponents();
}
internal void Popup()
{
GenericMenu menu = new GenericMenu();
UpdateMenuItems(menu);
menu.ShowAsContext();
}
void MergeSelectedFilesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.MergeContributors();
}
void MergeKeepingSourceChangesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.MergeKeepingSourceChanges();
}
void MergeKeepingWorkspaceChangesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.MergeKeepingWorkspaceChanges();
}
void DiffYoursWithIncomingMenuItem_Click()
{
mIncomingChangesViewMenuOperations.DiffYoursWithIncoming();
}
void DiffIncomingChangesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.DiffIncomingChanges();
}
void DiffMetaYoursWithIncomingMenuItem_Click()
{
mIncomingChangesMetaMenuOperations.DiffYoursWithIncoming();
}
void DiffMetaIncomingChangesMenuItem_Click()
{
mIncomingChangesMetaMenuOperations.DiffIncomingChanges();
}
void UpdateMenuItems(GenericMenu menu)
{
SelectedIncomingChangesGroupInfo info =
mIncomingChangesViewMenuOperations.GetSelectedIncomingChangesGroupInfo();
IncomingChangesMenuOperations operations =
UpdateIncomingChangesMenu.GetAvailableMenuOperations(info);
if (operations == IncomingChangesMenuOperations.None)
{
menu.AddDisabledItem(GetNoActionMenuItemContent());
return;
}
AddMergeActions(menu, operations);
menu.AddSeparator(string.Empty);
AddDiffActions(menu, operations);
if (!mIncomingChangesMetaMenuOperations.SelectionHasMeta())
return;
menu.AddSeparator(string.Empty);
AddMetaActions(menu, operations);
}
void AddMergeActions(
GenericMenu menu,
IncomingChangesMenuOperations operations)
{
if (operations.HasFlag(IncomingChangesMenuOperations.MergeContributors))
menu.AddItem(mMergeSelectedFilesMenuItemContent, false,
MergeSelectedFilesMenuItem_Click);
else
menu.AddDisabledItem(mMergeSelectedFilesMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.MergeKeepingSourceChanges))
menu.AddItem(mMergeKeepingSourceChangesMenuItemContent, false,
MergeKeepingSourceChangesMenuItem_Click);
else
menu.AddDisabledItem(mMergeKeepingSourceChangesMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.MergeKeepingWorkspaceChanges))
menu.AddItem(mMergeKeepingWorkspaceChangesMenuItemContent, false,
MergeKeepingWorkspaceChangesMenuItem_Click);
else
menu.AddDisabledItem(mMergeKeepingWorkspaceChangesMenuItemContent);
}
void AddDiffActions(GenericMenu menu, IncomingChangesMenuOperations operations)
{
if (operations.HasFlag(IncomingChangesMenuOperations.DiffYoursWithIncoming))
menu.AddItem(mDiffYoursWithIncomingMenuItemContent, false,
DiffYoursWithIncomingMenuItem_Click);
else
menu.AddDisabledItem(mDiffYoursWithIncomingMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.DiffIncomingChanges))
menu.AddItem(mDiffIncomingChangesMenuItemContent, false,
DiffIncomingChangesMenuItem_Click);
else
menu.AddDisabledItem(mDiffIncomingChangesMenuItemContent);
}
void AddMetaActions(GenericMenu menu, IncomingChangesMenuOperations operations)
{
if (operations.HasFlag(IncomingChangesMenuOperations.DiffYoursWithIncoming))
menu.AddItem(mDiffMetaYoursWithIncomingMenuItemContent, false,
DiffMetaYoursWithIncomingMenuItem_Click);
else
menu.AddDisabledItem(mDiffMetaYoursWithIncomingMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.DiffIncomingChanges))
menu.AddItem(mDiffMetaIncomingChangesMenuItemContent, false,
DiffMetaIncomingChangesMenuItem_Click);
else
menu.AddDisabledItem(mDiffMetaIncomingChangesMenuItemContent);
}
GUIContent GetNoActionMenuItemContent()
{
if (mNoActionMenuItemContent == null)
{
mNoActionMenuItemContent = new GUIContent(
PlasticLocalization.GetString(
PlasticLocalization.Name.NoActionMenuItem));
}
return mNoActionMenuItemContent;
}
void BuildComponents()
{
mMergeSelectedFilesMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.
Name.MergeSelectedFiles));
mMergeKeepingSourceChangesMenuItemContent = new GUIContent(
UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemMergeKeepingSourceChanges)));
mMergeKeepingWorkspaceChangesMenuItemContent = new GUIContent(
UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemMergeKeepingWorkspaceChanges)));
string diffYoursWithIncomingText = UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemDiffYoursWithIncoming));
string diffIncomingChangesText = UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemDiffIncomingChanges));
mDiffYoursWithIncomingMenuItemContent = new GUIContent(
diffYoursWithIncomingText);
mDiffIncomingChangesMenuItemContent = new GUIContent(
diffIncomingChangesText);
mDiffMetaYoursWithIncomingMenuItemContent = new GUIContent(
string.Format(
"{0}/{1}",
MetaPath.META_EXTENSION,
diffYoursWithIncomingText));
mDiffMetaIncomingChangesMenuItemContent = new GUIContent(
string.Format(
"{0}/{1}",
MetaPath.META_EXTENSION,
diffIncomingChangesText));
}
GUIContent mNoActionMenuItemContent;
GUIContent mMergeSelectedFilesMenuItemContent;
GUIContent mMergeKeepingSourceChangesMenuItemContent;
GUIContent mMergeKeepingWorkspaceChangesMenuItemContent;
GUIContent mDiffYoursWithIncomingMenuItemContent;
GUIContent mDiffIncomingChangesMenuItemContent;
GUIContent mDiffMetaYoursWithIncomingMenuItemContent;
GUIContent mDiffMetaIncomingChangesMenuItemContent;
readonly IIncomingChangesViewMenuOperations mIncomingChangesViewMenuOperations;
readonly IMetaMenuOperations mIncomingChangesMetaMenuOperations;
}
}

View File

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

View File

@@ -0,0 +1,37 @@
using Codice.Client.BaseCommands.Merge;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
// internal for testing purpuses
internal static class IsCurrent
{
internal static bool Conflict(
MergeChangeInfo changeInfo,
MergeChangeInfo metaChangeInfo,
MergeSolvedFileConflicts solvedFileConflicts)
{
if (solvedFileConflicts == null)
return false;
MergeSolvedFileConflicts.CurrentConflict currentConflict;
if (!solvedFileConflicts.TryGetCurrentConflict(out currentConflict))
return false;
return IsSameConflict(currentConflict, changeInfo) ||
IsSameConflict(currentConflict, metaChangeInfo);
}
static bool IsSameConflict(
MergeSolvedFileConflicts.CurrentConflict currentConflict,
MergeChangeInfo changeInfo)
{
if (changeInfo == null)
return false;
return currentConflict.MountId.Equals(changeInfo.GetMount().Id)
&& currentConflict.ItemId == changeInfo.GetRevision().ItemId;
}
}
}

View File

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

View File

@@ -0,0 +1,54 @@
using Codice.Client.BaseCommands.Merge;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal static class IsSolved
{
internal static bool Conflict(
MergeChangeInfo changeInfo,
MergeChangeInfo metaChangeInfo,
MergeSolvedFileConflicts solvedFileConflicts)
{
if (IsDirectoryConflict(changeInfo))
{
if (metaChangeInfo == null)
return IsDirectoryConflictResolved(changeInfo);
return IsDirectoryConflictResolved(changeInfo) &&
IsDirectoryConflictResolved(metaChangeInfo);
}
if (metaChangeInfo == null)
{
return IsFileConflictResolved(
changeInfo, solvedFileConflicts);
}
return IsFileConflictResolved(changeInfo, solvedFileConflicts) &&
IsFileConflictResolved(metaChangeInfo, solvedFileConflicts);
}
static bool IsFileConflictResolved(
MergeChangeInfo changeInfo,
MergeSolvedFileConflicts solvedFileConflicts)
{
if (solvedFileConflicts == null)
return false;
return solvedFileConflicts.IsResolved(
changeInfo.GetMount().Id,
changeInfo.GetRevision().ItemId);
}
static bool IsDirectoryConflictResolved(MergeChangeInfo changeInfo)
{
return changeInfo.DirectoryConflict.IsResolved();
}
static bool IsDirectoryConflict(MergeChangeInfo changeInfo)
{
return (changeInfo.DirectoryConflict != null);
}
}
}

View File

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

View File

@@ -0,0 +1,182 @@
using System.Collections.Generic;
using PlasticGui.WorkspaceWindow.Merge;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
{
internal class UnityIncomingChangesTree
{
internal static UnityIncomingChangesTree BuildIncomingChangeCategories(
MergeChangesTree tree)
{
return new UnityIncomingChangesTree(tree);
}
UnityIncomingChangesTree(
MergeChangesTree tree)
{
mInnerTree = tree;
mMetaCache.Build(mInnerTree.GetNodes());
}
internal List<MergeChangesCategory> GetNodes()
{
return mInnerTree.GetNodes();
}
internal bool HasMeta(MergeChangeInfo changeInfo)
{
return mMetaCache.ContainsMeta(changeInfo);
}
internal MergeChangeInfo GetMetaChange(MergeChangeInfo change)
{
return mMetaCache.GetExistingMeta(change);
}
internal void FillWithMeta(List<MergeChangeInfo> changes)
{
changes.AddRange(
mMetaCache.GetExistingMeta(changes));
}
internal void Sort(string key, bool isAscending)
{
mInnerTree.Sort(key, isAscending);
}
internal void ResolveUserNames(
MergeChangesTree.ResolveUserName resolveUserName)
{
mInnerTree.ResolveUserNames(resolveUserName);
}
MetaCache mMetaCache = new MetaCache();
MergeChangesTree mInnerTree;
class MetaCache
{
internal bool ContainsMeta(MergeChangeInfo changeInfo)
{
string key = BuildKey.ForMetaChange(changeInfo);
return mCache.ContainsKey(key);
}
internal MergeChangeInfo GetExistingMeta(MergeChangeInfo change)
{
MergeChangeInfo result;
if (!mCache.TryGetValue(BuildKey.ForMetaChange(change), out result))
return null;
return result;
}
internal List<MergeChangeInfo> GetExistingMeta(
List<MergeChangeInfo> changes)
{
List<MergeChangeInfo> result = new List<MergeChangeInfo>();
foreach (MergeChangeInfo change in changes)
{
string key = BuildKey.ForMetaChange(change);
MergeChangeInfo metaChange;
if (!mCache.TryGetValue(key, out metaChange))
continue;
result.Add(metaChange);
}
return result;
}
internal void Build(List<MergeChangesCategory> incomingChangesCategories)
{
mCache.Clear();
foreach (MergeChangesCategory category in incomingChangesCategories)
{
ExtractMetaToCache(category, mCache);
}
}
static void ExtractMetaToCache(
MergeChangesCategory category,
Dictionary<string, MergeChangeInfo> cache)
{
List<MergeChangeInfo> changes = category.GetChanges();
HashSet<string> indexedKeys = BuildIndexedKeys(
changes);
for (int i = changes.Count - 1; i >= 0; i--)
{
MergeChangeInfo currentChange = changes[i];
string path = currentChange.GetPath();
if (!MetaPath.IsMetaPath(path))
continue;
string realPath = MetaPath.GetPathFromMetaPath(path);
if (!indexedKeys.Contains(BuildKey.BuildCacheKey(
currentChange.CategoryType, realPath)))
continue;
// found foo.c and foo.c.meta - move .meta to cache
cache.Add(BuildKey.ForChange(currentChange), currentChange);
changes.RemoveAt(i);
}
}
static HashSet<string> BuildIndexedKeys(
List<MergeChangeInfo> changes)
{
HashSet<string> result = new HashSet<string>();
foreach (MergeChangeInfo change in changes)
{
if (MetaPath.IsMetaPath(change.GetPath()))
continue;
result.Add(BuildKey.ForChange(change));
}
return result;
}
Dictionary<string, MergeChangeInfo> mCache =
new Dictionary<string, MergeChangeInfo>();
static class BuildKey
{
internal static string ForChange(
MergeChangeInfo change)
{
return BuildCacheKey(
change.CategoryType,
change.GetPath());
}
internal static string ForMetaChange(
MergeChangeInfo change)
{
return BuildCacheKey(
change.CategoryType,
MetaPath.GetMetaPath(change.GetPath()));
}
internal static string BuildCacheKey(
MergeChangesCategory.Type type,
string path)
{
return string.Concat(type, ":", path);
}
}
}
}
}

View File

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

View File

@@ -0,0 +1,89 @@
using UnityEditor;
using UnityEngine;
using Codice.Client.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow.Merge;
using Unity.PlasticSCM.Editor.UI;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges
{
internal static class DrawIncomingChangesOverview
{
internal static void For(
int directoryConflictCount,
int fileConflictCount,
MergeViewTexts.ChangesToApplySummary changesSummary)
{
DrawItem(
Images.GetConflictedIcon(),
PlasticLocalization.Name.DirectoryConflictsTitleSingular,
PlasticLocalization.Name.DirectoryConflictsTitlePlural,
directoryConflictCount,
0,
false);
DrawItem(
Images.GetConflictedIcon(),
PlasticLocalization.Name.FileConflictsTitleSingular,
PlasticLocalization.Name.FileConflictsTitlePlural,
fileConflictCount,
0,
false);
DrawItem(
Images.GetOutOfSyncIcon(),
PlasticLocalization.Name.MergeChangesMadeInSourceOfMergeOverviewSingular,
PlasticLocalization.Name.MergeChangesMadeInSourceOfMergeOverviewPlural,
changesSummary.FilesToModify,
changesSummary.SizeToModify,
true);
DrawItem(
Images.GetAddedLocalIcon(),
PlasticLocalization.Name.MergeNewItemsToDownloadOverviewSingular,
PlasticLocalization.Name.MergeNewItemsToDownloadOverviewPlural,
changesSummary.FilesToAdd,
changesSummary.SizeToAdd,
true);
DrawItem(
Images.GetDeletedRemoteIcon(),
PlasticLocalization.Name.MergeDeletesToApplyOverviewSingular,
PlasticLocalization.Name.MergeDeletesToApplyOverviewPlural,
changesSummary.FilesToDelete,
changesSummary.SizeToDelete,
true);
}
static void DrawItem(
Texture2D icon,
PlasticLocalization.Name singularLabel,
PlasticLocalization.Name pluralLabel,
int count,
long size,
bool showSize)
{
if (count == 0)
return;
EditorGUILayout.BeginHorizontal();
GUIContent iconContent = new GUIContent(icon);
GUILayout.Label(iconContent, GUILayout.Width(20f), GUILayout.Height(20f));
string label = PlasticLocalization.GetString(count > 1 ? pluralLabel : singularLabel);
if (showSize)
label = string.Format(label, count, SizeConverter.ConvertToSizeString(size));
else
label = string.Format(label, count);
GUIContent content = new GUIContent(label);
GUILayout.Label(content, UnityStyles.IncomingChangesTab.ChangesToApplySummaryLabel);
GUILayout.Space(5);
EditorGUILayout.EndHorizontal();
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,17 @@
using UnityEditor.IMGUI.Controls;
using PlasticGui.Gluon.WorkspaceWindow.Views.IncomingChanges;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon
{
internal class ChangeCategoryTreeViewItem : TreeViewItem
{
internal IncomingChangeCategory Category { get; private set; }
internal ChangeCategoryTreeViewItem(int id, IncomingChangeCategory category)
: base(id, 0)
{
Category = category;
}
}
}

View File

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

View File

@@ -0,0 +1,19 @@
using UnityEditor.IMGUI.Controls;
using PlasticGui.Gluon.WorkspaceWindow.Views.IncomingChanges;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon
{
internal class ChangeTreeViewItem : TreeViewItem
{
internal IncomingChangeInfo ChangeInfo { get; private set; }
internal ChangeTreeViewItem(int id, IncomingChangeInfo change)
: base(id, 1)
{
ChangeInfo = change;
displayName = change.GetPathString();
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,19 @@
using UnityEditor.IMGUI.Controls;
using Codice.CM.Common;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon.Errors
{
internal class ErrorListViewItem : TreeViewItem
{
internal ErrorMessage ErrorMessage { get; private set; }
internal ErrorListViewItem(int id, ErrorMessage errorMessage)
: base(id, 0)
{
ErrorMessage = errorMessage;
displayName = errorMessage.Path;
}
}
}

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,180 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.IMGUI.Controls;
using Codice.Client.BaseCommands;
using Codice.CM.Common;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.Tree;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon.Errors
{
internal class ErrorsListView : TreeView
{
internal ErrorsListView(ErrorsListHeaderState headerState)
: base(new TreeViewState())
{
multiColumnHeader = new MultiColumnHeader(headerState);
multiColumnHeader.canSort = false;
rowHeight = UnityConstants.TREEVIEW_ROW_HEIGHT;
showAlternatingRowBackgrounds = true;
}
public override IList<TreeViewItem> GetRows()
{
return mRows;
}
protected override TreeViewItem BuildRoot()
{
return new TreeViewItem(0, -1, string.Empty);
}
protected override IList<TreeViewItem> BuildRows(TreeViewItem rootItem)
{
RegenerateRows(
this, mErrorMessages, rootItem, mRows);
return mRows;
}
protected override void BeforeRowsGUI()
{
int firstRowVisible;
int lastRowVisible;
GetFirstAndLastVisibleRows(out firstRowVisible, out lastRowVisible);
GUI.DrawTexture(new Rect(0,
firstRowVisible * rowHeight,
GetRowRect(0).width,
(lastRowVisible * rowHeight) + 1000),
Images.GetTreeviewBackgroundTexture());
DrawTreeViewItem.InitializeStyles();
base.BeforeRowsGUI();
}
protected override void RowGUI(RowGUIArgs args)
{
if (args.item is ErrorListViewItem)
{
ErrorListViewItemGUI((ErrorListViewItem)args.item, args);
return;
}
base.RowGUI(args);
}
internal void BuildModel(List<ErrorMessage> errorMessages)
{
mErrorMessages = errorMessages;
}
internal ErrorMessage GetSelectedError()
{
List<ErrorMessage> selectedErrors = GetSelectedErrors(this);
if (selectedErrors.Count != 1)
return null;
return selectedErrors[0];
}
static List<ErrorMessage> GetSelectedErrors(
ErrorsListView listView)
{
List<ErrorMessage> result = new List<ErrorMessage>();
IList<int> selectedIds = listView.GetSelection();
if (selectedIds.Count == 0)
return result;
foreach (ErrorListViewItem treeViewItem in
listView.FindRows(selectedIds))
{
result.Add(treeViewItem.ErrorMessage);
}
return result;
}
static void RegenerateRows(
ErrorsListView listView,
List<ErrorMessage> errorMessages,
TreeViewItem rootItem,
List<TreeViewItem> rows)
{
ClearRows(rootItem, rows);
if (errorMessages.Count == 0)
return;
for (int i = 0; i < errorMessages.Count; i++)
{
ErrorListViewItem errorListViewItem =
new ErrorListViewItem(i + 1, errorMessages[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 ErrorListViewItemGUI(
ErrorListViewItem item,
RowGUIArgs args)
{
for (int visibleColumnIdx = 0; visibleColumnIdx < args.GetNumVisibleColumns(); visibleColumnIdx++)
{
Rect cellRect = args.GetCellRect(visibleColumnIdx);
ErrorsListColumn column =
(ErrorsListColumn)args.GetColumn(visibleColumnIdx);
ErrorListViewItemCellGUI(
cellRect, item, column, args.selected, args.focused);
}
}
static void ErrorListViewItemCellGUI(
Rect rect,
ErrorListViewItem item,
ErrorsListColumn column,
bool isSelected,
bool isFocused)
{
ErrorMessage errorMessage = item.ErrorMessage;
string label = column == ErrorsListColumn.Path ?
errorMessage.Path : errorMessage.Error;
if (column == ErrorsListColumn.Path)
{
DrawTreeViewItem.ForLabel(
rect, label, isSelected, isFocused, false);
return;
}
DrawTreeViewItem.ForSecondaryLabel(
rect, label, isSelected, isFocused, false);
}
List<TreeViewItem> mRows = new List<TreeViewItem>();
List<ErrorMessage> mErrorMessages = new List<ErrorMessage>();
}
}

View File

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

View File

@@ -0,0 +1,33 @@
using System.Collections.Generic;
using PlasticGui.Gluon.WorkspaceWindow.Views.IncomingChanges;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon
{
internal static class IncomingChangesSelection
{
internal static SelectedIncomingChangesGroupInfo GetSelectedGroupInfo(
IncomingChangesTreeView treeView)
{
List<IncomingChangeInfo> selectedIncomingChanges =
treeView.GetSelectedIncomingChanges();
return GetSelectedIncomingChangesGroupInfo.For(
selectedIncomingChanges);
}
internal static List<IncomingChangeInfo> GetSelectedFileConflictsIncludingMeta(
IncomingChangesTreeView treeView)
{
List<IncomingChangeInfo> result = treeView.GetSelectedFileConflicts();
treeView.FillWithMeta(result);
return result;
}
internal static IncomingChangeInfo GetSingleSelectedIncomingChange(
IncomingChangesTreeView treeView)
{
return treeView.GetSelectedIncomingChange();
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI.Tree;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon
{
internal enum IncomingChangesTreeColumn
{
Path,
LastEditedBy,
Size,
DateModififed,
Comment
}
[Serializable]
internal class IncomingChangesTreeHeaderState : MultiColumnHeaderState, ISerializationCallbackReceiver
{
internal static IncomingChangesTreeHeaderState GetDefault()
{
return new IncomingChangesTreeHeaderState(BuildColumns());
}
internal static List<string> GetColumnNames()
{
List<string> result = new List<string>();
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.PathColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.LastEditedByColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.SizeColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.DateModifiedColumn));
result.Add(PlasticLocalization.GetString(PlasticLocalization.Name.CommentColumn));
return result;
}
internal static string GetColumnName(IncomingChangesTreeColumn column)
{
switch (column)
{
case IncomingChangesTreeColumn.Path:
return PlasticLocalization.GetString(PlasticLocalization.Name.PathColumn);
case IncomingChangesTreeColumn.LastEditedBy:
return PlasticLocalization.GetString(PlasticLocalization.Name.LastEditedByColumn);
case IncomingChangesTreeColumn.Size:
return PlasticLocalization.GetString(PlasticLocalization.Name.SizeColumn);
case IncomingChangesTreeColumn.DateModififed:
return PlasticLocalization.GetString(PlasticLocalization.Name.DateModifiedColumn);
case IncomingChangesTreeColumn.Comment:
return PlasticLocalization.GetString(PlasticLocalization.Name.CommentColumn);
default:
return null;
}
}
void ISerializationCallbackReceiver.OnAfterDeserialize()
{
if (mHeaderTitles != null)
TreeHeaderColumns.SetTitles(columns, mHeaderTitles);
if (mColumsAllowedToggleVisibility != null)
TreeHeaderColumns.SetVisibilities(columns, mColumsAllowedToggleVisibility);
}
void ISerializationCallbackReceiver.OnBeforeSerialize()
{
}
static Column[] BuildColumns()
{
return new Column[]
{
new Column()
{
width = 440,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Path)),
minWidth = 200,
allowToggleVisibility = false,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 150,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.LastEditedBy)),
minWidth = 80,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 80,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Size)),
minWidth = 45,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 260,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.DateModififed)),
minWidth = 100,
sortingArrowAlignment = TextAlignment.Right
},
new Column()
{
width = 400,
headerContent = new GUIContent(
GetColumnName(IncomingChangesTreeColumn.Comment)),
minWidth = 100,
sortingArrowAlignment = TextAlignment.Right
}
};
}
IncomingChangesTreeHeaderState(Column[] columns)
: base(columns)
{
if (mHeaderTitles == null)
mHeaderTitles = TreeHeaderColumns.GetTitles(columns);
if (mColumsAllowedToggleVisibility == null)
mColumsAllowedToggleVisibility = TreeHeaderColumns.GetVisibilities(columns);
}
[SerializeField]
string[] mHeaderTitles;
[SerializeField]
bool[] mColumsAllowedToggleVisibility;
}
}

View File

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

View File

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

View File

@@ -0,0 +1,223 @@
using UnityEngine;
using UnityEditor;
using Codice.CM.Common;
using Codice.Client.Common.EventTracking;
using PlasticGui;
using PlasticGui.Gluon.WorkspaceWindow.Views.IncomingChanges;
using Unity.PlasticSCM.Editor.Tool;
using Unity.PlasticSCM.Editor.UI;
namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon
{
internal class IncomingChangesViewMenu
{
internal interface IMetaMenuOperations
{
void DiffIncomingChanges();
void DiffYoursWithIncoming();
bool SelectionHasMeta();
}
internal IncomingChangesViewMenu(
WorkspaceInfo wkInfo,
IIncomingChangesViewMenuOperations incomingChangesViewMenuOperations,
IMetaMenuOperations incomingChangesMetaMenuOperations)
{
mWkInfo = wkInfo;
mIncomingChangesViewMenuOperations = incomingChangesViewMenuOperations;
mIncomingChangesMetaMenuOperations = incomingChangesMetaMenuOperations;
BuildComponents();
}
internal void Popup()
{
GenericMenu menu = new GenericMenu();
UpdateMenuItems(menu);
menu.ShowAsContext();
}
void MergeSelectedFilesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.MergeContributors();
}
void MergeKeepingSourceChangesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.MergeKeepingSourceChanges();
}
void MergeKeepingWorkspaceChangesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.MergeKeepingWorkspaceChanges();
}
void DiffYoursWithIncomingMenuItem_Click()
{
mIncomingChangesViewMenuOperations.DiffYoursWithIncoming();
}
void DiffIncomingChangesMenuItem_Click()
{
mIncomingChangesViewMenuOperations.DiffIncomingChanges();
}
void DiffMetaYoursWithIncomingMenuItem_Click()
{
mIncomingChangesMetaMenuOperations.DiffYoursWithIncoming();
}
void DiffMetaIncomingChangesMenuItem_Click()
{
mIncomingChangesMetaMenuOperations.DiffIncomingChanges();
}
void UpdateMenuItems(GenericMenu menu)
{
SelectedIncomingChangesGroupInfo info =
mIncomingChangesViewMenuOperations.GetSelectedIncomingChangesGroupInfo();
IncomingChangesMenuOperations operations =
UpdateIncomingChangesMenu.GetAvailableMenuOperations(info);
if (operations == IncomingChangesMenuOperations.None)
{
menu.AddDisabledItem(GetNoActionMenuItemContent());
return;
}
AddMergeActions(menu, operations);
menu.AddSeparator(string.Empty);
AddDiffActions(menu, operations);
if (!mIncomingChangesMetaMenuOperations.SelectionHasMeta())
return;
menu.AddSeparator(string.Empty);
AddMetaActions(menu, operations);
}
void AddMergeActions(
GenericMenu menu,
IncomingChangesMenuOperations operations)
{
if (operations.HasFlag(IncomingChangesMenuOperations.MergeContributors))
menu.AddItem(mMergeSelectedFilesMenuItemContent, false,
MergeSelectedFilesMenuItem_Click);
else
menu.AddDisabledItem(mMergeSelectedFilesMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.MergeKeepingSourceChanges))
menu.AddItem(mMergeKeepingSourceChangesMenuItemContent, false,
MergeKeepingSourceChangesMenuItem_Click);
else
menu.AddDisabledItem(mMergeKeepingSourceChangesMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.MergeKeepingWorkspaceChanges))
menu.AddItem(mMergeKeepingWorkspaceChangesMenuItemContent, false,
MergeKeepingWorkspaceChangesMenuItem_Click);
else
menu.AddDisabledItem(mMergeKeepingWorkspaceChangesMenuItemContent);
}
void AddDiffActions(GenericMenu menu, IncomingChangesMenuOperations operations)
{
if (operations.HasFlag(IncomingChangesMenuOperations.DiffYoursWithIncoming))
menu.AddItem(mDiffYoursWithIncomingMenuItemContent, false,
DiffYoursWithIncomingMenuItem_Click);
else
menu.AddDisabledItem(mDiffYoursWithIncomingMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.DiffIncomingChanges))
menu.AddItem(mDiffIncomingChangesMenuItemContent, false,
DiffIncomingChangesMenuItem_Click);
else
menu.AddDisabledItem(mDiffIncomingChangesMenuItemContent);
}
void AddMetaActions(GenericMenu menu, IncomingChangesMenuOperations operations)
{
if (operations.HasFlag(IncomingChangesMenuOperations.DiffYoursWithIncoming))
menu.AddItem(mDiffMetaYoursWithIncomingMenuItemContent, false,
DiffMetaYoursWithIncomingMenuItem_Click);
else
menu.AddDisabledItem(mDiffMetaYoursWithIncomingMenuItemContent);
if (operations.HasFlag(IncomingChangesMenuOperations.DiffIncomingChanges))
menu.AddItem(mDiffMetaIncomingChangesMenuItemContent, false,
DiffMetaIncomingChangesMenuItem_Click);
else
menu.AddDisabledItem(mDiffMetaIncomingChangesMenuItemContent);
}
GUIContent GetNoActionMenuItemContent()
{
if (mNoActionMenuItemContent == null)
{
mNoActionMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.
Name.NoActionMenuItem));
}
return mNoActionMenuItemContent;
}
void BuildComponents()
{
mMergeSelectedFilesMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.
Name.MergeSelectedFiles));
mMergeKeepingSourceChangesMenuItemContent = new GUIContent(
UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemMergeKeepingSourceChanges)));
mMergeKeepingWorkspaceChangesMenuItemContent = new GUIContent(
UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemMergeKeepingWorkspaceChanges)));
string diffYoursWithIncomingText = UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemDiffYoursWithIncoming));
string diffIncomingChangesText = UnityMenuItem.EscapedText(
PlasticLocalization.GetString(PlasticLocalization.
Name.IncomingChangesMenuItemDiffIncomingChanges));
mDiffYoursWithIncomingMenuItemContent = new GUIContent(
diffYoursWithIncomingText);
mDiffIncomingChangesMenuItemContent = new GUIContent(
diffIncomingChangesText);
mDiffMetaYoursWithIncomingMenuItemContent = new GUIContent(
string.Format(
"{0}/{1}",
MetaPath.META_EXTENSION,
diffYoursWithIncomingText));
mDiffMetaIncomingChangesMenuItemContent = new GUIContent(
string.Format(
"{0}/{1}",
MetaPath.META_EXTENSION,
diffIncomingChangesText));
}
GUIContent mNoActionMenuItemContent;
GUIContent mMergeSelectedFilesMenuItemContent;
GUIContent mMergeKeepingSourceChangesMenuItemContent;
GUIContent mMergeKeepingWorkspaceChangesMenuItemContent;
GUIContent mDiffYoursWithIncomingMenuItemContent;
GUIContent mDiffIncomingChangesMenuItemContent;
GUIContent mDiffMetaYoursWithIncomingMenuItemContent;
GUIContent mDiffMetaIncomingChangesMenuItemContent;
readonly WorkspaceInfo mWkInfo;
readonly IIncomingChangesViewMenuOperations mIncomingChangesViewMenuOperations;
readonly IMetaMenuOperations mIncomingChangesMetaMenuOperations;
}
}

View File

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

Some files were not shown because too many files have changed in this diff Show More