Unity-WebSocket/Assets/FishNet/Runtime/Editor/NewNetworkBehaviour/SettingsProvider.cs
2025-06-28 11:28:54 +03:30

103 lines
4.0 KiB
C#

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using UnitySettingsProviderAttribute = UnityEditor.SettingsProviderAttribute;
using UnitySettingsProvider = UnityEditor.SettingsProvider;
using FishNet.Configuring;
using System.IO;
using System;
using System.Text.RegularExpressions;
namespace FishNet.Editing.NewNetworkBehaviourScript
{
internal static class SettingsProvider
{
private static CreateNewNetworkBehaviourConfigurations _settings;
private static GUIContent _folderIcon;
private static readonly Regex SlashRegex = new(@"[\\//]");
[UnitySettingsProvider]
private static UnitySettingsProvider Create()
{
return new("Project/Fish-Networking/New NetworkBehaviour Template", SettingsScope.Project)
{
label = "New NetworkBehaviour Template",
guiHandler = OnGUI,
keywords = new string[]
{
"Fish",
"Networking",
"CreateNewNetworkBehaviour",
"Template"
},
};
}
private static void OnGUI(string searchContext)
{
if (_settings == null)
_settings = Configuration.Configurations.CreateNewNetworkBehaviour;
if (_folderIcon == null)
_folderIcon = EditorGUIUtility.IconContent("d_FolderOpened Icon");
EditorGUI.BeginChangeCheck();
GUILayoutOption iconWidthConstraint = GUILayout.MaxWidth(32.0f);
GUILayoutOption iconHeightConstraint = GUILayout.MaxHeight(EditorGUIUtility.singleLineHeight);
if (GUILayout.Button("Edit template"))
{
CreateNewNetworkBehaviour.EnsureTemplateExists();
try
{
System.Diagnostics.Process.Start(CreateNewNetworkBehaviour.TemplatePath);
}
catch (Exception e)
{
Debug.LogError($"An issue occurred while trying to launch the NetworkBehaviour template. {e.Message}");
}
}
GUILayout.Space(20);
EditorGUILayout.BeginHorizontal();
GUILayout.Label("Template directory: ", GUILayout.MaxWidth(150));
string newDirectoryPath;
newDirectoryPath = EditorGUILayout.DelayedTextField(_settings.templateDirectoryPath, GUILayout.MaxWidth(600));
if (newDirectoryPath.StartsWith("Assets") && Directory.Exists(newDirectoryPath))
{
_settings.templateDirectoryPath = newDirectoryPath;
}
else
{
EditorWindow.focusedWindow.ShowNotification(new($"Directory must be inside the Assets folder."), 2);
}
if (GUILayout.Button(_folderIcon, iconHeightConstraint, iconWidthConstraint))
{
newDirectoryPath = EditorUtility.OpenFolderPanel("Select template directory", _settings.templateDirectoryPath, "");
}
if (newDirectoryPath.StartsWith(Application.dataPath, StringComparison.OrdinalIgnoreCase))
{
newDirectoryPath = SlashRegex.Replace(newDirectoryPath.Remove(0, Path.GetDirectoryName(Application.dataPath).Length + 1), Path.DirectorySeparatorChar.ToString());
_settings.templateDirectoryPath = newDirectoryPath;
}
else if (!newDirectoryPath.StartsWith(Application.dataPath, StringComparison.OrdinalIgnoreCase) && !newDirectoryPath.StartsWith("Assets"))
{
EditorWindow.focusedWindow.ShowNotification(new($"Directory must be inside the Assets folder."), 2);
}
EditorGUILayout.EndHorizontal();
// EditorGUILayout.HelpBox("By default MonoBehaviour script template will be copied", MessageType.Info);
if (EditorGUI.EndChangeCheck())
Configuration.Configurations.Write(true);
}
}
}
#endif