Exemplo n.º 1
0
        /// <inheritdoc />
        public override void Initialize(LayoutElementsContainer layout)
        {
            _scripts.Clear();

            // Area for drag&drop scripts
            var dragArea = layout.CustomContainer <DragAreaControl>();

            dragArea.CustomControl.ScriptsEditor = this;

            // No support to show scripts for more than one actor selected
            // TODO: support showing scripts from objects that has the same scripts layout
            if (Values.Count != 1)
            {
                return;
            }

            // Scripts arrange bar
            var dragBar = layout.Custom <ScriptArrangeBar>();

            dragBar.CustomControl.Init(0, this);

            // Scripts
            var scripts = (Script[])Values[0];

            _scripts.AddRange(scripts);
            var elementType = typeof(Script);

            for (int i = 0; i < scripts.Length; i++)
            {
                var script = scripts[i];
                if (script == null)
                {
                    AddMissingScript(i, layout);
                    continue;
                }

                var values = new ListValueContainer(elementType, i, Values);
                var type   = script.GetType();
                var editor = CustomEditorsUtil.CreateEditor(type, false);

                // Create group
                var title = CustomEditorsUtil.GetPropertyNameUI(type.Name);
                var group = layout.Group(title);
                group.Panel.Open(false);

                // Customize
                var typeAttributes = type.GetCustomAttributes(true);
                var tooltip        = (TooltipAttribute)typeAttributes.FirstOrDefault(x => x is TooltipAttribute);
                if (tooltip != null)
                {
                    group.Panel.TooltipText = tooltip.Text;
                }

                // Add toggle button to the group
                var scriptToggle = new CheckBox(2, 0, script.Enabled)
                {
                    TooltipText  = "If checked, script will be enabled",
                    IsScrollable = false,
                    Size         = new Vector2(14, 14),
                    BoxSize      = 12.0f,
                    Tag          = script,
                    Parent       = group.Panel
                };
                scriptToggle.StateChanged += ScriptToggleOnCheckChanged;

                // Add drag button to the group
                const float dragIconSize = 14;
                var         scriptDrag   = new ScriptDragIcon(this, script, scriptToggle.Right, 0.5f, dragIconSize)
                {
                    TooltipText  = "Script reference",
                    CanFocus     = true,
                    IsScrollable = false,
                    Color        = new Color(0.7f),
                    Margin       = new Margin(1),
                    ImageSource  = new SpriteImageSource(Editor.Instance.UI.DragBar12),
                    Tag          = script,
                    Parent       = group.Panel
                };

                // Add settings button to the group
                const float settingsButtonSize = 14;
                var         settingsButton     = new Image(group.Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize)
                {
                    TooltipText  = "Settings",
                    CanFocus     = true,
                    AnchorStyle  = AnchorStyle.UpperRight,
                    IsScrollable = false,
                    Color        = new Color(0.7f),
                    Margin       = new Margin(1),
                    ImageSource  = new SpriteImageSource(FlaxEngine.GUI.Style.Current.Settings),
                    Tag          = script,
                    Parent       = group.Panel
                };
                settingsButton.Clicked += SettingsButtonOnClicked;

                group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right, 15, 2, 2);
                group.Object(values, editor);

                // Scripts arrange bar
                dragBar = layout.Custom <ScriptArrangeBar>();
                dragBar.CustomControl.Init(i + 1, this);
            }

            base.Initialize(layout);
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public override void Initialize(LayoutElementsContainer layout)
        {
            // Area for drag&drop scripts
            var dragArea = layout.CustomContainer <DragAreaControl>();

            dragArea.CustomControl.ScriptsEditor = this;

            // No support for showing scripts from multiple actors that have different set of scripts
            var scripts = (Script[])Values[0];

            _scripts.Clear();
            _scripts.AddRange(scripts);
            for (int i = 1; i < Values.Count; i++)
            {
                var e = (Script[])Values[i];
                if (scripts.Length != e.Length)
                {
                    return;
                }
                for (int j = 0; j < e.Length; j++)
                {
                    var t1 = scripts[j]?.TypeName;
                    var t2 = e[j]?.TypeName;
                    if (t1 != t2)
                    {
                        return;
                    }
                }
            }

            // Scripts arrange bar
            var dragBar = layout.Custom <ScriptArrangeBar>();

            dragBar.CustomControl.Init(0, this);

            // Scripts
            var elementType = new ScriptType(typeof(Script));

            _scriptToggles = new CheckBox[scripts.Length];
            for (int i = 0; i < scripts.Length; i++)
            {
                var script = scripts[i];
                if (script == null)
                {
                    AddMissingScript(i, layout);
                    continue;
                }

                var values     = new ScriptsContainer(elementType, i, Values);
                var scriptType = TypeUtils.GetObjectType(script);
                var editor     = CustomEditorsUtil.CreateEditor(scriptType, false);

                // Create group
                var title = Utilities.Utils.GetPropertyNameUI(scriptType.Name);
                var group = layout.Group(title, editor);
                if ((Presenter.Features & FeatureFlags.CacheExpandedGroups) != 0)
                {
                    if (Editor.Instance.ProjectCache.IsCollapsedGroup(title))
                    {
                        group.Panel.Close(false);
                    }
                    else
                    {
                        group.Panel.Open(false);
                    }
                    group.Panel.IsClosedChanged += panel => Editor.Instance.ProjectCache.SetCollapsedGroup(panel.HeaderText, panel.IsClosed);
                }
                else
                {
                    group.Panel.Open(false);
                }

                // Customize
                group.Panel.TooltipText = Editor.Instance.CodeDocs.GetTooltip(scriptType);
                if (script.HasPrefabLink)
                {
                    group.Panel.HeaderTextColor = FlaxEngine.GUI.Style.Current.ProgressNormal;
                }

                // Add toggle button to the group
                var scriptToggle = new CheckBox
                {
                    TooltipText  = "If checked, script will be enabled.",
                    IsScrollable = false,
                    Checked      = script.Enabled,
                    Parent       = group.Panel,
                    Size         = new Float2(14, 14),
                    Bounds       = new Rectangle(2, 0, 14, 14),
                    BoxSize      = 12.0f,
                    Tag          = script,
                };
                scriptToggle.StateChanged += OnScriptToggleCheckChanged;
                _scriptToggles[i]          = scriptToggle;

                // Add drag button to the group
                const float dragIconSize = 14;
                var         scriptDrag   = new ScriptDragIcon(this, script)
                {
                    TooltipText  = "Script reference",
                    AutoFocus    = true,
                    IsScrollable = false,
                    Color        = FlaxEngine.GUI.Style.Current.ForegroundGrey,
                    Parent       = group.Panel,
                    Bounds       = new Rectangle(scriptToggle.Right, 0.5f, dragIconSize, dragIconSize),
                    Margin       = new Margin(1),
                    Brush        = new SpriteBrush(Editor.Instance.Icons.DragBar12),
                    Tag          = script,
                };

                // Add settings button to the group
                const float settingsButtonSize = 14;
                var         settingsButton     = new Image
                {
                    TooltipText  = "Settings",
                    AutoFocus    = true,
                    AnchorPreset = AnchorPresets.TopRight,
                    Parent       = group.Panel,
                    Bounds       = new Rectangle(group.Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize),
                    IsScrollable = false,
                    Color        = FlaxEngine.GUI.Style.Current.ForegroundGrey,
                    Margin       = new Margin(1),
                    Brush        = new SpriteBrush(FlaxEngine.GUI.Style.Current.Settings),
                    Tag          = script,
                };
                settingsButton.Clicked += OnSettingsButtonClicked;

                group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right, 15, 2, 2);
                group.Object(values, editor);

                // Scripts arrange bar
                dragBar = layout.Custom <ScriptArrangeBar>();
                dragBar.CustomControl.Init(i + 1, this);
            }

            base.Initialize(layout);
        }