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