using UnityEngine; using UnityEditor; using Codice.CM.Common; using PlasticGui; using PlasticGui.WorkspaceWindow.Attributes; using Unity.PlasticSCM.Editor.UI; using Unity.PlasticSCM.Editor.Views.Properties; #if !UNITY_6000_3_OR_NEWER using EditorGUI = Unity.PlasticSCM.Editor.UnityInternals.UnityEditor.EditorGUI; #endif namespace Unity.PlasticSCM.Editor.Views.Attributes { internal class AttributePanel : AttributePanelOperations.IAttributePanel { internal interface IAttributesPanel { internal void RemovePanel(AttributePanel attributePanel); } internal Vector2 DesiredSize => mDesiredSize; internal AttributePanel( RepositorySpec repSpec, AttributeRealizationInfo attribute, IProgressControls progressControls, IAttributesPanel attributesPanel, IWorkspaceWindow workspaceWindow, EditorWindow window) { mRepSpec = repSpec; mAttribute = attribute; mProgressControls = progressControls; mAttributesPanel = attributesPanel; mWorkspaceWindow = workspaceWindow; mWindow = window; Color solidColor = AttributeColor.FromAttributeName(mAttribute.AttributeName); mNameForegroundColor = solidColor; mOutlineColor = new Color(solidColor.r, solidColor.g, solidColor.b, 0.5f);; mFillColor = new Color(solidColor.r, solidColor.g, solidColor.b, 0.1f); CalculateTextAndDesiredSize(); } internal void Update() { if (!mbEditButtonClicked) return; mbEditButtonClicked = false; EditButton_Click(); } internal void OnGUI(float availableWidth) { GUIStyle labelStyle = UnityStyles.AttributesPanel.AttributeLabel; GUIStyle editButtonStyle= UnityStyles.AttributesPanel.AttributeLabelButton; GUIStyle removeButtonStyle= UnityStyles.AttributesPanel.AttributeLabelRightButton; float buttonsWidth = editButtonStyle.fixedWidth + removeButtonStyle.fixedWidth + editButtonStyle.margin.horizontal + removeButtonStyle.margin.horizontal; string cutText = CutText( mPlainText, mRichText, labelStyle, availableWidth - buttonsWidth, mNameForegroundColor, out Vector2 textSize); Rect totalRect = GUILayoutUtility.GetRect( 0, 0, GUILayout.Width(textSize.x + buttonsWidth + labelStyle.margin.horizontal), GUILayout.Height(textSize.y + labelStyle.margin.vertical)); Rect boxRect = new Rect( totalRect.x + labelStyle.margin.left, totalRect.y + labelStyle.margin.top, totalRect.width - labelStyle.margin.horizontal, totalRect.height - labelStyle.margin.vertical); Rect editButtonRect = new Rect( boxRect.x + textSize.x, boxRect.y + (boxRect.height - editButtonStyle.fixedHeight) / 2, editButtonStyle.fixedWidth, editButtonStyle.fixedHeight); Rect removeButtonRect = new Rect( boxRect.x + textSize.x + editButtonRect.width, boxRect.y + (boxRect.height - removeButtonStyle.fixedHeight) / 2, removeButtonStyle.fixedWidth, removeButtonStyle.fixedHeight); UnityEditor.EditorGUI.DrawRect(boxRect, mFillColor); EditorGUI.DrawOutline(boxRect, 1, mOutlineColor); GUI.Label( boxRect, new GUIContent(cutText, cutText != mRichText ? mRichText : string.Empty), labelStyle); if (GUI.Button( editButtonRect, Images.GetEditIcon(), editButtonStyle)) { mbEditButtonClicked = true; } if (GUI.Button( removeButtonRect, Images.GetCloseIcon(), removeButtonStyle)) { RemoveButton_Click(); } } void AttributePanelOperations.IAttributePanel.Fill(string[] attValues) { } void AttributePanelOperations.IAttributePanel.DisableEditionMode() { mAttribute.Value = mEditAttributeValue; CalculateTextAndDesiredSize(); PropertiesRefreshNotifier.Notify(); } void AttributePanelOperations.IAttributePanel.Remove() { mAttributesPanel.RemovePanel(this); PropertiesRefreshNotifier.Notify(); } void EditButton_Click() { ApplyAttributeData applyAttributeData = AttributeDataDialog.BuildForEditAttributeRealization( mAttribute, mRepSpec, mWorkspaceWindow, mWindow); if (!applyAttributeData.Result) return; mEditAttributeValue = applyAttributeData.AttributeValue; AttributePanelOperations.ChangeAttributeValue( mRepSpec, mAttribute, applyAttributeData.AttributeValue, mProgressControls, this); } void RemoveButton_Click() { AttributePanelOperations.DeleteAttribute( mRepSpec, mAttribute, mProgressControls, this); } void CalculateTextAndDesiredSize() { GUIStyle labelStyle = UnityStyles.AttributesPanel.AttributeLabel; GUIStyle editButtonStyle = UnityStyles.AttributesPanel.AttributeLabelButton; GUIStyle removeButtonStyle = UnityStyles.AttributesPanel.AttributeLabelRightButton; mPlainText = string.Format("{0}: {1}", mAttribute.AttributeName, mAttribute.Value); mRichText = string.Format( "{1}: {2}", GetHexString(mNameForegroundColor), mAttribute.AttributeName, mAttribute.Value); Vector2 desiredTextSize = labelStyle.CalcSize(new GUIContent(mRichText)); mDesiredSize = desiredTextSize + new Vector2( labelStyle.margin.horizontal + editButtonStyle.fixedWidth + removeButtonStyle.fixedWidth + editButtonStyle.margin.horizontal + removeButtonStyle.margin.horizontal, labelStyle.margin.vertical); } static string CutText( string plainText, string richText, GUIStyle style, float availableWidth, Color nameForegroundColor, out Vector2 usedSize) { usedSize = new Vector2(); availableWidth -= style.margin.horizontal; Vector2 fullTextSize = style.CalcSize(new GUIContent(richText)); if (fullTextSize.x < availableWidth) { usedSize = fullTextSize; return richText; } string textResult = string.Format("", GetHexString(nameForegroundColor)); bool bReachedAttributeValue = false; foreach (char c in plainText) { Vector2 currentSize = style.CalcSize( new GUIContent( textResult + c + ELLIPSIS + (!bReachedAttributeValue ? "" : string.Empty))); if (currentSize.x >= availableWidth) return textResult + ELLIPSIS + (!bReachedAttributeValue ? "" : string.Empty); usedSize = currentSize; textResult += c; if (!bReachedAttributeValue && c == ':') { bReachedAttributeValue = true; textResult += ""; } } return textResult + ELLIPSIS; } static string GetHexString(Color color) { return string.Format( "#{0}{1}{2}{3}", ((int)(color.r * 255)).ToString("X2"), ((int)(color.g * 255)).ToString("X2"), ((int)(color.b * 255)).ToString("X2"), ((int)(color.a * 255)).ToString("X2")); } string mRichText; string mPlainText; Vector2 mDesiredSize; string mEditAttributeValue; bool mbEditButtonClicked; readonly Color mNameForegroundColor; readonly Color mOutlineColor; readonly Color mFillColor; readonly RepositorySpec mRepSpec; readonly AttributeRealizationInfo mAttribute; readonly IProgressControls mProgressControls; readonly IAttributesPanel mAttributesPanel; readonly IWorkspaceWindow mWorkspaceWindow; readonly EditorWindow mWindow; const string ELLIPSIS = "..."; } }