diff --git a/Source/Editor/CustomEditors/Dedicated/ParticleEffectEditor.cs b/Source/Editor/CustomEditors/Dedicated/ParticleEffectEditor.cs index 75fec4eba..ec71348cf 100644 --- a/Source/Editor/CustomEditors/Dedicated/ParticleEffectEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ParticleEffectEditor.cs @@ -1,8 +1,10 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +using System; using System.Linq; using FlaxEditor.Surface; using FlaxEngine; +using FlaxEngine.GUI; namespace FlaxEditor.CustomEditors.Dedicated { @@ -13,6 +15,7 @@ namespace FlaxEditor.CustomEditors.Dedicated [CustomEditor(typeof(ParticleEffect)), DefaultEditor] public class ParticleEffectEditor : ActorEditor { + private Label _infoLabel; private bool _isValid; private bool _isActive; private uint _parametersVersion; @@ -48,6 +51,15 @@ namespace FlaxEditor.CustomEditors.Dedicated return null; } + private void Foreach(Action func) + { + foreach (var value in Values) + { + if (value is ParticleEffect player) + func(player); + } + } + /// public override void Initialize(LayoutElementsContainer layout) { @@ -60,6 +72,26 @@ namespace FlaxEditor.CustomEditors.Dedicated _parametersVersion = effect.ParametersVersion; _isActive = effect.IsActive; + // Show playback options during simulation + if (Editor.IsPlayMode) + { + var playbackGroup = layout.Group("Playback"); + playbackGroup.Panel.Open(); + + _infoLabel = playbackGroup.Label(string.Empty).Label; + _infoLabel.AutoHeight = true; + + var grid = playbackGroup.CustomContainer(); + var gridControl = grid.CustomControl; + gridControl.ClipChildren = false; + gridControl.Height = Button.DefaultHeight; + gridControl.SlotsHorizontally = 3; + gridControl.SlotsVertically = 1; + grid.Button("Play").Button.Clicked += () => Foreach(x => x.Play()); + grid.Button("Pause").Button.Clicked += () => Foreach(x => x.Pause()); + grid.Button("Stop").Button.Clicked += () => Foreach(x => x.Stop()); + } + // Show all effect parameters grouped by the emitter track name var groups = layout.Group("Parameters"); groups.Panel.Open(); @@ -99,7 +131,7 @@ namespace FlaxEditor.CustomEditors.Dedicated base.RefreshRootChild(); return; } - + for (int i = 0; i < ChildrenEditors.Count; i++) { if (_isActive != effect.IsActive || _parametersVersion != effect.ParametersVersion) diff --git a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs index 5c87cbff6..8845c24bf 100644 --- a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs +++ b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs @@ -729,8 +729,6 @@ namespace FlaxEditor.SceneGraph.GUI { DragData data; var tree = ParentTree; - if (tree.Selection.Count == 1) - Select(); // Check if this node is selected if (tree.Selection.Contains(this)) diff --git a/Source/Engine/Input/Enums.h b/Source/Engine/Input/Enums.h index 80e10786f..82498f500 100644 --- a/Source/Engine/Input/Enums.h +++ b/Source/Engine/Input/Enums.h @@ -263,6 +263,37 @@ API_ENUM() enum class InputActionMode Release = 2, }; +/// +/// The input action event phases. +/// +API_ENUM() enum class InputActionState +{ + /// + /// The key/button is not assigned. + /// + None = 0, + + /// + /// The key/button is waiting for input. + /// + Waiting = 1, + + /// + /// User is pressing the key/button. + /// + Pressing = 2, + + /// + /// User pressed the key/button (but wasn't pressing it in the previous frame). + /// + Press = 3, + + /// + /// User released the key/button (was pressing it in the previous frame). + /// + Release = 4, +}; + /// /// The input gamepad index. /// diff --git a/Source/Engine/Input/Input.cpp b/Source/Engine/Input/Input.cpp index 7a4547c62..1fa7454ea 100644 --- a/Source/Engine/Input/Input.cpp +++ b/Source/Engine/Input/Input.cpp @@ -29,11 +29,13 @@ struct ActionData { bool Active; uint64 FrameIndex; + InputActionState State; ActionData() { Active = false; FrameIndex = 0; + State = InputActionState::Waiting; } }; @@ -597,6 +599,16 @@ bool Input::GetAction(const StringView& name) return e ? e->Active : false; } +InputActionState Input::GetActionState(const StringView& name) +{ + const auto e = Actions.TryGet(name); + if (e != nullptr) + { + return e->State; + } + return InputActionState::None; +} + float Input::GetAxis(const StringView& name) { const auto e = Axes.TryGet(name); @@ -806,6 +818,7 @@ void InputService::Update() ActionData& data = Actions[name]; data.Active = false; + data.State = InputActionState::Waiting; // Mark as updated in this frame data.FrameIndex = frame; @@ -830,6 +843,19 @@ void InputService::Update() isActive = Input::GetKeyUp(config.Key) || Input::GetMouseButtonUp(config.MouseButton) || Input::GetGamepadButtonUp(config.Gamepad, config.GamepadButton); } + if (Input::GetKeyDown(config.Key) || Input::GetMouseButtonDown(config.MouseButton) || Input::GetGamepadButtonDown(config.Gamepad, config.GamepadButton)) + { + data.State = InputActionState::Press; + } + else if (Input::GetKey(config.Key) || Input::GetMouseButton(config.MouseButton) || Input::GetGamepadButton(config.Gamepad, config.GamepadButton)) + { + data.State = InputActionState::Pressing; + } + else if (Input::GetKeyUp(config.Key) || Input::GetMouseButtonUp(config.MouseButton) || Input::GetGamepadButtonUp(config.Gamepad, config.GamepadButton)) + { + data.State = InputActionState::Release; + } + data.Active |= isActive; } diff --git a/Source/Engine/Input/Input.h b/Source/Engine/Input/Input.h index d9f86076b..1fcb352ea 100644 --- a/Source/Engine/Input/Input.h +++ b/Source/Engine/Input/Input.h @@ -309,6 +309,14 @@ public: /// API_FUNCTION() static bool GetAction(const StringView& name); + /// + /// Gets the value of the virtual action identified by name. Use to get the current config. + /// + /// The action name. + /// A InputActionPhase determining the current phase of the Action (e.g If it was just pressed, is being held or just released). + /// + API_FUNCTION() static InputActionState GetActionState(const StringView& name); + /// /// Gets the value of the virtual axis identified by name. Use to get the current config. /// diff --git a/Source/Engine/Particles/ParticleEffect.cpp b/Source/Engine/Particles/ParticleEffect.cpp index 4b7923439..18bcbdd54 100644 --- a/Source/Engine/Particles/ParticleEffect.cpp +++ b/Source/Engine/Particles/ParticleEffect.cpp @@ -253,6 +253,11 @@ int32 ParticleEffect::GetParticlesCount() const return Instance.GetParticlesCount(); } +bool ParticleEffect::GetIsPlaying() const +{ + return _isPlaying; +} + void ParticleEffect::ResetSimulation() { Instance.ClearState(); @@ -275,6 +280,22 @@ void ParticleEffect::UpdateSimulation(bool singleFrame) Particles::UpdateEffect(this); } +void ParticleEffect::Play() +{ + _isPlaying = true; +} + +void ParticleEffect::Pause() +{ + _isPlaying = false; +} + +void ParticleEffect::Stop() +{ + _isPlaying = false; + ResetSimulation(); +} + void ParticleEffect::UpdateBounds() { BoundingBox bounds = BoundingBox::Empty; @@ -395,6 +416,13 @@ void ParticleEffect::SetParametersOverrides(const Array& valu void ParticleEffect::Update() { + if (!_isPlaying) + { + // Move update timer forward while paused for correct delta time after unpause + Instance.LastUpdateTime = (UseTimeScale ? Time::Update.Time : Time::Update.UnscaledTime).GetTotalSeconds(); + return; + } + // Skip if off-screen if (!UpdateWhenOffscreen && _lastMinDstSqr >= MAX_Real) return; @@ -416,8 +444,12 @@ void ParticleEffect::Update() void ParticleEffect::UpdateExecuteInEditor() { + // Auto-play in Editor if (!Editor::IsPlayMode) + { + _isPlaying = true; Update(); + } } #endif @@ -576,6 +608,7 @@ void ParticleEffect::Serialize(SerializeStream& stream, const void* otherObj) SERIALIZE(SimulationSpeed); SERIALIZE(UseTimeScale); SERIALIZE(IsLooping); + SERIALIZE(PlayOnStart); SERIALIZE(UpdateWhenOffscreen); SERIALIZE(DrawModes); SERIALIZE(SortOrder); @@ -589,6 +622,7 @@ void ParticleEffect::Deserialize(DeserializeStream& stream, ISerializeModifier* const auto overridesMember = stream.FindMember("Overrides"); if (overridesMember != stream.MemberEnd()) { + // [Deprecated on 25.11.2018, expires on 25.11.2022] if (modifier->EngineBuild < 6197) { const auto& overrides = overridesMember->value; @@ -675,6 +709,7 @@ void ParticleEffect::Deserialize(DeserializeStream& stream, ISerializeModifier* DESERIALIZE(SimulationSpeed); DESERIALIZE(UseTimeScale); DESERIALIZE(IsLooping); + DESERIALIZE(PlayOnStart); DESERIALIZE(UpdateWhenOffscreen); DESERIALIZE(DrawModes); DESERIALIZE(SortOrder); @@ -706,6 +741,9 @@ void ParticleEffect::OnEnable() GetScene()->Ticking.Update.AddTickExecuteInEditor(this); #endif + if (PlayOnStart) + Play(); + // Base Actor::OnEnable(); } diff --git a/Source/Engine/Particles/ParticleEffect.h b/Source/Engine/Particles/ParticleEffect.h index 3487a35f4..bfee23a3b 100644 --- a/Source/Engine/Particles/ParticleEffect.h +++ b/Source/Engine/Particles/ParticleEffect.h @@ -184,6 +184,7 @@ private: uint32 _parametersVersion = 0; // Version number for _parameters to be in sync with Instance.ParametersVersion Array _parameters; // Cached for scripting API Array _parametersOverrides; // Cached parameter modifications to be applied to the parameters + bool _isPlaying = false; public: /// @@ -235,9 +236,15 @@ public: bool IsLooping = true; /// - /// If true, the particle simulation will be updated even when an actor cannot be seen by any camera. Otherwise, the simulation will stop running when the actor is off-screen. + /// Determines whether the particle effect should play on start. /// API_FIELD(Attributes="EditorDisplay(\"Particle Effect\"), DefaultValue(true), EditorOrder(60)") + bool PlayOnStart = true; + + /// + /// If true, the particle simulation will be updated even when an actor cannot be seen by any camera. Otherwise, the simulation will stop running when the actor is off-screen. + /// + API_FIELD(Attributes="EditorDisplay(\"Particle Effect\"), DefaultValue(true), EditorOrder(70)") bool UpdateWhenOffscreen = true; /// @@ -326,6 +333,11 @@ public: /// API_PROPERTY() int32 GetParticlesCount() const; + /// + /// Gets whether or not the particle effect is playing. + /// + API_PROPERTY(Attributes="NoSerialize, HideInEditor") bool GetIsPlaying() const; + /// /// Resets the particles simulation state (clears the instance state data but preserves the instance parameters values). /// @@ -337,6 +349,21 @@ public: /// True if update animation by a single frame only (time time since last engine update), otherwise will update simulation with delta time since last update. API_FUNCTION() void UpdateSimulation(bool singleFrame = false); + /// + /// Plays the simulation. + /// + API_FUNCTION() void Play(); + + /// + /// Pauses the simulation. + /// + API_FUNCTION() void Pause(); + + /// + /// Stops and resets the simulation. + /// + API_FUNCTION() void Stop(); + /// /// Updates the actor bounds. /// diff --git a/Source/Engine/Render2D/Font.cpp b/Source/Engine/Render2D/Font.cpp index b026e2d80..c36f40515 100644 --- a/Source/Engine/Render2D/Font.cpp +++ b/Source/Engine/Render2D/Font.cpp @@ -118,16 +118,10 @@ void Font::ProcessText(const StringView& text, Array& outputLines tmpLine.FirstCharIndex = 0; tmpLine.LastCharIndex = -1; - int32 lastWhitespaceIndex = INVALID_INDEX; - float lastWhitespaceX = 0; + int32 lastWrapCharIndex = INVALID_INDEX; + float lastWrapCharX = 0; bool lastMoveLine = false; - int32 lastUpperIndex = INVALID_INDEX; - float lastUpperX = 0; - - int32 lastUnderscoreIndex = INVALID_INDEX; - float lastUnderscoreX = 0; - // Process each character to split text into single lines for (int32 currentIndex = 0; currentIndex < textLength;) { @@ -137,30 +131,14 @@ void Font::ProcessText(const StringView& text, Array& outputLines // Cache current character const Char currentChar = text[currentIndex]; - - // Check if character is a whitespace const bool isWhitespace = StringUtils::IsWhitespace(currentChar); - if (isWhitespace) - { - // Cache line break point - lastWhitespaceIndex = currentIndex; - lastWhitespaceX = cursorX; - } - // Check if character is an upper case letter - const bool isUpper = StringUtils::IsUpper(currentChar); - if (isUpper && currentIndex != 0) + // Check if character can wrap words + const bool isWrapChar = !StringUtils::IsAlnum(currentChar) || isWhitespace || StringUtils::IsUpper(currentChar); + if (isWrapChar && currentIndex != 0) { - lastUpperIndex = currentIndex; - lastUpperX = cursorX; - } - - // Check if character is an underscore - const bool isUnderscore = currentChar == '_'; - if (isUnderscore) - { - lastUnderscoreIndex = currentIndex; - lastUnderscoreX = cursorX; + lastWrapCharIndex = currentIndex; + lastWrapCharX = cursorX; } // Check if it's a newline character @@ -197,41 +175,31 @@ void Font::ProcessText(const StringView& text, Array& outputLines } else if (layout.TextWrapping == TextWrapping::WrapWords) { - // Move line but back to the last after-whitespace character - moveLine = true; - if (lastWhitespaceIndex != INVALID_INDEX) - { - cursorX = lastWhitespaceX; - tmpLine.LastCharIndex = lastWhitespaceIndex - 1; - nextCharIndex = currentIndex = lastWhitespaceIndex + 1; - } - else if (lastUpperIndex != INVALID_INDEX) + if (lastWrapCharIndex != INVALID_INDEX) { // Skip moving twice for the same character - if (outputLines.HasItems() && outputLines.Last().LastCharIndex == lastUpperIndex - 1) + if (outputLines.HasItems() && outputLines.Last().LastCharIndex == lastWrapCharIndex - 1) { currentIndex = nextCharIndex; lastMoveLine = moveLine; continue; } - cursorX = lastUpperX; - tmpLine.LastCharIndex = lastUpperIndex - 1; - nextCharIndex = currentIndex = lastUpperIndex; - } - else if (lastUnderscoreIndex != INVALID_INDEX) - { - cursorX = lastUnderscoreX; - tmpLine.LastCharIndex = lastUnderscoreIndex - 2; - nextCharIndex = currentIndex = lastUnderscoreIndex + 1; - } - else - { - nextCharIndex = currentIndex; - - // Skip moving twice for the same character - if (lastMoveLine) - break; + // Move line + const Char wrapChar = text[lastWrapCharIndex]; + moveLine = true; + cursorX = lastWrapCharX; + if (StringUtils::IsWhitespace(wrapChar)) + { + // Skip whitespaces + tmpLine.LastCharIndex = lastWrapCharIndex - 1; + nextCharIndex = currentIndex = lastWrapCharIndex + 1; + } + else + { + tmpLine.LastCharIndex = lastWrapCharIndex - 1; + nextCharIndex = currentIndex = lastWrapCharIndex; + } } } else if (layout.TextWrapping == TextWrapping::WrapChars) @@ -260,16 +228,8 @@ void Font::ProcessText(const StringView& text, Array& outputLines tmpLine.FirstCharIndex = currentIndex; tmpLine.LastCharIndex = currentIndex - 1; cursorX = 0; - - lastWhitespaceIndex = INVALID_INDEX; - lastWhitespaceX = 0; - - lastUpperIndex = INVALID_INDEX; - lastUpperX = 0; - - lastUnderscoreIndex = INVALID_INDEX; - lastUnderscoreX = 0; - + lastWrapCharIndex = INVALID_INDEX; + lastWrapCharX = 0; previous.IsValid = false; } diff --git a/Source/Engine/UI/GUI/Common/Button.cs b/Source/Engine/UI/GUI/Common/Button.cs index 532523be7..da6fc1529 100644 --- a/Source/Engine/UI/GUI/Common/Button.cs +++ b/Source/Engine/UI/GUI/Common/Button.cs @@ -42,7 +42,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the font used to draw button text. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2022), ExpandGroups] public FontReference Font { get => _font; @@ -52,15 +52,51 @@ namespace FlaxEngine.GUI /// /// Gets or sets the custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("Custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] + [EditorDisplay("Text Style"), EditorOrder(2021), Tooltip("Custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] public MaterialBase TextMaterial { get; set; } /// /// Gets or sets the color used to draw button text. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2020)] public Color TextColor; + /// + /// Gets or sets the brush used for background drawing. + /// + [EditorDisplay("Background Style"), EditorOrder(1999), Tooltip("The brush used for background drawing."), ExpandGroups] + public IBrush BackgroundBrush { get; set; } + + /// + /// Gets or sets the background color when button is highlighted. + /// + [EditorDisplay("Background Style"), EditorOrder(2001)] + public Color BackgroundColorHighlighted { get; set; } + + /// + /// Gets or sets the background color when button is selected. + /// + [EditorDisplay("Background Style"), EditorOrder(2002)] + public Color BackgroundColorSelected { get; set; } + + /// + /// Gets or sets the color of the border. + /// + [EditorDisplay("Border Style"), EditorOrder(2010), ExpandGroups] + public Color BorderColor { get; set; } + + /// + /// Gets or sets the border color when button is highlighted. + /// + [EditorDisplay("Border Style"), EditorOrder(2011)] + public Color BorderColorHighlighted { get; set; } + + /// + /// Gets or sets the border color when button is selected. + /// + [EditorDisplay("Border Style"), EditorOrder(2012)] + public Color BorderColorSelected { get; set; } + /// /// Event fired when user clicks on the button. /// @@ -81,42 +117,6 @@ namespace FlaxEngine.GUI /// public event Action HoverEnd; - /// - /// Gets or sets the brush used for background drawing. - /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The brush used for background drawing.")] - public IBrush BackgroundBrush { get; set; } - - /// - /// Gets or sets the color of the border. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color BorderColor { get; set; } - - /// - /// Gets or sets the background color when button is selected. - /// - [EditorDisplay("Style"), EditorOrder(2010)] - public Color BackgroundColorSelected { get; set; } - - /// - /// Gets or sets the border color when button is selected. - /// - [EditorDisplay("Style"), EditorOrder(2020)] - public Color BorderColorSelected { get; set; } - - /// - /// Gets or sets the background color when button is highlighted. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color BackgroundColorHighlighted { get; set; } - - /// - /// Gets or sets the border color when button is highlighted. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color BorderColorHighlighted { get; set; } - /// /// Gets a value indicating whether this button is being pressed (by mouse or touch). /// @@ -209,7 +209,7 @@ namespace FlaxEngine.GUI public override void ClearState() { base.ClearState(); - + if (_isPressed) OnPressEnd(); } diff --git a/Source/Engine/UI/GUI/Common/CheckBox.cs b/Source/Engine/UI/GUI/Common/CheckBox.cs index ab689bfc3..939708f36 100644 --- a/Source/Engine/UI/GUI/Common/CheckBox.cs +++ b/Source/Engine/UI/GUI/Common/CheckBox.cs @@ -97,6 +97,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the size of the box. /// + [EditorOrder(20)] public float BoxSize { get => _boxSize; @@ -107,34 +108,34 @@ namespace FlaxEngine.GUI } } - /// - /// Gets or sets the color of the checkbox icon. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color ImageColor { get; set; } - /// /// Gets or sets the color of the border. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Border Style"), EditorOrder(2010), ExpandGroups] public Color BorderColor { get; set; } /// /// Gets or sets the border color when checkbox is hovered. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Border Style"), EditorOrder(2011)] public Color BorderColorHighlighted { get; set; } + /// + /// Gets or sets the color of the checkbox icon. + /// + [EditorDisplay("Image Style"), EditorOrder(2020), ExpandGroups] + public Color ImageColor { get; set; } + /// /// Gets or sets the image used to render checkbox checked state. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The image used to render checkbox checked state.")] + [EditorDisplay("Image Style"), EditorOrder(2021), Tooltip("The image used to render checkbox checked state.")] public IBrush CheckedImage { get; set; } /// /// Gets or sets the image used to render checkbox intermediate state. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The image used to render checkbox intermediate state.")] + [EditorDisplay("Image Style"), EditorOrder(2022), Tooltip("The image used to render checkbox intermediate state.")] public IBrush IntermediateImage { get; set; } /// diff --git a/Source/Engine/UI/GUI/Common/Dropdown.cs b/Source/Engine/UI/GUI/Common/Dropdown.cs index 80d4beb02..6ad962d6d 100644 --- a/Source/Engine/UI/GUI/Common/Dropdown.cs +++ b/Source/Engine/UI/GUI/Common/Dropdown.cs @@ -246,79 +246,79 @@ namespace FlaxEngine.GUI /// /// Gets or sets the font used to draw text. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2021)] public FontReference Font { get; set; } /// /// Gets or sets the custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("Custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] + [EditorDisplay("Text Style"), EditorOrder(2022), Tooltip("Custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] public MaterialBase FontMaterial { get; set; } /// /// Gets or sets the color of the text. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2020), ExpandGroups] public Color TextColor { get; set; } /// /// Gets or sets the color of the border. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Border Style"), EditorOrder(2010), ExpandGroups] public Color BorderColor { get; set; } /// /// Gets or sets the background color when dropdown popup is opened. /// - [EditorDisplay("Style"), EditorOrder(2010)] + [EditorDisplay("Background Style"), EditorOrder(2002)] public Color BackgroundColorSelected { get; set; } /// /// Gets or sets the border color when dropdown popup is opened. /// - [EditorDisplay("Style"), EditorOrder(2020)] + [EditorDisplay("Border Style"), EditorOrder(2012)] public Color BorderColorSelected { get; set; } /// /// Gets or sets the background color when dropdown is highlighted. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Background Style"), EditorOrder(2001), ExpandGroups] public Color BackgroundColorHighlighted { get; set; } /// /// Gets or sets the border color when dropdown is highlighted. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Border Style"), EditorOrder(2011)] public Color BorderColorHighlighted { get; set; } /// /// Gets or sets the image used to render dropdown drop arrow icon. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The image used to render dropdown drop arrow icon.")] + [EditorDisplay("Icon Style"), EditorOrder(2033), Tooltip("The image used to render dropdown drop arrow icon.")] public IBrush ArrowImage { get; set; } /// /// Gets or sets the color used to render dropdown drop arrow icon. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color used to render dropdown drop arrow icon.")] + [EditorDisplay("Icon Style"), EditorOrder(2030), Tooltip("The color used to render dropdown drop arrow icon."), ExpandGroups] public Color ArrowColor { get; set; } /// /// Gets or sets the color used to render dropdown drop arrow icon (menu is opened). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color used to render dropdown drop arrow icon (menu is opened).")] + [EditorDisplay("Icon Style"), EditorOrder(2032), Tooltip("The color used to render dropdown drop arrow icon (menu is opened).")] public Color ArrowColorSelected { get; set; } /// /// Gets or sets the color used to render dropdown drop arrow icon (menu is highlighted). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color used to render dropdown drop arrow icon (menu is highlighted).")] + [EditorDisplay("Icon Style"), EditorOrder(2031), Tooltip("The color used to render dropdown drop arrow icon (menu is highlighted).")] public Color ArrowColorHighlighted { get; set; } /// /// Gets or sets the image used to render dropdown checked item icon. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The image used to render dropdown checked item icon.")] + [EditorDisplay("Icon Style"), EditorOrder(2034), Tooltip("The image used to render dropdown checked item icon.")] public IBrush CheckedImage { get; set; } /// diff --git a/Source/Engine/UI/GUI/Common/Image.cs b/Source/Engine/UI/GUI/Common/Image.cs index 98113b00c..f911664f6 100644 --- a/Source/Engine/UI/GUI/Common/Image.cs +++ b/Source/Engine/UI/GUI/Common/Image.cs @@ -25,19 +25,19 @@ namespace FlaxEngine.GUI /// /// Gets or sets the color used to multiply the image pixels. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Image Style"), EditorOrder(2010), ExpandGroups] public Color Color { get; set; } = Color.White; /// /// Gets or sets the color used to multiply the image pixels when mouse is over the image. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Image Style"), EditorOrder(2011)] public Color MouseOverColor { get; set; } = Color.White; /// /// Gets or sets the color used to multiply the image pixels when control is disabled. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Image Style"), EditorOrder(2012)] public Color DisabledTint { get; set; } = Color.Gray; /// diff --git a/Source/Engine/UI/GUI/Common/Label.cs b/Source/Engine/UI/GUI/Common/Label.cs index b64764a40..2779dfdea 100644 --- a/Source/Engine/UI/GUI/Common/Label.cs +++ b/Source/Engine/UI/GUI/Common/Label.cs @@ -47,37 +47,37 @@ namespace FlaxEngine.GUI /// /// Gets or sets the color of the text. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the text.")] + [EditorDisplay("Text Style"), EditorOrder(2010), Tooltip("The color of the text."), ExpandGroups] public Color TextColor { get; set; } /// /// Gets or sets the color of the text when it is highlighted (mouse is over). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the text when it is highlighted (mouse is over).")] + [EditorDisplay("Text Style"), EditorOrder(2011), Tooltip("The color of the text when it is highlighted (mouse is over).")] public Color TextColorHighlighted { get; set; } /// /// Gets or sets the horizontal text alignment within the control bounds. /// - [EditorDisplay("Style"), EditorOrder(2010), Tooltip("The horizontal text alignment within the control bounds.")] + [EditorDisplay("Text Style"), EditorOrder(2020), Tooltip("The horizontal text alignment within the control bounds.")] public TextAlignment HorizontalAlignment { get; set; } = TextAlignment.Center; /// /// Gets or sets the vertical text alignment within the control bounds. /// - [EditorDisplay("Style"), EditorOrder(2020), Tooltip("The vertical text alignment within the control bounds.")] + [EditorDisplay("Text Style"), EditorOrder(2021), Tooltip("The vertical text alignment within the control bounds.")] public TextAlignment VerticalAlignment { get; set; } = TextAlignment.Center; /// /// Gets or sets the text wrapping within the control bounds. /// - [EditorDisplay("Style"), EditorOrder(2030), Tooltip("The text wrapping within the control bounds.")] + [EditorDisplay("Text Style"), EditorOrder(2022), Tooltip("The text wrapping within the control bounds.")] public TextWrapping Wrapping { get; set; } = TextWrapping.NoWrap; /// /// Gets or sets the font. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2023)] public FontReference Font { get => _font; @@ -99,7 +99,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2024)] public MaterialBase Material { get; set; } /// diff --git a/Source/Engine/UI/GUI/Common/ProgressBar.cs b/Source/Engine/UI/GUI/Common/ProgressBar.cs index fa76d9d26..a742d3b43 100644 --- a/Source/Engine/UI/GUI/Common/ProgressBar.cs +++ b/Source/Engine/UI/GUI/Common/ProgressBar.cs @@ -99,19 +99,19 @@ namespace FlaxEngine.GUI /// /// Gets or sets the margin for the progress bar rectangle within the control bounds. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The margin for the progress bar rectangle within the control bounds.")] + [EditorDisplay("Bar Style"), EditorOrder(2011), Tooltip("The margin for the progress bar rectangle within the control bounds.")] public Margin BarMargin { get; set; } /// /// Gets or sets the color of the progress bar rectangle. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the progress bar rectangle.")] + [EditorDisplay("Bar Style"), EditorOrder(2010), Tooltip("The color of the progress bar rectangle."), ExpandGroups] public Color BarColor { get; set; } /// /// Gets or sets the brush used for progress bar drawing. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The brush used for progress bar drawing.")] + [EditorDisplay("Bar Style"), EditorOrder(2012), Tooltip("The brush used for progress bar drawing.")] public IBrush BarBrush { get; set; } /// diff --git a/Source/Engine/UI/GUI/Common/TextBox.cs b/Source/Engine/UI/GUI/Common/TextBox.cs index 00c381e01..5ec86a94e 100644 --- a/Source/Engine/UI/GUI/Common/TextBox.cs +++ b/Source/Engine/UI/GUI/Common/TextBox.cs @@ -27,7 +27,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the text wrapping within the control bounds. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The text wrapping within the control bounds.")] + [EditorDisplay("Text Style"), EditorOrder(2023), Tooltip("The text wrapping within the control bounds.")] public TextWrapping Wrapping { get => _layout.TextWrapping; @@ -37,31 +37,31 @@ namespace FlaxEngine.GUI /// /// Gets or sets the font. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorDisplay("Text Style"), EditorOrder(2024)] public FontReference Font { get; set; } /// /// Gets or sets the custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("Custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] + [EditorDisplay("Text Style"), EditorOrder(2025), Tooltip("Custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] public MaterialBase TextMaterial { get; set; } /// /// Gets or sets the color of the text. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the text.")] + [EditorDisplay("Text Style"), EditorOrder(2020), Tooltip("The color of the text."), ExpandGroups] public Color TextColor { get; set; } /// /// Gets or sets the color of the text. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the watermark text.")] + [EditorDisplay("Text Style"), EditorOrder(2021), Tooltip("The color of the watermark text.")] public Color WatermarkTextColor { get; set; } /// /// Gets or sets the color of the selection (Transparent if not used). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the selection (Transparent if not used).")] + [EditorDisplay("Text Style"), EditorOrder(2022), Tooltip("The color of the selection (Transparent if not used).")] public Color SelectionColor { get; set; } /// diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index fb130bf18..d94ff8854 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -243,42 +243,43 @@ namespace FlaxEngine.GUI /// /// Gets or sets a value indicating whether you can scroll the text in the text box (eg. with a mouse wheel). /// + [EditorOrder(41)] public bool IsMultilineScrollable { get; set; } = true; /// /// Gets or sets textbox background color when the control is selected (has focus). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The textbox background color when the control is selected (has focus).")] + [EditorDisplay("Background Style"), EditorOrder(2001), Tooltip("The textbox background color when the control is selected (has focus)."), ExpandGroups] public Color BackgroundSelectedColor { get; set; } /// /// Gets or sets the color of the caret (Transparent if not used). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the caret (Transparent if not used).")] + [EditorDisplay("Caret Style"), EditorOrder(2020), Tooltip("The color of the caret (Transparent if not used)."), ExpandGroups] public Color CaretColor { get; set; } /// /// Gets or sets the speed of the caret flashing animation. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The speed of the caret flashing animation.")] + [EditorDisplay("Caret Style"), EditorOrder(2021), Tooltip("The speed of the caret flashing animation.")] public float CaretFlashSpeed { get; set; } = 6.0f; /// /// Gets or sets the speed of the selection background flashing animation. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The speed of the selection background flashing animation.")] + [EditorDisplay("Background Style"), EditorOrder(2002), Tooltip("The speed of the selection background flashing animation.")] public float BackgroundSelectedFlashSpeed { get; set; } = 6.0f; /// /// Gets or sets the color of the border (Transparent if not used). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the border (Transparent if not used).")] + [EditorDisplay("Border Style"), EditorOrder(2010), Tooltip("The color of the border (Transparent if not used)."), ExpandGroups] public Color BorderColor { get; set; } /// /// Gets or sets the color of the border when control is focused (Transparent if not used). /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The color of the border when control is focused (Transparent if not used)")] + [EditorDisplay("Border Style"), EditorOrder(2011), Tooltip("The color of the border when control is focused (Transparent if not used)")] public Color BorderSelectedColor { get; set; } /// @@ -409,6 +410,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the selection range. /// + [EditorOrder(50)] public TextRange SelectionRange { get => new TextRange(SelectionLeft, SelectionRight); @@ -1195,7 +1197,7 @@ namespace FlaxEngine.GUI { SetSelection(hitPos); } - + if (Cursor == CursorType.Default && _changeCursor) Cursor = CursorType.IBeam; diff --git a/Source/Engine/UI/GUI/Control.cs b/Source/Engine/UI/GUI/Control.cs index 427c1aa8f..49b7f65d3 100644 --- a/Source/Engine/UI/GUI/Control.cs +++ b/Source/Engine/UI/GUI/Control.cs @@ -166,7 +166,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets control background color (transparent color (alpha=0) means no background rendering) /// - [ExpandGroups, EditorDisplay("Style"), EditorOrder(2000), Tooltip("The control background color. Use transparent color (alpha=0) to hide background.")] + [ExpandGroups, EditorDisplay("Background Style"), EditorOrder(2000), Tooltip("The control background color. Use transparent color (alpha=0) to hide background.")] public Color BackgroundColor { get => _backgroundColor; diff --git a/Source/Engine/UI/GUI/Panels/DropPanel.cs b/Source/Engine/UI/GUI/Panels/DropPanel.cs index 409209549..d650d6205 100644 --- a/Source/Engine/UI/GUI/Panels/DropPanel.cs +++ b/Source/Engine/UI/GUI/Panels/DropPanel.cs @@ -95,48 +95,48 @@ namespace FlaxEngine.GUI } } - /// - /// Gets or sets the color used to draw header text. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color HeaderTextColor; - - /// - /// Gets or sets the color of the header. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color HeaderColor { get; set; } - - /// - /// Gets or sets the color of the header when mouse is over. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public Color HeaderColorMouseOver { get; set; } - - /// - /// Gets or sets the font used to render panel header text. - /// - [EditorDisplay("Style"), EditorOrder(2000)] - public FontReference HeaderTextFont { get; set; } - - /// - /// Gets or sets the custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data. - /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("Custom material used to render the header text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] - public MaterialBase HeaderTextMaterial { get; set; } - /// /// Gets or sets a value indicating whether enable drop down icon drawing. /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorOrder(1)] public bool EnableDropDownIcon { get; set; } /// /// Gets or sets a value indicating whether to enable containment line drawing, /// - [EditorDisplay("Style"), EditorOrder(2000)] + [EditorOrder(2)] public bool EnableContainmentLines { get; set; } = false; + /// + /// Gets or sets the color used to draw header text. + /// + [EditorDisplay("Header Style"), EditorOrder(2010), ExpandGroups] + public Color HeaderTextColor; + + /// + /// Gets or sets the color of the header. + /// + [EditorDisplay("Header Style"), EditorOrder(2011)] + public Color HeaderColor { get; set; } + + /// + /// Gets or sets the color of the header when mouse is over. + /// + [EditorDisplay("Header Style"), EditorOrder(2012)] + public Color HeaderColorMouseOver { get; set; } + + /// + /// Gets or sets the font used to render panel header text. + /// + [EditorDisplay("Header Text Style"), EditorOrder(2020), ExpandGroups] + public FontReference HeaderTextFont { get; set; } + + /// + /// Gets or sets the custom material used to render the text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data. + /// + [EditorDisplay("Header Text Style"), EditorOrder(2021), Tooltip("Custom material used to render the header text. It must has domain set to GUI and have a public texture parameter named Font used to sample font atlas texture with font characters data.")] + public MaterialBase HeaderTextMaterial { get; set; } + /// /// Occurs when mouse right-clicks over the header. /// @@ -192,13 +192,13 @@ namespace FlaxEngine.GUI /// /// Gets or sets the image used to render drop panel drop arrow icon when panel is opened. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The image used to render drop panel drop arrow icon when panel is opened.")] + [EditorDisplay("Icon Style"), EditorOrder(2030), Tooltip("The image used to render drop panel drop arrow icon when panel is opened."), ExpandGroups] public IBrush ArrowImageOpened { get; set; } /// /// Gets or sets the image used to render drop panel drop arrow icon when panel is closed. /// - [EditorDisplay("Style"), EditorOrder(2000), Tooltip("The image used to render drop panel drop arrow icon when panel is closed.")] + [EditorDisplay("Icon Style"), EditorOrder(2031), Tooltip("The image used to render drop panel drop arrow icon when panel is closed.")] public IBrush ArrowImageClosed { get; set; } /// @@ -376,7 +376,6 @@ namespace FlaxEngine.GUI Render2D.DrawText(HeaderTextFont.GetFont(), HeaderTextMaterial, HeaderText, textRect, textColor, TextAlignment.Near, TextAlignment.Center); - if (!_isClosed && EnableContainmentLines) { Color lineColor = Style.Current.ForegroundGrey - new Color(0, 0, 0, 100); @@ -385,7 +384,7 @@ namespace FlaxEngine.GUI Render2D.DrawLine(new Float2(1, Height), new Float2(Width, Height), lineColor, lineThickness); Render2D.DrawLine(new Float2(Width, HeaderHeight), new Float2(Width, Height), lineColor, lineThickness); } - + // Children DrawChildren(); }