diff --git a/Editor/EditorMessageUtility.cs b/Editor/EditorMessageUtility.cs index 7fbd560..9dc4799 100644 --- a/Editor/EditorMessageUtility.cs +++ b/Editor/EditorMessageUtility.cs @@ -95,13 +95,20 @@ public static Texture GetCustomDataIcon() return EditorGUIUtility.IconContent("animation.play").image; } + public static Texture GetClearIcon() + { + return EditorGUIUtility.IconContent("clear").image; + } + - public static Image NewImage(Texture image = null, string tooltip = null, DisplayStyle display = DisplayStyle.Flex) + public static Image NewImage(Texture image = null, string tooltip = null, + DisplayStyle display = DisplayStyle.Flex, PickingMode pickingMode = PickingMode.Ignore) { Image imageElement = new Image { tooltip = tooltip, image = image, + pickingMode = pickingMode, style = { display = display, diff --git a/Editor/MessageBanner.cs b/Editor/MessageBanner.cs index 31d61e3..bb8e2ec 100644 --- a/Editor/MessageBanner.cs +++ b/Editor/MessageBanner.cs @@ -31,14 +31,16 @@ public bool ShowMessageTypeCount } } - public object Source { get; private set; } - public string SourceName { get; private set; } + public object Source { get; set; } + public string SourceName { get; set; } + public bool AllowClearMessages { get; set; } public IList Messages { get; private set; } public int CurrentMessageIndex { get; private set; } - public MessageBanner(object source, string sourceName, bool showMessageTypeCount = true) - : this(null, source, sourceName, showMessageTypeCount) { } + public MessageBanner(object source, string sourceName, + bool showMessageTypeCount = true, bool allowClearMessages = false) + : this(null, source, sourceName, showMessageTypeCount, allowClearMessages) { } /// /// 消息横幅。 @@ -48,12 +50,13 @@ public MessageBanner(object source, string sourceName, bool showMessageTypeCount /// 调用源的名字。 /// 是否显示各类型消息的计数。 public MessageBanner(IList messages, object source, string sourceName, - bool showMessageTypeCount = true) + bool showMessageTypeCount = true, bool allowClearMessages = false) { _showMessageTypeCount = showMessageTypeCount; Messages = messages; Source = source; SourceName = sourceName; + AllowClearMessages = allowClearMessages; style.flexDirection = FlexDirection.Row; style.paddingLeft = 4; @@ -208,9 +211,9 @@ private void RefreshMessageTypeCountDisplay() private void OnClick(ClickEvent evt) { - if (evt.clickCount == 2) + if (evt.clickCount == 2 && Messages != null && Messages.Count > 0) { - MessageViewer.Open(Messages, Source, SourceName); + MessageViewer.Open(Messages, Source, SourceName, AllowClearMessages); } } diff --git a/Editor/MessageViewer.cs b/Editor/MessageViewer.cs index b112e56..2f505d0 100644 --- a/Editor/MessageViewer.cs +++ b/Editor/MessageViewer.cs @@ -21,7 +21,8 @@ public class MessageViewer : EditorWindow /// 调用源。当调用源变为null时,消息查看器窗口会自动关闭。若传入null,则消息查看器窗口不会自动关闭。 /// 调用源的名字。会出现在消息查看器窗口标题中。 /// - public static MessageViewer Open(IList messages, object source, string sourceName) + public static MessageViewer Open(IList messages, object source, string sourceName, + bool allowClearMessages = true) { if (source == null) { @@ -32,6 +33,7 @@ public static MessageViewer Open(IList messages, object source, string _sourcelessInstance._sourceless = true; } + _sourcelessInstance._showClearButton = allowClearMessages; _sourcelessInstance.SetMessages(messages); _sourcelessInstance.Show(); _sourcelessInstance.Focus(); @@ -47,15 +49,16 @@ public static MessageViewer Open(IList messages, object source, string viewer.titleContent = new GUIContent($"Message Viewer({sourceName ?? source})"); viewer.Source = source; + viewer._showClearButton = allowClearMessages; viewer.SetMessages(messages); viewer.Show(); viewer.Focus(); return viewer; } - public static MessageViewer Open(object source, string sourceName) + public static MessageViewer Open(object source, string sourceName, bool allowClearMessages = true) { - return Open(null, source, sourceName); + return Open(null, source, sourceName, allowClearMessages); } @@ -69,6 +72,7 @@ public static MessageViewer Open(object source, string sourceName) private MessageTypeToggle _infoMessageToggle; private MessageTypeToggle _warningMessageToggle; private MessageTypeToggle _errorMessageToggle; + private ToolbarButton _clearButton; private ListView _messageListView; private MessageDetailsElement _messageDetailsElement; @@ -110,6 +114,9 @@ public static MessageViewer Open(object source, string sourceName) [SerializeField] [HideInInspector] private bool _showErrorMessage = true; + [SerializeField] + [HideInInspector] + private bool _showClearButton; #endregion @@ -249,6 +256,19 @@ private void CreateGUI() _errorMessageToggle.RegisterValueChangedCallback(OnMessageTypeToggleChanged); typeToggleContainer.Add(_errorMessageToggle); + // Clear Button + _clearButton = new ToolbarImageButton(EditorMessageUtility.GetClearIcon(), ClearMessages) + { + tooltip = "Clear All Messages", + style = + { + width = 22, + flexShrink = 0, + display = _showClearButton ? DisplayStyle.Flex : DisplayStyle.None, + } + }; + toolbar.Add(_clearButton); + #endregion @@ -487,6 +507,12 @@ private bool TestMessageSearchPattern(Message message) return message.message.Contains(_searchPattern, StringComparison.OrdinalIgnoreCase); } + private void ClearMessages() + { + Messages?.Clear(); + Refresh(); + } + private void TryClose() { if (_sourcelessInstance == this) diff --git a/Editor/ToolbarImageButton.cs b/Editor/ToolbarImageButton.cs new file mode 100644 index 0000000..fa34c1b --- /dev/null +++ b/Editor/ToolbarImageButton.cs @@ -0,0 +1,32 @@ +using System; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace GBG.EditorMessages.Editor +{ + internal class ToolbarImageButton : ToolbarButton + { + public Texture Image + { + get => _image.image; + set => _image.image = value; + } + + private readonly Image _image; + + + public ToolbarImageButton(Action clickEvent) : base(clickEvent) + { + float iconSize = EditorMessageUtility.GlobalIconSize; + + _image = EditorMessageUtility.NewImage(); + Insert(0, _image); + } + + public ToolbarImageButton(Texture image, Action clickEvent) : this(clickEvent) + { + Image = image; + } + } +} diff --git a/Editor/ToolbarImageButton.cs.meta b/Editor/ToolbarImageButton.cs.meta new file mode 100644 index 0000000..02ca3c6 --- /dev/null +++ b/Editor/ToolbarImageButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d024f17d496fbb54c919df45a7683f91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index a08b885..51ffa61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.greenbamboogames.editormessages", - "version": "1.0.2", + "version": "1.0.3", "displayName": "Editor Messages!", "description": "Show custom messages in Unity Editor.", "unity": "2022.3",