300 lines
7.8 KiB
C#
300 lines
7.8 KiB
C#
using System;
|
|
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
using Unity.PlasticSCM.Editor.UI;
|
|
|
|
namespace Unity.Cloud.Collaborate
|
|
{
|
|
internal class UVCSToolbarButton : SubToolbar
|
|
{
|
|
internal UVCSToolbarButton(
|
|
Action<Rect> buttonClicked,
|
|
Action repaintToolbar)
|
|
{
|
|
mButtonClicked = buttonClicked;
|
|
mRepaintToolbar = repaintToolbar;
|
|
|
|
mTruncatedTextGUIContent = new GUIContent();
|
|
mTooltipButtonGUIContent = new GUIContent();
|
|
}
|
|
|
|
internal bool IsVisible
|
|
{
|
|
get { return mIsVisible; }
|
|
set
|
|
{
|
|
if (mIsVisible == value)
|
|
return;
|
|
|
|
mIsVisible = value;
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
internal int MaxTextLength
|
|
{
|
|
get { return mMaxTextLenght; }
|
|
set
|
|
{
|
|
if (mMaxTextLenght == value || value < 6)
|
|
return;
|
|
|
|
mMaxTextLenght = value;
|
|
mTruncatedTextGUIContent.text = Truncate(mText, MaxTextLength);
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
internal string Text
|
|
{
|
|
get { return mText; }
|
|
set
|
|
{
|
|
if (mText == value)
|
|
return;
|
|
|
|
mText = value;
|
|
mTruncatedTextGUIContent.text = Truncate(mText, MaxTextLength);
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
internal string Tooltip
|
|
{
|
|
get { return mTooltipButtonGUIContent.tooltip; }
|
|
set
|
|
{
|
|
if (mTooltipButtonGUIContent.tooltip == value)
|
|
return;
|
|
|
|
mTooltipButtonGUIContent.tooltip = value;
|
|
RequestRepaint();
|
|
}
|
|
}
|
|
|
|
internal Texture LeftIcon
|
|
{
|
|
get { return mLeftIcon; }
|
|
set
|
|
{
|
|
if (mLeftIcon == value)
|
|
return;
|
|
|
|
mLeftIcon = value;
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
internal Texture RightIcon
|
|
{
|
|
get { return mRightIcon; }
|
|
set
|
|
{
|
|
if (mRightIcon == value)
|
|
return;
|
|
|
|
mRightIcon = value;
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
internal void BeginUpdate()
|
|
{
|
|
mBatchUpdateCount++;
|
|
}
|
|
|
|
internal void EndUpdate()
|
|
{
|
|
mBatchUpdateCount--;
|
|
|
|
if (mBatchUpdateCount <= 0)
|
|
{
|
|
mBatchUpdateCount = 0;
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
void InvalidateLayout()
|
|
{
|
|
if (mBatchUpdateCount > 0)
|
|
return;
|
|
|
|
mIsLayoutValid = false;
|
|
mRepaintToolbar();
|
|
}
|
|
|
|
void RequestRepaint()
|
|
{
|
|
if (mBatchUpdateCount > 0)
|
|
return;
|
|
|
|
mRepaintToolbar();
|
|
}
|
|
|
|
public override void OnGUI(Rect rect)
|
|
{
|
|
if (!mIsVisible)
|
|
{
|
|
Width = 0;
|
|
return;
|
|
}
|
|
|
|
if (mDropDownIcon == null)
|
|
mDropDownIcon = Images.GetDropDownIcon();
|
|
|
|
if (mButtonStyle == null)
|
|
mButtonStyle = UnityStyles.EditorToolbar.Button.AppCmdButton;
|
|
|
|
if (mTextStyle == null)
|
|
mTextStyle = UnityStyles.EditorToolbar.Button.ButtonText;
|
|
|
|
if (!mIsLayoutValid)
|
|
{
|
|
UpdateLayout();
|
|
Width = mLayout.TotalWidth;
|
|
}
|
|
|
|
Rect buttonRect = DrawButton(rect);
|
|
|
|
DrawLeftIcon(buttonRect);
|
|
DrawText(buttonRect);
|
|
DrawRightIcon(buttonRect);
|
|
DrawDropDownIcon(buttonRect);
|
|
}
|
|
|
|
Rect DrawButton(Rect rect)
|
|
{
|
|
Rect buttonRect = new Rect(
|
|
rect.x,
|
|
rect.y,
|
|
mLayout.TotalWidth,
|
|
rect.height);
|
|
|
|
if (GUI.Button(buttonRect, mTooltipButtonGUIContent, mButtonStyle))
|
|
{
|
|
mButtonClicked.Invoke(buttonRect);
|
|
}
|
|
|
|
return buttonRect;
|
|
}
|
|
|
|
void DrawLeftIcon(Rect buttonRect)
|
|
{
|
|
if (LeftIcon == null)
|
|
return;
|
|
|
|
Rect leftIconRect = new Rect(
|
|
mLayout.LeftIconX,
|
|
buttonRect.y + (buttonRect.height - Layout.LEFT_ICON_SIZE) / 2,
|
|
Layout.LEFT_ICON_SIZE,
|
|
Layout.LEFT_ICON_SIZE);
|
|
|
|
GUI.DrawTexture(leftIconRect, LeftIcon);
|
|
}
|
|
|
|
void DrawText(Rect buttonRect)
|
|
{
|
|
Rect textRect = new Rect(
|
|
mLayout.TextX,
|
|
buttonRect.y + (buttonRect.height - mLayout.TextSize.y) / 2,
|
|
mLayout.TextSize.x,
|
|
mLayout.TextSize.y);
|
|
|
|
GUI.Label(textRect, mTruncatedTextGUIContent, mTextStyle);
|
|
}
|
|
|
|
void DrawRightIcon(Rect buttonRect)
|
|
{
|
|
if (RightIcon == null)
|
|
return;
|
|
|
|
Rect rightIconRect = new Rect(
|
|
mLayout.RightIconX,
|
|
buttonRect.y + (buttonRect.height - Layout.RIGHT_ICON_SIZE) / 2,
|
|
Layout.RIGHT_ICON_SIZE,
|
|
Layout.RIGHT_ICON_SIZE);
|
|
|
|
GUI.DrawTexture(rightIconRect, RightIcon);
|
|
}
|
|
|
|
void DrawDropDownIcon(Rect buttonRect)
|
|
{
|
|
if (mDropDownIcon == null)
|
|
return;
|
|
|
|
Rect dropDownIconRect = new Rect(
|
|
mLayout.DropDownIconX,
|
|
buttonRect.y + (buttonRect.height - Layout.DROPDOWN_ICON_SIZE) / 2,
|
|
Layout.DROPDOWN_ICON_SIZE,
|
|
Layout.DROPDOWN_ICON_SIZE);
|
|
|
|
GUI.DrawTexture(dropDownIconRect, mDropDownIcon);
|
|
}
|
|
|
|
void UpdateLayout()
|
|
{
|
|
mLayout.TextSize = mTextStyle.CalcSize(mTruncatedTextGUIContent);
|
|
|
|
int margin = 2;
|
|
|
|
mLayout.LeftIconX = mButtonStyle.margin.left + mButtonStyle.padding.left;
|
|
mLayout.TextX = LeftIcon != null ? mLayout.LeftIconX + Layout.LEFT_ICON_SIZE + margin : mLayout.LeftIconX;
|
|
mLayout.RightIconX = mLayout.TextX + mLayout.TextSize.x + margin;
|
|
mLayout.DropDownIconX =
|
|
RightIcon != null ? mLayout.RightIconX + Layout.RIGHT_ICON_SIZE + margin : mLayout.RightIconX;
|
|
mLayout.TotalWidth =
|
|
mLayout.DropDownIconX +
|
|
(mDropDownIcon != null ? Layout.DROPDOWN_ICON_SIZE : 0) +
|
|
mButtonStyle.margin.right +
|
|
mButtonStyle.margin.right;
|
|
}
|
|
|
|
static string Truncate(string text, int maxTextLength)
|
|
{
|
|
const string ellipsis = "...";
|
|
|
|
if (text.Length <= maxTextLength)
|
|
return text;
|
|
|
|
return string.Concat(text.Substring(0, maxTextLength - ellipsis.Length), ellipsis);
|
|
}
|
|
|
|
readonly Action<Rect> mButtonClicked;
|
|
readonly Action mRepaintToolbar;
|
|
|
|
readonly GUIContent mTruncatedTextGUIContent;
|
|
readonly GUIContent mTooltipButtonGUIContent;
|
|
|
|
bool mIsVisible;
|
|
bool mIsLayoutValid;
|
|
|
|
Texture mLeftIcon;
|
|
Texture mRightIcon;
|
|
Texture mDropDownIcon;
|
|
|
|
int mMaxTextLenght = 35;
|
|
string mText;
|
|
GUIStyle mButtonStyle;
|
|
GUIStyle mTextStyle;
|
|
|
|
Layout mLayout;
|
|
int mBatchUpdateCount;
|
|
|
|
struct Layout
|
|
{
|
|
internal const int DROPDOWN_ICON_SIZE = 12;
|
|
internal const int LEFT_ICON_SIZE = 16;
|
|
internal const int RIGHT_ICON_SIZE = 16;
|
|
|
|
internal float LeftIconX;
|
|
internal Vector2 TextSize;
|
|
internal float TextX;
|
|
internal float RightIconX;
|
|
internal float DropDownIconX;
|
|
internal float TotalWidth;
|
|
}
|
|
}
|
|
}
|