Started flight display and implemented readouts.
Started flight display and implemented readouts.

--- a/KerbalEngineer/BuildEngineer/BuildAdvanced.cs
+++ b/KerbalEngineer/BuildEngineer/BuildAdvanced.cs
@@ -24,7 +24,7 @@
 
         #region Fields
 
-        private Rect _position = new Rect(265f, 45f, 0f, 0f);
+        private Rect _windowPosition = new Rect(265f, 45f, 0f, 0f);
         private GUIStyle _windowStyle, _areaStyle, _areaBodiesStyle, _buttonStyle, _titleStyle, _infoStyle;
         private int _windowID = EngineerGlobals.GetNextWindowID();
         private bool _hasInitStyles = false;
@@ -154,8 +154,8 @@
                     {
                         _hasChanged = false;
 
-                        _position.width = 0f;
-                        _position.height = 0f;
+                        _windowPosition.width = 0f;
+                        _windowPosition.height = 0f;
                     }
                 }
             }
@@ -180,7 +180,7 @@
                     else
                         title = "K.E.R. " + EngineerGlobals.AssemblyVersion;
 
-                    _position = GUILayout.Window(_windowID, _position, OnWindow, title, _windowStyle).ClampToScreen();
+                    _windowPosition = GUILayout.Window(_windowID, _windowPosition, Window, title, _windowStyle).ClampToScreen();
 
                     // Check editor lock to manage click-through.
                     CheckEditorLock();
@@ -192,12 +192,12 @@
         // Checks whether the editor should be looked to stop click-through.
         private void CheckEditorLock()
         {
-            if (_position.MouseIsOver() && !EditorLogic.editorLocked)
+            if (_windowPosition.MouseIsOver() && !EditorLogic.editorLocked)
             {
                 EditorLogic.fetch.Lock(true, true, true);
                 _isEditorLocked = true;
             }
-            else if (_isEditorLocked && !_position.MouseIsOver() && EditorLogic.editorLocked)
+            else if (_isEditorLocked && !_windowPosition.MouseIsOver() && EditorLogic.editorLocked)
             {
                 EditorLogic.fetch.Unlock();
             }
@@ -205,10 +205,10 @@
             if (!EditorLogic.editorLocked) _isEditorLocked = false;
         }
 
-        private void OnWindow(int windowID)
+        private void Window(int windowID)
         {
             // Draw the compact mode toggle.
-            if (GUI.Toggle(new Rect(_position.width - 70f, 5f, 65f, 20f), _compactMode, "COMPACT", _buttonStyle) != _compactMode)
+            if (GUI.Toggle(new Rect(_windowPosition.width - 70f, 5f, 65f, 20f), _compactMode, "COMPACT", _buttonStyle) != _compactMode)
             {
                 _hasChanged = true;
                 _compactMode = !_compactMode;
@@ -217,14 +217,14 @@
             // When not in compact mode draw the 'All Stages' and 'Atmospheric' toggles.
             if (!_compactMode)
             {
-                if (GUI.Toggle(new Rect(_position.width - 153f, 5f, 80f, 20f), _showAllStages, "ALL STAGES", _buttonStyle) != _showAllStages)
+                if (GUI.Toggle(new Rect(_windowPosition.width - 153f, 5f, 80f, 20f), _showAllStages, "ALL STAGES", _buttonStyle) != _showAllStages)
                 {
                     _hasChanged = true;
                     _showAllStages = !_showAllStages;
                 }
 
-                _useAtmosphericDetails = GUI.Toggle(new Rect(_position.width - 251f, 5f, 95f, 20f), _useAtmosphericDetails, "ATMOSPHERIC", _buttonStyle);
-                if (GUI.Toggle(new Rect(_position.width - 379f, 5f, 125f, 20f), _showReferenceBodies, "REFERENCE BODIES", _buttonStyle) != _showReferenceBodies)
+                _useAtmosphericDetails = GUI.Toggle(new Rect(_windowPosition.width - 251f, 5f, 95f, 20f), _useAtmosphericDetails, "ATMOSPHERIC", _buttonStyle);
+                if (GUI.Toggle(new Rect(_windowPosition.width - 379f, 5f, 125f, 20f), _showReferenceBodies, "REFERENCE BODIES", _buttonStyle) != _showReferenceBodies)
                 {
                     _hasChanged = true;
                     _showReferenceBodies = !_showReferenceBodies;
@@ -414,8 +414,8 @@
             {
                 SettingsList list = new SettingsList();
                 list.AddSetting("visible", _visible);
-                list.AddSetting("x", _position.x);
-                list.AddSetting("y", _position.y);
+                list.AddSetting("x", _windowPosition.x);
+                list.AddSetting("y", _windowPosition.y);
                 list.AddSetting("compact", _compactMode);
                 list.AddSetting("all_stages", _showAllStages);
                 list.AddSetting("atmosphere", _useAtmosphericDetails);
@@ -435,8 +435,8 @@
             {
                 SettingsList list = SettingsList.CreateFromFile(EngineerGlobals.AssemblyPath + "Settings/BuildAdvanced");
                 _visible = (bool)list.GetSetting("visible", _visible);
-                _position.x = (float)list.GetSetting("x", _position.x);
-                _position.y = (float)list.GetSetting("y", _position.y);
+                _windowPosition.x = (float)list.GetSetting("x", _windowPosition.x);
+                _windowPosition.y = (float)list.GetSetting("y", _windowPosition.y);
                 _compactMode = (bool)list.GetSetting("compact", _compactMode);
                 _showAllStages = (bool)list.GetSetting("all_stages", _showAllStages);
                 _useAtmosphericDetails = (bool)list.GetSetting("atmosphere", _useAtmosphericDetails);

--- a/KerbalEngineer/BuildEngineer/BuildOverlay.cs
+++ b/KerbalEngineer/BuildEngineer/BuildOverlay.cs
@@ -25,7 +25,7 @@
 
         #region Fields
 
-        private Rect _position = new Rect(265f, 0f, 0f, 0f);
+        private Rect _windowPosition = new Rect(265f, 0f, 0f, 0f);
         private GUIStyle _windowStyle, _titleStyle, _infoStyle, _tooltipTitleStyle, _tooltipInfoStyle;
         private int _windowID = EngineerGlobals.GetNextWindowID();
         private bool _hasInitStyles = false;
@@ -129,11 +129,11 @@
                     // Initialise the GUI styles, but only once as needed.
                     if (!_hasInitStyles) InitialiseStyles();
 
-                    _position = GUILayout.Window(_windowID, _position, OnWindow, string.Empty, _windowStyle);
+                    _windowPosition = GUILayout.Window(_windowID, _windowPosition, Window, string.Empty, _windowStyle);
 
                     // Check and set that the window is at the bottom of the screen.
-                    if (_position.y + _position.height != Screen.height - 5f)
-                        _position.y = Screen.height - _position.height - 5f;
+                    if (_windowPosition.y + _windowPosition.height != Screen.height - 5f)
+                        _windowPosition.y = Screen.height - _windowPosition.height - 5f;
 
                     // Find if a part is selected or being hovered over.
                     if (EditorLogic.SelectedPart != null)
@@ -183,7 +183,7 @@
             catch { /* A null reference exception is thrown when checking if EditorLogic.fetch != null??? */ }
         }
 
-        private void OnWindow(int windowID)
+        private void Window(int windowID)
         {
             GUILayout.BeginHorizontal();
 

--- a/KerbalEngineer/FlightEngineer/FlightController.cs
+++ b/KerbalEngineer/FlightEngineer/FlightController.cs
@@ -13,7 +13,7 @@
 
         private static FlightController _instance;
         /// <summary>
-        /// Gets the current instance of the FlightButton object.
+        /// Gets the current instance of the flight controller.
         /// </summary>
         public static FlightController Instance
         {
@@ -30,7 +30,7 @@
 
         #region Fields
 
-        private Rect _windowPosition = new Rect(Screen.width / 2 + 150f, 0f, 200f, 0f);
+        private Rect _windowPosition = new Rect(Screen.width / 2f + 150f, 0f, 200f, 0f);
         private Rect _handlePosition = new Rect(Screen.width / 2f + 200f, 0f, 100f, 17f);
         private GUIStyle _windowStyle, _buttonStyle;
         private Texture2D _closedNormal = new Texture2D(100, 17, TextureFormat.RGBA32, false);
@@ -111,10 +111,10 @@
             DrawButton();
 
             if (_windowPosition.y + _windowPosition.height > 0f || _windowPosition.height == 0f)
-                _windowPosition = GUILayout.Window(_windowID, _windowPosition, DrawWindow, string.Empty, _windowStyle);
-        }
-
-        private void DrawWindow(int windowID)
+                _windowPosition = GUILayout.Window(_windowID, _windowPosition, Window, string.Empty, _windowStyle);
+        }
+
+        private void Window(int windowID)
         {
             GUILayout.BeginHorizontal();
 

--- a/KerbalEngineer/FlightEngineer/FlightDisplay.cs
+++ b/KerbalEngineer/FlightEngineer/FlightDisplay.cs
@@ -11,6 +11,9 @@
         #region Instance
 
         private static FlightDisplay _instance;
+        /// <summary>
+        /// Gets the current instance of the flight display.
+        /// </summary>
         public static FlightDisplay Instance
         {
             get
@@ -26,6 +29,10 @@
 
         #region Fields
 
+        private Rect _windowPosition = new Rect(Screen.width / 2f - 125f, 100f, 250f, 0f);
+        private GUIStyle _windowStyle;
+        private int _windowID = EngineerGlobals.GetNextWindowID();
+
         private bool _hasInitStyles = false;
 
         #endregion
@@ -40,6 +47,10 @@
         private void InitialiseStyles()
         {
             _hasInitStyles = true;
+
+            _windowStyle = new GUIStyle(HighLogic.Skin.window);
+            _windowStyle.margin = new RectOffset();
+            _windowStyle.padding = new RectOffset(3, 3, 3, 3);
         }
 
         #endregion
@@ -54,7 +65,14 @@
         {
             if (!_hasInitStyles) InitialiseStyles();
 
+            _windowPosition = GUILayout.Window(_windowID, _windowPosition, Window, string.Empty, _windowStyle);
+        }
 
+        private void Window(int windowID)
+        {
+            Orbital.Apoapsis.Instance.Draw();
+
+            GUI.DragWindow();
         }
 
         #endregion

--- a/KerbalEngineer/FlightEngineer/FlightEngineer.cs
+++ b/KerbalEngineer/FlightEngineer/FlightEngineer.cs
@@ -26,6 +26,7 @@
             if (FlightGlobals.ActiveVessel == this.vessel && this.part.IsPrimary(this.vessel.parts, this))
             {
                 FlightController.Instance.Update();
+                FlightDisplay.Instance.Update();
             }
         }
 
@@ -34,6 +35,7 @@
             if (FlightGlobals.ActiveVessel == this.vessel && this.part.IsPrimary(this.vessel.parts, this))
             {
                 FlightController.Instance.Draw();
+                FlightDisplay.Instance.Draw();
             }
         }
 

--- /dev/null
+++ b/KerbalEngineer/FlightEngineer/Orbital/Apoapsis.cs
@@ -1,1 +1,44 @@
+// Name:    Kerbal Engineer Redux
+// Author:  CYBUTEK
+// License: Attribution-NonCommercial-ShareAlike 3.0 Unported
 
+using KerbalEngineer.Extensions;
+using UnityEngine;
+
+namespace KerbalEngineer.FlightEngineer.Orbital
+{
+    public class Apoapsis : Readout
+    {
+        #region Instance
+
+        private static Readout _instance;
+        /// <summary>
+        /// Gets the current instance of this readout.
+        /// </summary>
+        public static Readout Instance
+        {
+            get
+            {
+                if (_instance == null)
+                    _instance = new Apoapsis();
+
+                return _instance;
+            }
+        }
+
+        #endregion
+
+        protected override void Initialise()
+        {
+            Name = "Apoapsis Height";
+            Description = "Shows the apoapsis height from sea level.";
+            Category = ReadoutCategory.Orbital;
+        }
+
+        public override void Draw()
+        {
+            DrawLine(FlightGlobals.ActiveVessel.orbit.ApA.ToDistance());
+        }
+    }
+}
+

--- /dev/null
+++ b/KerbalEngineer/FlightEngineer/Readout.cs
@@ -1,1 +1,120 @@
+// Name:    Kerbal Engineer Redux
+// Author:  CYBUTEK
+// License: Attribution-NonCommercial-ShareAlike 3.0 Unported
 
+using UnityEngine;
+
+namespace KerbalEngineer.FlightEngineer
+{
+    public enum ReadoutCategory
+    {
+        Orbital,
+        Surface,
+        Vessel,
+        Rendezvous,
+        Misc
+    }
+
+    public class Readout
+    {
+        #region Properties
+
+        protected GUIStyle NameStyle { get; private set; }
+        protected GUIStyle DataStyle { get; private set; }
+        protected int NameWidth { get; private set; }
+        protected int DataWidth { get; private set; }
+
+        /// <summary>
+        /// Gets the readout name.
+        /// </summary>
+        public string Name { get; protected set; }
+
+        /// <summary>
+        /// Gets the readout description.
+        /// </summary>
+        public string Description { get; protected set; }
+
+        /// <summary>
+        /// Gets the category in which the readout is contained.
+        /// </summary>
+        public ReadoutCategory Category { get; protected set; }
+
+        #endregion
+
+        #region Initialisation
+
+        protected Readout()
+        {   
+            NameWidth = 100;
+            DataWidth = 150;
+
+            InitialiseStyles();
+            Initialise();
+        }
+
+        private void InitialiseStyles()
+        {
+            NameStyle = new GUIStyle(HighLogic.Skin.label);
+            NameStyle.normal.textColor = Color.white;
+            NameStyle.fontSize = 11;
+            NameStyle.fontStyle = FontStyle.Bold;
+            NameStyle.alignment = TextAnchor.MiddleLeft;
+            NameStyle.stretchWidth = true;
+
+            DataStyle = new GUIStyle(HighLogic.Skin.label);
+            DataStyle.fontSize = 11;
+            DataStyle.fontStyle = FontStyle.Normal;
+            DataStyle.alignment = TextAnchor.MiddleRight;
+            DataStyle.stretchWidth = true;
+        }
+
+        protected virtual void Initialise() { }
+
+        #endregion
+
+        #region Update and Draw
+
+        public virtual void Update() { }
+
+        public virtual void Draw() { }
+
+        /// <summary>
+        /// Draws a single line readout using the provided data.
+        /// </summary>
+        protected void DrawLine(string data)
+        {
+            GUILayout.BeginHorizontal();
+
+            GUILayout.BeginVertical(GUILayout.Width(NameWidth));
+            GUILayout.Label(Name, NameStyle);
+            GUILayout.EndVertical();
+
+            GUILayout.BeginVertical(GUILayout.Width(DataWidth));
+            GUILayout.Label(data, DataStyle);
+            GUILayout.EndVertical();
+
+            GUILayout.EndHorizontal();
+        }
+
+        /// <summary>
+        /// Draws a single line readout using the provided name and data.
+        /// </summary>
+        protected void DrawLine(string name, string data)
+        {
+            GUILayout.BeginHorizontal();
+
+            GUILayout.BeginVertical(GUILayout.Width(NameWidth));
+            GUILayout.Label(name, NameStyle);
+            GUILayout.EndVertical();
+
+            GUILayout.BeginVertical(GUILayout.Width(DataWidth));
+            GUILayout.Label(data, DataStyle);
+            GUILayout.EndVertical();
+
+            GUILayout.EndHorizontal();
+        }
+
+        #endregion
+    }
+}
+

--- /dev/null
+++ b/KerbalEngineer/FlightEngineer/Section.cs
@@ -1,1 +1,14 @@
+// Name:    Kerbal Engineer Redux
+// Author:  CYBUTEK
+// License: Attribution-NonCommercial-ShareAlike 3.0 Unported
 
+using System.Collections.Generic;
+
+namespace KerbalEngineer.FlightEngineer
+{
+    public class Section
+    {
+
+    }
+}
+

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -60,6 +60,9 @@
     <Compile Include="FlightEngineer\FlightController.cs" />
     <Compile Include="FlightEngineer\FlightDisplay.cs" />
     <Compile Include="FlightEngineer\FlightEngineer.cs" />
+    <Compile Include="FlightEngineer\Orbital\Apoapsis.cs" />
+    <Compile Include="FlightEngineer\Readout.cs" />
+    <Compile Include="FlightEngineer\Section.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Settings\Setting.cs" />
     <Compile Include="Settings\SettingsList.cs" />

 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ