Added target selector to rendezvous.
Added target selector to rendezvous.

--- a/KerbalEngineer/FlightEngineer/FlightDisplay.cs
+++ b/KerbalEngineer/FlightEngineer/FlightDisplay.cs
@@ -61,7 +61,7 @@
             set { _requireResize = value; }
         }
 
-        private bool _controlBar = false;
+        private bool _controlBar = true;
         /// <summary>
         /// Gets and sets the visibility of the control bar.
         /// </summary>
@@ -182,6 +182,7 @@
                 SettingList list = new SettingList();
                 list.AddSetting("x", _windowPosition.x);
                 list.AddSetting("y", _windowPosition.y);
+                list.AddSetting("controlBar", _controlBar);
                 SettingList.SaveToFile(EngineerGlobals.AssemblyPath + "Settings/FlightDisplay", list);
                 
                 MonoBehaviour.print("[KerbalEngineer/FlightDisplay]: Successfully saved settings.");
@@ -197,6 +198,7 @@
                 SettingList list = SettingList.CreateFromFile(EngineerGlobals.AssemblyPath + "Settings/FlightDisplay");
                 _windowPosition.x = (float)list.GetSetting("x", _windowPosition.x);
                 _windowPosition.y = (float)list.GetSetting("y", _windowPosition.y);
+                _controlBar = (bool)list.GetSetting("controlBar", _controlBar);
 
                 MonoBehaviour.print("[KerbalEngineer/FlightDisplay]: Successfully loaded settings.");
             }

--- a/KerbalEngineer/FlightEngineer/InfoDisplay.cs
+++ b/KerbalEngineer/FlightEngineer/InfoDisplay.cs
@@ -107,7 +107,7 @@
             {
                 if (!_hasInitStyles) InitialiseStyles();
 
-                _windowPosition = GUILayout.Window(_windowID, _windowPosition, Window, "INFORMATION", _windowStyle).ClampToScreen();
+                _windowPosition = GUILayout.Window(_windowID, _windowPosition, Window, "READOUT INFORMATION", _windowStyle).ClampToScreen();
             }
         }
 

--- a/KerbalEngineer/FlightEngineer/Readout.cs
+++ b/KerbalEngineer/FlightEngineer/Readout.cs
@@ -40,6 +40,7 @@
 
         protected GUIStyle NameStyle { get; private set; }
         protected GUIStyle DataStyle { get; private set; }
+        protected GUIStyle MsgStyle { get; private set; }
 
         private string _name = string.Empty;
         /// <summary>
@@ -99,6 +100,9 @@
             DataStyle.fontStyle = FontStyle.Normal;
             DataStyle.alignment = TextAnchor.MiddleRight;
             DataStyle.stretchWidth = true;
+
+            MsgStyle = new GUIStyle(NameStyle);
+            MsgStyle.alignment = TextAnchor.MiddleCenter;
         }
 
         protected virtual void Initialise() { }
@@ -147,6 +151,16 @@
             GUILayout.EndHorizontal();
         }
 
+        /// <summary>
+        /// Draws a single line message that is centred.
+        /// </summary>
+        protected void DrawMessageLine(string message)
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Label(message, MsgStyle);
+            GUILayout.EndHorizontal();
+        }
+
         #endregion
     }
 }

--- a/KerbalEngineer/FlightEngineer/ReadoutList.cs
+++ b/KerbalEngineer/FlightEngineer/ReadoutList.cs
@@ -73,6 +73,8 @@
             _readouts.Add(new Vessel.ThrustTotal());
             _readouts.Add(new Vessel.ThrustActual());
             _readouts.Add(new Vessel.ThrustToWeight());
+
+            _readouts.Add(new Rendezvous.TargetSelector());
         }
 
         #endregion

--- /dev/null
+++ b/KerbalEngineer/FlightEngineer/Rendezvous/TargetSelector.cs
@@ -1,1 +1,305 @@
-
+// Name:    Kerbal Engineer Redux
+// Author:  CYBUTEK
+// License: Attribution-NonCommercial-ShareAlike 3.0 Unported
+
+using UnityEngine;
+
+namespace KerbalEngineer.FlightEngineer.Rendezvous
+{
+    public class TargetSelector : Readout
+    {
+        #region Fields
+
+        private GUIStyle _buttonStyle, _searchStyle;
+        private float _typeButtonWidth = 0f;
+        private string _searchQuery = string.Empty;
+        private string _searchText = string.Empty;
+        private bool _usingSearch = false;
+        private VesselType _vesselType = VesselType.Unknown;
+        private bool _typeIsBody = false;
+        private int _targetCount = 0;
+
+        #endregion
+
+        #region Initialisation
+
+        protected override void Initialise()
+        {
+            Name = "Target Selector";
+            Description = "A tool to allow easy browsing, searching and selection of targets.";
+            Category = ReadoutCategory.Rendezvous;
+            InitialiseStyles();
+        }
+
+        private void InitialiseStyles()
+        {
+            _buttonStyle = new GUIStyle(HighLogic.Skin.button);
+            _buttonStyle.normal.textColor = Color.white;
+            _buttonStyle.margin = new RectOffset();
+            _buttonStyle.padding = new RectOffset(5, 5, 5, 5);
+            _buttonStyle.fontSize = 11;
+            _buttonStyle.fontStyle = FontStyle.Bold;
+
+            _searchStyle = new GUIStyle(HighLogic.Skin.textField);
+            _searchStyle.stretchHeight = true;
+
+            _typeButtonWidth = Mathf.Round((Readout.NameWidth + Readout.DataWidth) / 2f);
+        }
+
+        #endregion
+
+        #region Drawing
+
+        // Draws the target selector structure.
+        public override void Draw()
+        {
+            if (FlightGlobals.fetch.VesselTarget == null)
+            {
+                if (_vesselType == VesselType.Unknown && !_typeIsBody)
+                {
+                    DrawSearch();
+                    if (_searchQuery.Length == 0)
+                        DrawTypes();
+                    else
+                        DrawTargetList();
+                }
+                else
+                {
+                    DrawTargetList();
+                    DrawBackToTypes();
+                }
+            }
+            else
+            {
+                DrawTarget();
+            }
+        }
+
+        // Draws the search bar.
+        private void DrawSearch()
+        {
+            GUILayout.BeginHorizontal(GUILayout.Height(30f));
+            GUILayout.BeginVertical(GUILayout.Width(75f));
+            GUILayout.Label("SEARCH:", NameStyle, GUILayout.ExpandHeight(true));
+            GUILayout.EndVertical();
+            GUILayout.BeginVertical();
+
+            _searchText = GUILayout.TextField(_searchText, _searchStyle);
+
+            if (_searchText.Length > 0 || _searchQuery.Length > 0)
+            {
+                _searchQuery = _searchText.ToLower();
+
+                if (!_usingSearch)
+                {
+                    _usingSearch = true;
+                    FlightDisplay.Instance.RequireResize = true;
+                }
+            }
+            else
+                if (_usingSearch)
+                    _usingSearch = false;
+
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+        }
+
+        // Draws the button list of target types.
+        private void DrawTypes()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Celestial Bodies", _buttonStyle)) SetTypeAsBody();
+            GUILayout.EndVertical();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Debris", _buttonStyle)) SetTypeAs(VesselType.Debris);
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+            GUILayout.BeginHorizontal();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Probes", _buttonStyle)) SetTypeAs(VesselType.Probe);
+            GUILayout.EndVertical();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Rovers", _buttonStyle)) SetTypeAs(VesselType.Rover);
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+            GUILayout.BeginHorizontal();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Landers", _buttonStyle)) SetTypeAs(VesselType.Lander);
+            GUILayout.EndVertical();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Ships", _buttonStyle)) SetTypeAs(VesselType.Ship);
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+            GUILayout.BeginHorizontal();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Stations", _buttonStyle)) SetTypeAs(VesselType.Station);
+            GUILayout.EndVertical();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Bases", _buttonStyle)) SetTypeAs(VesselType.Base);
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+            GUILayout.BeginHorizontal();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("EVAs", _buttonStyle)) SetTypeAs(VesselType.EVA);
+            GUILayout.EndVertical();
+            GUILayout.BeginVertical(GUILayout.Width(_typeButtonWidth));
+            if (GUILayout.Button("Flags", _buttonStyle)) SetTypeAs(VesselType.Flag);
+            GUILayout.EndVertical();
+            GUILayout.EndHorizontal();
+        }
+
+        // Draws the target information when selected.
+        private void DrawTarget()
+        {
+            DrawLine("Selected Target", FlightGlobals.fetch.VesselTarget.GetName());
+
+            GUILayout.Space(3f);
+
+            if (GUILayout.Button("Go Back to Target Selection", _buttonStyle))
+            {
+                FlightGlobals.fetch.SetVesselTarget(null);
+                FlightDisplay.Instance.RequireResize = true;
+            }
+        }
+
+        // Draws back to types button.
+        private void DrawBackToTypes()
+        {
+            GUILayout.Space(3f);
+
+            if (GUILayout.Button("Go Back to Type Selection", _buttonStyle))
+            {
+                _typeIsBody = false;
+                _vesselType = VesselType.Unknown;
+                FlightDisplay.Instance.RequireResize = true;
+            }
+        }
+
+        // Draws the target list.
+        private void DrawTargetList()
+        {
+            int count = 0;
+
+            if (_searchQuery.Length == 0)
+            {
+                if (_typeIsBody)
+                {
+                    count += DrawMoons();
+                    count += DrawPlanets();
+                }
+                else
+                {
+                    count += DrawVessels();
+                }
+            }
+            else
+            {
+                count += DrawVessels();
+                count += DrawMoons();
+                count += DrawPlanets();
+            }
+
+            if (count == 0) DrawMessageLine("No targets found!");
+            if (count != _targetCount)
+            {
+                _targetCount = count;
+                FlightDisplay.Instance.RequireResize = true;
+            }
+        }
+
+        // Draws targettable moons.
+        private int DrawMoons()
+        {
+            int count = 0;
+            foreach (CelestialBody body in FlightGlobals.Bodies)
+            {
+                if (body == Planetarium.fetch.Sun) continue;
+
+                if (FlightGlobals.ActiveVessel.mainBody == body.referenceBody)
+                {
+                    if (_searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(_searchQuery)) continue;
+
+                    count++;
+                    if (GUILayout.Button(body.bodyName, _buttonStyle))
+                        SetTargetAs(body);
+                }
+
+            }
+            return count;
+        }
+
+        // Draws targettable planets.
+        private int DrawPlanets()
+        {
+            int count = 0;
+            foreach (CelestialBody body in FlightGlobals.Bodies)
+            {
+                if (body == Planetarium.fetch.Sun || body == FlightGlobals.ActiveVessel.mainBody) continue;
+
+                if (FlightGlobals.ActiveVessel.mainBody.referenceBody == body.referenceBody)
+                {
+                    if (_searchQuery.Length > 0 && !body.bodyName.ToLower().Contains(_searchQuery)) continue;
+
+                    count++;
+                    if (GUILayout.Button(body.GetName(), _buttonStyle))
+                        SetTargetAs(body);
+                }
+            }
+            return count;
+        }
+
+        // Draws targettable vessels.
+        private int DrawVessels()
+        {
+            int count = 0;
+            foreach (global::Vessel vessel in FlightGlobals.Vessels)
+            {
+                if (vessel == FlightGlobals.ActiveVessel) continue;
+
+                if (_searchQuery.Length == 0)
+                {
+                    if (vessel.vesselType == _vesselType)
+                    {
+                        count++;
+                        if (GUILayout.Button(vessel.GetName(), _buttonStyle))
+                            SetTargetAs(vessel);
+                    }
+                }
+                else if (vessel.vesselName.ToLower().Contains(_searchQuery))
+                {
+                    count++;
+                    if (GUILayout.Button(vessel.GetName(), _buttonStyle))
+                        SetTargetAs(vessel);
+                }
+            }
+            return count;
+        }
+       
+
+        #endregion
+
+        #region Private Methods
+
+        private void SetTypeAs(VesselType vesselType)
+        {
+            _vesselType = vesselType;
+            FlightDisplay.Instance.RequireResize = true;
+        }
+
+        private void SetTypeAsBody()
+        {
+            _typeIsBody = true;
+            FlightDisplay.Instance.RequireResize = true;
+        }
+
+        private void SetTargetAs(ITargetable target)
+        {
+            FlightGlobals.fetch.SetVesselTarget(target);
+            FlightDisplay.Instance.RequireResize = true;
+        }
+
+        #endregion
+    }
+}
+

--- a/KerbalEngineer/FlightEngineer/SectionList.cs
+++ b/KerbalEngineer/FlightEngineer/SectionList.cs
@@ -66,6 +66,7 @@
             _fixedSections.Add(new Section() { Title = "Orbital", Readouts = ReadoutList.Instance.GetCategory(ReadoutCategory.Orbital), Categories = new List<ReadoutCategory> { ReadoutCategory.Orbital }, ShortTitle = "ORBT" });
             _fixedSections.Add(new Section() { Title = "Surface", Readouts = ReadoutList.Instance.GetCategory(ReadoutCategory.Surface), Categories = new List<ReadoutCategory> { ReadoutCategory.Surface }, ShortTitle = "SURF" });
             _fixedSections.Add(new Section() { Title = "Vessel", Readouts = ReadoutList.Instance.GetCategory(ReadoutCategory.Vessel), Categories = new List<ReadoutCategory> { ReadoutCategory.Vessel }, ShortTitle = "VESL" });
+            _fixedSections.Add(new Section() { Title = "Rendezvous", Readouts = ReadoutList.Instance.GetCategory(ReadoutCategory.Rendezvous), Categories = new List<ReadoutCategory> { ReadoutCategory.Rendezvous }, ShortTitle = "RDZV" });
         }
 
         #endregion

--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -73,6 +73,7 @@
     <Compile Include="FlightEngineer\Orbital\PeriapsisHeight.cs" />
     <Compile Include="FlightEngineer\Orbital\TimeToApoapsis.cs" />
     <Compile Include="FlightEngineer\ReadoutList.cs" />
+    <Compile Include="FlightEngineer\Rendezvous\TargetSelector.cs" />
     <Compile Include="FlightEngineer\SectionList.cs" />
     <Compile Include="FlightEngineer\Orbital\ApoapsisHeight.cs" />
     <Compile Include="FlightEngineer\Readout.cs" />

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