Files
project-reset/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs
2026-01-06 22:42:15 -05:00

71 lines
2.8 KiB
C#

using System;
using System.Threading.Tasks;
using SingularityGroup.HotReload.Editor.Cli;
using SingularityGroup.HotReload.Editor.Localization;
using UnityEditor;
namespace SingularityGroup.HotReload.Editor {
internal sealed class ExposeServerOption : ComputerOptionBase {
public override string ShortSummary => Translations.Settings.OptionExposeServerShort;
public override string Summary => Translations.Settings.OptionExposeServerFull;
public override void InnerOnGUI() {
string description;
if (GetValue()) {
description = Translations.Settings.OptionExposeServerDescriptionEnabled;
} else {
description = Translations.Settings.OptionExposeServerDescriptionDisabled;
}
EditorGUILayout.LabelField(description, HotReloadWindowStyles.WrapStyle);
}
public override bool GetValue() {
return HotReloadPrefs.ExposeServerToLocalNetwork;
}
public override void SetValue(SerializedObject so, bool val) {
// AllowAndroidAppToMakeHttpRequestsOption
if (val == HotReloadPrefs.ExposeServerToLocalNetwork) {
return;
}
HotReloadPrefs.ExposeServerToLocalNetwork = val;
if (val) {
// they allowed this one for mobile builds, so now we allow everything else needed for player build to work with HR
new AllowAndroidAppToMakeHttpRequestsOption().SetValue(so, true);
}
RunTask(() => {
RunOnMainThreadSync(() => {
var isRunningResult = ServerHealthCheck.I.IsServerHealthy;
if (isRunningResult) {
var restartServer = EditorUtility.DisplayDialog(Translations.Dialogs.DialogTitleHotReload,
string.Format(Translations.Dialogs.DialogMessageRestartExposeServer, Summary),
Translations.Dialogs.DialogButtonRestartServer, Translations.Dialogs.DialogButtonDontRestart);
if (restartServer) {
CodePatcher.I.ClearPatchedMethods();
EditorCodePatcher.RestartCodePatcher().Forget();
}
}
});
});
}
void RunTask(Action action) {
var token = HotReloadWindow.Current.cancelToken;
Task.Run(() => {
if (token.IsCancellationRequested) return;
try {
action();
} catch (Exception ex) {
ThreadUtility.LogException(ex, token);
}
}, token);
}
void RunOnMainThreadSync(Action action) {
ThreadUtility.RunOnMainThread(action, HotReloadWindow.Current.cancelToken);
}
}
}