Exemple #1
0
        internal void CrewTransferStopAction()
        {
            // This adds the kerbal(s) to the destination part(s)
            try
            {
                // Add Source Crewmember to target part
                if (FromCrewMember != null && ToPart.CrewCapacity > ToPart.protoModuleCrew.Count)
                {
                    AddCrewMember(FromCrewMember, ToPart, ToSeat);
                }

                // Add Target Crewmember to source part
                if (ToCrewMember != null && FromPart.CrewCapacity > FromPart.protoModuleCrew.Count)
                {
                    AddCrewMember(ToCrewMember, FromPart, FromSeat);
                }

                SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true;
                SMAddon.FireEventTriggers();
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
            }
        }
 internal void FillVesselCrew()
 {
     foreach (var part in _partsByResource["Crew"])
     {
         FillPartCrew(part.CrewCapacity - part.protoModuleCrew.Count, part);
     }
     SMAddon.FireEventTriggers();
 }
        internal static void Display(int windowId)
        {
            // Reset Tooltip active flag...
            ToolTipActive = false;
            ShowToolTips  = Settings.RosterToolTips;

            Rect rect = new Rect(396, 4, 16, 16);

            if (GUI.Button(rect, new GUIContent("", "Close Window")))
            {
                OnCreate       = false;
                SelectedKerbal = null;
                ToolTip        = "";
                if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
                {
                    SMAddon.OnSMRosterToggle();
                }
                else
                {
                    Settings.ShowRoster = false;
                }
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips == true)
            {
                ToolTip = Utilities.SetActiveTooltip(rect, Settings.RosterPosition, GUI.tooltip, ref ToolTipActive, 0, 0);
            }
            try
            {
                GUIStyle style        = GUI.skin.button;
                var      defaultColor = style.normal.textColor;
                GUILayout.BeginVertical();

                RosterListViewer();

                if (OnCreate)
                {
                    CreateKerbalViewer();
                }
                else if (SelectedKerbal != null)
                {
                    EditKerbalViewer();
                }
                else
                {
                    if (GUILayout.Button("Create Kerbal", GUILayout.MaxWidth(120)))
                    {
                        OnCreate = true;
                    }
                }

                GUILayout.EndVertical();
                GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
            }
            catch (Exception ex)
            {
                Utilities.LogMessage(string.Format(" in Roster Window.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), "Error", true);
            }
        }
Exemple #4
0
        internal static void Display(int windowId)
        {
            // Reset Tooltip active flag...
            Rect rect = new Rect();

            ToolTipActive = false;
            ShowToolTips  = Settings.SettingsToolTips;

            rect = new Rect(371, 4, 16, 16);
            if (GUI.Button(rect, new GUIContent("", "Close Window")))
            {
                ToolTip = "";
                if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
                {
                    SMAddon.OnSMSettingsToggle();
                }
                else
                {
                    Settings.ShowSettings = false;
                }
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips == true)
            {
                ToolTip = Utilities.SetActiveTooltip(rect, Settings.SettingsPosition, GUI.tooltip, ref ToolTipActive, 0, 0);
            }

            GUILayout.BeginVertical();

            DisplayTabButtons();

            ScrollViewerPosition = GUILayout.BeginScrollView(ScrollViewerPosition, GUILayout.Height(280), GUILayout.Width(375));
            GUILayout.BeginVertical();

            DisplaySelectedTab();

            GUILayout.EndVertical();
            GUILayout.EndScrollView();

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Save"))
            {
                Settings.SaveIntervalSec = int.Parse(txtSaveInterval);
                Settings.Save();
                Settings.ShowSettings = false;
            }
            if (GUILayout.Button("Cancel"))
            {
                // We've canclled, so restore original settings.
                Settings.RestoreTempSettings();
                Settings.ShowSettings = false;
            }
            GUILayout.EndHorizontal();
            GUILayout.EndVertical();

            GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
        }
Exemple #5
0
 internal void CloseHatch(bool fireEvent = false)
 {
     Module.HatchEvents["CloseHatch"].active = false;
     Module.HatchEvents["OpenHatch"].active  = true;
     Module.HatchOpen = false;
     if (fireEvent)
     {
         SMAddon.FireEventTriggers();
     }
 }
 internal void EmptyVesselCrew()
 {
     foreach (var part in _partsByResource["Crew"])
     {
         for (int i = part.protoModuleCrew.Count - 1; i >= 0; i--)
         {
             RemoveCrewMember(part.protoModuleCrew[i], part);
         }
         SMAddon.FireEventTriggers();
     }
 }
Exemple #7
0
 internal void GetHatches()
 {
     _hatches.Clear();
     try
     {
         if (!SMSettings.EnableCls || !SMConditions.CanShowShipManifest())
         {
             return;
         }
         if (!SMAddon.GetClsAddon())
         {
             return;
         }
         SMAddon.UpdateClsSpaces();
         if (!SMAddon.GetClsVessel())
         {
             return;
         }
         List <ICLSPart> .Enumerator hParts = SMAddon.ClsAddon.Vessel.Parts.GetEnumerator();
         while (hParts.MoveNext())
         {
             if (hParts.Current == null)
             {
                 continue;
             }
             List <PartModule> .Enumerator hModules = hParts.Current.Part.Modules.GetEnumerator();
             while (hModules.MoveNext())
             {
                 if (hModules.Current == null)
                 {
                     continue;
                 }
                 PartModule pModule = (PartModule)hModules.Current;
                 if (pModule.moduleName != "ModuleDockingHatch")
                 {
                     continue;
                 }
                 ModHatch pHatch = new ModHatch
                 {
                     HatchModule = (PartModule)hModules.Current,
                     ClsPart     = hParts.Current
                 };
                 _hatches.Add(pHatch);
             }
             hModules.Dispose();
         }
         hParts.Dispose();
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage($"Error in GetHatches().\r\nError:  {ex}", SmUtils.LogType.Error, true);
     }
 }
 internal static void AddCrewMember(ProtoCrewMember kerbal, Part part)
 {
     part.AddCrewmember(kerbal);
     kerbal.rosterStatus = ProtoCrewMember.RosterStatus.Assigned;
     if (part.internalModel != null)
     {
         if (kerbal.seat != null)
         {
             kerbal.seat.SpawnCrew();
         }
     }
     SMAddon.FireEventTriggers();
 }
Exemple #9
0
        internal static void Display(int windowId)
        {
            Title = SmUtils.SmTags["#smloc_settings_001"];
            // set input locks when mouseover window...
            //_inputLocked = GuiUtils.PreventClickthrough(ShowWindow, Position, _inputLocked);

            // Reset Tooltip active flag...
            ToolTipActive = false;

            Rect rect = new Rect(Position.width - 20, 4, 16, 16);

            // "Close Window.\r\nSettings will not be immediately saved,\r\n but will be remembered while in game.")))
            if (GUI.Button(rect, new GUIContent("", SmUtils.SmTags["#smloc_settings_tt_001"])))
            {
                ToolTip = "";
                if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
                {
                    SMAddon.OnSmSettingsClicked();
                }
                else
                {
                    SMSettings.MemStoreTempSettings();
                    ShowWindow = false;
                }
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            GUILayout.BeginVertical();

            DisplayTabButtons();

            _displayViewerPosition = GUILayout.BeginScrollView(_displayViewerPosition, SMStyle.ScrollStyle,
                                                               GUILayout.Height(300), GUILayout.Width(380));
            GUILayout.BeginVertical();

            DisplaySelectedTab(_displayViewerPosition);

            GUILayout.EndVertical();
            GUILayout.EndScrollView();

            DisplayActionButtons();

            GUILayout.EndVertical();

            GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
            SMAddon.RepositionWindow(ref Position);
        }
        private static void DisplayActionButtons()
        {
            GUILayout.BeginHorizontal();

              // Save
              //GUIContent label = new GUIContent("Save", "Save the current settings to file.");
              GUIContent label = new GUIContent(SmUtils.Localize("#smloc_settings_002"), SmUtils.Localize("#smloc_settings_tt_002"));
              if (GUILayout.Button(label, GUILayout.Height(20)))
              {
            ToolTip = "";
            SMSettings.SaveIntervalSec = int.Parse(TabConfig.TxtSaveInterval);
            SMSettings.SaveSettings();

            // Sync SM to CLS override settings with CLS
            if (SMSettings.EnableCls && HighLogic.LoadedSceneIsFlight)
            {
              SMSettings.UpdateClsOverride();
            }

            if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
              SMAddon.OnSmSettingsClicked();
            else
              ShowWindow = false;
              }
              Rect rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && ShowToolTips)
            ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);

              // Cancel
              //label = new GUIContent("Cancel", "Cancel the changes made.\nSettings will revert to before changes were made.");
              label = new GUIContent(SmUtils.Localize("#smloc_settings_003"), SmUtils.Localize("#smloc_settings_tt_003"));
              if (GUILayout.Button(label, GUILayout.Height(20)))
              {
            ToolTip = "";
            // We've canclled, so restore original settings.
            SMSettings.MemRestoreTempSettings();

            if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
              SMAddon.OnSmSettingsClicked();
            else
              ShowWindow = false;
              }
              rect = GUILayoutUtility.GetLastRect();
              if (Event.current.type == EventType.Repaint && ShowToolTips)
            ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);

              GUILayout.EndHorizontal();
        }
Exemple #11
0
 internal void FillCrew()
 {
     //Utilities.LogMessage("Entering FillCrew", Utilities.LogType.Info, true);
     List <Part> .Enumerator parts = PartsByResource[SMConditions.ResourceType.Crew.ToString()].GetEnumerator();
     while (parts.MoveNext())
     {
         if (parts.Current == null)
         {
             continue;
         }
         //Utilities.LogMessage(string.Format("Processing FillCrew with part {0}", parts.Current.partInfo.name), Utilities.LogType.Info, true);
         SMPart.FillCrew(parts.Current);
     }
     parts.Dispose();
     SMAddon.FireEventTriggers();
 }
Exemple #12
0
 internal void EmptyCrew()
 {
     List <Part> .Enumerator parts = PartsByResource[SMConditions.ResourceType.Crew.ToString()].GetEnumerator();
     while (parts.MoveNext())
     {
         if (parts.Current == null)
         {
             continue;
         }
         for (int i = parts.Current.protoModuleCrew.Count - 1; i >= 0; i--)
         {
             TransferCrew.RemoveCrewMember(parts.Current.protoModuleCrew[i], parts.Current);
         }
         SMAddon.FireEventTriggers();
     }
     parts.Dispose();
 }
Exemple #13
0
 internal static void FillCrew(Part part)
 {
     //Utilities.LogMessage(string.Format("Entering Fill Crew with part {0}", part.partInfo.name), Utilities.LogType.Info, true);
     if (IsCrewFull(part))
     {
         return;
     }
     while (part.CrewCapacity > SMUtils.GetPartCrewCount(part))
     {
         ProtoCrewMember kerbal = HighLogic.CurrentGame.CrewRoster.GetNextOrNewKerbal();
         part.AddCrewmember(kerbal);
         //Utilities.LogMessage(string.Format("Filling crew in part {0}", part.partInfo.name), Utilities.LogType.Info, true);
         if (kerbal.seat != null)
         {
             kerbal.seat.SpawnCrew();
         }
     }
     SMAddon.FireEventTriggers();
 }
Exemple #14
0
 internal static void OpenAllHatches()
 {
     // TODO: for realism, add a closing/opening sound
     // ReSharper disable once SuspiciousTypeConversion.Global
     List <IModuleDockingHatch> .Enumerator iModules = SMAddon.SmVessel.Hatches.Select(iHatch => (IModuleDockingHatch)iHatch.HatchModule)
                                                       .Where(iModule => iModule.IsDocked).ToList().GetEnumerator();
     while (iModules.MoveNext())
     {
         if (iModules.Current == null)
         {
             continue;
         }
         iModules.Current.HatchEvents["CloseHatch"].active = true;
         iModules.Current.HatchEvents["OpenHatch"].active  = false;
         iModules.Current.HatchOpen = true;
     }
     iModules.Dispose();
     SMAddon.FireEventTriggers();
 }
Exemple #15
0
        internal void RefreshLists()
        {
            //Utilities.LogMessage("Entered:  SMVessel.RefreshLists", Utilities.LogType.Info, SMSettings.VerboseLogging);
            if (Vessel == null)
            {
                return;
            }
            SMConditions.ListsUpdating = true;
            UpdatePartsByResource();
            GetSelectedResourcesParts();
            UpdateDockedVessels();

            // now lets reconcile the selected parts based on the new list of resources...
            WindowManifest.ResolveResourcePartSelections(SMAddon.SmVessel.SelectedResources);

            // Now lets update the Resource Xfer Objects...
            TransferPump.UpdateDisplayPumps();

            // now SM settings / hatches.
            if (SMSettings.EnableCls && SMConditions.CanShowShipManifest())
            {
                if (SMAddon.GetClsAddon())
                {
                    SMAddon.UpdateClsSpaces();
                    if (SMAddon.GetClsVessel())
                    {
                        GetHatches();
                    }
                }
            }

            // Control Window datasources
            GetDockedVessels();
            GetHatches();
            GetAntennas();
            GetLights();
            GetSolarPanels();
            GetLabs();
            WindowRoster.GetRosterList();
            //Utilities.LogMessage("Exiting:  SMVessel.RefreshLists", Utilities.LogType.Info, SMSettings.VerboseLogging);
            SMConditions.ListsUpdating = false;
        }
Exemple #16
0
 internal void CrewTransferStartAction()
 {
     // This removes the kerbal(s) from the current (source) part(s)
     try
     {
         if (FromCrewMember != null)
         {
             RemoveCrewMember(FromCrewMember, FromPart);
         }
         if (ToCrewMember != null)
         {
             RemoveCrewMember(ToCrewMember, ToPart);
         }
         SMAddon.FireEventTriggers();
     }
     catch (Exception ex)
     {
         SmUtils.LogMessage(
             $"in CrewTransferStartAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
     }
 }
 /// <summary>
 ///   Removes Highlighting on parts belonging to the selected resource list.
 /// </summary>
 /// <param name="resourceParts"></param>
 internal static void ClearResourceHighlighting(List <Part> resourceParts)
 {
     if (resourceParts == null)
     {
         return;
     }
     List <Part> .Enumerator list = resourceParts.GetEnumerator();
     while (list.MoveNext())
     {
         ClearPartHighlight(list.Current);
     }
     list.Dispose();
     if (!SMSettings.EnableCls || !SMSettings.EnableClsHighlighting || !SMAddon.GetClsVessel())
     {
         return;
     }
     if (resourceParts.Count > 0 && resourceParts[0] != null)
     {
         SMAddon.ClsAddon.Vessel.Highlight(false);
     }
 }
Exemple #18
0
 internal static void HighlightClsVessel(bool enabled, bool force = false)
 {
     try
     {
         if (SMAddon.ClsAddon.Vessel == null)
         {
             SMAddon.UpdateClsSpaces();
         }
         if (SMAddon.ClsAddon.Vessel == null)
         {
             return;
         }
         List <ICLSSpace> .Enumerator spaces = SMAddon.ClsAddon.Vessel.Spaces.GetEnumerator();
         while (spaces.MoveNext())
         {
             if (spaces.Current == null)
             {
                 continue;
             }
             List <ICLSPart> .Enumerator parts = spaces.Current.Parts.GetEnumerator();
             while (parts.MoveNext())
             {
                 parts.Current?.Highlight(enabled, force);
             }
             parts.Dispose();
         }
         spaces.Dispose();
     }
     catch (Exception ex)
     {
         if (!SMAddon.FrameErrTripped)
         {
             SMUtils.LogMessage(
                 string.Format(" in HighlightCLSVessel (repeating error).  Error:  {0} \r\n\r\n{1}", ex.Message,
                               ex.StackTrace), SMUtils.LogType.Error, true);
             SMAddon.FrameErrTripped = true;
         }
     }
 }
Exemple #19
0
        internal static void DumpCrew(Part part)
        {
            if (!part.vessel.IsRecoverable)
            {
                return;
            }
            while (part.protoModuleCrew.Count > 0)
            {
                ProtoCrewMember kerbal = part.protoModuleCrew.FirstOrDefault();
                if (kerbal != null)
                {
                    part.RemoveCrewmember(kerbal);
                    kerbal.rosterStatus = ProtoCrewMember.RosterStatus.Available;

                    if (kerbal.seat != null)
                    {
                        kerbal.seat.SpawnCrew();
                    }
                }
            }
            SMAddon.FireEventTriggers();
        }
Exemple #20
0
        internal static void Display(int windowId)
        {
            Title = SMUtils.Localize("#smloc_control_001");

            // set input locks when mouseover window...
            //_inputLocked = GuiUtils.PreventClickthrough(ShowWindow, Position, _inputLocked);

            // Reset Tooltip active flag...
            ToolTipActive = false;

            Rect rect = new Rect(Position.width - 20, 4, 16, 16);

            if (GUI.Button(rect, new GUIContent("", SMUtils.Localize("#smloc_window_tt_001")))) // "Close Window"
            {
                ShowWindow = false;
                ToolTip    = "";
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            // This is a scroll panel (we are using it to make button lists...)
            GUILayout.BeginVertical();
            DisplayWindowTabs();

            // This is a scroll panel (we are using it to make button lists...)
            _displayViewerPosition = GUILayout.BeginScrollView(_displayViewerPosition, SMStyle.ScrollStyle,
                                                               GUILayout.Height(200), GUILayout.Width(380));
            DisplaySelectedTab(_displayViewerPosition);
            GUILayout.EndScrollView();

            DisplayTabActions();
            GUILayout.EndVertical();

            GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
            SMAddon.RepositionWindow(ref Position);
        }
Exemple #21
0
        internal static void Display(int windowId)
        {
            Title = SMUtils.Localize("#smloc_roster_001");

            // set input locks when mouseover window...
            //_inputLocked = GuiUtils.PreventClickthrough(ShowWindow, Position, _inputLocked);

            // Reset Tooltip active flag...
            ToolTipActive = false;

            Rect rect = new Rect(Position.width - 20, 4, 16, 16);

            if (GUI.Button(rect, new GUIContent("", SMUtils.Localize("#smloc_window_tt_001")))) // "Close Window"
            {
                OnCreate       = false;
                SelectedKerbal = null;
                ToolTip        = "";
                if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
                {
                    SMAddon.OnSmRosterClicked();
                }
                else
                {
                    ShowWindow = false;
                }
            }

            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }
            try
            {
                GUILayout.BeginVertical();
                DisplayRosterFilter();

                DisplayRosterListViewer();

                if (OnCreate)
                {
                    CreateKerbalViewer();
                }
                else if (SelectedKerbal != null)
                {
                    EditKerbalViewer();
                }
                else
                {
                    GUILayout.BeginHorizontal();
                    GUI.enabled = SMSettings.EnableCrewModify;
                    GUIContent guilabel = new GUIContent(SMUtils.Localize("#smloc_roster_002"), GUI.enabled // "Create Kerbal"
            ? SMUtils.Localize("#smloc_roster_tt_001")                                                      // Realistic Control is On.  Create a Kerbal is disabled.
            : SMUtils.Localize("#smloc_roster_tt_022"));                                                    // "Opens the Kerbal creation editor."
                    if (GUILayout.Button(guilabel, GUILayout.MaxWidth(120), GUILayout.Height(20)))
                    {
                        OnCreate = true;
                    }
                    rect = GUILayoutUtility.GetLastRect();
                    if (Event.current.type == EventType.Repaint && ShowToolTips)
                    {
                        ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
                    }
                    GUILayout.EndHorizontal();
                    GUI.enabled = true;
                }

                GUILayout.EndVertical();
                GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
                SMAddon.RepositionWindow(ref Position);
            }
            catch (Exception ex)
            {
                SMUtils.LogMessage(string.Format(" in Roster Window.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace),
                                   SMUtils.LogType.Error, true);
            }
        }
 internal void RespawnCrew()
 {
     this.Vessel.SpawnCrew();
     SMAddon.FireEventTriggers();
 }
Exemple #23
0
        internal static void LoadSettings()
        {
            LoadColors();

            if (Settings == null)
            {
                LoadSettingsFile();
            }
            if (Settings != null)
            {
                ConfigNode windowsNode = Settings.HasNode("SM_Windows")
          ? Settings.GetNode("SM_Windows")
          : Settings.AddNode("SM_Windows");
                ConfigNode realismNode = Settings.HasNode("SM_Realism")
          ? Settings.GetNode("SM_Realism")
          : Settings.AddNode("SM_Realism");
                ConfigNode highlightNode = Settings.HasNode("SM_Highlight")
          ? Settings.GetNode("SM_Highlight")
          : Settings.AddNode("SM_Highlight");
                ConfigNode toolTipsNode = Settings.HasNode("SM_ToolTips")
          ? Settings.GetNode("SM_ToolTips")
          : Settings.AddNode("SM_ToolTips");
                ConfigNode soundsNode = Settings.HasNode("SM_Sounds")
          ? Settings.GetNode("SM_Sounds")
          : Settings.AddNode("SM_Sounds");
                ConfigNode configNode = Settings.HasNode("SM_Config")
          ? Settings.GetNode("SM_Config")
          : Settings.AddNode("SM_Config");
                ConfigNode hiddenNode = Settings.HasNode("SM_Hidden")
          ? Settings.GetNode("SM_Hidden")
          : Settings.AddNode("SM_Hidden");

                // Lets get our rectangles...
                WindowManifest.Position = GetRectangle(windowsNode, "ManifestPosition", WindowManifest.Position);
                WindowTransfer.Position = GetRectangle(windowsNode, "TransferPosition", WindowTransfer.Position);
                WindowDebugger.Position = GetRectangle(windowsNode, "DebuggerPosition", WindowDebugger.Position);
                WindowSettings.Position = GetRectangle(windowsNode, "SettingsPosition", WindowSettings.Position);
                WindowControl.Position  = GetRectangle(windowsNode, "ControlPosition", WindowControl.Position);
                WindowRoster.Position   = GetRectangle(windowsNode, "RosterPosition", WindowRoster.Position);

                // now the settings
                // Realism Settings
                RealismMode = realismNode.HasValue("RealismMode")
          ? int.Parse(realismNode.GetValue("RealismMode"))
          : RealismMode;
                RealXfers = realismNode.HasValue("RealXfers")
          ? bool.Parse(realismNode.GetValue("RealXfers"))
          : RealXfers;
                RealControl = realismNode.HasValue("RealControl")
          ? bool.Parse(realismNode.GetValue("RealControl"))
          : RealControl;
                EnableCrew = realismNode.HasValue("EnableCrew")
          ? bool.Parse(realismNode.GetValue("EnableCrew"))
          : EnableCrew;
                EnableKerbalRename = realismNode.HasValue("EnableKerbalRename")
          ? bool.Parse(realismNode.GetValue("EnableKerbalRename"))
          : EnableKerbalRename;
                EnableChangeProfession = realismNode.HasValue("EnableChangeProfession")
          ? bool.Parse(realismNode.GetValue("EnableChangeProfession"))
          : EnableChangeProfession;
                EnableCrewModify = realismNode.HasValue("EnableCrewModify")
          ? bool.Parse(realismNode.GetValue("EnableCrewModify"))
          : EnableCrewModify;
                EnablePfCrews = realismNode.HasValue("EnablePfCrews")
          ? bool.Parse(realismNode.GetValue("EnablePfCrews"))
          : EnablePfCrews;
                EnableStockCrewXfer = realismNode.HasValue("EnableStockCrewTransfer")
          ? bool.Parse(realismNode.GetValue("EnableStockCrewTransfer"))
          : EnableStockCrewXfer;

                EnableScience = realismNode.HasValue("EnableScience")
          ? bool.Parse(realismNode.GetValue("EnableScience"))
          : EnableScience;
                EnableResources = realismNode.HasValue("EnableResources")
          ? bool.Parse(realismNode.GetValue("EnableResources"))
          : EnableResources;
                EnablePfResources = realismNode.HasValue("EnablePFResources")
          ? bool.Parse(realismNode.GetValue("EnablePFResources"))
          : EnablePfResources;
                EnableCls = realismNode.HasValue("EnableCLS")
          ? bool.Parse(realismNode.GetValue("EnableCLS"))
          : EnableCls;
                OverrideStockCrewXfer = realismNode.HasValue("OverrideStockCrewTransfer")
          ? bool.Parse(realismNode.GetValue("OverrideStockCrewTransfer"))
          : OverrideStockCrewXfer;
                EnableClsAllowTransfer = realismNode.HasValue("EnableClsAllowTransfer")
          ? bool.Parse(realismNode.GetValue("EnableClsAllowTransfer"))
          : EnableClsAllowTransfer;
                FlowRate = realismNode.HasValue("FlowRate")
          ? double.Parse(realismNode.GetValue("FlowRate"))
          : FlowRate;
                FlowCost = realismNode.HasValue("FlowCost")
          ? double.Parse(realismNode.GetValue("FlowCost"))
          : FlowCost;
                MinFlowRate = realismNode.HasValue("MinFlowRate")
          ? double.Parse(realismNode.GetValue("MinFlowRate"))
          : MinFlowRate;
                MaxFlowRate = realismNode.HasValue("MaxFlowRate")
          ? double.Parse(realismNode.GetValue("MaxFlowRate"))
          : MaxFlowRate;
                MaxFlowTimeSec = realismNode.HasValue("MaxFlowTimeSec")
          ? int.Parse(realismNode.GetValue("MaxFlowTimeSec"))
          : MaxFlowTimeSec;
                EnableXferCost = realismNode.HasValue("EnableXferCost")
          ? bool.Parse(realismNode.GetValue("EnableXferCost"))
          : EnableXferCost;
                LockSettings = realismNode.HasValue("LockSettings")
          ? bool.Parse(realismNode.GetValue("LockSettings"))
          : LockSettings;

                // Highlighting settings
                EnableHighlighting = highlightNode.HasValue("EnableHighlighting")
          ? bool.Parse(highlightNode.GetValue("EnableHighlighting"))
          : EnableHighlighting;
                OnlySourceTarget = highlightNode.HasValue("OnlySourceTarget")
          ? bool.Parse(highlightNode.GetValue("OnlySourceTarget"))
          : OnlySourceTarget;
                EnableClsHighlighting = highlightNode.HasValue("EnableCLSHighlighting")
          ? bool.Parse(highlightNode.GetValue("EnableCLSHighlighting"))
          : EnableClsHighlighting;
                EnableEdgeHighlighting = highlightNode.HasValue("EnableEdgeHighlighting")
          ? bool.Parse(highlightNode.GetValue("EnableEdgeHighlighting"))
          : EnableClsHighlighting;
                ResourcePartColor = hiddenNode.HasValue("ResourcePartColor")
          ? hiddenNode.GetValue("ResourcePartColor")
          : ResourcePartColor;

                // ToolTip Settings
                ShowToolTips = toolTipsNode.HasValue("ShowToolTips")
          ? bool.Parse(toolTipsNode.GetValue("ShowToolTips"))
          : ShowToolTips;
                WindowManifest.ShowToolTips = toolTipsNode.HasValue("ManifestToolTips")
          ? bool.Parse(toolTipsNode.GetValue("ManifestToolTips"))
          : WindowManifest.ShowToolTips;
                WindowTransfer.ShowToolTips = toolTipsNode.HasValue("TransferToolTips")
          ? bool.Parse(toolTipsNode.GetValue("TransferToolTips"))
          : WindowTransfer.ShowToolTips;
                WindowSettings.ShowToolTips = toolTipsNode.HasValue("SettingsToolTips")
          ? bool.Parse(toolTipsNode.GetValue("SettingsToolTips"))
          : WindowSettings.ShowToolTips;
                TabRealism.ShowToolTips = toolTipsNode.HasValue("RealismToolTips")
          ? bool.Parse(toolTipsNode.GetValue("RealismToolTips"))
          : TabRealism.ShowToolTips;
                TabHighlight.ShowToolTips = toolTipsNode.HasValue("HighlightingToolTips")
          ? bool.Parse(toolTipsNode.GetValue("HighlightingToolTips"))
          : TabHighlight.ShowToolTips;
                TabToolTips.ShowToolTips = toolTipsNode.HasValue("ToolTipsToolTips")
          ? bool.Parse(toolTipsNode.GetValue("ToolTipsToolTips"))
          : TabToolTips.ShowToolTips;
                TabSounds.ShowToolTips = toolTipsNode.HasValue("SoundsToolTips")
          ? bool.Parse(toolTipsNode.GetValue("SoundsToolTips"))
          : TabSounds.ShowToolTips;
                TabConfig.ShowToolTips = toolTipsNode.HasValue("ConfigToolTips")
          ? bool.Parse(toolTipsNode.GetValue("ConfigToolTips"))
          : TabConfig.ShowToolTips;
                WindowRoster.ShowToolTips = toolTipsNode.HasValue("RosterToolTips")
          ? bool.Parse(toolTipsNode.GetValue("RosterToolTips"))
          : WindowRoster.ShowToolTips;
                WindowControl.ShowToolTips = toolTipsNode.HasValue("ControlToolTips")
          ? bool.Parse(toolTipsNode.GetValue("ControlToolTips"))
          : WindowControl.ShowToolTips;
                TabHatch.ShowToolTips = toolTipsNode.HasValue("HatchToolTips")
          ? bool.Parse(toolTipsNode.GetValue("HatchToolTips"))
          : TabHatch.ShowToolTips;
                TabSolarPanel.ShowToolTips = toolTipsNode.HasValue("PanelToolTips")
          ? bool.Parse(toolTipsNode.GetValue("PanelToolTips"))
          : TabSolarPanel.ShowToolTips;
                TabAntenna.ShowToolTips = toolTipsNode.HasValue("AntennaToolTips")
          ? bool.Parse(toolTipsNode.GetValue("AntennaToolTips"))
          : TabAntenna.ShowToolTips;
                TabLight.ShowToolTips = toolTipsNode.HasValue("LightToolTips")
          ? bool.Parse(toolTipsNode.GetValue("LightToolTips"))
          : TabLight.ShowToolTips;
                WindowDebugger.ShowToolTips = toolTipsNode.HasValue("DebuggerToolTips")
          ? bool.Parse(toolTipsNode.GetValue("DebuggerToolTips"))
          : WindowDebugger.ShowToolTips;

                // Sounds Settings
                PumpSoundStart = soundsNode.HasValue("PumpSoundStart")
          ? soundsNode.GetValue("PumpSoundStart")
          : PumpSoundStart;
                PumpSoundRun = soundsNode.HasValue("PumpSoundRun")
          ? soundsNode.GetValue("PumpSoundRun")
          : PumpSoundRun;
                PumpSoundStop = soundsNode.HasValue("PumpSoundStop")
          ? soundsNode.GetValue("PumpSoundStop")
          : PumpSoundStop;
                CrewSoundStart = soundsNode.HasValue("CrewSoundStart")
          ? soundsNode.GetValue("CrewSoundStart")
          : CrewSoundStart;
                CrewSoundRun = soundsNode.HasValue("CrewSoundRun")
          ? soundsNode.GetValue("CrewSoundRun")
          : CrewSoundRun;
                CrewSoundStop = soundsNode.HasValue("CrewSoundStop")
          ? soundsNode.GetValue("CrewSoundStop")
          : CrewSoundStop;

                PumpSoundVol = soundsNode.HasValue("PumpSoundVol")
          ? double.Parse(soundsNode.GetValue("PumpSoundVol"))
          : PumpSoundVol;
                CrewSoundVol = soundsNode.HasValue("CrewSoundVol")
          ? double.Parse(soundsNode.GetValue("CrewSoundVol"))
          : CrewSoundVol;

                // Config Settings
                EnableBlizzyToolbar = configNode.HasValue("EnableBlizzyToolbar")
          ? bool.Parse(configNode.GetValue("EnableBlizzyToolbar"))
          : EnableBlizzyToolbar;
                WindowDebugger.ShowWindow = configNode.HasValue("ShowDebugger")
          ? bool.Parse(configNode.GetValue("ShowDebugger"))
          : WindowDebugger.ShowWindow;
                VerboseLogging = configNode.HasValue("VerboseLogging")
          ? bool.Parse(configNode.GetValue("VerboseLogging"))
          : VerboseLogging;
                AutoSave = configNode.HasValue("AutoSave")
          ? bool.Parse(configNode.GetValue("AutoSave"))
          : AutoSave;
                SaveIntervalSec = configNode.HasValue("SaveIntervalSec")
          ? int.Parse(configNode.GetValue("SaveIntervalSec"))
          : SaveIntervalSec;
                AutoDebug = configNode.HasValue("AutoDebug")
          ? bool.Parse(configNode.GetValue("AutoDebug"))
          : AutoDebug;
                DebugLogPath = configNode.HasValue("DebugLogPath")
          ? configNode.GetValue("DebugLogPath")
          : DebugLogPath;
                ErrorLogLength = configNode.HasValue("ErrorLogLength")
          ? configNode.GetValue("ErrorLogLength")
          : ErrorLogLength;
                SaveLogOnExit = configNode.HasValue("SaveLogOnExit")
          ? bool.Parse(configNode.GetValue("SaveLogOnExit"))
          : SaveLogOnExit;
                UseUnityStyle = configNode.HasValue("UseUnityStyle")
          ? bool.Parse(configNode.GetValue("UseUnityStyle"))
          : UseUnityStyle;

                // Hidden Settings
                // Hidden Highlighting
                SourcePartColor = hiddenNode.HasValue("SourcePartColor")
          ? hiddenNode.GetValue("SourcePartColor")
          : SourcePartColor;
                TargetPartColor = hiddenNode.HasValue("TargetPartColor")
          ? hiddenNode.GetValue("TargetPartColor")
          : TargetPartColor;
                TargetPartCrewColor = hiddenNode.HasValue("TargetPartCrewColor")
          ? hiddenNode.GetValue("TargetPartCrewColor")
          : TargetPartCrewColor;
                MouseOverColor = hiddenNode.HasValue("MouseOverColor")
          ? hiddenNode.GetValue("MouseOverColor")
          : MouseOverColor;

                // Hidden config
                CrewXferDelaySec = hiddenNode.HasValue("CrewXferDelaySec")
          ? double.Parse(hiddenNode.GetValue("CrewXferDelaySec"))
          : CrewXferDelaySec;
                IvaUpdateFrameDelay = hiddenNode.HasValue("IvaUpdateFrameDelay")
          ? int.Parse(hiddenNode.GetValue("IvaUpdateFrameDelay"))
          : IvaUpdateFrameDelay;
                // Okay, set the Settings loaded flag
                Loaded = true;
                MemStoreTempSettings();
            }

            // Enable/Disable crewed parts CrewTransferDialog
            SetStockCrewTransferState();

            // Force Styles to refresh/load.
            SMStyle.WindowStyle = null;

            // Lets make sure that the windows can be seen on the screen. (supports different resolutions)
            SMAddon.RepositionWindows();
        }
Exemple #24
0
        internal static void Display(int windowId)
        {
            Title = $"{SmUtils.SmTags["#smloc_debug_000"]}:  {SMSettings.CurVersion}";

            // set input locks when mouseover window...
            //_inputLocked = GuiUtils.PreventClickthrough(ShowWindow, Position, _inputLocked);

            // Reset Tooltip active flag...
            ToolTipActive = false;

            Rect rect = new Rect(Position.width - 20, 4, 16, 16);

            if (GUI.Button(rect, new GUIContent("", SmUtils.SmTags["#smloc_window_tt_001"]))) // "Close Window"
            {
                ShowWindow = false;
                SMSettings.MemStoreTempSettings();
                ToolTip = "";
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            GUILayout.BeginVertical();
            SmUtils.DebugScrollPosition = GUILayout.BeginScrollView(SmUtils.DebugScrollPosition, SMStyle.ScrollStyle,
                                                                    GUILayout.Height(300), GUILayout.Width(500));
            GUILayout.BeginVertical();

            List <string> .Enumerator errors = SmUtils.LogItemList.GetEnumerator();
            while (errors.MoveNext())
            {
                if (errors.Current == null)
                {
                    continue;
                }
                GUILayout.TextArea(errors.Current, GUILayout.Width(460));
            }
            errors.Dispose();

            GUILayout.EndVertical();
            GUILayout.EndScrollView();

            GUILayout.BeginHorizontal();
            if (GUILayout.Button(SmUtils.SmTags["#smloc_debug_001"], GUILayout.Height(20))) //"Clear log"
            {
                SmUtils.LogItemList.Clear();
                SmUtils.LogItemList.Add($"Info:  Log Cleared at {DateTime.UtcNow.ToString(CultureInfo.InvariantCulture)} UTC.");
            }
            if (GUILayout.Button(SmUtils.SmTags["#smloc_debug_002"], GUILayout.Height(20))) // "Save Log"
            {
                // Create log file and save.
                Savelog();
            }
            if (GUILayout.Button(SmUtils.SmTags["#smloc_debug_003"], GUILayout.Height(20))) // "Close"
            {
                // Create log file and save.
                ShowWindow = false;
                SMSettings.MemStoreTempSettings();
            }
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
            GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
            SMAddon.RepositionWindow(ref Position);
        }
Exemple #25
0
        internal static void DisplayWindowTabs()
        {
            Rect rect;

            GUILayout.BeginHorizontal();
            GUIContent label;

            if (SMSettings.EnableCls)
            {
                label = new GUIContent(SMUtils.Localize("#smloc_control_002"), SMUtils.Localize("#smloc_control_tt_001"));
                GUIStyle hatchesStyle = _selectedTab == Tab.Hatch ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;
                if (GUILayout.Button(label, hatchesStyle, GUILayout.Height(20))) // "Hatches"
                {
                    try
                    {
                        SMAddon.UpdateClsSpaces();
                        SMAddon.SmVessel.GetHatches();
                        _selectedTab = Tab.Hatch;
                    }
                    catch (Exception ex)
                    {
                        SMUtils.LogMessage(
                            string.Format(" opening Hatches Tab.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace),
                            SMUtils.LogType.Error, true);
                    }
                }
                rect = GUILayoutUtility.GetLastRect();
                if (Event.current.type == EventType.Repaint && ShowToolTips)
                {
                    ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
                }
            }
            GUI.enabled = true;
            label       = new GUIContent(SMUtils.Localize("#smloc_control_003"), SMUtils.Localize("#smloc_control_tt_002"));
            GUIStyle panelsStyle = _selectedTab == Tab.Panel ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(label, panelsStyle, GUILayout.Height(20))) // "Solar Panels"
            {
                try
                {
                    SMAddon.SmVessel.GetSolarPanels();
                    _selectedTab = Tab.Panel;
                }
                catch (Exception ex)
                {
                    SMUtils.LogMessage(
                        string.Format(" opening Solar Panels Tab.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), SMUtils.LogType.Error,
                        true);
                }
            }
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            label = new GUIContent(SMUtils.Localize("#smloc_control_004"), SMUtils.Localize("#smloc_control_tt_003"));
            GUIStyle antennaStyle = _selectedTab == Tab.Antenna ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(label, antennaStyle, GUILayout.Height(20))) // "Antennas"
            {
                try
                {
                    SMAddon.SmVessel.GetAntennas();
                    _selectedTab = Tab.Antenna;
                }
                catch (Exception ex)
                {
                    SMUtils.LogMessage(
                        string.Format(" opening Antennas Tab.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), SMUtils.LogType.Error, true);
                }
            }
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            label = new GUIContent(SMUtils.Localize("#smloc_control_005"), SMUtils.Localize("#smloc_control_tt_004"));
            GUIStyle lightsStyle = _selectedTab == Tab.Light ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(label, lightsStyle, GUILayout.Height(20))) // "Lights"
            {
                try
                {
                    SMAddon.SmVessel.GetLights();
                    _selectedTab = Tab.Light;
                }
                catch (Exception ex)
                {
                    SMUtils.LogMessage(
                        string.Format(" opening Lights Tab.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), SMUtils.LogType.Error, true);
                }
            }
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            label = new GUIContent(SMUtils.Localize("#smloc_control_006"), SMUtils.Localize("#smloc_control_tt_005"));
            GUIStyle labsStyle = _selectedTab == Tab.Lab ? SMStyle.ButtonToggledStyle : SMStyle.ButtonStyle;

            if (GUILayout.Button(label, labsStyle, GUILayout.Height(20))) // "Labs"
            {
                try
                {
                    SMAddon.SmVessel.GetLabs();
                    _selectedTab = Tab.Lab;
                }
                catch (Exception ex)
                {
                    SMUtils.LogMessage(
                        string.Format(" opening Labs Tab.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), SMUtils.LogType.Error, true);
                }
            }
            rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }

            GUILayout.EndHorizontal();
        }
Exemple #26
0
        internal static void Display(Vector2 displayViewerPosition)
        {
            // Reset Tooltip active flag...
            ToolTipActive    = false;
            _canShowToolTips = WindowSettings.ShowToolTips && ShowToolTips;

            Position = WindowSettings.Position;
            int scrollX = 20;

            GUI.enabled = true;
            GUILayout.Label(SmUtils.SmTags["#smloc_settings_highlight_000"], SMStyle.LabelTabHeader);
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));

            // EnableHighlighting Mode
            GUILayout.BeginHorizontal();
            //_label = "Enable Highlighting";
            //_toolTip = "Enables highlighting of all parts that contain the resource(s) selected in the Manifest Window.";
            //_toolTip += "\r\nThis is a global setting.  Does not affect mouseover highlighting.";
            _label    = SmUtils.SmTags["#smloc_settings_highlight_001"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_highlight_tt_001"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableHighlighting = GUILayout.Toggle(SMSettings.EnableHighlighting, _guiLabel, GUILayout.Width(guiToggleWidth));
            GUILayout.EndHorizontal();
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            if (SMSettings.EnableHighlighting != SMSettings.PrevEnableHighlighting && HighLogic.LoadedSceneIsFlight)
            {
                if (SMSettings.EnableCls)
                {
                    if (SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()))
                    {
                        // Update spaces and reassign the resource to observe new settings.
                        SMHighlighter.HighlightClsVessel(SMSettings.EnableHighlighting, true);
                        SMAddon.UpdateClsSpaces();
                        SMAddon.SmVessel.SelectedResources.Clear();
                        SMAddon.SmVessel.SelectedResources.Add(SMConditions.ResourceType.Crew.ToString());
                    }
                }
            }

            // OnlySourceTarget Mode
            GUI.enabled = true;
            GUI.enabled = SMSettings.EnableHighlighting;
            GUILayout.BeginHorizontal();
            GUILayout.Space(guiIndent);
            //_label = "Highlight Only Source / Target Parts";
            //_toolTip = "Disables general highlighting of parts for a selected Resource or resources.";
            //_toolTip += "\r\nRestricts highlighting of parts to only the part or parts selected in the Transfer Window.";
            //_toolTip += "\r\nRequires 'Enable Highlighting' to be On.";
            _label    = SmUtils.SmTags["#smloc_settings_highlight_002"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_highlight_tt_002"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.OnlySourceTarget = GUILayout.Toggle(SMSettings.OnlySourceTarget, _guiLabel, GUILayout.Width(guiToggleWidth));
            GUILayout.EndHorizontal();
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            if (SMSettings.OnlySourceTarget && (!SMSettings.PrevOnlySourceTarget || SMSettings.EnableClsHighlighting))
            {
                SMSettings.EnableClsHighlighting = false;
                if (HighLogic.LoadedSceneIsFlight && SMSettings.EnableCls &&
                    SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()))
                {
                    // Update spaces and reassign the resource to observe new settings.
                    SMHighlighter.HighlightClsVessel(false, true);
                    SMAddon.UpdateClsSpaces();
                    SMAddon.SmVessel.SelectedResources.Clear();
                    SMAddon.SmVessel.SelectedResources.Add(SMConditions.ResourceType.Crew.ToString());
                }
            }
            // Enable CLS Highlighting Mode
            if (!SMSettings.EnableHighlighting || !SMSettings.EnableCls)
            {
                GUI.enabled = false;
            }
            else
            {
                GUI.enabled = true;
            }
            GUILayout.BeginHorizontal();
            GUILayout.Space(guiIndent);
            //_label = "Enable CLS Highlighting";
            //_toolTip = "Changes highlighting behavior if CLS is enabled & Crew selected in Manifest Window.";
            //_toolTip += "\r\nHighlights the parts associated with livable/passable spaces on vessel.";
            //_toolTip += "\r\nRequires 'Enable Highlighting' to be On and is mutually exclusive with ";
            //_toolTip += "\r\n'Highlight Only Source / Target Parts'.";
            _label    = SmUtils.SmTags["#smloc_settings_highlight_003"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_highlight_tt_003"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableClsHighlighting = GUILayout.Toggle(SMSettings.EnableClsHighlighting, _guiLabel, GUILayout.Width(guiToggleWidth));
            GUILayout.EndHorizontal();
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            if (SMSettings.EnableClsHighlighting && (!SMSettings.PrevEnableClsHighlighting || SMSettings.OnlySourceTarget))
            {
                SMSettings.OnlySourceTarget = false;
            }
            if (HighLogic.LoadedSceneIsFlight && SMSettings.EnableCls &&
                SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()) &&
                WindowTransfer.ShowWindow)
            {
                if (SMSettings.EnableClsHighlighting != SMSettings.PrevEnableClsHighlighting)
                {
                    SMHighlighter.HighlightClsVessel(SMSettings.EnableClsHighlighting);
                }
            }

            // Enable Edge Highlighting Mode
            GUI.enabled = SMSettings.EnableHighlighting;
            GUILayout.BeginHorizontal();
            //_label = "Enable Edge Highlighting (On Mouse Overs)";
            //_toolTip = "Changes highlighting behavior when you mouseover a part button in Transfer Window.";
            //_toolTip += "\r\nCauses the edge of the part to glow, making it easier to see.";
            //_toolTip += "\r\nRequires Edge Highlighting to be enabled in the KSP Game settings.";
            _label    = SmUtils.SmTags["#smloc_settings_highlight_004"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_highlight_tt_004"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableEdgeHighlighting = GUILayout.Toggle(SMSettings.EnableEdgeHighlighting, _guiLabel, GUILayout.Width(guiToggleWidth));
            GUILayout.EndHorizontal();
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            if (SMSettings.EnableEdgeHighlighting != SMSettings.PrevEnableEdgeHighlighting && HighLogic.LoadedSceneIsFlight)
            {
                if (SMSettings.EnableEdgeHighlighting == false)
                {
                    if (SMAddon.SmVessel.SelectedResources.Count > 0)
                    {
                        List <Part> .Enumerator parts = SMAddon.SmVessel.SelectedResourcesParts.GetEnumerator();
                        while (parts.MoveNext())
                        {
                            if (parts.Current == null)
                            {
                                continue;
                            }
                            SMHighlighter.EdgeHighight(parts.Current, false);
                        }
                        parts.Dispose();
                    }
                }
            }
            GUI.enabled = true;
        }
Exemple #27
0
        internal void CrewTransferAction()
        {
            try
            {
                // Both parts have internal models...
                if (FromPart.internalModel != null && ToPart.internalModel != null)
                {
                    if (ToSeat.taken)
                    {
                        // Remove the crew members from the part(s)...
                        RemoveCrewMember(FromCrewMember, FromPart);

                        // Swap places if there is no standing room available
                        if (ToPart.CrewCapacity == ToPart.protoModuleCrew.Count)
                        {
                            RemoveCrewMember(ToCrewMember, ToPart);
                            FromPart.AddCrewmemberAt(ToCrewMember, FromPart.internalModel.seats.IndexOf(FromSeat));
                            // Add the crew members back into the part(s) at their new seats.
                            ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
                        }
                        else
                        {
                            // Just move.
                            RemoveCrewMember(FromCrewMember, FromPart);
                            AddCrewMember(FromCrewMember, ToPart);
                        }
                        SMAddon.FireEventTriggers();
                    }
                    else
                    {
                        // Just move.
                        RemoveCrewMember(FromCrewMember, FromPart);
                        ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
                        SMAddon.FireEventTriggers();
                    }
                }
                else // one or both parts do not have an internal model
                {
                    // no portraits, so let's just move kerbals...
                    if (ToCrewMember != null)
                    {
                        RemoveCrewMember(FromCrewMember, FromPart);
                        RemoveCrewMember(ToCrewMember, ToPart);
                        AddCrewMember(FromCrewMember, ToPart);
                        AddCrewMember(ToCrewMember, FromPart);
                    }
                    else
                    {
                        RemoveCrewMember(FromCrewMember, FromPart);
                        AddCrewMember(FromCrewMember, ToPart);
                    }
                    SMAddon.FireEventTriggers();
                }
                if (SMSettings.EnableStockCrewXfer)
                {
                    // Now let's deal with third party mod support...
                    SourceAction        = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart);
                    FireSourceXferEvent = true;

                    //If a swap, we need to handle that too...
                    if (ToCrewMember != null)
                    {
                        TargetAction        = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart);
                        FireTargetXferEvent = true;
                    }
                }

                FromPart.vessel.SpawnCrew();

                // not sure if these help.   We have been experiencing issues with "ghost" kerbals & EVAs/docking/undocking after Crew Moves.
                // trying this to see if it "cleans up" any internal tracking inside of KSP...
                FromPart.RegisterCrew();
                ToPart.RegisterCrew();

                SMAddon.SmVessel.RespawnCrew();
                SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true;
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
            }
        }
        internal static void Display(Vector2 displayViewerPosition)
        {
            // Reset Tooltip active flag...
            ToolTipActive    = false;
            _canShowToolTips = WindowSettings.ShowToolTips && ShowToolTips;

            Position = WindowSettings.Position;
            int scrollX = 20;

            GUI.enabled = true;
            if (!SMSettings.LockSettings)
            {
                // "Realism Settings / Options"
                GUILayout.Label(SmUtils.SmTags["#smloc_settings_realism_001"], SMStyle.LabelTabHeader);
            }
            else
            {
                // "Realism Settings / Options  (Locked.  To unlock, edit SMSettings.dat file)"
                GUILayout.Label(
                    new GUIContent(SmUtils.SmTags["#smloc_settings_realism_002"],
                                   SmUtils.SmTags["#smloc_settings_realism_tt_001"]), SMStyle.LabelTabHeader);
            }
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));

            bool isEnabled = !SMSettings.LockSettings;

            //RealismMode Buttons.
            DisplayRealismButtons();

            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));


            // RealXfers Mode
            GUI.enabled = isEnabled;
            //_label = "Realistic Transfers";
            //_toolTip = "Turns on/off Realistic Resource Transfers.";
            //_toolTip += "\r\nWhen ON, Resource fills, Dumps, Crew and Science transfers will behave realistically";
            //_toolTip += "\r\nWhen Off, Allows Fills, Dumps, Repeating Science,";
            //_toolTip += "\r\ninstantaneous Xfers, Crew Xfers anywwhere, etc.";
            _label               = SmUtils.SmTags["#smloc_settings_realism_008"];
            _toolTip             = SmUtils.SmTags["#smloc_settings_realism_tt_007"];
            _guiLabel            = new GUIContent(_label, _toolTip);
            SMSettings.RealXfers = GUILayout.Toggle(SMSettings.RealXfers, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            // RealControl Mode
            GUI.enabled = isEnabled;
            //_label = "Realistic Control";
            //_toolTip = "Turns on/off Realistic Shipboard Control.";
            //_toolTip += "\r\nWhen ON, you must have crew aboard, or a valid comm link to a control station or satellite";
            //_toolTip += "\r\nWhen Off, you have full control of the vessel at any time (subject to the availability of resources).";
            _label    = SmUtils.SmTags["#smloc_settings_realism_009"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_008"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.RealControl = GUILayout.Toggle(SMSettings.RealControl, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            // EnableCrew Modifications
            GUI.enabled = isEnabled;
            GUILayout.BeginHorizontal();
            //_label = "Enable Roster Modifications";
            //_toolTip = "Enables/Disable Crew Modifications in the Roster Window.";
            //_toolTip += "\r\nWhen ON, You cannot Edit, Create, or Respawn Crew members.";
            //_toolTip += "\r\nWhen Off, You can Edit, Create, or Respawn Crew members.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_010"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_009"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableCrewModify = GUILayout.Toggle(SMSettings.EnableCrewModify, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            GUILayout.EndHorizontal();

            //_label = "Enable Kerbal Renaming";
            //_toolTip = "Allows renaming a Kerbal.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_011"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_010"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableKerbalRename = GUILayout.Toggle(SMSettings.EnableKerbalRename, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            GUILayout.BeginHorizontal();
            //_label = "Enable Profession management";
            //_toolTip = "When On, SM allows you to change a Kerbal's profession.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_012"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_011"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableChangeProfession = GUILayout.Toggle(SMSettings.EnableChangeProfession, _guiLabel,
                                                                 GUILayout.Width(guiToggleWidth));
            GUILayout.EndHorizontal();
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUI.enabled = true;

            // Enable stock Crew Xfers
            GUI.enabled = SMSettings.EnableCrew && isEnabled;
            GUILayout.BeginHorizontal();
            //_label = "Enable Stock Crew Xfers";
            //_toolTip = "Turns On/Off the stock Crew Transfer mechanism.";
            //_toolTip += "\r\nWhen ON stock crew transfers will be Allowed.";
            //_toolTip += "\r\nWhen OFF Stock Crew transfers are disabled.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_013"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_012"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableStockCrewXfer = GUILayout.Toggle(SMSettings.EnableStockCrewXfer, _guiLabel,
                                                              GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            GUILayout.EndHorizontal();

            // EnableCrew Xfer Mode
            GUI.enabled = isEnabled;
            GUILayout.BeginHorizontal();
            //_label = "Enable SM Crew Xfers";
            //_toolTip = "Turns on/off Crew transfers using SM.";
            //_toolTip += "\r\nWhen ON, The Crew option will appear in your resource list.";
            //_toolTip += "\r\nWhen Off, Crew transfers are not possible using SM.";
            _label                = SmUtils.SmTags["#smloc_settings_realism_014"];
            _toolTip              = SmUtils.SmTags["#smloc_settings_realism_tt_013"];
            _guiLabel             = new GUIContent(_label, _toolTip);
            SMSettings.EnableCrew = GUILayout.Toggle(SMSettings.EnableCrew, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            GUILayout.EndHorizontal();

            if (!SMSettings.EnableCrew && HighLogic.LoadedSceneIsFlight)
            {
                if (SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()))
                {
                    // Clear Resource selection.
                    SMHighlighter.ClearResourceHighlighting(SMAddon.SmVessel.SelectedResourcesParts);
                    SMAddon.SmVessel.SelectedResources.Clear();
                    WindowTransfer.ShowWindow = false;
                }
            }

            // Set Gui.enabled for child settings to resources...
            GUI.enabled = SMSettings.EnableCrew && isEnabled;

            // EnablePFResources Mode
            GUILayout.BeginHorizontal();
            GUILayout.Space(20);
            //_label = "Enable Crew Fill and Empty Ops in Pre-Flight";
            //_toolTip = "Turns on/off Fill and Empty Crew when in preflight.";
            //_toolTip += "\r\nWhen ON, Fill & Empty Crew vessel wide are possible (shows in the Resource list).";
            //_toolTip += "\r\nWhen Off, Fill and Empty Crew vessel wide will not appear in the resource list.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_015"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_014"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnablePfCrews = GUILayout.Toggle(SMSettings.EnablePfCrews, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            // Enable stock Crew Xfer Override
            GUI.enabled = SMSettings.EnableCrew && isEnabled && SMSettings.EnableStockCrewXfer;
            GUILayout.BeginHorizontal();
            //_label = "Override Stock Crew Xfers";
            //_toolTip = "Turns on/off Overriding the stock Crew Transfer mechanism with the SM style.";
            //_toolTip += "\r\nWhen ON stock crew transfers will behave like SM style transfers.\n(requires both Stock Crew Transfers & SM Crew Transfers ON)";
            //_toolTip += "\r\nWhen Off Stock Crew transfers behave normally if enabled.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_016"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_015"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Space(20);
            SMSettings.OverrideStockCrewXfer = GUILayout.Toggle(SMSettings.OverrideStockCrewXfer, _guiLabel,
                                                                GUILayout.Width(300));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            GUILayout.EndHorizontal();

            // EnableCLS Mode
            GUILayout.BeginHorizontal();
            GUILayout.Space(20);
            if (!SMSettings.EnableCrew || !SMSettings.ClsInstalled)
            {
                GUI.enabled = false;
            }
            else
            {
                GUI.enabled = isEnabled;
            }
            //_label = "Enable CLS  (Connected Living Spaces)";
            //_toolTip = "Turns on/off Connected Living space support.";
            //_toolTip += "\r\nWhen ON, Crew can only be xfered to a part in the same 'Living Space'.";
            //_toolTip += "\r\nWhen Off, Crew transfers are possible to any part that can hold a kerbal.";
            _label               = SmUtils.SmTags["#smloc_settings_realism_017"];
            _toolTip             = SmUtils.SmTags["#smloc_settings_realism_tt_016"];
            _guiLabel            = new GUIContent(_label, _toolTip);
            SMSettings.EnableCls = GUILayout.Toggle(SMSettings.EnableCls, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            if (SMSettings.EnableCls != SMSettings.PrevEnableCls && HighLogic.LoadedSceneIsFlight)
            {
                if (!SMSettings.EnableCls)
                {
                    SMHighlighter.HighlightClsVessel(false, true);
                }
                else if (SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()))
                {
                    // Update spaces and reassign the resource to observe new settings.
                    SMAddon.UpdateClsSpaces();
                    SMAddon.SmVessel.SelectedResources.Clear();
                    SMAddon.SmVessel.SelectedResources.Add(SMConditions.ResourceType.Crew.ToString());
                }
            }

            // Enable stock Crew Xfer Override
            if (!SMSettings.EnableCrew || !SMSettings.ClsInstalled)
            {
                GUI.enabled = false;
            }
            else
            {
                GUI.enabled = isEnabled;
            }
            GUILayout.BeginHorizontal();
            //_label = "Enable CLS' Allow Unrestricted Crew Xfers switch";
            //_toolTip = "Turns on/off Enabling the CLS Switch allowing unrestricted crew transfers.";
            //_toolTip += "\r\nWhen ON (requires Realism Mode On), SM Manages Stock and CLS aware Crew Transfers.";
            //_toolTip += "\r\nWhen Off (or Realism is off), the setting in CLS is not touched.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_018"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_017"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Space(20);
            SMSettings.EnableClsAllowTransfer = GUILayout.Toggle(SMSettings.EnableClsAllowTransfer, _guiLabel,
                                                                 GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            GUILayout.EndHorizontal();

            // EnableScience Mode
            GUILayout.BeginHorizontal();
            GUI.enabled = isEnabled;
            //_label = "Enable Science Xfers";
            //_toolTip = "Turns on/off Science Xfers.";
            //_toolTip += "\r\nWhen ON, Science transfers are possible and show up in the Resource list.";
            //_toolTip += "\r\nWhen Off, Science transfers will not appear in the resource list.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_019"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_018"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableScience = GUILayout.Toggle(SMSettings.EnableScience, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            if (!SMSettings.EnableScience && HighLogic.LoadedSceneIsFlight)
            {
                // Clear Resource selection.
                if (SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Science.ToString()))
                {
                    SMAddon.SmVessel.SelectedResources.Clear();
                }
            }

            // EnableResources Mode
            GUILayout.BeginHorizontal();
            GUI.enabled = isEnabled;
            //_label = "Enable Resource Xfers";
            //_toolTip = "Turns on/off Resource Xfers.";
            //_toolTip += "\r\nWhen ON, Resource transfers are possible and display in Manifest Window.";
            //_toolTip += "\r\nWhen Off, Resources will not appear in the resource list.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_020"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_019"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableResources = GUILayout.Toggle(SMSettings.EnableResources, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            if (!SMSettings.EnableResources && HighLogic.LoadedSceneIsFlight)
            {
                // Clear Resource selection.
                if (SMAddon.SmVessel.SelectedResources.Count > 0 &&
                    !SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Crew.ToString()) &&
                    !SMAddon.SmVessel.SelectedResources.Contains(SMConditions.ResourceType.Science.ToString()))
                {
                    SMAddon.SmVessel.SelectedResources.Clear();
                }
            }

            // Set Gui.enabled for child settings to resources...
            GUI.enabled = SMSettings.EnableResources && isEnabled;

            // EnablePFResources Mode
            GUILayout.BeginHorizontal();
            GUILayout.Space(20);
            //_label = "Enable Resources in Pre-Flight";
            //_toolTip = "Turns on/off Fill and Empty Resources when in preflight.";
            //_toolTip += "\r\nWhen ON, Fill & Dump resources vessel wide are possible (shows in the Resource list).";
            //_toolTip += "\r\nWhen Off, Fill and Dump Resources vessel wide will not appear in the resource list.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_021"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_020"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnablePfResources = GUILayout.Toggle(SMSettings.EnablePfResources, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            // EnableXferCost Mode
            GUILayout.BeginHorizontal();
            GUILayout.Space(20);
            //_label = "Resource Xfers Consume Power";
            //_toolTip = "Turns on/off ElectricCharge cost forResource Xfers.";
            //_toolTip += "\r\nWhen ON, Resource transfers will consume ElectricCharge.";
            //_toolTip += "\r\nWhen Off, Resources Xfers consume no ElectricCharge.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_022"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_021"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.EnableXferCost = GUILayout.Toggle(SMSettings.EnableXferCost, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            // Resource Xfer EC cost
            GUI.enabled = !SMSettings.LockSettings && SMSettings.EnableResources && SMSettings.EnableXferCost;
            GUILayout.BeginHorizontal();
            GUILayout.Space(35);
            //_label = "Xfer Power Cost:";
            //_toolTip = "Sets the Electrical cost of resource Xfers.";
            //_toolTip += "\r\nThe higher the number the more ElectricCharge used.";
            _label    = $"{SmUtils.SmTags["#smloc_settings_realism_023"]}:";
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_022"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(125), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }

            // Lets parse the string to allow decimal points.
            StrFlowCost = SMSettings.FlowCost.ToString(CultureInfo.InvariantCulture);
            // add the decimal point if it was typed.
            StrFlowCost = SmUtils.GetStringDecimal(StrFlowCost);
            // add the zero if it was typed.
            StrFlowCost = SmUtils.GetStringZero(StrFlowCost);

            StrFlowCost = GUILayout.TextField(StrFlowCost, 20, GUILayout.Height(20), GUILayout.Width(80));
            //_label = "EC/Unit";
            //_toolTip = "Sets the Electrical cost of resource Xfers when Realism Mode is on.";
            //_toolTip += "\r\nThe higher the number the more ElectricCharge used.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_024"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_022"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(80), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            // update decimal bool
            SmUtils.SetStringDecimal(StrFlowCost);
            //update zero bool
            SmUtils.SetStringZero(StrFlowCost);

            if (float.TryParse(StrFlowCost, out float newCost))
            {
                SMSettings.FlowCost = newCost;
            }

            // create xfer Flow Rate slider;
            // Lets parse the string to allow decimal points.
            string strFlowRate    = SMSettings.FlowRate.ToString(CultureInfo.InvariantCulture);
            string strMinFlowRate = SMSettings.MinFlowRate.ToString(CultureInfo.InvariantCulture);
            string strMaxFlowRate = SMSettings.MaxFlowRate.ToString(CultureInfo.InvariantCulture);
            string strMaxFlowTime = SMSettings.MaxFlowTimeSec.ToString();


            // Resource Flow Rate
            GUI.enabled = !SMSettings.LockSettings && SMSettings.EnableResources && SMSettings.RealXfers;
            GUILayout.BeginHorizontal();
            GUILayout.Space(25);
            //_label = "Resource Flow Rate:";
            //_toolTip = "Sets the rate that resources Xfer when Realistic Transfers is on.";
            //_toolTip += "\r\nThe higher the number the faster resources move.";
            //_toolTip += "\r\nYou can also use the slider below to change this value.";
            _label    = $"{SmUtils.SmTags["#smloc_settings_realism_025"]}:";
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_023"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(135), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            strFlowRate = GUILayout.TextField(strFlowRate, 20, GUILayout.Height(20), GUILayout.Width(80));
            //_label = "Units/Sec";
            //_toolTip = "Sets the rate that resources Xfer when Realism Mode is on.";
            //_toolTip += "\r\nThe higher the number the faster resources move.";
            //_toolTip += "\r\nYou can also use the slider below to change this value.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_026"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_023"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(80), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            if (float.TryParse(strFlowRate, out float newRate))
            {
                SMSettings.FlowRate = (int)newRate;
            }

            // Resource Flow rate Slider
            GUILayout.BeginHorizontal();
            GUILayout.Space(30);
            GUILayout.Label(SMSettings.MinFlowRate.ToString(CultureInfo.InvariantCulture), GUILayout.Width(10),
                            GUILayout.Height(20));
            SMSettings.FlowRate = GUILayout.HorizontalSlider((float)SMSettings.FlowRate, (float)SMSettings.MinFlowRate,
                                                             (float)SMSettings.MaxFlowRate, GUILayout.Width(240), GUILayout.Height(20));
            _label = SMSettings.MaxFlowRate.ToString(CultureInfo.InvariantCulture);
            //_toolTip = "Slide control to change the Resource Flow Rate shown above.";
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_024"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(40), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();

            // Min Flow Rate for Slider
            GUILayout.BeginHorizontal();
            GUILayout.Space(30);
            //_label = " - Min Flow Rate:";
            //_toolTip = "Sets the lower limit (left side) of the Flow rate Slider range.";
            _label    = $" - {SmUtils.SmTags["#smloc_settings_realism_027"]}:";
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_025"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(130), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            strMinFlowRate = GUILayout.TextField(strMinFlowRate, 20, GUILayout.Height(20), GUILayout.Width(80));
            //_label = "Units/Sec";
            //_toolTip = "Sets the lower limit (left side) of the Flow rate Slider range.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_026"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_025"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(80), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();
            if (float.TryParse(strMinFlowRate, out newRate))
            {
                SMSettings.MinFlowRate = (int)newRate;
            }

            // Max Flow Rate for Slider
            GUILayout.BeginHorizontal();
            GUILayout.Space(30);
            //_label = " - Max Flow Rate:";
            //_toolTip = "Sets the upper limit (right side) of the Flow rate Slider range.";
            _label    = $" - {SmUtils.SmTags["#smloc_settings_realism_028"]}:";
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_026"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(130), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            strMaxFlowRate = GUILayout.TextField(strMaxFlowRate, 20, GUILayout.Height(20), GUILayout.Width(80));
            //_label = "Units/Sec";
            //_toolTip = "Sets the upper limit (right side) of the Flow rate Slider range.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_026"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_026"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(80), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();
            if (float.TryParse(strMaxFlowRate, out newRate))
            {
                SMSettings.MaxFlowRate = (int)newRate;
            }

            // Max Flow Time
            GUILayout.BeginHorizontal();
            GUILayout.Space(30);
            //_label = " - Max Flow Time:";
            //_toolTip = "Sets the maximum duration (in sec) of a resource transfer.";
            //_toolTip += "\r\nWorks in conjunction with the Flow rate.  if time it would take";
            //_toolTip += "\r\n to move a resource exceeds this number, this number will be used";
            //_toolTip += "\r\n to calculate an adjusted flow rate.";
            //_toolTip += "\r\n(protects you from long Xfers)";
            _label    = $" - {SmUtils.SmTags["#smloc_settings_realism_029"]}:";
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_027"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(130), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            strMaxFlowTime = GUILayout.TextField(strMaxFlowTime, 20, GUILayout.Height(20), GUILayout.Width(80));
            //_label = "Sec";
            //_toolTip = "Sets the maximum duration (in sec) of a resource transfer.";
            //_toolTip += "\r\nWorks in conjunction with the Flow rate.  if time it would take";
            //_toolTip += "\r\n to move a resource exceeds this number, this number will be used";
            //_toolTip += "\r\n to calculate an adjusted flow rate.";
            //_toolTip += "\r\n(protects you from long Xfers)";
            _label    = SmUtils.SmTags["#smloc_settings_realism_030"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_027"];
            _guiLabel = new GUIContent(_label, _toolTip);
            GUILayout.Label(_guiLabel, GUILayout.Width(80), GUILayout.Height(20));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUILayout.EndHorizontal();
            if (float.TryParse(strMaxFlowTime, out newRate))
            {
                SMSettings.MaxFlowTimeSec = (int)newRate;
            }

            // reset gui.enabled to default
            GUI.enabled = true;
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));

            // LockSettings Mode
            GUI.enabled = isEnabled;
            //_label = "Lock Realism Settings  (If set ON, disable in config file)";
            //_toolTip = "Locks the settings in this section so they cannot be altered in game.";
            //_toolTip += "\r\nTo turn off Locking you MUST edit the SMSettings.dat file.";
            _label    = SmUtils.SmTags["#smloc_settings_realism_031"];
            _toolTip  = SmUtils.SmTags["#smloc_settings_realism_tt_028"];
            _guiLabel = new GUIContent(_label, _toolTip);
            SMSettings.LockSettings = GUILayout.Toggle(SMSettings.LockSettings, _guiLabel, GUILayout.Width(guiToggleWidth));
            _rect = GUILayoutUtility.GetLastRect();
            if (Event.current.type == EventType.Repaint && _canShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(_rect, GUI.tooltip, ref ToolTipActive, scrollX);
            }
            GUI.enabled = true;
            GUILayout.Label("____________________________________________________________________________________________",
                            SMStyle.LabelStyleHardRule, GUILayout.Height(10), GUILayout.Width(guiRuleWidth));
        }
Exemple #29
0
        internal static void Display(int windowId)
        {
            Title = string.Format("{0} {1} - {2}", SMUtils.Localize("#smloc_manifest_002"), SMSettings.CurVersion, SMAddon.SmVessel.Vessel.vesselName);

            // set input locks when mouseover window...
            //_inputLocked = GuiUtils.PreventClickthrough(ShowWindow, Position, _inputLocked);

            // Reset Tooltip active flag...
            ToolTipActive = false;

            //GUIContent label = new GUIContent("", "Close Window");
            GUIContent label = new GUIContent("", SMUtils.Localize("#smloc_window_tt_001"));

            if (SMConditions.IsTransferInProgress())
            {
                //label = new GUIContent("", "Action in progress.  Cannot close window");
                label       = new GUIContent("", SMUtils.Localize("#smloc_window_tt_002"));
                GUI.enabled = false;
            }
            Rect rect = new Rect(Position.width - 20, 4, 16, 16);

            if (GUI.Button(rect, label))
            {
                SMAddon.OnSmButtonClicked();
                ToolTip = "";
                SMHighlighter.Update_Highlighter();
            }
            if (Event.current.type == EventType.Repaint && ShowToolTips)
            {
                ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, 10);
            }
            GUI.enabled = true;
            try
            {
                GUILayout.BeginVertical();
                _smScrollViewerPosition = GUILayout.BeginScrollView(_smScrollViewerPosition, SMStyle.ScrollStyle,
                                                                    GUILayout.Height(100), GUILayout.Width(300));
                GUILayout.BeginVertical();

                // Prelaunch (landed) Gui
                if (SMConditions.IsInPreflight())
                {
                    PreLaunchGui();
                }

                // Now the Resource Buttons
                ResourceButtonsList();

                GUILayout.EndVertical();
                GUILayout.EndScrollView();

                //string resLabel = "No Resource Selected";
                string resLabel = SMUtils.Localize("#smloc_manifest_003");
                if (SMAddon.SmVessel.SelectedResources.Count == 1)
                {
                    resLabel = SMAddon.SmVessel.SelectedResources[0];
                }
                else if (SMAddon.SmVessel.SelectedResources.Count == 2)
                {
                    //resLabel = "Multiple Resources selected";
                    resLabel = SMUtils.Localize("#smloc_manifest_004");
                }
                GUILayout.Label(string.Format("{0}", resLabel), GUILayout.Width(300), GUILayout.Height(20));

                // Resource Details List Viewer
                ResourceDetailsViewer();

                // Window toggle Button List
                WindowToggleButtons();

                GUILayout.EndVertical();
                GUI.DragWindow(new Rect(0, 0, Screen.width, 30));
                SMAddon.RepositionWindow(ref Position);
            }
            catch (Exception ex)
            {
                if (!SMAddon.FrameErrTripped)
                {
                    SMUtils.LogMessage(
                        string.Format(" in WindowManifest.Display.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace),
                        SMUtils.LogType.Error, true);
                    SMAddon.FrameErrTripped = true;
                }
            }
        }
Exemple #30
0
        private static void DisplayRosterListViewer()
        {
            try
            {
                GUILayout.BeginVertical();
                // Roster List Header...
                GUILayout.BeginHorizontal();
                //GUILayout.Label("", GUILayout.Width(5));
                GUILayout.Label(SMUtils.Localize("#smloc_roster_016"), GUILayout.Width(140)); // "Name"
                GUILayout.Label(SMUtils.Localize("#smloc_roster_017"), GUILayout.Width(50));  // "Gender"
                GUILayout.Label(SMUtils.Localize("#smloc_roster_005"), GUILayout.Width(70));  // "Profession"
                GUILayout.Label(SMUtils.Localize("#smloc_roster_018"), GUILayout.Width(30));  // "Skill"
                GUILayout.Label(SMUtils.Localize("#smloc_roster_019"), GUILayout.Width(220)); // "Status"
                GUILayout.Label(SMUtils.Localize("#smloc_roster_020"), GUILayout.Width(55));  // "Edit"
                GUILayout.Label(SMUtils.Localize("#smloc_roster_021"), GUILayout.Width(65));  // "Action"
                GUILayout.EndHorizontal();

                _scrollViewerPosition = GUILayout.BeginScrollView(_scrollViewerPosition, SMStyle.ScrollStyle,
                                                                  GUILayout.Height(230), GUILayout.Width(680));

                // vars for acton to occurs after button press
                bool            isAction     = false;
                Part            actionPart   = null;
                string          actionText   = "";
                ProtoCrewMember actionKerbal = null;

                List <ProtoCrewMember> .Enumerator kerbals = RosterList.GetEnumerator();
                while (kerbals.MoveNext())
                {
                    if (kerbals.Current == null)
                    {
                        continue;
                    }
                    if (!CanDisplayKerbal(kerbals.Current))
                    {
                        continue;
                    }
                    GUIStyle labelStyle;
                    if (kerbals.Current.rosterStatus == ProtoCrewMember.RosterStatus.Dead ||
                        kerbals.Current.rosterStatus == ProtoCrewMember.RosterStatus.Missing)
                    {
                        labelStyle = SMStyle.LabelStyleRed;
                    }
                    else if (kerbals.Current.rosterStatus == ProtoCrewMember.RosterStatus.Assigned)
                    {
                        labelStyle = SMStyle.LabelStyleYellow;
                    }
                    else
                    {
                        labelStyle = SMStyle.LabelStyle;
                    }

                    // What vessel is this Kerbal Assigned to?
                    string rosterDetails = "";
                    if (kerbals.Current.rosterStatus == ProtoCrewMember.RosterStatus.Assigned)
                    {
                        List <Vessel> .Enumerator theseVessels = FlightGlobals.Vessels.GetEnumerator();
                        while (theseVessels.MoveNext())
                        {
                            if (theseVessels.Current == null)
                            {
                                continue;
                            }
                            List <ProtoCrewMember> crew = theseVessels.Current.GetVesselCrew();
                            if (crew.Any(crewMember => crewMember == kerbals.Current))
                            {
                                rosterDetails = string.Format("{0} - {1}", SMUtils.Localize("#smloc_roster_011"), theseVessels.Current.GetName().Replace("(unloaded)", "")); // "Assigned"
                            }
                        }
                        theseVessels.Dispose();
                    }
                    else if (InstalledMods.IsDfInstalled && DFWrapper.APIReady && kerbals.Current.type == ProtoCrewMember.KerbalType.Unowned)
                    {
                        // This kerbal could be frozen.  Lets find out...
                        rosterDetails = GetFrozenKerbalDetails(kerbals.Current);
                        labelStyle    = SMStyle.LabelStyleCyan;
                    }
                    else
                    {
                        // Since the kerbal has no vessel assignment, lets show what their status...
                        rosterDetails = kerbals.Current.rosterStatus.ToString();
                    }
                    string buttonText;
                    string buttonToolTip;
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(kerbals.Current.name, labelStyle, GUILayout.Width(140), GUILayout.Height(20));
                    GUILayout.Label(kerbals.Current.gender.ToString(), labelStyle, GUILayout.Width(50));
                    GUILayout.Label(kerbals.Current.experienceTrait.Title, labelStyle, GUILayout.Width(70));
                    GUILayout.Label(kerbals.Current.experienceLevel.ToString(), labelStyle, GUILayout.Width(30));
                    GUILayout.Label(rosterDetails, labelStyle, GUILayout.Width(215));

                    SetupEditButton(kerbals.Current, out buttonText, out buttonToolTip);
                    if (GUILayout.Button(new GUIContent(buttonText, buttonToolTip), GUILayout.Width(55), GUILayout.Height(20),
                                         GUILayout.Height(20)))
                    {
                        if (SelectedKerbal == null || SelectedKerbal.Kerbal != kerbals.Current)
                        {
                            SelectedKerbal = new ModKerbal(kerbals.Current, false);
                            SetProfessionFlag();
                        }
                        else
                        {
                            SelectedKerbal = null;
                        }
                    }
                    Rect rect = GUILayoutUtility.GetLastRect();
                    if (Event.current.type == EventType.Repaint && ShowToolTips)
                    {
                        ToolTip = SMToolTips.SetActiveToolTip(rect, GUI.tooltip, ref ToolTipActive, XOffset);
                    }

                    // Setup buttons with gui state, button text and tooltip.
                    SetupActionButton(kerbals.Current, out buttonText, out buttonToolTip);

                    if (GUILayout.Button(new GUIContent(buttonText, buttonToolTip), GUILayout.Width(65), GUILayout.Height(20)))
                    {
                        isAction     = true;
                        actionKerbal = kerbals.Current;
                        actionText   = buttonText;
                        if (actionText == SMUtils.Localize("#smloc_roster_022")) // "Remove"
                        {
                            actionPart = SMAddon.SmVessel.FindPartByKerbal(kerbals.Current);
                        }
                    }
                    Rect rect2 = GUILayoutUtility.GetLastRect();
                    if (Event.current.type == EventType.Repaint && ShowToolTips)
                    {
                        ToolTip = SMToolTips.SetActiveToolTip(rect2, GUI.tooltip, ref ToolTipActive, XOffset);
                    }
                    GUILayout.EndHorizontal();
                    GUI.enabled = true;
                }
                kerbals.Dispose();
                GUILayout.EndVertical();
                GUILayout.EndScrollView();

                // perform action from button press.
                if (!isAction)
                {
                    return;
                }
                if (actionText == SMUtils.Localize("#smloc_roster_022")) // "Remove"
                {
                    TransferCrew.RemoveCrewMember(actionKerbal, actionPart);
                }
                else if (actionText == SMUtils.Localize("#smloc_roster_023")) // "Add"
                {
                    TransferCrew.AddCrewMember(actionKerbal, SMAddon.SmVessel.SelectedPartsSource[0]);
                }
                else if (actionText == SMUtils.Localize("#smloc_roster_024")) // "Respawn"
                {
                    RespawnKerbal(actionKerbal);
                }
                else if (actionText == SMUtils.Localize("#smloc_roster_025")) // "Thaw"
                {
                    ThawKerbal(actionKerbal.name);
                }
                else if (actionText == SMUtils.Localize("#smloc_roster_026"))// "Freeze"
                {
                    FreezeKerbal(actionKerbal);
                }
                SMAddon.FireEventTriggers();
            }
            catch (Exception ex)
            {
                if (!SMAddon.FrameErrTripped)
                {
                    SMUtils.LogMessage(string.Format(" in RosterListViewer.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), SMUtils.LogType.Error, true);
                }
            }
        }