Update HotReload
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
# do not include HotReloadSettingsObject inside the upm package.
|
||||
# (needs to be editable by the user)
|
||||
# (only created on first Android build)
|
||||
/Resources/HotReloadSettingsObject.asset
|
||||
/Resources/HotReloadSettingsObject.asset.meta
|
||||
/Resources.meta
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a025eec5cd1851429c24e953a58d48b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8999c2c2d9cadcb44a617a5df023bfa1
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67658aafb8404f0eb9496812ba4bb8a4
|
||||
timeCreated: 1678721795
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d7493a30e78d4ec783ead20baea2c4d2
|
||||
timeCreated: 1678721534
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea93d0fb53fe44419e8a20d4701918ef
|
||||
timeCreated: 1773924481
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor {
|
||||
internal static class ReportWindowAPI {
|
||||
public static void OpenBugReport(string title = null, string description = null) {
|
||||
HotReloadBugReportWindow.Open(
|
||||
ReportMode.BugReport,
|
||||
discordUrl: Constants.DiscordInviteUrl,
|
||||
contactUrl: Constants.ContactURL,
|
||||
email: HotReloadPrefs.LicenseEmail,
|
||||
details: description,
|
||||
title: title
|
||||
);
|
||||
}
|
||||
|
||||
public static void OpenFeedback(
|
||||
Func<Report, Task<string>> submitHandler = null,
|
||||
string discordUrl = null,
|
||||
string contactUrl = null,
|
||||
string title = null,
|
||||
string email = null,
|
||||
string feedback = null
|
||||
) {
|
||||
HotReloadBugReportWindow.Open(
|
||||
ReportMode.Feedback,
|
||||
discordUrl: Constants.DiscordInviteUrl,
|
||||
contactUrl: Constants.ContactURL,
|
||||
email: HotReloadPrefs.LicenseEmail
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8a7505b2e85b481479de6861e72e954a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,616 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEngine.UIElements;
|
||||
using SingularityGroup.HotReload.Editor.Localization;
|
||||
using Application = UnityEngine.Application;
|
||||
#if UNITY_2021_3_OR_NEWER
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using SingularityGroup.HotReload.Editor.Cli;
|
||||
using SingularityGroup.HotReload.EditorDependencies;
|
||||
using CompressionLevel = System.IO.Compression.CompressionLevel;
|
||||
#endif
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor {
|
||||
|
||||
internal enum ReportMode {
|
||||
BugReport,
|
||||
Feedback
|
||||
}
|
||||
|
||||
internal class HotReloadBugReportWindow : EditorWindow {
|
||||
static List<string> SeverityChoices => new List<string> {
|
||||
Translations.BugReport.SeverityNormal,
|
||||
Translations.BugReport.SeverityLow,
|
||||
Translations.BugReport.SeverityHigh,
|
||||
};
|
||||
|
||||
static List<string> FrequencyChoices => new List<string> {
|
||||
Translations.BugReport.FrequencyFirstTime,
|
||||
Translations.BugReport.FrequencySometimes,
|
||||
Translations.BugReport.FrequencyAlways,
|
||||
};
|
||||
|
||||
[SerializeField] ReportMode _mode = ReportMode.BugReport;
|
||||
|
||||
[SerializeField] VisualTreeAsset visualTree;
|
||||
[SerializeField] StyleSheet styleSheet;
|
||||
|
||||
string _discordUrl;
|
||||
string _contactUrl;
|
||||
|
||||
TextField _titleField;
|
||||
PopupField<string> _severityPopup;
|
||||
PopupField<string> _frequencyPopup;
|
||||
TextField _emailField;
|
||||
IMGUIContainer _detailsContainer;
|
||||
[SerializeField] string _detailsText = "";
|
||||
[SerializeField] string _emailText = "";
|
||||
[SerializeField] string _titleText = "";
|
||||
Label _detailsLabel;
|
||||
Label _validationLabel;
|
||||
Button _submitButton;
|
||||
VisualElement _severitySection;
|
||||
VisualElement _frequencySection;
|
||||
ScrollView _scrollView;
|
||||
VisualElement _detailsSlot;
|
||||
|
||||
VisualElement _successScreen;
|
||||
VisualElement _failureScreen;
|
||||
Label _failureErrorLabel;
|
||||
Button _tabBugReport;
|
||||
Button _tabFeedback;
|
||||
|
||||
bool _isOnResultScreen;
|
||||
|
||||
static Vector2 GetMinSize(ReportMode mode) {
|
||||
return mode == ReportMode.Feedback
|
||||
? new Vector2(420, 500)
|
||||
: new Vector2(420, 620);
|
||||
}
|
||||
|
||||
#region Public API
|
||||
/// <summary>
|
||||
/// Opens the window with the given mode and configuration.
|
||||
/// Prefer using <see cref="ReportWindowAPI"/> for a cleaner call site.
|
||||
/// </summary>
|
||||
public static HotReloadBugReportWindow Open(
|
||||
ReportMode mode,
|
||||
string discordUrl = null,
|
||||
string contactUrl = null,
|
||||
string title = null,
|
||||
string email = null,
|
||||
string details = null
|
||||
) {
|
||||
var wnd = GetWindow<HotReloadBugReportWindow>(utility: true);
|
||||
wnd._mode = mode;
|
||||
wnd._discordUrl = discordUrl;
|
||||
wnd._contactUrl = contactUrl;
|
||||
wnd.titleContent = new GUIContent(
|
||||
mode == ReportMode.Feedback
|
||||
? Translations.BugReport.WindowTitleFeedback
|
||||
: Translations.BugReport.WindowTitleBugReport);
|
||||
wnd.minSize = wnd.maxSize = GetMinSize(mode);
|
||||
|
||||
wnd._titleText = title;
|
||||
wnd._emailText = email;
|
||||
wnd._detailsText = details;
|
||||
|
||||
wnd.RebuildUI();
|
||||
return wnd;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prefills form fields on an already-open window. Null values are ignored.
|
||||
/// </summary>
|
||||
public void Prefill() {
|
||||
if (_titleText != null && _titleField != null) {
|
||||
_titleField.SetValueWithoutNotify(_titleText);
|
||||
}
|
||||
if (_emailText != null && _emailField != null) {
|
||||
_emailField.SetValueWithoutNotify(_emailText);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
void OnEnable() {
|
||||
RebuildUI();
|
||||
}
|
||||
|
||||
bool HasUnsavedFormContent() {
|
||||
if (_isOnResultScreen) {
|
||||
return false;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(_titleField.value)) {
|
||||
return true;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(_detailsText) && _detailsText != Translations.BugReport.PlaceholderDetails) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnDestroy() {
|
||||
if (_detailsContainer != null && _detailsSlot != null) {
|
||||
_detailsSlot.Remove(_detailsContainer);
|
||||
_detailsContainer = null;
|
||||
}
|
||||
if (!HasUnsavedFormContent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool discard = EditorUtility.DisplayDialog(
|
||||
Translations.BugReport.DiscardDialogTitle,
|
||||
Translations.BugReport.DiscardDialogMessage,
|
||||
Translations.BugReport.DiscardDialogConfirm,
|
||||
Translations.BugReport.DiscardDialogCancel);
|
||||
|
||||
if (!discard) {
|
||||
_emailText = _emailField.value;
|
||||
_titleText = _titleField.value;
|
||||
EditorApplication.delayCall += () => {
|
||||
Open(_mode, _discordUrl, _contactUrl);
|
||||
};
|
||||
} else {
|
||||
_detailsText = null;
|
||||
_emailText = null;
|
||||
_titleText = null;
|
||||
}
|
||||
}
|
||||
|
||||
void RebuildUI() {
|
||||
DetachCallbacks();
|
||||
if (visualTree == null) {
|
||||
Log.Warning($"Could not open bug report. Please reach out to our support: {_contactUrl}");
|
||||
return;
|
||||
}
|
||||
|
||||
rootVisualElement.Clear();
|
||||
visualTree.CloneTree(rootVisualElement);
|
||||
if (styleSheet != null) {
|
||||
rootVisualElement.styleSheets.Add(styleSheet);
|
||||
}
|
||||
|
||||
QueryElements();
|
||||
AttachIMGUIContainers();
|
||||
ApplyTranslations();
|
||||
CreatePopupFields();
|
||||
ApplyMode();
|
||||
SetupSubmit();
|
||||
SetupResultScreenButtons();
|
||||
FixSingleLineFieldAlignment(_titleField);
|
||||
FixSingleLineFieldAlignment(_emailField);
|
||||
Prefill();
|
||||
AttachCallbacks();
|
||||
|
||||
ShowFormView();
|
||||
}
|
||||
|
||||
void AttachIMGUIContainers() {
|
||||
_detailsSlot = rootVisualElement.Q<VisualElement>("details-field-slot");
|
||||
// Build the IMGUI textarea and inject it
|
||||
_detailsContainer = new IMGUIContainer(DrawDetailsField);
|
||||
_detailsSlot.Add(_detailsContainer);
|
||||
}
|
||||
|
||||
void QueryElements() {
|
||||
_titleField = rootVisualElement.Q<TextField>("title-field");
|
||||
_emailField = rootVisualElement.Q<TextField>("email-field");
|
||||
_detailsLabel = rootVisualElement.Q<Label>("details-label");
|
||||
_validationLabel = rootVisualElement.Q<Label>("validation-label");
|
||||
_submitButton = rootVisualElement.Q<Button>("submit-button");
|
||||
_severitySection = rootVisualElement.Q<VisualElement>("severity-section");
|
||||
_frequencySection = rootVisualElement.Q<VisualElement>("frequency-section");
|
||||
_scrollView = rootVisualElement.Q<ScrollView>("scroll-view");
|
||||
|
||||
_successScreen = rootVisualElement.Q<VisualElement>("success-screen");
|
||||
_failureScreen = rootVisualElement.Q<VisualElement>("failure-screen");
|
||||
_failureErrorLabel = rootVisualElement.Q<Label>("failure-error-label");
|
||||
_tabBugReport = rootVisualElement.Q<Button>("tab-bug-report");
|
||||
_tabFeedback = rootVisualElement.Q<Button>("tab-feedback");
|
||||
}
|
||||
|
||||
private void DrawDetailsField() {
|
||||
// GUILayout.ExpandHeight lets it grow; clamp min so it doesn't collapse
|
||||
_detailsText = EditorGUILayout.TextArea(
|
||||
_detailsText,
|
||||
GUILayout.ExpandWidth(true),
|
||||
GUILayout.MinHeight(160)
|
||||
);
|
||||
}
|
||||
|
||||
void ApplyTranslations() {
|
||||
// Form labels
|
||||
rootVisualElement.Q<Label>(className: "section-label") // Title section — first one
|
||||
?.SetText(Translations.BugReport.LabelTitle);
|
||||
rootVisualElement.Q("severity-section")?.Q<Label>(className: "section-label")
|
||||
?.SetText(Translations.BugReport.LabelIssueSeverity);
|
||||
rootVisualElement.Q("frequency-section")?.Q<Label>(className: "section-label")
|
||||
?.SetText(Translations.BugReport.LabelHowOften);
|
||||
rootVisualElement.Q("tabs")?.Q<Button>("tab-bug-report")
|
||||
?.SetText(Translations.BugReport.TabBugReport);
|
||||
rootVisualElement.Q("tabs")?.Q<Button>("tab-feedback")
|
||||
?.SetText(Translations.BugReport.TabFeedback);
|
||||
|
||||
// Contact section — scoped by class since it has no name
|
||||
var contactSection = rootVisualElement.Q(className: "contact-section");
|
||||
contactSection?.Q<Label>(className: "section-label")?.SetText(Translations.BugReport.LabelContactEmail);
|
||||
contactSection?.Q<Label>(className: "fine-print")?.SetText(Translations.BugReport.LabelContactEmailFinePrint);
|
||||
|
||||
// Submit button
|
||||
_submitButton.text = Translations.BugReport.ButtonSubmit;
|
||||
|
||||
// Success screen
|
||||
var successContent = _successScreen?.Q(className: "result-content");
|
||||
successContent?.Q<Label>(className: "result-title")?.SetText(Translations.BugReport.SuccessTitle);
|
||||
successContent?.Q<Label>(className: "result-message")?.SetText(Translations.BugReport.SuccessMessage);
|
||||
_successScreen?.Q<Button>("success-discord-button")?.SetText(Translations.BugReport.ButtonJoinDiscord);
|
||||
|
||||
|
||||
// Failure screen
|
||||
var failureContent = _failureScreen?.Q(className: "result-content");
|
||||
failureContent?.Q<Label>(className: "result-title")?.SetText(Translations.BugReport.FailureTitle);
|
||||
// result-message--error is the dynamic error label, skip it; translate the static one
|
||||
var failureMessages = failureContent?.Query<Label>(className: "result-message").ToList();
|
||||
if (failureMessages != null) {
|
||||
foreach (var lbl in failureMessages) {
|
||||
if (!lbl.ClassListContains("result-message--error")) {
|
||||
lbl.text = Translations.BugReport.FailureMessage;
|
||||
}
|
||||
}
|
||||
}
|
||||
_failureScreen?.Q<Button>("failure-discord-button")?.SetText(Translations.BugReport.ButtonJoinDiscord);
|
||||
_failureScreen?.Q<Button>("failure-contact-button")?.SetText(Translations.BugReport.ButtonContactUs);
|
||||
}
|
||||
|
||||
#region View switching
|
||||
void ShowFormView() {
|
||||
_isOnResultScreen = false;
|
||||
_scrollView.style.display = DisplayStyle.Flex;
|
||||
_successScreen.RemoveFromClassList("result-screen--visible");
|
||||
_failureScreen.RemoveFromClassList("result-screen--visible");
|
||||
}
|
||||
|
||||
void ShowSuccessScreen() {
|
||||
_isOnResultScreen = true;
|
||||
_scrollView.style.display = DisplayStyle.None;
|
||||
_tabFeedback.style.display = DisplayStyle.None;
|
||||
_tabBugReport.style.display = DisplayStyle.None;
|
||||
_failureScreen.RemoveFromClassList("result-screen--visible");
|
||||
_successScreen.AddToClassList("result-screen--visible");
|
||||
}
|
||||
|
||||
void ShowFailureScreen(string errorMessage) {
|
||||
_scrollView.style.display = DisplayStyle.None;
|
||||
_tabFeedback.style.display = DisplayStyle.None;
|
||||
_tabBugReport.style.display = DisplayStyle.None;
|
||||
_successScreen.RemoveFromClassList("result-screen--visible");
|
||||
|
||||
if (_failureErrorLabel != null) {
|
||||
if (string.IsNullOrEmpty(errorMessage)) {
|
||||
_failureErrorLabel.style.display = DisplayStyle.None;
|
||||
} else {
|
||||
_failureErrorLabel.text = errorMessage;
|
||||
_failureErrorLabel.style.display = DisplayStyle.Flex;
|
||||
}
|
||||
}
|
||||
|
||||
_failureScreen.AddToClassList("result-screen--visible");
|
||||
_isOnResultScreen = true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
void ApplyMode() {
|
||||
bool isBugReport = _mode == ReportMode.BugReport;
|
||||
this.minSize = this.maxSize = GetMinSize(_mode);
|
||||
|
||||
if (isBugReport) {
|
||||
_severitySection.style.display = DisplayStyle.Flex;
|
||||
_frequencySection.style.display = DisplayStyle.Flex;
|
||||
_severityPopup.style.display = DisplayStyle.Flex;
|
||||
_frequencyPopup.style.display = DisplayStyle.Flex;
|
||||
_detailsLabel.text = Translations.BugReport.LabelDetails;
|
||||
_tabBugReport.AddToClassList("tab--active");
|
||||
_tabFeedback.RemoveFromClassList("tab--active");
|
||||
if (string.IsNullOrEmpty(_detailsText)) {
|
||||
_detailsText = Translations.BugReport.PlaceholderDetails;
|
||||
_detailsContainer.MarkDirtyRepaint();
|
||||
}
|
||||
} else {
|
||||
_severitySection.style.display = DisplayStyle.None;
|
||||
_frequencySection.style.display = DisplayStyle.None;
|
||||
_severityPopup.style.display = DisplayStyle.None;
|
||||
_frequencyPopup.style.display = DisplayStyle.None;
|
||||
_detailsLabel.text = Translations.BugReport.LabelFeedback;
|
||||
_tabFeedback.AddToClassList("tab--active");
|
||||
_tabBugReport.RemoveFromClassList("tab--active");
|
||||
if (_detailsText == Translations.BugReport.PlaceholderDetails) {
|
||||
_detailsText = string.Empty;
|
||||
_detailsContainer.MarkDirtyRepaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreatePopupFields() {
|
||||
var severityContainer = rootVisualElement.Q<VisualElement>("severity-container");
|
||||
_severityPopup = new PopupField<string>(
|
||||
string.Empty,
|
||||
SeverityChoices,
|
||||
0);
|
||||
_severityPopup.AddToClassList("input-field");
|
||||
severityContainer.Add(_severityPopup);
|
||||
|
||||
var frequencyContainer = rootVisualElement.Q<VisualElement>("frequency-container");
|
||||
_frequencyPopup = new PopupField<string>(
|
||||
string.Empty,
|
||||
FrequencyChoices,
|
||||
0);
|
||||
_frequencyPopup.AddToClassList("input-field");
|
||||
frequencyContainer.Add(_frequencyPopup);
|
||||
}
|
||||
|
||||
void SelectBugReport() {
|
||||
_mode = ReportMode.BugReport;
|
||||
ApplyMode();
|
||||
}
|
||||
|
||||
void SelectFeedback() {
|
||||
_mode = ReportMode.Feedback;
|
||||
ApplyMode();
|
||||
}
|
||||
|
||||
void AttachCallbacks() {
|
||||
if (_tabBugReport != null) {
|
||||
_tabBugReport.clicked += SelectBugReport;
|
||||
}
|
||||
if (_tabFeedback != null) {
|
||||
_tabFeedback.clicked += SelectFeedback;
|
||||
}
|
||||
if (_emailField != null) {
|
||||
_emailField.RegisterValueChangedCallback(SetEmailText);
|
||||
}
|
||||
if (_titleField != null) {
|
||||
_titleField.RegisterValueChangedCallback(SetTitleText);
|
||||
}
|
||||
}
|
||||
|
||||
void DetachCallbacks() {
|
||||
if (_tabBugReport != null) {
|
||||
_tabBugReport.clicked -= SelectBugReport;
|
||||
}
|
||||
if (_tabFeedback != null) {
|
||||
_tabFeedback.clicked -= SelectFeedback;
|
||||
}
|
||||
if (_emailField != null) {
|
||||
_emailField.UnregisterValueChangedCallback(SetEmailText);
|
||||
}
|
||||
if (_titleField != null) {
|
||||
_titleField.UnregisterValueChangedCallback(SetTitleText);
|
||||
}
|
||||
}
|
||||
|
||||
void SetEmailText(ChangeEvent<string> @event) {
|
||||
_emailText = @event.newValue;
|
||||
}
|
||||
|
||||
void SetTitleText(ChangeEvent<string> @event) {
|
||||
_titleText = @event.newValue;
|
||||
}
|
||||
|
||||
static void FixSingleLineFieldAlignment(TextField field) {
|
||||
field.RegisterCallback<GeometryChangedEvent>(evt => {
|
||||
var input = field.Q(className: "unity-text-field__input");
|
||||
if (input != null) {
|
||||
input.style.alignItems = Align.Center;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#region Validation & submit
|
||||
void SetupSubmit() {
|
||||
_submitButton.clickable.clicked += OnSubmitClicked;
|
||||
}
|
||||
|
||||
async void OnSubmitClicked() {
|
||||
HideValidation();
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_titleField.value)) {
|
||||
ShowValidation(Translations.BugReport.ValidationTitleRequired);
|
||||
return;
|
||||
}
|
||||
|
||||
var details = _detailsText;
|
||||
|
||||
var report = new Report {
|
||||
Mode = _mode,
|
||||
Id = Guid.NewGuid().ToString("N").Substring(0, 10),
|
||||
Title = _titleField.value.Trim(),
|
||||
Severity = _severityPopup != null ? _severityPopup.value : null,
|
||||
Frequency = _frequencyPopup != null ? _frequencyPopup.value : null,
|
||||
ContactEmail = _emailField.value != null ? _emailField.value.Trim() : null,
|
||||
Details = details != null ? details.Trim() : null
|
||||
};
|
||||
|
||||
_submitButton.SetEnabled(false);
|
||||
_submitButton.text = Translations.BugReport.ButtonSubmitting;
|
||||
|
||||
string error;
|
||||
try {
|
||||
error = await HandleBugReport(report);
|
||||
} catch (Exception ex) {
|
||||
error = string.Format(Translations.BugReport.SubmitHandlerError, ex.Message);
|
||||
}
|
||||
|
||||
if (this == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
_submitButton.SetEnabled(true);
|
||||
_submitButton.text = Translations.BugReport.ButtonSubmit;
|
||||
|
||||
if (error == null) {
|
||||
ShowSuccessScreen();
|
||||
if (report.Mode == ReportMode.BugReport) {
|
||||
// Back up log and patches locally for this bug report
|
||||
// They can be later used to simplify reproducing and fixing the issue, but due to our privacy policy they can't be auto uploaded so we need to ask for them
|
||||
#if UNITY_2021_3_OR_NEWER
|
||||
var logName = LogsHelper.FindRecentLog(HotReloadAboutTab.logsPath);
|
||||
try {
|
||||
CreateBugReportZip(
|
||||
Path.Combine(CliUtils.GetCliTempDir(), "Backup"),
|
||||
logName == null ? null : Path.Combine(HotReloadAboutTab.logsPath, logName),
|
||||
Path.Combine(PackageConst.LibraryCachePath, "BugReports", $"{report.Id}.zip")
|
||||
);
|
||||
} catch {
|
||||
// Fail silently. If zip is not available we will have to ask for a reproduce
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
ShowFailureScreen(error);
|
||||
}
|
||||
}
|
||||
|
||||
private static Task<string> HandleBugReport(Report report) {
|
||||
var hwId = HotReloadPrefs.HardwareId;
|
||||
if (string.IsNullOrEmpty(hwId)) {
|
||||
hwId = "unknown";
|
||||
}
|
||||
return RequestHelper.SubmitBugReport(new BugReport {
|
||||
reportId = report.Id,
|
||||
label = report.Mode == ReportMode.Feedback ? "Feedback" : "Bug Report",
|
||||
title = report.Title,
|
||||
description = report.Details,
|
||||
email = report.ContactEmail,
|
||||
hwId = hwId,
|
||||
hotReloadVersion = PackageConst.Version,
|
||||
unityVersion = Application.unityVersion,
|
||||
operatingSystemVersionInfo = SystemInfo.operatingSystem,
|
||||
});
|
||||
}
|
||||
|
||||
#if UNITY_2021_3_OR_NEWER
|
||||
private static void CreateBugReportZip(
|
||||
string sourceDir,
|
||||
string sourceFile,
|
||||
string outputZipPath
|
||||
) {
|
||||
var files = Directory.GetFiles(sourceDir, "*", SearchOption.AllDirectories);
|
||||
if (files.Length == 0 && sourceFile == null) {
|
||||
return;
|
||||
}
|
||||
Directory.CreateDirectory(new FileInfo(outputZipPath).DirectoryName!);
|
||||
|
||||
using (var stream = new FileStream(outputZipPath, FileMode.Create, FileAccess.Write, FileShare.None, 65536)) {
|
||||
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: false)) {
|
||||
if (sourceFile != null) {
|
||||
AddFileToArchive(archive, sourceFile, Path.GetFileName(sourceFile));
|
||||
}
|
||||
foreach (string filePath in Directory.GetFiles(sourceDir, "*", SearchOption.AllDirectories)) {
|
||||
string relativePath = Path.GetRelativePath(sourceDir, filePath);
|
||||
string entryName = $"Patches/{relativePath}".Replace('\\', '/');
|
||||
AddFileToArchive(archive, filePath, entryName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddFileToArchive(ZipArchive archive, string filePath, string entryName) {
|
||||
var entry = archive.CreateEntry(entryName, CompressionLevel.Optimal);
|
||||
using (var entryStream = entry.Open()) {
|
||||
using (var fileStream = new FileStream(
|
||||
filePath,
|
||||
FileMode.Open,
|
||||
FileAccess.Read,
|
||||
FileShare.ReadWrite, // allow concurrent writers
|
||||
65536)) {
|
||||
fileStream.CopyTo(entryStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void ShowValidation(string message) {
|
||||
_validationLabel.text = message;
|
||||
_validationLabel.AddToClassList("validation-label--visible");
|
||||
}
|
||||
|
||||
void HideValidation() {
|
||||
_validationLabel.RemoveFromClassList("validation-label--visible");
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Result screen buttons
|
||||
void SetupResultScreenButtons() {
|
||||
var successDiscord = rootVisualElement.Q<Button>("success-discord-button");
|
||||
var failureDiscord = rootVisualElement.Q<Button>("failure-discord-button");
|
||||
var failureContact = rootVisualElement.Q<Button>("failure-contact-button");
|
||||
|
||||
if (successDiscord != null) {
|
||||
successDiscord.clickable.clicked += OnDiscordClicked;
|
||||
}
|
||||
|
||||
if (failureDiscord != null) {
|
||||
failureDiscord.clickable.clicked += OnDiscordClicked;
|
||||
}
|
||||
if (failureContact != null) {
|
||||
failureContact.clickable.clicked += OnContactClicked;
|
||||
}
|
||||
|
||||
bool hasDiscord = !string.IsNullOrEmpty(_discordUrl);
|
||||
bool hasContact = !string.IsNullOrEmpty(_contactUrl);
|
||||
|
||||
if (successDiscord != null) {
|
||||
successDiscord.style.display = hasDiscord ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
if (failureDiscord != null) {
|
||||
failureDiscord.style.display = hasDiscord ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
if (failureContact != null) {
|
||||
failureContact.style.display = hasContact ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
}
|
||||
|
||||
void OnDiscordClicked() {
|
||||
if (!string.IsNullOrEmpty(_discordUrl)) {
|
||||
Application.OpenURL(_discordUrl);
|
||||
}
|
||||
}
|
||||
|
||||
void OnContactClicked() {
|
||||
if (!string.IsNullOrEmpty(_contactUrl)) {
|
||||
Application.OpenURL(_contactUrl);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
internal class Report {
|
||||
public string Id;
|
||||
public ReportMode Mode;
|
||||
public string Title;
|
||||
public string Severity;
|
||||
public string Frequency;
|
||||
public string ContactEmail;
|
||||
public string Details;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Small extension to avoid repetitive null checks on label/button text assignment
|
||||
namespace SingularityGroup.HotReload.Editor {
|
||||
internal static class VisualElementExtensions {
|
||||
public static void SetText(this UnityEngine.UIElements.Label label, string text) {
|
||||
if (label != null) label.text = text;
|
||||
}
|
||||
public static void SetText(this UnityEngine.UIElements.Button button, string text) {
|
||||
if (button != null) button.text = text;
|
||||
}
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9cceb96662b8a6841a0c7d4adaf01331
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences:
|
||||
- m_ViewDataDictionary: {instanceID: 0}
|
||||
- visualTree: {fileID: 9197481963319205126, guid: d9941d55822724b41bff198971988a21, type: 3}
|
||||
- styleSheet: {fileID: 7433441132597879392, guid: b8a805d0a53f99248a999c327b3a151e, type: 3}
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+218
@@ -0,0 +1,218 @@
|
||||
.root {
|
||||
padding: 12px;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.section {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.section-label {
|
||||
font-size: 13px;
|
||||
-unity-font-style: bold;
|
||||
margin-bottom: 4px;
|
||||
color: var(--unity-colors-label-text);
|
||||
}
|
||||
|
||||
.input-field {
|
||||
height: 28px;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
.contact-section {
|
||||
padding: 10px;
|
||||
border-width: 1px;
|
||||
border-color: var(--unity-colors-input_field-border);
|
||||
border-top-left-radius: 6px;
|
||||
border-top-right-radius: 6px;
|
||||
border-bottom-left-radius: 6px;
|
||||
border-bottom-right-radius: 6px;
|
||||
background-color: rgba(127, 127, 127, 0.08);
|
||||
}
|
||||
|
||||
.fine-print {
|
||||
font-size: 10px;
|
||||
color: var(--unity-colors-label-text-disabled);
|
||||
margin-top: 4px;
|
||||
white-space: normal;
|
||||
-unity-font-style: italic;
|
||||
}
|
||||
|
||||
.details-section {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.details-input {
|
||||
flex-grow: 1;
|
||||
min-height: 160px;
|
||||
}
|
||||
|
||||
.details-input > .unity-text-field__input {
|
||||
flex-grow: 1;
|
||||
-unity-text-align: upper-left;
|
||||
padding: 6px 8px;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.details-input .unity-text-element {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.validation-label {
|
||||
color: rgb(220, 60, 60);
|
||||
font-size: 12px;
|
||||
margin-bottom: 4px;
|
||||
-unity-text-align: middle-center;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.validation-label--visible {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.submit-row {
|
||||
flex-direction: row-reverse;
|
||||
margin-top: 4px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.submit-button {
|
||||
width: 100px;
|
||||
height: 30px;
|
||||
font-size: 13px;
|
||||
-unity-font-style: bold;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
/* Placeholder styling */
|
||||
.placeholder-active > .unity-text-field__input > .unity-text-element {
|
||||
color: var(--unity-colors-label-text-disabled);
|
||||
}
|
||||
|
||||
/* ── Result screens ── */
|
||||
|
||||
.result-screen {
|
||||
display: none;
|
||||
flex-grow: 1;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 32px;
|
||||
}
|
||||
|
||||
.result-screen--visible {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.result-content {
|
||||
align-items: center;
|
||||
max-width: 360px;
|
||||
}
|
||||
|
||||
.result-icon {
|
||||
font-size: 48px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.result-icon--success {
|
||||
color: rgb(40, 160, 40);
|
||||
}
|
||||
|
||||
.result-icon--failure {
|
||||
color: rgb(200, 40, 40);
|
||||
}
|
||||
|
||||
.result-title {
|
||||
font-size: 18px;
|
||||
-unity-font-style: bold;
|
||||
margin-bottom: 8px;
|
||||
color: var(--unity-colors-label-text);
|
||||
-unity-text-align: middle-center;
|
||||
}
|
||||
|
||||
.result-message {
|
||||
font-size: 12px;
|
||||
color: var(--unity-colors-label-text-disabled);
|
||||
margin-bottom: 6px;
|
||||
-unity-text-align: middle-center;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.result-message--error {
|
||||
color: rgb(200, 60, 60);
|
||||
-unity-font-style: italic;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.result-buttons {
|
||||
margin-top: 16px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.result-button {
|
||||
height: 30px;
|
||||
min-width: 180px;
|
||||
margin-bottom: 6px;
|
||||
font-size: 13px;
|
||||
-unity-font-style: bold;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
.result-button--primary {
|
||||
background-color: rgb(60, 120, 200);
|
||||
color: rgb(240, 240, 240);
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.result-button--primary:hover {
|
||||
background-color: rgb(75, 135, 215);
|
||||
}
|
||||
|
||||
.result-button--secondary {
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
color: var(--unity-colors-label-text-disabled);
|
||||
border-width: 1px;
|
||||
border-color: var(--unity-colors-input_field-border);
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.result-button--secondary:hover {
|
||||
color: var(--unity-colors-label-text);
|
||||
border-color: var(--unity-colors-input_field-border-focus);
|
||||
}
|
||||
|
||||
.tab-bar {
|
||||
flex-direction: row;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-color: var(--unity-colors-toolbar-border);
|
||||
background-color: var(--unity-colors-toolbar-background);
|
||||
flex-shrink: 0;
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
.tab {
|
||||
flex: 1;
|
||||
background-color: transparent;
|
||||
border-width: 0;
|
||||
border-radius: 0;
|
||||
color: var(--unity-colors-label-text-disabled);
|
||||
padding: 6px 0 5px 0;
|
||||
margin: 0 2px;
|
||||
-unity-font-style: normal;
|
||||
}
|
||||
|
||||
.tab--active {
|
||||
color: var(--unity-colors-label-text);
|
||||
background-color: var(--unity-colors-toolbar-button-background-checked);
|
||||
border-width: 0 0 2px 0;
|
||||
border-color: #3c79f2;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8a805d0a53f99248a999c327b3a151e
|
||||
ScriptedImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
||||
disableValidation: 0
|
||||
unsupportedSelectorAction: 0
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
|
||||
|
||||
<ui:VisualElement name="tabs" class="tab-bar">
|
||||
<ui:Button name="tab-bug-report" text="Bug Report" class="tab tab--active" />
|
||||
<ui:Button name="tab-feedback" text="Feedback" class="tab" />
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- Form view -->
|
||||
<ui:ScrollView name="scroll-view" class="root">
|
||||
|
||||
<!-- Title -->
|
||||
<ui:VisualElement class="section">
|
||||
<ui:Label text="Title" class="section-label" />
|
||||
<ui:TextField name="title-field" class="input-field" />
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- Issue Severity (PopupField added from C#, hidden in Feedback mode) -->
|
||||
<ui:VisualElement name="severity-section" class="section">
|
||||
<ui:Label text="Issue Severity" class="section-label" />
|
||||
<ui:VisualElement name="severity-container" />
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- How often does it happen? (hidden in Feedback mode) -->
|
||||
<ui:VisualElement name="frequency-section" class="section">
|
||||
<ui:Label text="How often does it happen?" class="section-label" />
|
||||
<ui:VisualElement name="frequency-container" />
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- Contact Email -->
|
||||
<ui:VisualElement class="section contact-section">
|
||||
<ui:Label text="Contact Email (optional)" class="section-label" />
|
||||
<ui:TextField name="email-field" class="input-field" />
|
||||
<ui:Label text="This email will only be used to follow up on this bug report and will not be stored or shared for any other purpose." class="fine-print" />
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- Details / Feedback -->
|
||||
<ui:VisualElement class="section details-section">
|
||||
<ui:Label name="details-label" text="Details" class="section-label" />
|
||||
<ui:VisualElement name="details-field-slot" class="details-input"/>
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- Validation message -->
|
||||
<ui:Label name="validation-label" class="validation-label" />
|
||||
|
||||
<!-- Submit -->
|
||||
<ui:VisualElement class="submit-row">
|
||||
<ui:Button name="submit-button" text="Submit" class="submit-button" />
|
||||
</ui:VisualElement>
|
||||
|
||||
</ui:ScrollView>
|
||||
|
||||
<!-- Success screen (hidden by default) -->
|
||||
<ui:VisualElement name="success-screen" class="result-screen">
|
||||
<ui:VisualElement class="result-content">
|
||||
<ui:Label text="✓" class="result-icon result-icon--success" />
|
||||
<ui:Label text="Report Submitted" class="result-title" />
|
||||
<ui:Label text="Thank you! We've accepted your report and are processing it." class="result-message" />
|
||||
<ui:VisualElement class="result-buttons">
|
||||
<ui:Button name="success-discord-button" text="Join Our Discord" class="result-button result-button--primary" />
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
|
||||
<!-- Failure screen (hidden by default) -->
|
||||
<ui:VisualElement name="failure-screen" class="result-screen">
|
||||
<ui:VisualElement class="result-content">
|
||||
<ui:Label text="✗" class="result-icon result-icon--failure" />
|
||||
<ui:Label text="Submission Failed" class="result-title" />
|
||||
<ui:Label name="failure-error-label" text="" class="result-message result-message--error" />
|
||||
<ui:Label text="Please reach out to us directly so we can help resolve your issue." class="result-message" />
|
||||
<ui:VisualElement class="result-buttons">
|
||||
<ui:Button name="failure-discord-button" text="Join Our Discord" class="result-button result-button--primary" />
|
||||
<ui:Button name="failure-contact-button" text="Contact Us" class="result-button result-button--primary" />
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
|
||||
</ui:UXML>
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d9941d55822724b41bff198971988a21
|
||||
ScriptedImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
|
||||
@@ -5,10 +5,34 @@ using System.Text;
|
||||
using SingularityGroup.HotReload.Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using SingularityGroup.HotReload.DTO;
|
||||
using SingularityGroup.HotReload.Localization;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor.Cli {
|
||||
internal static class CliUtils {
|
||||
static readonly string projectIdentifier = GetProjectIdentifier();
|
||||
|
||||
class Config {
|
||||
public bool singleInstance;
|
||||
}
|
||||
|
||||
public static string GetProjectIdentifier() {
|
||||
if (File.Exists(PackageConst.ConfigFilePath)) {
|
||||
var config = JsonConvert.DeserializeObject<Config>(File.ReadAllText(PackageConst.ConfigFilePath));
|
||||
if (config.singleInstance) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
var path = Path.GetFullPath(MultiplayerPlaymodeHelper.PathToMainProject("."));
|
||||
var name = new DirectoryInfo(path).Name;
|
||||
using (SHA256 sha256 = SHA256.Create()) {
|
||||
byte[] inputBytes = Encoding.UTF8.GetBytes(path);
|
||||
byte[] hashBytes = sha256.ComputeHash(inputBytes);
|
||||
var hash = BitConverter.ToString(hashBytes).Replace("-", "").Substring(0, 6).ToUpper();
|
||||
return $"{name}-{hash}";
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetTempDownloadFilePath(string osxFileName) {
|
||||
if (UnityHelper.Platform == RuntimePlatform.OSXEditor) {
|
||||
// project specific temp directory that is writeable on MacOS (Path.GetTempPath() wasn't when run through HotReload.app)
|
||||
@@ -19,6 +43,16 @@ namespace SingularityGroup.HotReload.Editor.Cli {
|
||||
}
|
||||
|
||||
public static string GetHotReloadTempDir() {
|
||||
if (UnityHelper.Platform == RuntimePlatform.WindowsEditor) {
|
||||
// library path interfereces with VS Code file watcher (Source Control window doesn't auto refresh)
|
||||
// so we pick data path on windows instead
|
||||
if (projectIdentifier != null) {
|
||||
return Path.Combine(GetAppDataPath(), "HotReloadServerTemp", projectIdentifier);
|
||||
} else {
|
||||
return Path.Combine(GetAppDataPath(), "HotReloadServerTemp");
|
||||
}
|
||||
}
|
||||
// store in library path on mac and linux since it works there
|
||||
return Path.GetFullPath(Path.Combine(PackageConst.LibraryCachePath, "HotReloadServerTemp"));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b0243b348dec4a308dc7b98e09842d2c
|
||||
timeCreated: 1673820875
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 090ed5d45f294f0d8799879206139bd6
|
||||
timeCreated: 1673824275
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -166,7 +166,7 @@ namespace SingularityGroup.HotReload.Editor.Cli {
|
||||
}
|
||||
|
||||
var searchAssemblies = string.Join(";", CodePatcher.I.GetAssemblySearchPaths());
|
||||
var cliArguments = $@"-u ""{unityProjDir}"" -s ""{slnPath}"" -t ""{cliTempDir}"" -a ""{searchAssemblies}"" -ver ""{PackageConst.Version}"" -proc ""{Process.GetCurrentProcess().Id}"" -assets ""{allAssetChanges}"" -p ""{port}"" -r {isReleaseMode} -detailed-error-reporting {detailedErrorReporting}";
|
||||
var cliArguments = $@"-u ""{unityProjDir}"" -s ""{slnPath}"" -t ""{cliTempDir}"" -a ""{searchAssemblies}"" -ver ""{PackageConst.Version}"" -proc ""{Process.GetCurrentProcess().Id}"" -assets ""{allAssetChanges}"" -p ""{port}"" -r {isReleaseMode} -detailed-error-reporting {detailedErrorReporting} -default-locale {PackageConst.DefaultLocale}";
|
||||
if (loginData != null) {
|
||||
cliArguments += $@" -email ""{loginData.email}"" -pass ""{loginData.password}""";
|
||||
}
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9f756ed6b78d428b8b9f83a6544317fe
|
||||
timeCreated: 1673820326
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cba48e21f76483da3ba615915e731fd
|
||||
timeCreated: 1673820542
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c894a69d595d4ada8cfa4afe23c68ab9
|
||||
timeCreated: 1673820131
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5ebeed1c29454bc78e5a9ee64f2c9def
|
||||
timeCreated: 1673821666
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e5644af69ec7404a8039ff2833610d48
|
||||
timeCreated: 1673822169
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using SingularityGroup.HotReload.Editor.Localization;
|
||||
using SingularityGroup.HotReload.DTO;
|
||||
using SingularityGroup.HotReload.Editor.Localization;
|
||||
using SingularityGroup.HotReload.Localization;
|
||||
using Translations = SingularityGroup.HotReload.Editor.Localization.Translations;
|
||||
|
||||
@@ -39,7 +40,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
public const int UpgradeLicenseNoteHideHeight = 150;
|
||||
public const int RateAppHideHeight = 325;
|
||||
public const int RateAppHideWidth = 300;
|
||||
public const int EventFiltersShownHideWidth = 275;
|
||||
public const int EventFiltersShownHideWidth = 325;
|
||||
public const int ConsumptionsHideWidth = 300;
|
||||
public const int ConsumptionsHideHeight = 360;
|
||||
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Constants.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -16,13 +16,14 @@ using Debug = UnityEngine.Debug;
|
||||
using Task = System.Threading.Tasks.Task;
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using SingularityGroup.HotReload.Editor.Localization;
|
||||
using SingularityGroup.HotReload.Localization;
|
||||
using SingularityGroup.HotReload.Newtonsoft.Json;
|
||||
using UnityEditor.Build;
|
||||
using UnityEditor.Compilation;
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEditorInternal;
|
||||
using UnityEngine.UIElements;
|
||||
using Translations = SingularityGroup.HotReload.Editor.Localization.Translations;
|
||||
|
||||
[assembly: InternalsVisibleTo("SingularityGroup.HotReload.IntegrationTests")]
|
||||
|
||||
@@ -130,7 +131,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
} else {
|
||||
UpdateHost();
|
||||
}
|
||||
licenseType = UnityLicenseHelper.GetLicenseType();
|
||||
licenseType = UnityLicenseHelper.GetLicenseType(isChina: PackageConst.DefaultLocale == Locale.SimplifiedChinese);
|
||||
compileChecker = CompileChecker.Create();
|
||||
compileChecker.onCompilationFinished += OnCompilationFinished;
|
||||
EditorApplication.delayCall += InstallUtility.CheckForNewInstall;
|
||||
@@ -149,7 +150,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
};
|
||||
|
||||
ServerHealthCheck.instance.CheckHealth();
|
||||
if (ServerHealthCheck.I.IsServerHealthy && !HotReloadPrefs.AutoClearTimeline) {
|
||||
if (ServerHealthCheck.I.IsServerHealthy) {
|
||||
HotReloadTimelineHelper.InitPersistedEvents().Forget();
|
||||
} else {
|
||||
HotReloadTimelineHelper.ClearPersistance();
|
||||
@@ -199,9 +200,8 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
HotReloadRunTab.recompiling = false;
|
||||
CompileMethodDetourer.Reset();
|
||||
|
||||
if (!HotReloadPrefs.AutoClearTimeline) {
|
||||
HotReloadTimelineHelper.CreateReloadFinishedEventEntry(patchedMethodsDisplayNames: new string[]{"Full assembly recompilation"});
|
||||
}
|
||||
|
||||
HotReloadTimelineHelper.CreateReloadFinishedEventEntry(patchedMethodsDisplayNames: new string[]{ Translations.Timeline.FullAssemblyRecompilation }, isCompile: true);
|
||||
};
|
||||
DetectEditorStart();
|
||||
DetectVersionUpdate();
|
||||
@@ -298,7 +298,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
if (!HotReloadPrefs.AutoRecompileUnsupportedChanges
|
||||
|| !CodePatcher.I.anyFailures
|
||||
&& (!HotReloadPrefs.AutoRecompilePartiallyUnsupportedChanges || !hasPartiallyUnsupportedPatches)
|
||||
|| _compileError
|
||||
|| _compileError && !CodePatcher.I.ignoreCompileErrorOnRecompileUnsupported
|
||||
|| isPlaying && !HotReloadPrefs.AutoRecompileUnsupportedChangesInPlayMode
|
||||
|| !isPlaying && !HotReloadPrefs.AutoRecompileUnsupportedChangesInEditMode
|
||||
) {
|
||||
@@ -706,6 +706,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
".asmdef",
|
||||
".asmref",
|
||||
".rsp",
|
||||
".additionalfile",
|
||||
};
|
||||
|
||||
public static string[] plugins = new[] {
|
||||
@@ -742,6 +743,8 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
if (assetPath.EndsWith(compileFile, StringComparison.Ordinal)) {
|
||||
HotReloadTimelineHelper.CreateErrorEventEntry(string.Format(Translations.Utility.AssemblyFileEditError, assetPath), entryType: EntryType.Foldout);
|
||||
CodePatcher.I.anyFailures = true;
|
||||
// we need to ignore compile errors because changes to compile files can inherently introduce them and without recompiling there is no way to resolve them
|
||||
CodePatcher.I.ignoreCompileErrorOnRecompileUnsupported = true;
|
||||
_applyingFailed = true;
|
||||
if (HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately || UnityEditorInternal.InternalEditorUtility.isApplicationActive) {
|
||||
TryRecompileUnsupportedChanges();
|
||||
@@ -808,7 +811,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
// Might be inside a package "file:"
|
||||
try {
|
||||
foreach (var package in UnityEditor.PackageManager.PackageInfo.GetAllRegisteredPackages()) {
|
||||
if (assetPath.StartsWith(package.resolvedPath.Replace("\\", "/"), StringComparison.Ordinal)) {
|
||||
if (assetPath.Replace("\\", "/").StartsWith(package.resolvedPath.Replace("\\", "/"), StringComparison.Ordinal)) {
|
||||
relativePathPackages = $"Packages/{package.name}/{assetPath.Substring(package.resolvedPath.Length)}";
|
||||
break;
|
||||
}
|
||||
@@ -1332,6 +1335,10 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
HotReloadPrefs.ErrorHidden = false;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(resp.hardwareId)) {
|
||||
HotReloadPrefs.HardwareId = resp.hardwareId;
|
||||
}
|
||||
|
||||
var oldStartupProgress = startupProgress;
|
||||
var newStartupProgress = Tuple.Create(
|
||||
resp.startupProgress,
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -28,9 +28,9 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
Paused,
|
||||
}
|
||||
|
||||
internal static readonly string greyIconPath = "grey";
|
||||
internal static readonly string greenIconPath = "green";
|
||||
internal static readonly string redIconPath = "red";
|
||||
internal static readonly string greyIconPath = "Hot_Reload_status_grey";
|
||||
internal static readonly string greenIconPath = "Hot_Reload_status_green";
|
||||
internal static readonly string redIconPath = "Hot_Reload_status_red";
|
||||
private static readonly Dictionary<IndicationStatus, string> IndicationIcon = new Dictionary<IndicationStatus, string> {
|
||||
// grey icon:
|
||||
{ IndicationStatus.FinishRegistration, greyIconPath },
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ee342ddb17e444c7a8927be3bd792ae2
|
||||
timeCreated: 1686087206
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b94f2314a044b109de488be1ccd5640
|
||||
timeCreated: 1674233674
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f41ad09ae4f04088bf6c9ad9a4fc0885
|
||||
timeCreated: 1674220023
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor {
|
||||
@@ -8,6 +9,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
EventsNew,
|
||||
Recompile,
|
||||
Logo,
|
||||
LogoNew,
|
||||
Close,
|
||||
FoldoutOpen,
|
||||
FoldoutClosed,
|
||||
@@ -18,16 +20,16 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
|
||||
internal static class GUIHelper {
|
||||
private static readonly Dictionary<InvertibleIcon, string> supportedInvertibleIcons = new Dictionary<InvertibleIcon, string> {
|
||||
{ InvertibleIcon.BugReport, "report_bug" },
|
||||
{ InvertibleIcon.Events, "events" },
|
||||
{ InvertibleIcon.Recompile, "refresh" },
|
||||
{ InvertibleIcon.Logo, "logo" },
|
||||
{ InvertibleIcon.Close, "close" },
|
||||
{ InvertibleIcon.FoldoutOpen, "foldout_open" },
|
||||
{ InvertibleIcon.FoldoutClosed, "foldout_closed" },
|
||||
{ InvertibleIcon.Spinner, "icon_loading_star_light_mode_96" },
|
||||
{ InvertibleIcon.Stop, "Icn_Stop" },
|
||||
{ InvertibleIcon.Start, "Icn_play" },
|
||||
{ InvertibleIcon.BugReport, "Hot_Reload_report_bug" },
|
||||
{ InvertibleIcon.Events, "Hot_Reload_events" },
|
||||
{ InvertibleIcon.Recompile, "Hot_Reload_refresh" },
|
||||
{ InvertibleIcon.Logo, "Hot_Reload_logo" },
|
||||
{ InvertibleIcon.Close, "Hot_Reload_close" },
|
||||
{ InvertibleIcon.FoldoutOpen, "Hot_Reload_foldout_open" },
|
||||
{ InvertibleIcon.FoldoutClosed, "Hot_Reload_foldout_closed" },
|
||||
{ InvertibleIcon.Spinner, "Hot_Reload_icon_loading_star_light_mode_96" },
|
||||
{ InvertibleIcon.Stop, "Hot_Reload_Icn_Stop" },
|
||||
{ InvertibleIcon.Start, "Hot_Reload_Icn_play" },
|
||||
};
|
||||
|
||||
private static readonly Dictionary<InvertibleIcon, Texture2D> invertibleIconCache = new Dictionary<InvertibleIcon, Texture2D>();
|
||||
@@ -66,7 +68,12 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
var cache = HotReloadWindowStyles.IsDarkMode ? invertibleIconInvertedCache : invertibleIconCache;
|
||||
|
||||
if (!cache.TryGetValue(invertibleIcon, out iconTexture) || !iconTexture) {
|
||||
var type = invertibleIcon == InvertibleIcon.EventsNew ? InvertibleIcon.Events : invertibleIcon;
|
||||
var type = invertibleIcon;
|
||||
if (invertibleIcon == InvertibleIcon.EventsNew) {
|
||||
type = InvertibleIcon.Events;
|
||||
} else if (invertibleIcon == InvertibleIcon.LogoNew) {
|
||||
type = InvertibleIcon.Logo;
|
||||
}
|
||||
iconTexture = Resources.Load<Texture2D>(supportedInvertibleIcons[type]);
|
||||
|
||||
// we assume icons are for light mode by default
|
||||
@@ -78,10 +85,10 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
cache[type] = iconTexture;
|
||||
|
||||
// we combine dot image with Events icon to create a new alert version
|
||||
if (invertibleIcon == InvertibleIcon.EventsNew) {
|
||||
var redDot = Resources.Load<Texture2D>("red_dot");
|
||||
if (invertibleIcon == InvertibleIcon.LogoNew || invertibleIcon == InvertibleIcon.EventsNew) {
|
||||
var redDot = Resources.Load<Texture2D>("Hot_Reload_red_dot");
|
||||
iconTexture = CombineImages(iconTexture, redDot);
|
||||
cache[InvertibleIcon.EventsNew] = iconTexture;
|
||||
cache[invertibleIcon] = iconTexture;
|
||||
}
|
||||
}
|
||||
return cache[invertibleIcon];
|
||||
@@ -127,7 +134,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
|
||||
private static readonly Dictionary<string, Texture2D> grayTextureCache = new Dictionary<string, Texture2D>();
|
||||
private static readonly Dictionary<string, Color> colorFactor = new Dictionary<string, Color> {
|
||||
{ "error", new Color(0.6f, 0.587f, 0.114f) },
|
||||
{ "Hot_Reload_error", new Color(0.6f, 0.587f, 0.114f) },
|
||||
};
|
||||
|
||||
internal static Texture2D ConvertToGrayscale(string localIcon) {
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b4be912211814333ab61898b6440dc8e
|
||||
timeCreated: 1694518358
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9cc471e812b143599ef5dde1d7ec022a
|
||||
timeCreated: 1694632601
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -61,8 +61,9 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
public readonly bool detiled;
|
||||
public readonly DateTime createdAt;
|
||||
public readonly string[] patchedMembersDisplayNames;
|
||||
public readonly bool isCompile;
|
||||
|
||||
public AlertData(AlertEntryType alertEntryType, DateTime createdAt, bool detiled = false, EntryType entryType = EntryType.Standalone, string errorString = null, string methodName = null, string methodSimpleName = null, PartiallySupportedChange partiallySupportedChange = default(PartiallySupportedChange), string[] patchedMembersDisplayNames = null) {
|
||||
public AlertData(AlertEntryType alertEntryType, DateTime createdAt, bool detiled = false, EntryType entryType = EntryType.Standalone, string errorString = null, string methodName = null, string methodSimpleName = null, PartiallySupportedChange partiallySupportedChange = default(PartiallySupportedChange), string[] patchedMembersDisplayNames = null, bool isCompile = false) {
|
||||
this.alertEntryType = alertEntryType;
|
||||
this.createdAt = createdAt;
|
||||
this.detiled = detiled;
|
||||
@@ -72,6 +73,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
this.methodSimpleName = methodSimpleName;
|
||||
this.partiallySupportedChange = partiallySupportedChange;
|
||||
this.patchedMembersDisplayNames = patchedMembersDisplayNames;
|
||||
this.isCompile = isCompile;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +143,8 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
case AlertEntryType.PatchApplied:
|
||||
CreateReloadFinishedEventEntry(
|
||||
createdAt: alertData.createdAt,
|
||||
patchedMethodsDisplayNames: alertData.patchedMembersDisplayNames
|
||||
patchedMethodsDisplayNames: alertData.patchedMembersDisplayNames,
|
||||
isCompile: alertData.isCompile
|
||||
);
|
||||
break;
|
||||
case AlertEntryType.PartiallySupportedChange:
|
||||
@@ -185,12 +188,12 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
}
|
||||
|
||||
internal static readonly Dictionary<AlertType, string> alertIconString = new Dictionary<AlertType, string> {
|
||||
{ AlertType.Suggestion, "alert_info" },
|
||||
{ AlertType.UnsupportedChange, "warning" },
|
||||
{ AlertType.CompileError, "error" },
|
||||
{ AlertType.PartiallySupportedChange, "infos" },
|
||||
{ AlertType.AppliedChange, "applied_patch" },
|
||||
{ AlertType.UndetectedChange, "undetected" },
|
||||
{ AlertType.Suggestion, "Hot_Reload_alert_info" },
|
||||
{ AlertType.UnsupportedChange, "Hot_Reload_warning" },
|
||||
{ AlertType.CompileError, "Hot_Reload_error" },
|
||||
{ AlertType.PartiallySupportedChange, "Hot_Reload_infos" },
|
||||
{ AlertType.AppliedChange, "Hot_Reload_applied_patch" },
|
||||
{ AlertType.UndetectedChange, "Hot_Reload_status_undetected" },
|
||||
};
|
||||
|
||||
#pragma warning disable CS0612 // obsolete
|
||||
@@ -211,12 +214,26 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
};
|
||||
#pragma warning restore CS0612
|
||||
|
||||
public static int CountTimelineEnties(Predicate<AlertEntry> predicate = null) {
|
||||
var count = 0;
|
||||
foreach (var alertEntry in EventsTimeline) {
|
||||
if (predicate == null || predicate(alertEntry)) {
|
||||
count++;
|
||||
}
|
||||
if (!HotReloadPrefs.TimelineViewAll && alertEntry.alertData?.isCompile == true) {
|
||||
// break on first compile entry if we only viewing recent events
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
internal static List<AlertEntry> Suggestions = new List<AlertEntry>();
|
||||
internal static int UnsupportedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.UnsupportedChange && alert.entryType != EntryType.Child);
|
||||
internal static int PartiallySupportedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.PartiallySupportedChange && alert.entryType != EntryType.Child);
|
||||
internal static int UndetectedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.UndetectedChange && alert.entryType != EntryType.Child);
|
||||
internal static int CompileErrorsCount => EventsTimeline.Count(alert => alert.alertType == AlertType.CompileError);
|
||||
internal static int AppliedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.AppliedChange);
|
||||
internal static int UnsupportedChangesCount => CountTimelineEnties(alert => alert.alertType == AlertType.UnsupportedChange && alert.entryType != EntryType.Child);
|
||||
internal static int PartiallySupportedChangesCount => CountTimelineEnties(alert => alert.alertType == AlertType.PartiallySupportedChange && alert.entryType != EntryType.Child);
|
||||
internal static int UndetectedChangesCount => CountTimelineEnties(alert => alert.alertType == AlertType.UndetectedChange && alert.entryType != EntryType.Child);
|
||||
internal static int CompileErrorsCount => CountTimelineEnties(alert => alert.alertType == AlertType.CompileError);
|
||||
internal static int AppliedChangesCount => CountTimelineEnties(alert => alert.alertType == AlertType.AppliedChange);
|
||||
|
||||
static Regex shortDescriptionRegex = new Regex(PackageConst.DefaultLocale == Locale.SimplifiedChinese ? @"^([\p{L}\p{N}_]+)\s([\p{L}\p{N}_]+)(?=:)" : @"^(\w+)\s(\w+)(?=:)", RegexOptions.Compiled);
|
||||
|
||||
@@ -248,6 +265,12 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RenderReportBugButton(string title, string detail = null) {
|
||||
if (GUILayout.Button(Translations.Common.ButtonBugReport.Trim(), GUILayout.Width(80))) {
|
||||
ReportWindowAPI.OpenBugReport(title?.Replace($", {Translations.UI.TapHereToSeeMore}", ""), detail);
|
||||
}
|
||||
}
|
||||
|
||||
private static float maxScrollPos;
|
||||
internal static void RenderErrorEventActions(string description, ErrorData errorData) {
|
||||
int maxLen = 2400;
|
||||
@@ -267,6 +290,8 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
RenderCompileButton();
|
||||
}
|
||||
|
||||
RenderReportBugButton(errorData.error, errorData.stacktrace);
|
||||
|
||||
// Link
|
||||
if (errorData.file) {
|
||||
GUILayout.FlexibleSpace();
|
||||
@@ -363,16 +388,18 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
}
|
||||
var patchesList = patchedMethodsDisplayNames?.Length > 0 ? string.Join("\n• ", patchedMethodsDisplayNames) : "";
|
||||
var timestamp = createdAt ?? DateTime.Now;
|
||||
var title = Translations.Timeline.EventTitleFailedApplyingPatch;
|
||||
var entry = new AlertEntry(
|
||||
timestamp: timestamp,
|
||||
alertType : AlertType.UnsupportedChange,
|
||||
title: Translations.Timeline.EventTitleFailedApplyingPatch,
|
||||
title: title,
|
||||
description: $"{Translations.Timeline.EventDescriptionInlinedMethods}\n\n• {(truncated ? patchesList + "\n..." : patchesList)}",
|
||||
entryType: EntryType.Parent,
|
||||
actionData: () => {
|
||||
GUILayout.Space(10f);
|
||||
using (new EditorGUILayout.HorizontalScope()) {
|
||||
RenderCompileButton();
|
||||
RenderReportBugButton(title);
|
||||
var suggestion = HotReloadSuggestionsHelper.suggestionMap[HotReloadSuggestionKind.SwitchToDebugModeForInlinedMethods];
|
||||
if (suggestion?.actionData != null) {
|
||||
suggestion.actionData();
|
||||
@@ -419,7 +446,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
return truncatedList;
|
||||
}
|
||||
|
||||
internal static void CreateReloadFinishedEventEntry(DateTime? createdAt = null, string[] patchedMethodsDisplayNames = null) {
|
||||
internal static void CreateReloadFinishedEventEntry(DateTime? createdAt = null, string[] patchedMethodsDisplayNames = null, bool isCompile = false) {
|
||||
var truncated = false;
|
||||
if (patchedMethodsDisplayNames?.Length > 25) {
|
||||
patchedMethodsDisplayNames = TruncateList(patchedMethodsDisplayNames, 25);
|
||||
@@ -439,6 +466,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
AlertEntryType.PatchApplied,
|
||||
createdAt: timestamp,
|
||||
entryType: EntryType.Standalone,
|
||||
isCompile: isCompile,
|
||||
patchedMembersDisplayNames: patchedMethodsDisplayNames)
|
||||
);
|
||||
|
||||
@@ -494,15 +522,17 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
|
||||
internal static void CreateReloadUndetectedChangeEventEntry(DateTime? createdAt = null) {
|
||||
var timestamp = createdAt ?? DateTime.Now;
|
||||
var title = EditorIndicationState.IndicationText[EditorIndicationState.IndicationStatus.Undetected];
|
||||
InsertEntry(new AlertEntry(
|
||||
timestamp: timestamp,
|
||||
alertType : AlertType.UndetectedChange,
|
||||
title: EditorIndicationState.IndicationText[EditorIndicationState.IndicationStatus.Undetected],
|
||||
title: title,
|
||||
description: Translations.Timeline.EventDescriptionUndetectedChange,
|
||||
actionData: () => {
|
||||
GUILayout.Space(10f);
|
||||
using (new EditorGUILayout.HorizontalScope()) {
|
||||
RenderCompileButton();
|
||||
RenderReportBugButton(title);
|
||||
GUILayout.FlexibleSpace();
|
||||
OpenURLButton.Render(Translations.Suggestions.ButtonDocs, Constants.UndetectedChangesURL);
|
||||
GUILayout.Space(10f);
|
||||
@@ -519,16 +549,18 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
if (!partiallySupportedChangeDescriptions.TryGetValue(partiallySupportedChange, out description)) {
|
||||
return;
|
||||
}
|
||||
var title = detailed ? Translations.Timeline.EventTitleChangePartiallyApplied : ToString(partiallySupportedChange);
|
||||
InsertEntry(new AlertEntry(
|
||||
timestamp: timestamp,
|
||||
alertType : AlertType.PartiallySupportedChange,
|
||||
title : detailed ? Translations.Timeline.EventTitleChangePartiallyApplied : ToString(partiallySupportedChange),
|
||||
title : title,
|
||||
description : description,
|
||||
shortDescription: detailed ? ToString(partiallySupportedChange) : null,
|
||||
actionData: () => {
|
||||
GUILayout.Space(10f);
|
||||
using (new EditorGUILayout.HorizontalScope()) {
|
||||
RenderCompileButton();
|
||||
RenderReportBugButton(title);
|
||||
GUILayout.FlexibleSpace();
|
||||
if (GetPartiallySupportedChangePref(partiallySupportedChange)) {
|
||||
if (GUILayout.Button(Translations.Timeline.ButtonIgnoreEventType, HotReloadWindowStyles.LinkStyle)) {
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ffb65be71b8b4d14800f8b28bf68d0ab
|
||||
timeCreated: 1695210350
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -3,7 +3,7 @@ using UnityEngine;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor {
|
||||
internal class Spinner {
|
||||
internal static string SpinnerIconPath => "icon_loading_star_light_mode_96";
|
||||
internal static string SpinnerIconPath => "Hot_Reload_icon_loading_star_light_mode_96";
|
||||
internal static Texture2D spinnerTexture => GUIHelper.GetInvertibleIcon(InvertibleIcon.Spinner);
|
||||
private Texture2D _rotatedTextureLight;
|
||||
private Texture2D _rotatedTextureDark;
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8bd77f0465824c5da3e1454f75c6e93c
|
||||
timeCreated: 1685871830
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 34fb1222dc00466ab4e3db7383bd00ee
|
||||
timeCreated: 1694279476
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/HotReloadAttributeProcessor.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -84,6 +84,10 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
using (new EditorGUILayout.HorizontalScope()) {
|
||||
GUILayout.Space(21);
|
||||
HotReloadTimelineHelper.RenderAlertFilters();
|
||||
|
||||
if (GUILayout.Button(GUIHelper.GetInvertibleIcon(InvertibleIcon.BugReport), GUILayout.MaxHeight(20), GUILayout.MaxWidth(30))) {
|
||||
ReportWindowAPI.OpenBugReport();
|
||||
}
|
||||
}
|
||||
}
|
||||
HotReloadState.ShowingRedDot = false;
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 00ec214cde074cf298acef73bb09a4fc
|
||||
timeCreated: 1696574416
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -12,55 +12,56 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
[Overlay(typeof(SceneView), Translations.MenuItems.OverlayDescription, true)]
|
||||
[Icon("Assets/HotReload/Editor/Resources/Icon_DarkMode.png")]
|
||||
internal class HotReloadOverlay : ToolbarOverlay {
|
||||
HotReloadOverlay() : base(HotReloadToolbarIndicationButton.id, HotReloadToolbarEventsButton.id, HotReloadToolbarRecompileButton.id) {
|
||||
HotReloadOverlay() : base(HotReloadToolbarLogoButton.id, HotReloadToolbarIndicationButton.id, HotReloadToolbarRecompileButton.id) {
|
||||
EditorApplication.update += Update;
|
||||
}
|
||||
|
||||
[EditorToolbarElement(id, typeof(SceneView))]
|
||||
class HotReloadToolbarLogoButton : EditorToolbarButton, IAccessContainerWindow {
|
||||
internal const string id = "HotReloadOverlay/LogoButton";
|
||||
public EditorWindow containerWindow { get; set; }
|
||||
|
||||
bool lastShowingRedDot;
|
||||
|
||||
internal HotReloadToolbarLogoButton() {
|
||||
icon = HotReloadState.ShowingRedDot ? GUIHelper.GetInvertibleIcon(InvertibleIcon.LogoNew) : GUIHelper.GetInvertibleIcon(InvertibleIcon.Logo);
|
||||
tooltip = "Hot Reload";
|
||||
clicked += OnClick;
|
||||
EditorApplication.update += Update;
|
||||
}
|
||||
|
||||
void OnClick() {
|
||||
HotReloadWindow.Open();
|
||||
if (HotReloadWindow.Current) {
|
||||
HotReloadWindow.Current.SelectTab(typeof(HotReloadRunTab));
|
||||
}
|
||||
}
|
||||
|
||||
void Update() {
|
||||
if (lastShowingRedDot != HotReloadState.ShowingRedDot) {
|
||||
icon = HotReloadState.ShowingRedDot ? GUIHelper.GetInvertibleIcon(InvertibleIcon.LogoNew) : GUIHelper.GetInvertibleIcon(InvertibleIcon.Logo);
|
||||
lastShowingRedDot = HotReloadState.ShowingRedDot;
|
||||
}
|
||||
}
|
||||
|
||||
~HotReloadToolbarLogoButton() {
|
||||
clicked -= OnClick;
|
||||
EditorApplication.update -= Update;
|
||||
}
|
||||
}
|
||||
|
||||
EditorIndicationState.IndicationStatus lastIndicationStatus;
|
||||
|
||||
[EditorToolbarElement(id, typeof(SceneView))]
|
||||
class HotReloadToolbarIndicationButton : EditorToolbarButton, IAccessContainerWindow {
|
||||
internal const string id = "HotReloadOverlay/LogoButton";
|
||||
internal const string id = "HotReloadOverlay/IndicationButton";
|
||||
public EditorWindow containerWindow { get; set; }
|
||||
|
||||
EditorIndicationState.IndicationStatus lastIndicationStatus;
|
||||
|
||||
internal HotReloadToolbarIndicationButton() {
|
||||
icon = GetIndicationIcon();
|
||||
tooltip = EditorIndicationState.IndicationStatusText;
|
||||
clicked += OnClick;
|
||||
EditorApplication.update += Update;
|
||||
}
|
||||
|
||||
void OnClick() {
|
||||
EditorWindow.GetWindow<HotReloadWindow>().Show();
|
||||
EditorWindow.GetWindow<HotReloadWindow>().SelectTab(typeof(HotReloadRunTab));
|
||||
}
|
||||
|
||||
void Update() {
|
||||
if (lastIndicationStatus != EditorIndicationState.CurrentIndicationStatus) {
|
||||
icon = GetIndicationIcon();
|
||||
tooltip = EditorIndicationState.IndicationStatusText;
|
||||
lastIndicationStatus = EditorIndicationState.CurrentIndicationStatus;
|
||||
}
|
||||
}
|
||||
|
||||
~HotReloadToolbarIndicationButton() {
|
||||
clicked -= OnClick;
|
||||
EditorApplication.update -= Update;
|
||||
}
|
||||
}
|
||||
|
||||
[EditorToolbarElement(id, typeof(SceneView))]
|
||||
class HotReloadToolbarEventsButton : EditorToolbarButton, IAccessContainerWindow {
|
||||
internal const string id = "HotReloadOverlay/EventsButton";
|
||||
public EditorWindow containerWindow { get; set; }
|
||||
|
||||
bool lastShowingRedDot;
|
||||
|
||||
internal HotReloadToolbarEventsButton() {
|
||||
icon = HotReloadState.ShowingRedDot ? GUIHelper.GetInvertibleIcon(InvertibleIcon.EventsNew) : GUIHelper.GetInvertibleIcon(InvertibleIcon.Events);
|
||||
tooltip = Translations.Timeline.EventsTooltip;
|
||||
tooltip = string.Format(Translations.Timeline.IndicationTooltip, EditorIndicationState.IndicationStatusText);
|
||||
clicked += OnClick;
|
||||
EditorApplication.update += Update;
|
||||
}
|
||||
@@ -70,13 +71,14 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
}
|
||||
|
||||
void Update() {
|
||||
if (lastShowingRedDot != HotReloadState.ShowingRedDot) {
|
||||
icon = HotReloadState.ShowingRedDot ? GUIHelper.GetInvertibleIcon(InvertibleIcon.EventsNew) : GUIHelper.GetInvertibleIcon(InvertibleIcon.Events);
|
||||
lastShowingRedDot = HotReloadState.ShowingRedDot;
|
||||
if (lastIndicationStatus != EditorIndicationState.CurrentIndicationStatus) {
|
||||
icon = GetIndicationIcon();
|
||||
tooltip = string.Format(Translations.Timeline.IndicationTooltip, EditorIndicationState.IndicationStatusText);
|
||||
lastIndicationStatus = EditorIndicationState.CurrentIndicationStatus;
|
||||
}
|
||||
}
|
||||
|
||||
~HotReloadToolbarEventsButton() {
|
||||
~HotReloadToolbarIndicationButton() {
|
||||
clicked -= OnClick;
|
||||
EditorApplication.update -= Update;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 91650b4b0d054bdf9c1e922305e6a61a
|
||||
timeCreated: 1685130321
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using JetBrains.Annotations;
|
||||
using SingularityGroup.HotReload.DTO;
|
||||
using SingularityGroup.HotReload.Editor.Cli;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
@@ -19,6 +20,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
private const string PasswordCachedKey = "HotReloadWindow.PasswordCached";
|
||||
private const string ExposeServerToLocalNetworkKey = "HotReloadWindow.ExposeServerToLocalNetwork";
|
||||
private const string ErrorHiddenCachedKey = "HotReloadWindow.ErrorHiddenCachedKey";
|
||||
private const string HardwareIdKey = "HotReloadWindow.HardwareId";
|
||||
private const string RefreshManuallyTipCachedKey = "HotReloadWindow.RefreshManuallyTipCachedKey";
|
||||
private const string ShowLoginCachedKey = "HotReloadWindow.ShowLoginCachedKey";
|
||||
private const string ConfigurationKey = "HotReloadWindow.Configuration";
|
||||
@@ -35,7 +37,9 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
private const string PatchesCollapseKey = "HotReloadWindow.PatchesCollapse";
|
||||
private const string PatchesGroupAllKey = "HotReloadWindow.PatchesGroupAll";
|
||||
private const string LaunchOnEditorStartKey = "HotReloadWindow.LaunchOnEditorStart";
|
||||
[Obsolete]
|
||||
private const string AutoClearTimelineKey = "HotReloadWindow.AutoClearTimeline";
|
||||
private const string TimelineViewAllKey = "HotReloadWindow.TimelineViewAll";
|
||||
private const string AutoRecompileUnsupportedChangesKey = "HotReloadWindow.AutoRecompileUnsupportedChanges";
|
||||
private const string AutoRecompilePartiallyUnsupportedChangesKey = "HotReloadWindow.AutoRecompilePartiallyUnsupportedChanges";
|
||||
private const string DisplayNewMonobehaviourMethodsAsPartiallySupportedKey = "HotReloadWindow.DisplayNewMonobehaviourMethodsAsPartiallySupported";
|
||||
@@ -167,6 +171,11 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
set { EditorPrefs.SetBool(ErrorHiddenCachedKey, value); }
|
||||
}
|
||||
|
||||
public static string HardwareId {
|
||||
get { return EditorPrefs.GetString(HardwareIdKey); }
|
||||
set { EditorPrefs.SetString(HardwareIdKey, value); }
|
||||
}
|
||||
|
||||
public static bool ShowLogin {
|
||||
get { return EditorPrefs.GetBool(ShowLoginCachedKey, true); }
|
||||
set { EditorPrefs.SetBool(ShowLoginCachedKey, value); }
|
||||
@@ -283,11 +292,17 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
set { EditorPrefs.SetBool(LaunchOnEditorStartKey, value); }
|
||||
}
|
||||
|
||||
[Obsolete]
|
||||
public static bool AutoClearTimeline {
|
||||
get { return EditorPrefs.GetBool(AutoClearTimelineKey, true); }
|
||||
set { EditorPrefs.SetBool(AutoClearTimelineKey, value); }
|
||||
}
|
||||
|
||||
public static bool TimelineViewAll {
|
||||
get { return EditorPrefs.GetBool(TimelineViewAllKey, false); }
|
||||
set { EditorPrefs.SetBool(TimelineViewAllKey, value); }
|
||||
}
|
||||
|
||||
public static bool AutoRecompileUnsupportedChanges {
|
||||
get { return EditorPrefs.GetBool(AutoRecompileUnsupportedChangesKey, false); }
|
||||
set { EditorPrefs.SetBool(AutoRecompileUnsupportedChangesKey, value); }
|
||||
@@ -511,7 +526,7 @@ namespace SingularityGroup.HotReload.Editor {
|
||||
|
||||
#if UNITY_EDITOR_WIN
|
||||
public static bool UseWatchman {
|
||||
get { return EditorPrefs.GetBool(UseWatchmanKey, PackageConst.DefaultLocale == RuntimeLocalization.Locale.English); }
|
||||
get { return EditorPrefs.GetBool(UseWatchmanKey, PackageConst.DefaultLocale == Locale.English); }
|
||||
set { EditorPrefs.SetBool(UseWatchmanKey, value); }
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 803347281bcf46b6b37d48231b8882be
|
||||
timeCreated: 1694458889
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
#if UNITY_6000_3_OR_NEWER
|
||||
using System.Collections.Generic;
|
||||
using SingularityGroup.HotReload.Editor.Localization;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Toolbars;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor {
|
||||
|
||||
internal static class HotReloadToolbar {
|
||||
|
||||
const string k_ElementId = "HotReload";
|
||||
|
||||
static readonly Spinner _spinner = new Spinner(100);
|
||||
|
||||
static HotReloadToolbar() {
|
||||
|
||||
bool _lastShowingRedDot = HotReloadState.ShowingRedDot;
|
||||
EditorIndicationState.IndicationStatus _lastIndicationStatus = EditorIndicationState.CurrentIndicationStatus;
|
||||
EditorApplication.update += () => {
|
||||
if (_lastShowingRedDot == HotReloadState.ShowingRedDot && _lastIndicationStatus == EditorIndicationState.CurrentIndicationStatus) {
|
||||
return;
|
||||
}
|
||||
_lastShowingRedDot = HotReloadState.ShowingRedDot;
|
||||
_lastIndicationStatus = EditorIndicationState.CurrentIndicationStatus;
|
||||
MainToolbar.Refresh(k_ElementId);
|
||||
};
|
||||
}
|
||||
|
||||
[MainToolbarElement(
|
||||
k_ElementId,
|
||||
defaultDockPosition = MainToolbarDockPosition.Right)]
|
||||
static IEnumerable<MainToolbarElement> CreateToolbar() {
|
||||
// ── Logo button ────────────────────────────────────────────────
|
||||
yield return new MainToolbarButton(
|
||||
new MainToolbarContent(
|
||||
"",
|
||||
GetLogoIcon(),
|
||||
HotReloadState.ShowingRedDot ? $"Hot Realod\n{Translations.Timeline.OpenToViewNewEventsTooltip}" : "Hot Reload"),
|
||||
OnLogoClick);
|
||||
|
||||
|
||||
// ── Indication button ────────────────────────────────────────────
|
||||
yield return new MainToolbarButton(
|
||||
new MainToolbarContent(
|
||||
"",
|
||||
GetIndicationIcon(),
|
||||
string.Format(Translations.Timeline.IndicationTooltip, EditorIndicationState.IndicationStatusText)),
|
||||
OnIndicationClick);
|
||||
|
||||
|
||||
// ── Recompile button ─────────────────────────────────────────────
|
||||
yield return new MainToolbarButton(
|
||||
new MainToolbarContent(
|
||||
"",
|
||||
GUIHelper.GetInvertibleIcon(InvertibleIcon.Recompile),
|
||||
Translations.Miscellaneous.OverlayTooltipRecompile),
|
||||
HotReloadRunTab.RecompileWithChecks);
|
||||
}
|
||||
|
||||
static void OnLogoClick() {
|
||||
HotReloadWindow.Open();
|
||||
if (HotReloadWindow.Current) {
|
||||
HotReloadWindow.Current.SelectTab(typeof(HotReloadRunTab));
|
||||
}
|
||||
}
|
||||
|
||||
static void OnIndicationClick() =>
|
||||
HotReloadEventPopup.Open(PopupSource.Overlay, Event.current.mousePosition);
|
||||
|
||||
static Texture2D GetIndicationIcon() {
|
||||
if (EditorIndicationState.IndicationIconPath == null || EditorIndicationState.SpinnerActive) {
|
||||
return _spinner.GetIcon();
|
||||
}
|
||||
return GUIHelper.GetLocalIcon(EditorIndicationState.IndicationIconPath);
|
||||
}
|
||||
|
||||
static Texture2D GetLogoIcon() => HotReloadState.ShowingRedDot ?
|
||||
GUIHelper.GetInvertibleIcon(InvertibleIcon.LogoNew) :
|
||||
GUIHelper.GetInvertibleIcon(InvertibleIcon.Logo);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c403e42877d6481eb900306cf3f6bb51
|
||||
timeCreated: 1774001943
|
||||
@@ -145,10 +145,3 @@ TextureImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 235343744f6348acb629d549ccafff0b
|
||||
timeCreated: 1708187279
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/InspectorFreezeFix.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using SingularityGroup.HotReload.DTO;
|
||||
using SingularityGroup.HotReload.Editor.Cli;
|
||||
using SingularityGroup.HotReload.Editor.Localization;
|
||||
using SingularityGroup.HotReload.Localization;
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2a7a39befa1f455cb21fcad46513b6e5
|
||||
timeCreated: 1676973096
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5329de48151140eb871721ae80f925cd
|
||||
timeCreated: 1676908147
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f076514e142a4915ab2676a9ca6d884a
|
||||
timeCreated: 1676802482
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d8485ce38122465e9e70d5992d9ae7ed
|
||||
timeCreated: 1676966641
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 155269da640bb89428bf5b3d415878c9
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/AboutTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
internal static partial class Translations {
|
||||
public static class BugReport {
|
||||
// Window titles
|
||||
public static string WindowTitleBugReport;
|
||||
public static string WindowTitleFeedback;
|
||||
|
||||
public static string TabBugReport;
|
||||
public static string TabFeedback;
|
||||
|
||||
// Form section labels
|
||||
public static string LabelTitle;
|
||||
public static string LabelIssueSeverity;
|
||||
public static string LabelHowOften;
|
||||
public static string LabelContactEmail;
|
||||
public static string LabelContactEmailFinePrint;
|
||||
public static string LabelDetails;
|
||||
public static string LabelFeedback;
|
||||
|
||||
// Severity choices
|
||||
public static string SeverityNormal;
|
||||
public static string SeverityLow;
|
||||
public static string SeverityHigh;
|
||||
|
||||
// Frequency choices
|
||||
public static string FrequencyFirstTime;
|
||||
public static string FrequencySometimes;
|
||||
public static string FrequencyAlways;
|
||||
|
||||
// Submit button
|
||||
public static string ButtonSubmit;
|
||||
public static string ButtonSubmitting;
|
||||
|
||||
// Validation
|
||||
public static string ValidationTitleRequired;
|
||||
|
||||
// Success screen
|
||||
public static string SuccessTitle;
|
||||
public static string SuccessMessage;
|
||||
|
||||
// Failure screen
|
||||
public static string FailureTitle;
|
||||
public static string FailureMessage;
|
||||
|
||||
// Shared buttons
|
||||
public static string ButtonJoinDiscord;
|
||||
public static string ButtonContactUs;
|
||||
|
||||
// Discard dialog
|
||||
public static string DiscardDialogTitle;
|
||||
public static string DiscardDialogMessage;
|
||||
public static string DiscardDialogConfirm;
|
||||
public static string DiscardDialogCancel;
|
||||
|
||||
// Misc
|
||||
public static string NoSubmitHandlerError;
|
||||
|
||||
// Exceptions
|
||||
public static string SubmitHandlerError;
|
||||
|
||||
public static string PlaceholderDetails;
|
||||
|
||||
public static string LicenseActivationFailed;
|
||||
public static string LicenseActivationFailedWithError;
|
||||
|
||||
public static void LoadEnglish() {
|
||||
WindowTitleBugReport = "Bug Report (Hot Reload)";
|
||||
WindowTitleFeedback = "Feedback (Hot Reload)";
|
||||
|
||||
TabBugReport = "Bug Report";
|
||||
TabFeedback = "Feedback";
|
||||
|
||||
LabelTitle = "Title";
|
||||
LabelIssueSeverity = "Issue Severity";
|
||||
|
||||
LicenseActivationFailed = "License activation failed";
|
||||
LicenseActivationFailedWithError = "License activation failed with error: {0}";
|
||||
|
||||
LabelHowOften = "How often does it happen?";
|
||||
LabelContactEmail = "Contact Email (optional)";
|
||||
LabelContactEmailFinePrint = "This email will only be used to follow up on this bug report and will not be stored or shared for any other purpose.";
|
||||
LabelDetails = "Details";
|
||||
LabelFeedback = "Feedback";
|
||||
|
||||
SeverityNormal = "Normal";
|
||||
SeverityLow = "Low";
|
||||
SeverityHigh = "High";
|
||||
|
||||
FrequencyFirstTime = "This is the first time";
|
||||
FrequencySometimes = "Sometimes but not always";
|
||||
FrequencyAlways = "Always";
|
||||
|
||||
ButtonSubmit = "Submit";
|
||||
ButtonSubmitting = "Submitting...";
|
||||
|
||||
ValidationTitleRequired = "You must provide a title to be able to send the report.";
|
||||
|
||||
SuccessTitle = "Report Submitted";
|
||||
SuccessMessage = "Thank you! We've accepted your report and are processing it.";
|
||||
|
||||
FailureTitle = "Submission Failed";
|
||||
FailureMessage = "Please reach out to us directly so we can help resolve your issue.";
|
||||
|
||||
ButtonJoinDiscord = "Join Our Discord";
|
||||
ButtonContactUs = "Contact Us";
|
||||
|
||||
DiscardDialogTitle = "Discard Report?";
|
||||
DiscardDialogMessage = "You have unsaved content in this report. Discard changes and close?";
|
||||
DiscardDialogConfirm = "Discard";
|
||||
DiscardDialogCancel = "Cancel";
|
||||
|
||||
NoSubmitHandlerError = "No way to handle bug report";
|
||||
|
||||
SubmitHandlerError = "Failure occurred while handling bug report: {0}";
|
||||
|
||||
PlaceholderDetails = @"## Steps to reproduce:
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## What happened?
|
||||
|
||||
## What should have happened?
|
||||
|
||||
";
|
||||
}
|
||||
|
||||
public static void LoadSimplifiedChinese() {
|
||||
WindowTitleBugReport = "错误报告 (Hot Reload)";
|
||||
WindowTitleFeedback = "反馈 (Hot Reload)";
|
||||
|
||||
TabBugReport = "错误报告";
|
||||
TabFeedback = "反馈";
|
||||
|
||||
LabelTitle = "标题";
|
||||
LabelIssueSeverity = "问题严重性";
|
||||
LabelHowOften = "发生频率如何?";
|
||||
LabelContactEmail = "联系邮箱(可选)";
|
||||
LabelContactEmailFinePrint = "此邮箱仅用于跟进本次错误报告,不会被存储或用于其他任何目的。";
|
||||
LabelDetails = "详情";
|
||||
LabelFeedback = "反馈";
|
||||
|
||||
SeverityNormal = "普通";
|
||||
SeverityLow = "低";
|
||||
SeverityHigh = "高";
|
||||
|
||||
FrequencyFirstTime = "这是第一次发生";
|
||||
FrequencySometimes = "偶尔发生";
|
||||
FrequencyAlways = "总是发生";
|
||||
|
||||
ButtonSubmit = "提交";
|
||||
ButtonSubmitting = "提交中…";
|
||||
|
||||
ValidationTitleRequired = "必须填写标题才能发送报告。";
|
||||
|
||||
SuccessTitle = "报告已提交";
|
||||
SuccessMessage = "感谢您!我们已收到您的报告并正在处理中。";
|
||||
|
||||
FailureTitle = "提交失败";
|
||||
FailureMessage = "请直接联系我们,以便我们协助解决您的问题。";
|
||||
|
||||
ButtonJoinDiscord = "加入我们的 Discord";
|
||||
ButtonContactUs = "联系我们";
|
||||
|
||||
DiscardDialogTitle = "放弃报告?";
|
||||
DiscardDialogMessage = "此报告中有未保存的内容。是否放弃更改并关闭?";
|
||||
DiscardDialogConfirm = "放弃";
|
||||
DiscardDialogCancel = "取消";
|
||||
|
||||
NoSubmitHandlerError = "无法处理错误报告";
|
||||
|
||||
SubmitHandlerError = "处理错误报告时发生错误:{0}";
|
||||
|
||||
LicenseActivationFailed = "许可证激活失败";
|
||||
LicenseActivationFailedWithError = "许可证激活失败,错误信息:{0}";
|
||||
|
||||
PlaceholderDetails = @"## 复现步骤:
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## 实际发生了什么?
|
||||
|
||||
## 预期应发生什么?
|
||||
|
||||
";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d6519b7661b44ec98e29b09e511f8ac7
|
||||
timeCreated: 1773936808
|
||||
@@ -8,6 +8,7 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
public static string ButtonStart;
|
||||
public static string ButtonStop;
|
||||
public static string ButtonRecompile;
|
||||
public static string ButtonBugReport;
|
||||
public static string ButtonProceed;
|
||||
public static string ButtonYes;
|
||||
public static string ButtonNo;
|
||||
@@ -45,6 +46,7 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
ButtonStart = " Start";
|
||||
ButtonStop = " Stop";
|
||||
ButtonRecompile = " Recompile";
|
||||
ButtonBugReport = "Report bug";
|
||||
ButtonProceed = "Proceed";
|
||||
ButtonYes = "Yes";
|
||||
ButtonNo = "No";
|
||||
@@ -82,6 +84,7 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
ButtonClear = "清除";
|
||||
ButtonStart = " 开始";
|
||||
ButtonStop = " 停止";
|
||||
ButtonBugReport = "报告错误";
|
||||
ButtonRecompile = " 重新编译";
|
||||
ButtonProceed = "继续";
|
||||
ButtonYes = "是";
|
||||
|
||||
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2fea73e8304102e4a805c3d00653b84b
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/CommonTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18bf971e42f1c6b40a2f22f0cc76411f
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/DialogTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f1ff9542af2fa0c4d8b9bfb9620e29a0
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/ErrorTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 35d12621e71ef12458b3bbe48e047469
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/LicenseTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using SingularityGroup.HotReload.DTO;
|
||||
using SingularityGroup.HotReload.Localization;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
[InitializeOnLoad]
|
||||
@@ -28,6 +28,7 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
|
||||
static void LoadEnglish() {
|
||||
Common.LoadEnglish();
|
||||
BugReport.LoadEnglish();
|
||||
Timeline.LoadEnglish();
|
||||
License.LoadEnglish();
|
||||
Errors.LoadEnglish();
|
||||
@@ -44,6 +45,7 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
|
||||
static void LoadSimplifiedChinese() {
|
||||
Common.LoadSimplifiedChinese();
|
||||
BugReport.LoadSimplifiedChinese();
|
||||
Timeline.LoadSimplifiedChinese();
|
||||
License.LoadSimplifiedChinese();
|
||||
Errors.LoadSimplifiedChinese();
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e39c1f768bb465fa48c1fe2c3dd4d75
|
||||
timeCreated: 1759652321
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/Localization.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using SingularityGroup.HotReload.DTO;
|
||||
using SingularityGroup.HotReload.Localization;
|
||||
|
||||
namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
internal static partial class Translations {
|
||||
public static class MenuItems {
|
||||
public const string OpenHotReload = PackageConst.DefaultLocale == Locale.SimplifiedChinese ? "Window/Hot Reload/打开 &#H" : "Window/Hot Reload/Open &#H";
|
||||
public const string OpenBugReport = PackageConst.DefaultLocale == Locale.SimplifiedChinese ? "Window/Hot Reload/错误报告" : "Window/Hot Reload/Bug Report";
|
||||
public const string RecompileHotReload = PackageConst.DefaultLocale == Locale.SimplifiedChinese ? "Window/Hot Reload/重新编译" : "Window/Hot Reload/Recompile";
|
||||
public const string OverlayDescription = PackageConst.DefaultLocale == Locale.SimplifiedChinese ? "Hot Reload" : "Hot Reload";
|
||||
public const string NotImplementedObsolete = PackageConst.DefaultLocale == Locale.SimplifiedChinese ? "未实现" : "Not implemented";
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/MenuItemsTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 839cc9c3fc3098d478a7450b4d23b907
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/MiscellaneousTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 19a8c5bfa6576844d9789872adce14e1
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/OnDeviceTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: da7def2f6c8576e4bbb04a79c3438b46
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/RegistrationTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: df46693e37527a74b8c24e95da9a4c47
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/SettingsTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
+1
-7
@@ -1,9 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3a2d7e9f8b1c4a5e9d6f8a7b9c1d2e3f
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/SuggestionsTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
|
||||
+30
-3
@@ -9,11 +9,12 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
public static string MessageEnableFilters;
|
||||
public static string MessageMakeCodeChanges;
|
||||
public static string MessageOnly40EntriesShown;
|
||||
public static string EventsTooltip;
|
||||
public static string LabelSuggestionsFormat;
|
||||
public static string LabelTimeline;
|
||||
public static string ButtonIgnoreEventType;
|
||||
public static string MessageStartHotReload;
|
||||
public static string IndicationTooltip;
|
||||
public static string OpenToViewNewEventsTooltip;
|
||||
|
||||
// Partially Supported Change Descriptions
|
||||
public static string PartiallySupportedLambdaClosure;
|
||||
@@ -49,6 +50,14 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
public static string ManualDownloadButtonOpenDownloadUrl;
|
||||
public static string ManualDownloadButtonComplete;
|
||||
|
||||
public static string EntryTimeNow;
|
||||
public static string EntryTimeHours;
|
||||
public static string EntryTimeMinutes;
|
||||
|
||||
public static string FullAssemblyRecompilation;
|
||||
public static string ViewAll;
|
||||
public static string ViewRecent;
|
||||
|
||||
public static void LoadEnglish() {
|
||||
// Timeline/Events
|
||||
TimelineTitle = "Timeline";
|
||||
@@ -58,7 +67,8 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
MessageEnableFilters = "Enable filters to see events";
|
||||
MessageMakeCodeChanges = "Make code changes to see events";
|
||||
MessageOnly40EntriesShown = "Only last 40 entries are shown";
|
||||
EventsTooltip = "Events";
|
||||
IndicationTooltip = "View events timeline\nLast event: {0}";
|
||||
OpenToViewNewEventsTooltip = "Open to see new events/suggestions";
|
||||
LabelSuggestionsFormat = "Suggestions ({0})";
|
||||
LabelTimeline = "Timeline";
|
||||
ButtonIgnoreEventType = "Ignore this event type ";
|
||||
@@ -97,6 +107,14 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
ManualDownloadButtonCopyToClipboard = "Copy path to clipboard";
|
||||
ManualDownloadButtonOpenDownloadUrl = "Open Download URL";
|
||||
ManualDownloadButtonComplete = "I've completed the download";
|
||||
|
||||
FullAssemblyRecompilation = "Full assembly recompilation";
|
||||
ViewAll = "View All";
|
||||
ViewRecent = "View Recent";
|
||||
|
||||
EntryTimeNow = "now";
|
||||
EntryTimeHours = "h";
|
||||
EntryTimeMinutes = "min";
|
||||
}
|
||||
|
||||
public static void LoadSimplifiedChinese() {
|
||||
@@ -108,7 +126,8 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
MessageEnableFilters = "启用过滤器以查看事件";
|
||||
MessageMakeCodeChanges = "进行代码更改以查看事件";
|
||||
MessageOnly40EntriesShown = "仅显示最后 40 个条目";
|
||||
EventsTooltip = "事件";
|
||||
IndicationTooltip = "查看事件时间线\n最后事件:{0}";
|
||||
OpenToViewNewEventsTooltip = "打开以查看新事件/建议";
|
||||
LabelSuggestionsFormat = "建议 ({0})";
|
||||
LabelTimeline = "时间线";
|
||||
ButtonIgnoreEventType = "忽略此事件类型 ";
|
||||
@@ -147,6 +166,14 @@ namespace SingularityGroup.HotReload.Editor.Localization {
|
||||
ManualDownloadButtonCopyToClipboard = "复制路径到剪贴板";
|
||||
ManualDownloadButtonOpenDownloadUrl = "打开下载链接";
|
||||
ManualDownloadButtonComplete = "我已完成下载";
|
||||
|
||||
FullAssemblyRecompilation = "完整程序集重新编译";
|
||||
ViewAll = "查看全部";
|
||||
ViewRecent = "查看最近";
|
||||
|
||||
EntryTimeNow = "刚刚";
|
||||
EntryTimeHours = "小时";
|
||||
EntryTimeMinutes = "分钟";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-7
@@ -1,9 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f7d83a43b1da0f14c860b06211f42149
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/TimelineTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/UITranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/Localization/UtilityTranslations.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 178df48ca88b4cddac448a49196b49bf
|
||||
timeCreated: 1682338738
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b9aa611f02544b609c5b29f9d1409d6e
|
||||
timeCreated: 1674041425
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1949292efc07445ea4c040d544e2d369
|
||||
timeCreated: 1675441886
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs
|
||||
uploadId: 870414
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6e856fe8c0b7d3c45a06140d120fdd87
|
||||
timeCreated: 1580717666
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 27fd74267707df04ab2cfac0e8abd782
|
||||
timeCreated: 1580717700
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ff65ad426f484ad5bbd34fb8f9204c4d
|
||||
timeCreated: 1676637309
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs
|
||||
uploadId: 870414
|
||||
|
||||
-7
@@ -1,10 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d58a4838109c4b31ac7f221547ad82e8
|
||||
timeCreated: 1676527868
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs
|
||||
uploadId: 870414
|
||||
|
||||
+40
-16
@@ -401,7 +401,7 @@ namespace SingularityGroup.HotReload.Editor.ProjectGeneration {
|
||||
List<ResponseFileData> responseFilesData,
|
||||
Config config
|
||||
) {
|
||||
var otherResponseFilesData = GetOtherArgumentsFromResponseFilesData(responseFilesData);
|
||||
var otherData = GetOtherArguments(responseFilesData, assembly.Assembly.compilerOptions);
|
||||
var arguments = new object[] {
|
||||
k_ToolsVersion,
|
||||
k_ProductVersion,
|
||||
@@ -414,18 +414,18 @@ namespace SingularityGroup.HotReload.Editor.ProjectGeneration {
|
||||
assembly.OutputPath,
|
||||
assembly.RootNamespace,
|
||||
"",
|
||||
GenerateLangVersion(otherResponseFilesData["langversion"], assembly),
|
||||
GenerateLangVersion(otherData["langversion"], assembly),
|
||||
k_BaseDirectory,
|
||||
assembly.CompilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe),
|
||||
GenerateNoWarn(otherResponseFilesData["nowarn"].Distinct().ToList()),
|
||||
config.excludeAllAnalyzers ? "" : GenerateAnalyserItemGroup(RetrieveRoslynAnalyzers(assembly, otherResponseFilesData)),
|
||||
config.excludeAllAnalyzers ? "" : GenerateAnalyserAdditionalFiles(otherResponseFilesData["additionalfile"].SelectMany(x=>x.Split(';')).Distinct().ToArray()),
|
||||
config.excludeAllAnalyzers ? "" : GenerateRoslynAnalyzerRulesetPath(assembly, otherResponseFilesData),
|
||||
GenerateWarningLevel(otherResponseFilesData["warn"].Concat(otherResponseFilesData["w"]).Distinct()),
|
||||
GenerateWarningAsError(otherResponseFilesData["warnaserror"], otherResponseFilesData["warnaserror-"],
|
||||
otherResponseFilesData["warnaserror+"]),
|
||||
GenerateDocumentationFile(otherResponseFilesData["doc"].ToArray()),
|
||||
GenerateNullable(otherResponseFilesData["nullable"])
|
||||
GenerateNoWarn(otherData["nowarn"].Distinct().ToList()),
|
||||
config.excludeAllAnalyzers ? "" : GenerateAnalyserItemGroup(RetrieveRoslynAnalyzers(assembly, otherData)),
|
||||
config.excludeAllAnalyzers ? "" : GenerateAnalyserAdditionalFiles(RetrieveRoslynAdditionalFiles(assembly, otherData)),
|
||||
config.excludeAllAnalyzers ? "" : GenerateRoslynAnalyzerRulesetPath(assembly, otherData),
|
||||
GenerateWarningLevel(otherData["warn"].Concat(otherData["w"]).Distinct()),
|
||||
GenerateWarningAsError(otherData["warnaserror"], otherData["warnaserror-"],
|
||||
otherData["warnaserror+"]),
|
||||
GenerateDocumentationFile(otherData["doc"].ToArray()),
|
||||
GenerateNullable(otherData["nullable"])
|
||||
};
|
||||
|
||||
try {
|
||||
@@ -436,6 +436,30 @@ namespace SingularityGroup.HotReload.Editor.ProjectGeneration {
|
||||
}
|
||||
}
|
||||
|
||||
private static string[] RetrieveRoslynAdditionalFiles(ProjectPart assembly, ILookup<string, string> otherResponseFilesData) {
|
||||
// return otherResponseFilesData["additionalfile"].SelectMany(x => x.Split(';')).Distinct().ToArray();
|
||||
string[] additionalFilePathsFromCompilationPipeline;
|
||||
#if UNITY_2021_3 // https://github.com/JetBrains/resharper-unity/issues/2401
|
||||
var type = assembly.CompilerOptions.GetType();
|
||||
var propertyInfo = type.GetProperty("RoslynAdditionalFilePaths");
|
||||
if (propertyInfo != null && propertyInfo.GetValue(assembly.CompilerOptions) is string[] value)
|
||||
{
|
||||
additionalFilePathsFromCompilationPipeline = value;
|
||||
} else {
|
||||
additionalFilePathsFromCompilationPipeline = Array.Empty<string>();
|
||||
}
|
||||
#elif UNITY_2022_2_OR_NEWER // https://docs.unity3d.com/2021.3/Documentation/ScriptReference/Compilation.ScriptCompilerOptions.RoslynAdditionalFilePaths.html
|
||||
additionalFilePathsFromCompilationPipeline = assembly.CompilerOptions.RoslynAdditionalFilePaths;
|
||||
#else
|
||||
additionalFilePathsFromCompilationPipeline = Array.Empty<string>();
|
||||
#endif
|
||||
return otherResponseFilesData["additionalfile"]
|
||||
.SelectMany(x => x.Split(';'))
|
||||
.Concat(additionalFilePathsFromCompilationPipeline)
|
||||
.Select(MakeAbsolutePath)
|
||||
.Distinct().ToArray();
|
||||
}
|
||||
|
||||
string[] RetrieveRoslynAnalyzers(ProjectPart assembly, ILookup<string, string> otherResponseFilesData) {
|
||||
var otherAnalyzers = otherResponseFilesData["a"] ?? Array.Empty<string>();
|
||||
#if UNITY_2020_2_OR_NEWER
|
||||
@@ -653,9 +677,11 @@ namespace SingularityGroup.HotReload.Editor.ProjectGeneration {
|
||||
return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations);
|
||||
}
|
||||
|
||||
private static ILookup<string, string> GetOtherArgumentsFromResponseFilesData(List<ResponseFileData> responseFilesData) {
|
||||
var paths = responseFilesData.SelectMany(x => {
|
||||
return x.OtherArguments
|
||||
private static ILookup<string, string> GetOtherArguments(List<ResponseFileData> responseFilesData, ScriptCompilerOptions compilationOptions) {
|
||||
return responseFilesData.SelectMany(x => x.OtherArguments)
|
||||
#if UNITY_2020_3_OR_NEWER
|
||||
.Concat((compilationOptions.AdditionalCompilerArguments ?? Enumerable.Empty<string>()))
|
||||
#endif
|
||||
.Where(a => a.StartsWith("/", StringComparison.Ordinal) || a.StartsWith("-", StringComparison.Ordinal))
|
||||
.Select(b => {
|
||||
var index = b.IndexOf(":", StringComparison.Ordinal);
|
||||
@@ -680,11 +706,9 @@ namespace SingularityGroup.HotReload.Editor.ProjectGeneration {
|
||||
}
|
||||
|
||||
return default(KeyValuePair<string, string>);
|
||||
});
|
||||
})
|
||||
.Distinct()
|
||||
.ToLookup(o => o.Key, pair => pair.Value);
|
||||
return paths;
|
||||
}
|
||||
|
||||
private string GenerateLangVersion(IEnumerable<string> langVersionList, ProjectPart assembly) {
|
||||
|
||||
-7
@@ -9,10 +9,3 @@ MonoImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 254358
|
||||
packageName: Hot Reload | Edit Code Without Compiling
|
||||
packageVersion: 1.13.17
|
||||
assetPath: Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs
|
||||
uploadId: 870414
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user