Merge remote-tracking branch 'origin/master' into 1.5

This commit is contained in:
Wojtek Figat
2023-01-15 12:44:45 +01:00
9 changed files with 329 additions and 34 deletions

View File

@@ -36,6 +36,7 @@ namespace FlaxEditor.Content
/// A <see cref="SceneAnimation"/> asset proxy object.
/// </summary>
/// <seealso cref="FlaxEditor.Content.BinaryAssetProxy" />
[ContentContextMenu("New/Animation/Scene Animation")]
public class SceneAnimationProxy : BinaryAssetProxy
{
/// <inheritdoc />

View File

@@ -9,6 +9,7 @@ using FlaxEditor.Content;
using FlaxEditor.Content.Import;
using FlaxEditor.Content.Settings;
using FlaxEditor.Content.Thumbnails;
using FlaxEditor.GUI;
using FlaxEditor.Modules;
using FlaxEditor.Modules.SourceCodeEditing;
using FlaxEditor.Options;
@@ -46,6 +47,8 @@ namespace FlaxEditor
private bool _isAfterInit, _areModulesInited, _areModulesAfterInitEnd, _isHeadlessMode;
private string _projectToOpen;
private float _lastAutoSaveTimer;
private AutoSavePopup _autoSavePopup;
private bool _autoSaveNow;
private Guid _startupSceneCmdLine;
private const string ProjectDataLastScene = "LastScene";
@@ -491,7 +494,28 @@ namespace FlaxEditor
var timeToNextSave = options.AutoSaveFrequency * 60.0f - timeSinceLastSave;
var countDownDuration = 4.0f;
if (timeToNextSave <= 0.0f)
// Show auto save popup
if (timeToNextSave <= options.AutoSaveReminderTime && timeToNextSave >= 0)
{
if (_autoSavePopup == null)
{
_autoSavePopup = AutoSavePopup.Show(Instance.Windows.MainWindow.GUI, timeToNextSave);
_autoSavePopup.SaveNowButton.Clicked += () => _autoSaveNow = true;
_autoSavePopup.CancelSaveButton.Clicked += () =>
{
Log("Auto save canceled");
_autoSavePopup.HidePopup();
_lastAutoSaveTimer = Time.UnscaledGameTime; // Reset timer
};
}
else if (!_autoSavePopup.Visible && !_autoSavePopup.UserClosed)
_autoSavePopup.ShowPopup();
if (_autoSavePopup.Visible)
_autoSavePopup.UpdateTime(timeToNextSave);
}
if (timeToNextSave <= 0.0f || _autoSaveNow)
{
Log("Auto save");
_lastAutoSaveTimer = Time.UnscaledGameTime;
@@ -499,6 +523,11 @@ namespace FlaxEditor
Scene.SaveScenes();
if (options.AutoSaveContent)
SaveContent();
// Hide auto save popup and reset user closed
_autoSavePopup.HidePopup();
_autoSavePopup.UserClosed = false;
_autoSaveNow = false;
}
else if (timeToNextSave < countDownDuration)
{

View File

@@ -0,0 +1,169 @@
using FlaxEngine;
using FlaxEngine.GUI;
namespace FlaxEditor.GUI
{
/// <summary>
/// Popup menu for reminding of an upcoming auto save.
/// </summary>
public class AutoSavePopup : ContainerControl
{
/// <summary>
/// Gets or sets the value for if the user has manually closed this popup.
/// </summary>
public bool UserClosed { get; set; }
/// <summary>
/// The save now button. Used to skip the last remaining auto save time.
/// </summary>
public Button SaveNowButton => _saveNowButton;
/// <summary>
/// Button that should be used to cancel the auto save.
/// </summary>
public Button CancelSaveButton => _cancelSaveButton;
private int _timeRemaining;
private Panel _backgroundPanel;
private Label _timeLabel;
private Button _saveNowButton;
private Button _cancelSaveButton;
private Color _defaultTextColor;
private bool _isMoved = false;
/// <summary>
/// Initialize the AutoSavePopup.
/// </summary>
/// <param name="initialTime">The initial time to set the time label to.</param>
public AutoSavePopup(float initialTime)
{
UpdateTime(initialTime);
_backgroundPanel = new Panel(ScrollBars.None)
{
Parent = this,
AnchorPreset = AnchorPresets.StretchAll,
BackgroundColor = Color.Transparent,
};
_timeLabel = new Label(0, 0, 25, 10)
{
Parent = _backgroundPanel,
Text = _timeRemaining.ToString(),
HorizontalAlignment = TextAlignment.Near,
VerticalAlignment = TextAlignment.Near,
AutoWidth = true,
Height = 14,
AnchorPreset = AnchorPresets.MiddleLeft,
};
_saveNowButton = new Button
{
Parent = _backgroundPanel,
Height = 14,
Width = 60,
AnchorPreset = AnchorPresets.MiddleRight,
BackgroundColor = Color.Transparent,
BorderColor = Color.Transparent,
BackgroundColorHighlighted = Color.Transparent,
BackgroundColorSelected = Color.Transparent,
BorderColorHighlighted = Color.Transparent,
Text = "Save Now",
TooltipText = "Saves now and restarts the auto save timer."
};
_saveNowButton.LocalX -= 85;
_cancelSaveButton = new Button
{
Parent = _backgroundPanel,
Height = 14,
Width = 70,
AnchorPreset = AnchorPresets.MiddleRight,
BackgroundColor = Color.Transparent,
BorderColor = Color.Transparent,
BackgroundColorHighlighted = Color.Transparent,
BackgroundColorSelected = Color.Transparent,
BorderColorHighlighted = Color.Transparent,
Text = "Cancel Save",
TooltipText = "Cancels this auto save."
};
_cancelSaveButton.LocalX -= 5;
_defaultTextColor = _saveNowButton.TextColor;
}
/// <summary>
/// Updates the time label
/// </summary>
/// <param name="time">The time to change the label to.</param>
public void UpdateTime(float time)
{
_timeRemaining = Mathf.CeilToInt(time);
if (_timeLabel != null)
_timeLabel.Text = "Auto Save in: " + _timeRemaining;
// Move on text update if the progress bar is visible - removes this call from update
if (Editor.Instance.UI.ProgressVisible && !_isMoved)
{
_isMoved = true;
LocalX -= 250;
}
else if (!Editor.Instance.UI.ProgressVisible && _isMoved)
{
LocalX += 250;
_isMoved = false;
}
}
/// <inheritdoc />
public override void Update(float deltaTime)
{
if (IsMouseOver)
{
_saveNowButton.TextColor = _saveNowButton.IsMouseOver ? Style.Current.BackgroundHighlighted : _defaultTextColor;
_cancelSaveButton.TextColor = _cancelSaveButton.IsMouseOver ? Style.Current.BackgroundHighlighted : _defaultTextColor;
}
base.Update(deltaTime);
}
/// <summary>
/// Creates and shows the AutoSavePopup
/// </summary>
/// <param name="parentControl">The parent control.</param>
/// <param name="initialTime">The time to start at.</param>
/// <returns></returns>
public static AutoSavePopup Show(ContainerControl parentControl, float initialTime)
{
var popup = new AutoSavePopup(initialTime)
{
Parent = parentControl,
Height = Editor.Instance.UI.StatusBar.Height,
Width = 250,
AnchorPreset = AnchorPresets.BottomRight,
};
popup.ShowPopup();
return popup;
}
/// <summary>
/// Shows the popup by changing its visibility
/// </summary>
public void ShowPopup()
{
Visible = true;
UserClosed = false;
_saveNowButton.TextColor = _defaultTextColor;
_cancelSaveButton.TextColor = _defaultTextColor;
}
/// <summary>
/// Hides the popup by changing its visibility
/// </summary>
public void HidePopup()
{
Visible = false;
if (_containsFocus)
Defocus();
}
}
}

View File

@@ -196,19 +196,26 @@ namespace FlaxEditor.Options
[DefaultValue(5), Limit(1)]
[EditorDisplay("Auto Save", "Auto Save Frequency"), EditorOrder(801), Tooltip("The interval between auto saves (in minutes)")]
public int AutoSaveFrequency { get; set; } = 5;
/// <summary>
/// Gets or sets a value indicating the time before the auto save that the popup shows (in seconds).
/// </summary>
[DefaultValue(10), Limit(-1)]
[EditorDisplay("Auto Save", "Auto Save Reminder Time"), EditorOrder(802), Tooltip("The time before the auto save that the reminder popup shows (in seconds). Set to -1 to not show the reminder popup.")]
public int AutoSaveReminderTime { get; set; } = 10;
/// <summary>
/// Gets or sets a value indicating whether enable auto saves for scenes.
/// </summary>
[DefaultValue(true)]
[EditorDisplay("Auto Save", "Auto Save Scenes"), EditorOrder(802), Tooltip("Enables or disables auto saving opened scenes")]
[EditorDisplay("Auto Save", "Auto Save Scenes"), EditorOrder(803), Tooltip("Enables or disables auto saving opened scenes")]
public bool AutoSaveScenes { get; set; } = true;
/// <summary>
/// Gets or sets a value indicating whether enable auto saves for content.
/// </summary>
[DefaultValue(true)]
[EditorDisplay("Auto Save", "Auto Save Content"), EditorOrder(803), Tooltip("Enables or disables auto saving content")]
[EditorDisplay("Auto Save", "Auto Save Content"), EditorOrder(804), Tooltip("Enables or disables auto saving content")]
public bool AutoSaveContent { get; set; } = true;
/// <summary>

View File

@@ -405,6 +405,31 @@ namespace FlaxEditor.Surface.Archetypes
NodeElementArchetype.Factory.Output(0, "Color", typeof(Float3), 3)
}
},
new NodeArchetype
{
TypeID = 17,
Create = (id, context, arch, groupArch) => new SampleTextureNode(id, context, arch, groupArch),
Title = "Procedural Sample Texture",
Description = "Samples a texture to create a more natural look with less obvious tiling.",
Flags = NodeFlags.MaterialGraph,
Size = new Float2(240, 110),
ConnectionsHints = ConnectionsHint.Vector,
DefaultValues = new object[]
{
2,
-1.0f,
0,
},
Elements = new[]
{
NodeElementArchetype.Factory.Input(0, "Texture", true, typeof(FlaxEngine.Object), 0),
NodeElementArchetype.Factory.Input(1, "UVs", true, null, 1),
NodeElementArchetype.Factory.Input(2, "Offset", true, typeof(Float2), 3),
NodeElementArchetype.Factory.Output(0, "Color", typeof(Float4), 4),
NodeElementArchetype.Factory.Text(0, Surface.Constants.LayoutOffsetY * 4, "Sampler"),
NodeElementArchetype.Factory.ComboBox(50, Surface.Constants.LayoutOffsetY * 4, 100, 0, typeof(CommonSamplerType))
}
},
};
}
}

View File

@@ -397,6 +397,13 @@ namespace FlaxEditor.Surface.ContextMenu
return;
Profiler.BeginEvent("VisjectCM.OnSearchFilterChanged");
if (string.IsNullOrEmpty(_searchBox.Text))
{
ResetView();
Profiler.EndEvent();
return;
}
// Update groups
LockChildrenRecursive();

View File

@@ -906,12 +906,21 @@ namespace FlaxEditor.Utilities
if (name.StartsWith("g_") || name.StartsWith("m_"))
startIndex = 2;
if (name.StartsWith("_"))
startIndex = 1;
// Filter text
var lastChar = '\0';
for (int i = startIndex; i < length; i++)
{
var c = name[i];
if (i == startIndex)
{
sb.Append(char.ToUpper(c));
continue;
}
// Space before word starting with uppercase letter
if (char.IsUpper(c) && i > 0)
{