first commit
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 97b1b110b0cf5ec428f9553e02bb7c03
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c408e05e88bc93c458a3195b15e9d625
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69ebbdad2c303214683305d65fe26726
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5b3802c1581ef894d83aa9fcb7ace84c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f88a4e9dbb5a07744954a86cbb61d54f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a9881fce7e445b84bbbd53752db30fe9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b10c9294742ed4040ad32d0b73b16c75
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f04b21b06239da4f95a5a9753647440
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c8b04d6403125b4ca51861863f386ee
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e0aed0a10caba04583f2474f8279b27
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 182343c61d477e2449cfbc9cb20dfb35
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5013a6f8fee1f2a49b06f75fc5a6ece4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d6db53f93de967c489902da57a7290a1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b57672168ae882a4b8483a000638c433
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f8686930677b1f44d9ad7deab4888955
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 184012b39edc5c7468c23f916818433e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: faf2afd8696f4604f82f46b06b357f06
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d491adc3134c2ac4d9e3c61ed42a7ccd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4edf5537f8245134c8b023ab85d8e640
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 71c34e5fa319ca644b6806e573c33d88
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8c069d7fb0d30cf499458f0d9c9fe035
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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>();
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 331d1c37d891f334390adb8324042856
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d287890d8b11cb7498506935c825b43d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9b917d42ad338ab4494088f574472998
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c0821447a35700c4280782d1092cf4c5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f2f2eb277e02054cbc5ccee904b593b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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
Reference in New Issue
Block a user