Example #1
0
        } // ViewportArea

        #endregion

        #region Add Main Window Controls

        /// <summary>
        /// Add the editor's main window controls.
        /// </summary>
        public static void AddMainControls()
        {
            #region Canvas

            // The canvas cover the whole window. I will place the static controls there.
            // I don’t place the controls directly to the manager to allow having some functionality
            // provided by the canvas like the automatic placing of menu items, status bar, etc.
            Container canvas = new Container
            {
                Top             = 0,
                Left            = 0,
                Width           = Screen.Width,
                Height          = Screen.Height,
                Anchor          = Anchors.All,
                AutoScroll      = false,
                BackgroundColor = Color.Transparent,
                StayOnBack      = true,
                Passive         = true,
                CanFocus        = false,
            };

            #endregion

            #region Main Menu

            canvas.MainMenu = new MainMenu
            {
                Width    = Screen.Width,
                Anchor   = Anchors.Left | Anchors.Top,
                CanFocus = false
            };

            #region File

            MenuItem menuItemFile = new MenuItem("File", true);
            canvas.MainMenu.Items.Add(menuItemFile);
            menuItemFile.Items.AddRange(new[]
            {
                new MenuItem("New Scene")
                {
                    RightSideText = "Ctrl+N"
                },
                new MenuItem("Open Scene")
                {
                    RightSideText = "Ctrl+O"
                },
                new MenuItem("Save Scene")
                {
                    RightSideText = "Ctrl+S", SeparationLine = true
                },
                new MenuItem("Save Scene as...")
                {
                    RightSideText = "Ctrl+Shift+S"
                },
                new MenuItem("Exit", true)
                {
                    SeparationLine = true
                },
            });
            menuItemFile.Items[0].Click += delegate { StorageManager.ClearScene(); };
            menuItemFile.Items[1].Click += delegate { StorageManager.LoadScene(); };
            menuItemFile.Items[2].Click += delegate { StorageManager.SaveScene(); };

            #endregion

            #region Edit

            MenuItem menuItemEdit = new MenuItem("Edit", true);
            canvas.MainMenu.Items.Add(menuItemEdit);
            menuItemEdit.Items.AddRange(new[]
            {
                new MenuItem("Undo")
                {
                    RightSideText = "Ctrl+Z"
                },
                new MenuItem("Redo")
                {
                    RightSideText = "Ctrl+Y"
                },
                new MenuItem("Frame Selected (All 3D Views)")
                {
                    RightSideText = "Shift+F", SeparationLine = true
                },
                new MenuItem("Frame All (All 3D Views)")
                {
                    RightSideText = "Shift+A"
                },
                new MenuItem("Reset (All 3D Views)")
                {
                    RightSideText = "Shift+R"
                },
            });
            menuItemEdit.Items[0].Click += delegate { ActionManager.Undo(); };
            menuItemEdit.Items[1].Click += delegate { ActionManager.Redo(); };
            menuItemEdit.Items[2].Click += delegate
            {
                foreach (var editorViewport in EditorManager.EditorViewports)
                {
                    editorViewport.FrameObjects(EditorManager.SelectedObjects);
                }
            };
            menuItemEdit.Items[3].Click += delegate
            {
                foreach (var editorViewport in EditorManager.EditorViewports)
                {
                    editorViewport.FrameObjects(GameObject.GameObjects);
                }
            };
            menuItemEdit.Items[4].Click += delegate
            {
                foreach (var editorViewport in EditorManager.EditorViewports)
                {
                    editorViewport.Reset();
                }
            };

            #endregion

            #region Game Object

            MenuItem menuItemGameObject = new MenuItem("Game Object", true);
            canvas.MainMenu.Items.Add(menuItemGameObject);
            menuItemGameObject.Items.AddRange(new[]
            {
                new MenuItem("Create Empty 3D Game Object")
                {
                    RightSideText = "Ctrl+Shift+N"
                },
                new MenuItem("Create Empty 2D Game Object")
                {
                    RightSideText = "Ctrl+Shift+M"
                },
                new MenuItem("Create Other"),
            });
            menuItemGameObject.Items[2].Items.AddRange(new[]
            {
                new MenuItem("Camera"),
                new MenuItem("Particle System"),
                new MenuItem("HUD Texture"),
                new MenuItem("HUD Text"),
                new MenuItem("Directional Light")
                {
                    SeparationLine = true
                },
                new MenuItem("Point Light"),
                new MenuItem("Spot Light"),
                new MenuItem("Sphere")
                {
                    SeparationLine = true
                },
                new MenuItem("Box"),
                new MenuItem("Plane"),
                new MenuItem("Cylinder"),
                new MenuItem("Cone"),
                new MenuItem("Empty Model"),
            });
            // Create Empty 3D Game Object
            menuItemGameObject.Items[0].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Camera
            menuItemGameObject.Items[2].Items[0].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <Camera>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Particle System
            menuItemGameObject.Items[2].Items[1].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <ParticleEmitter>();
                gameObject3D.AddComponent <ParticleRenderer>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // HUD Texture
            menuItemGameObject.Items[2].Items[2].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <HudTexture>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // HUD Text
            menuItemGameObject.Items[2].Items[3].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <HudText>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Directional Light
            menuItemGameObject.Items[2].Items[4].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <DirectionalLight>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Point Light
            menuItemGameObject.Items[2].Items[5].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <PointLight>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Spot Light
            menuItemGameObject.Items[2].Items[6].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D();
                gameObject3D.AddComponent <SpotLight>();
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Sphere
            menuItemGameObject.Items[2].Items[7].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D(new Sphere(), Material.DefaultMaterial);
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Box
            menuItemGameObject.Items[2].Items[8].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D(new Box(), Material.DefaultMaterial);
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Plane
            menuItemGameObject.Items[2].Items[9].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D(new Plane(), Material.DefaultMaterial);
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Cylinder
            menuItemGameObject.Items[2].Items[10].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D(new Cylinder(), Material.DefaultMaterial);
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Cone
            menuItemGameObject.Items[2].Items[11].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D(new Cone(), Material.DefaultMaterial);
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };
            // Empty Model
            menuItemGameObject.Items[2].Items[12].Click += delegate
            {
                GameObject3D gameObject3D = new GameObject3D(null, Material.DefaultMaterial);
                EditorManager.RemoveAllObjectFromSelection();
                EditorManager.AddObjectToSelection(gameObject3D);
            };

            #endregion

            #region Component

            MenuItem menuItemComponent = new MenuItem("Component", true);
            canvas.MainMenu.Items.Add(menuItemComponent);
            menuItemComponent.Items.AddRange(new[]
            {
                new MenuItem("Model"),
                new MenuItem("Particles"),
                new MenuItem("Physics"),
                new MenuItem("Audio"),
                new MenuItem("Rendering"),
            });

            #endregion

            #region Window

            MenuItem menuItemWindow = new MenuItem("Window", true);
            canvas.MainMenu.Items.Add(menuItemWindow);
            menuItemWindow.Items.AddRange(new[]
            {
                new MenuItem("Layouts"),
                new MenuItem("Hierarchy")
                {
                    RightSideText = "Ctrl+6", SeparationLine = true,
                },
                new MenuItem("Heads Up Display Editor")
                {
                    RightSideText = "Ctrl+7"
                },
            });
            menuItemWindow.Items[0].Items.AddRange(new []
            {
                new MenuItem("4 Split"),
                new MenuItem("3 Split"),
                new MenuItem("Wide"),
                new MenuItem("Toggle")
                {
                    RightSideText = "F12", SeparationLine = true,
                },
            });
            menuItemWindow.Items[0].Items[0].Click += delegate { EditorManager.Layout = EditorManager.LayoutOptions.FourSplit; };
            menuItemWindow.Items[0].Items[1].Click += delegate { EditorManager.Layout = EditorManager.LayoutOptions.ThreeSplit; };
            menuItemWindow.Items[0].Items[2].Click += delegate { EditorManager.Layout = EditorManager.LayoutOptions.Wide; };
            menuItemWindow.Items[0].Items[3].Click += delegate { EditorManager.ToggleLayout(); };

            #endregion

            #region Help

            MenuItem menuItemHelp = new MenuItem("Help", true);
            canvas.MainMenu.Items.Add(menuItemHelp);
            menuItemHelp.Items.AddRange(new[]
            {
                new MenuItem("About"),
                new MenuItem("Documentation")
                {
                    RightSideText = "F1", SeparationLine = true,
                },
            });
            menuItemHelp.Items[1].Click += delegate { System.Diagnostics.Process.Start("http://xnafinalengine.codeplex.com/documentation"); };

            #endregion

            #endregion

            #region Top Panel

            ToolBarPanel topPanel = new ToolBarPanel();
            canvas.ToolBarPanel = topPanel;
            ToolBar toolBarTopPanel = new ToolBar
            {
                Parent  = topPanel,
                Movable = true,
                FullRow = true
            };

            #region Button Space

            Button buttonSpace = new Button
            {
                Text     = "Global",
                Left     = 10,
                Top      = 10,
                Height   = 15,
                Parent   = toolBarTopPanel,
                CanFocus = false,
            };
            buttonSpace.Click += delegate
            {
                if (Gizmo.Space == Gizmo.SpaceMode.Local)
                {
                    Gizmo.Space      = Gizmo.SpaceMode.Global;
                    buttonSpace.Text = "Global";
                }
                else
                {
                    Gizmo.Space      = Gizmo.SpaceMode.Local;
                    buttonSpace.Text = "Local";
                }
                buttonSpace.Focused = false;
            };

            #endregion

            #region Buttons Play, Pause and Stop

            Texture playTexture        = new Texture("Editor\\PlayIconNotPressed");
            Texture playPressedTexture = new Texture("Editor\\PlayIcon");
            Button  buttonPlay         = new Button
            {
                Left   = Screen.Width / 2 - 50,
                Top    = 2,
                Height = 32,
                Width  = 32,
                Glyph  = new Glyph(playTexture)
                {
                    SizeMode = SizeMode.Normal
                },
                Parent   = toolBarTopPanel,
                CanFocus = false,
            };
            buttonPlay.Click += delegate { buttonPlay.Glyph.Texture = buttonPlay.Glyph.Texture == playTexture ? playPressedTexture : playTexture; };
            Texture pauseTexture        = new Texture("Editor\\PauseIconNotPressed");
            Texture pausePressedTexture = new Texture("Editor\\PauseIcon");
            Button  buttonPause         = new Button
            {
                Left   = buttonPlay.Left + 34,
                Top    = 2,
                Height = 32,
                Width  = 32,
                Glyph  = new Glyph(pauseTexture)
                {
                    SizeMode = SizeMode.Normal
                },
                Parent   = toolBarTopPanel,
                CanFocus = false,
            };
            buttonPause.Click += delegate { buttonPause.Glyph.Texture = buttonPause.Glyph.Texture == pauseTexture ? pausePressedTexture : pauseTexture; };
            Texture stopTexture        = new Texture("Editor\\StopIconNotPressed");
            Texture stopPressedTexture = new Texture("Editor\\StopIcon");
            Button  buttonStop         = new Button
            {
                Left   = buttonPlay.Left + 68,
                Top    = 2,
                Height = 32,
                Width  = 32,
                Glyph  = new Glyph(stopTexture)
                {
                    SizeMode = SizeMode.Normal
                },
                Parent   = toolBarTopPanel,
                CanFocus = false,
            };
            buttonStop.Click += delegate { buttonStop.Glyph.Texture = buttonStop.Glyph.Texture == stopTexture ? stopPressedTexture : stopTexture; };

            #endregion

            // Adjust top panel height.
            topPanel.Height        = buttonStop.Top + buttonStop.Height + 2;
            toolBarTopPanel.Height = buttonStop.Top + buttonStop.Height + 2;

            #endregion

            #region Viewport Space

            // The canvas cover the whole window. I will place the static controls there.
            // I don’t place the controls directly to the manager to allow having some functionality
            // provided by the canvas like the automatic placing of menu items, status bar, etc.
            ViewportsSpace = new Container
            {
                Top             = 0,
                Left            = 0,
                Width           = canvas.ClientWidth - 420,
                Height          = canvas.ClientHeight,
                Anchor          = Anchors.All,
                AutoScroll      = false,
                BackgroundColor = Color.Transparent,
                StayOnBack      = true,
                Passive         = false,
                CanFocus        = false,
                Parent          = canvas,
            };

            #endregion

            #region Right Panel

            Panel rightPanel = new Panel
            {
                StayOnBack = true,
                Passive    = true,
                Parent     = canvas,
                Width      = 420,
                Left       = canvas.ClientWidth - 420,
                Height     = canvas.ClientHeight,
                Anchor     = Anchors.Right | Anchors.Top | Anchors.Bottom,
                Color      = new Color(64, 64, 64),
            };

            TabControl rightPanelTabControl = new TabControl
            {
                Parent = rightPanel,
                Left   = 2,
                Top    = 2,
                Width  = rightPanel.ClientWidth - 2,
                Height = rightPanel.ClientHeight - 2,
                Anchor = Anchors.All
            };
            rightPanelTabControl.AddPage();
            rightPanelTabControl.TabPages[0].Text = "Inspector";
            inspector = rightPanelTabControl.TabPages[0];
            rightPanelTabControl.AddPage();
            rightPanelTabControl.TabPages[1].Text = "Layers";
            var label = new Label
            {
                Parent = rightPanelTabControl.TabPages[1],
                Width  = 50,
                Top    = 15,
                Left   = rightPanelTabControl.TabPages[1].ClientWidth - 132,
                Text   = "Active",
                Height = 10,
            };
            label.ToolTip.Text = "Active layers are updated.";
            label = new Label
            {
                Parent = rightPanelTabControl.TabPages[1],
                Width  = 50,
                Top    = 15,
                Left   = rightPanelTabControl.TabPages[1].ClientWidth - 72,
                Text   = "Visible",
                Height = 10,
            };
            label.ToolTip.Text = "Visible layers are rendered.";
            for (int i = 0; i < 30; i++)
            {
                CommonControls.LayerBox(i, rightPanelTabControl.TabPages[1]);
            }

            #endregion
        } // AddMainControls