diff --git a/TestFlight/Resources/ChevronDown.png b/TestFlight/Resources/ChevronDown.png
new file mode 100644
index 00000000..b02cbfce
Binary files /dev/null and b/TestFlight/Resources/ChevronDown.png differ
diff --git a/TestFlight/Resources/ChevronUp.png b/TestFlight/Resources/ChevronUp.png
new file mode 100644
index 00000000..eaa849ca
Binary files /dev/null and b/TestFlight/Resources/ChevronUp.png differ
diff --git a/TestFlightCore/TestFlightCore/Framework/PartModuleExtended.cs b/TestFlightCore/TestFlightCore/Framework/PartModuleExtended.cs
new file mode 100644
index 00000000..b12cbcdb
--- /dev/null
+++ b/TestFlightCore/TestFlightCore/Framework/PartModuleExtended.cs
@@ -0,0 +1,451 @@
+/* Part of KSPPluginFramework
+Version 1.2
+
+Forum Thread:http://forum.kerbalspaceprogram.com/threads/66503-KSP-Plugin-Framework
+Author: TriggerAu, 2014
+License: The MIT License (MIT)
+*/
+
+/*
+ * Equivelant of MonobehaviourExtended for PartModule
+ * Original code provided by TriggerAu in KSPPluginFramework
+ * PartModuleExtended and PartModuleWindow written by Agathorn
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using KSP;
+using UnityEngine;
+
+namespace KSPPluginFramework
+{
+ ///
+ /// An Extended version of the UnityEngine.PartModule Class
+ /// Has some added functions to simplify repeated use and some defined overridable functions for common functions
+ ///
+ public abstract class PartModuleExtended : PartModule
+ {
+ #region RepeatingFunction Code
+ private Boolean _RepeatRunning = false;
+ ///
+ /// Returns whether the RepeatingWorkerFunction is Running
+ ///
+ internal Boolean RepeatingWorkerRunning { get { return _RepeatRunning; } }
+
+ //Storage Variables
+ private Single _RepeatInitialWait;
+ private Single _RepeatSecs;
+
+ ///
+ /// Get/Set the period in seconds that the repeatingfunction is triggered at
+ /// Note: When setting this value if the repeating function is already running it restarts it to set the new period
+ ///
+ internal Single RepeatingWorkerRate
+ {
+ get { return _RepeatSecs; }
+ private set
+ {
+ LogFormatted_DebugOnly("Setting RepeatSecs to {0}", value);
+ _RepeatSecs = value;
+ //If its running then restart it
+ if (RepeatingWorkerRunning)
+ {
+ StopRepeatingWorker();
+ StartRepeatingWorker();
+ }
+ }
+ }
+
+ ///
+ /// Set the repeating period by how many times a second it should repeat
+ /// eg. if you set this to 4 then it will repeat every 0.25 secs
+ ///
+ /// Number of times per second to repeat
+ /// The new RepeatSecs value (eg 0.25 from the example)
+ internal Single SetRepeatTimesPerSecond(Int32 NewTimesPerSecond)
+ {
+ RepeatingWorkerRate = (Single)(1 / (Single)NewTimesPerSecond);
+ return RepeatingWorkerRate;
+ }
+ ///
+ /// Set the repeating period by how many times a second it should repeat
+ /// eg. if you set this to 4 then it will repeat every 0.25 secs
+ ///
+ /// Number of times per second to repeat
+ /// The new RepeatSecs value (eg 0.25 from the example)
+ internal Single SetRepeatTimesPerSecond(Single NewTimesPerSecond)
+ {
+ RepeatingWorkerRate = (Single)(1 / NewTimesPerSecond);
+ return RepeatingWorkerRate;
+ }
+ ///
+ /// Set the repeating rate in seconds for the repeating function
+ /// eg. if you set this to 0.1 then it will repeat 10 times every second
+ ///
+ /// Number of times per second to repeat
+ /// The new RepeatSecs value
+ internal Single SetRepeatRate(Single NewSeconds)
+ {
+ RepeatingWorkerRate = NewSeconds;
+ return RepeatingWorkerRate;
+ }
+
+ ///
+ /// Get/Set the value of the period that should be waited before the repeatingfunction begins
+ /// eg. If you set this to 1 and then start the repeating function then the first time it fires will be in 1 second and then every RepeatSecs after that
+ ///
+ internal Single RepeatingWorkerInitialWait
+ {
+ get { return _RepeatInitialWait; }
+ set { _RepeatInitialWait = value; }
+ }
+
+ #region Start/Stop Functions
+ ///
+ /// Starts the RepeatingWorker Function and sets the TimesPerSec variable
+ ///
+ /// How many times a second should the RepeatingWorker Function be run
+ /// The RunningState of the RepeatinWorker Function
+ internal Boolean StartRepeatingWorker(Int32 TimesPerSec)
+ {
+ LogFormatted_DebugOnly("Starting the repeating function");
+ //Stop it if its running
+ StopRepeatingWorker();
+ //Set the new value
+ SetRepeatTimesPerSecond(TimesPerSec);
+ //Start it and return the result
+ return StartRepeatingWorker();
+ }
+
+ ///
+ /// Starts the Repeating worker
+ ///
+ /// The RunningState of the RepeatinWorker Function
+ internal Boolean StartRepeatingWorker()
+ {
+ try
+ {
+ LogFormatted_DebugOnly("Invoking the repeating function");
+ this.InvokeRepeating("RepeatingWorkerWrapper", _RepeatInitialWait, RepeatingWorkerRate);
+ _RepeatRunning = true;
+ }
+ catch (Exception)
+ {
+ LogFormatted("Unable to invoke the repeating function");
+ //throw;
+ }
+ return _RepeatRunning;
+ }
+
+ ///
+ /// Stop the RepeatingWorkerFunction
+ ///
+ /// The RunningState of the RepeatinWorker Function
+ internal Boolean StopRepeatingWorker()
+ {
+ try
+ {
+ LogFormatted_DebugOnly("Cancelling the repeating function");
+ this.CancelInvoke("RepeatingWorkerWrapper");
+ _RepeatRunning = false;
+ }
+ catch (Exception)
+ {
+ LogFormatted("Unable to cancel the repeating function");
+ //throw;
+ }
+ return _RepeatRunning;
+ }
+ #endregion
+
+ ///
+ /// Function that is repeated.
+ /// You can monitor the duration of the execution of your RepeatingWorker using RepeatingWorkerDuration
+ /// You can see the game time that passes between repeats via RepeatingWorkerUTPeriod
+ ///
+ /// No Need to run the base RepeatingWorker
+ ///
+ internal virtual void RepeatingWorker()
+ {
+ //LogFormatted_DebugOnly("WorkerBase");
+
+ }
+
+ ///
+ /// Time that the last iteration of RepeatingWorkerFunction ran for. Can use this value to see how much impact your code is having
+ ///
+ internal TimeSpan RepeatingWorkerDuration { get; private set; }
+
+
+ ///
+ /// The Game Time that the Repeating Worker function last started
+ ///
+ private Double RepeatingWorkerUTLastStart { get; set; }
+ ///
+ /// The Game Time that the Repeating Worker function started this time
+ ///
+ private Double RepeatingWorkerUTStart { get; set; }
+ ///
+ /// The amount of UT that passed between the last two runs of the Repeating Worker Function
+ ///
+ /// NOTE: Inside the RepeatingWorker Function this will be the UT that has passed since the last run of the RepeatingWorker
+ ///
+ internal Double RepeatingWorkerUTPeriod { get; private set; }
+
+ ///
+ /// This is the wrapper function that calls all the repeating function goodness
+ ///
+ private void RepeatingWorkerWrapper()
+ {
+ //record the start date
+ DateTime Duration = DateTime.Now;
+
+ //Do the math to work out how much game time passed since last time
+ RepeatingWorkerUTLastStart = RepeatingWorkerUTStart;
+ RepeatingWorkerUTStart = Planetarium.GetUniversalTime();
+ RepeatingWorkerUTPeriod = RepeatingWorkerUTStart - RepeatingWorkerUTLastStart;
+
+ //Now call the users code function as they will have overridden this
+ RepeatingWorker();
+
+ //Now calc the duration
+ RepeatingWorkerDuration = (DateTime.Now - Duration);
+ }
+ #endregion
+
+ #region Standard Monobehaviour definitions-for overriding
+ // PartModule has 6 standard overrides and can use any standard Unity MonoBehaviour EXCEPT Awake()
+ // See this for info on order of execuction
+ // http://docs.unity3d.com/Documentation/Manual/ExecutionOrder.html
+
+ ///
+ /// Awake is not allowed for PartModule
+ ///
+ //internal virtual void Awake()
+ //{
+ // LogFormatted_DebugOnly("New PMExtended Awakened");
+ //}
+
+ ///
+ /// KSP:
+ /// Constructor style setup.
+ /// Called in the Part's Awake method.
+ /// The model may not be built by this point.
+ ///
+ public override void OnAwake()
+ {
+ LogFormatted_DebugOnly("PMExtended OnAwake");
+ }
+
+ ///
+ /// Unity: Start is called on the frame when a script is enabled just before any of the Update methods is called the first time.
+ ///
+ /// Trigger: This is the last thing that happens before the scene starts doing stuff
+ /// See this for info on order of execuction: http://docs.unity3d.com/Documentation/Manual/ExecutionOrder.html
+ ///
+ public virtual void Start()
+ {
+ LogFormatted_DebugOnly("New MBExtended Started");
+ }
+
+ ///
+ /// KSP:
+ /// Called during the Part startup.
+ /// StartState gives flag values of initial state
+ ///
+ /// Initial state
+ public override void OnStart(StartState state)
+ {
+ LogFormatted_DebugOnly("New PMExtended OnStart");
+ }
+
+ ///
+ /// Unity: This function is called every fixed framerate frame, if the MonoBehaviour is enabled.
+ ///
+ /// Trigger: This Update is called at a fixed rate and usually where you do all your physics stuff for consistent results
+ /// See this for info on order of execuction: http://docs.unity3d.com/Documentation/Manual/ExecutionOrder.html
+ ///
+ /// Agathorn:
+ /// For PartModule, FixedUpdate() is called every physics update even if the part is not active. In most cases
+ /// you will want to use OnFixedUpdate() instead.
+ ///
+ public virtual void FixedUpdate()
+ { }
+
+ ///
+ /// KSP:
+ /// Per-physx-frame update
+ /// Called ONLY when Part is ACTIVE!
+ ///
+ public override void OnFixedUpdate()
+ { }
+
+ ///
+ /// Unity: LateUpdate is called every frame, if the MonoBehaviour is enabled.
+ ///
+ /// Trigger: This Update is called just before the rendering, and where you can adjust any graphical values/positions based on what has been updated in the physics, etc
+ /// See this for info on order of execuction: http://docs.unity3d.com/Documentation/Manual/ExecutionOrder.html
+ ///
+ public virtual void LateUpdate()
+ { }
+
+ ///
+ /// Unity: Update is called every frame, if the MonoBehaviour is enabled.
+ ///
+ /// Trigger: This is usually where you stick all your control inputs, keyboard handling, etc
+ /// See this for info on order of execuction: http://docs.unity3d.com/Documentation/Manual/ExecutionOrder.html
+ ///
+ /// Agathorn: Note that for PartModule, Update() will be called every frame regardless of scene or state. In otherwords
+ /// This will be called for example in the VAB/SPH scenes when a part is added to a vessel. It will also be called
+ /// in the Flight scene even if the part is not yet active. In *most* cases you should be using OnUpdate() instead.
+ ///
+ public virtual void Update()
+ { }
+
+ ///
+ /// KSP:
+ /// Per-frame update
+ /// Called ONLY when Part is ACTIVE!
+ ///
+ /// Agathorn:
+ /// For PartModule OnUpdate() is similiar to Update() in that it is called every frame, however OnUpdate() is only
+ /// called when the part is *active*.
+ ///
+ public override void OnUpdate()
+ { }
+
+ ///
+ /// KSP:
+ /// Called when PartModule is asked to save its values.
+ /// Can save additional data here.
+ ///
+ /// The node to save in to
+ public override void OnSave(ConfigNode node)
+ {
+ LogFormatted_DebugOnly("PMExtended OnSave");
+ }
+
+ ///
+ /// KSP:
+ /// Called when PartModule is asked to load its values.
+ /// Can load additional data here.
+ ///
+ /// The node to load from
+ public override void OnLoad(ConfigNode node)
+ {
+ LogFormatted_DebugOnly("PMExtended OnLoad");
+ }
+
+ ///
+ /// Unity Help: This function is called when the MonoBehaviour will be destroyed..
+ ///
+ /// Trigger: Override this for destruction and cleanup code
+ /// See this for info on order of execuction: http://docs.unity3d.com/Documentation/Manual/ExecutionOrder.html
+ ///
+ public virtual void OnDestroy()
+ {
+ LogFormatted_DebugOnly("Destroying MBExtended");
+ }
+
+ #endregion
+
+ #region OnGuiStuff
+ //flag to mark when OnceOnly has been done
+ private Boolean _OnGUIOnceOnlyHasRun = false;
+
+ ///
+ /// Unity: OnGUI is called for rendering and handling GUI events.
+ ///
+ /// Trigger: This is called multiple times per frame to lay stuff out etc.
+ /// Code here ignores the F2 key that disables user interface. So if you are making something to be user hidable then use the RenderingManager.PostDrawQueue functions in here
+ /// Alternatively you could use the MonoBehaviourWindow Type and its DrawWindow Function
+ ///
+ public void OnGUI()
+ {
+ if (!_OnGUIOnceOnlyHasRun)
+ {
+ //set theflag so this only runs once
+ _OnGUIOnceOnlyHasRun = true;
+ //set up the skins library
+ if (!SkinsLibrary._Initialized)
+ SkinsLibrary.InitSkinList();
+
+ //then pass it on to the downstream derivatives
+ OnGUIOnceOnly();
+ }
+
+ OnGUIEvery();
+ }
+
+ ///
+ /// Extension Function - OnGUIEvery is wrapped in OnGUI with some stuff to facilitate the OnGUIOnceOnly functionality, basically this is the OnGUI function
+ ///
+ /// Unity: OnGUI is called for rendering and handling GUI events.
+ ///
+ /// Trigger: This is called multiple times per frame to lay stuff out etc.
+ /// Code here ignores the F2 key that disables user interface. So if you are making something to be user hidable then use the RenderingManager.PostDrawQueue functions in here
+ /// Alternatively you could use the MonoBehaviourWindow Type and its DrawWindow Function
+ ///
+ internal virtual void OnGUIEvery()
+ {
+
+ }
+
+ ///
+ /// Extension Function - this will run only once each time the monobehaviour is awakened
+ ///
+ /// Added this so you can put your GUI initialisation code in here. Running GUI initialisation stuff in Awake/Start will throw an error
+ ///
+ internal virtual void OnGUIOnceOnly()
+ {
+ LogFormatted_DebugOnly("Running OnGUI OnceOnly Code");
+
+ }
+ #endregion
+
+ #region Assembly/Class Information
+ ///
+ /// Name of the Assembly that is running this MonoBehaviour
+ ///
+ internal static String _AssemblyName
+ { get { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; } }
+
+ ///
+ /// Name of the Class - including Derivations
+ ///
+ internal String _ClassName
+ { get { return this.GetType().Name; } }
+ #endregion
+
+ #region Logging
+ ///
+ /// Some Structured logging to the debug file - ONLY RUNS WHEN DLL COMPILED IN DEBUG MODE
+ ///
+ /// Text to be printed - can be formatted as per String.format
+ /// Objects to feed into a String.format
+ [System.Diagnostics.Conditional("DEBUG")]
+ internal static void LogFormatted_DebugOnly(String Message, params object[] strParams)
+ {
+ LogFormatted("DEBUG: " + Message, strParams);
+ }
+
+ ///
+ /// Some Structured logging to the debug file
+ ///
+ /// Text to be printed - can be formatted as per String.format
+ /// Objects to feed into a String.format
+ internal static void LogFormatted(String Message, params object[] strParams)
+ {
+ Message = String.Format(Message, strParams); // This fills the params into the message
+ String strMessageLine = String.Format("{0},{2},{1}",
+ DateTime.Now, Message,
+ _AssemblyName); // This adds our standardised wrapper to each line
+ UnityEngine.Debug.Log(strMessageLine); // And this puts it in the log
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/TestFlightCore/TestFlightCore/FrameworkExt/MonoBehaviourWindowPlus.cs b/TestFlightCore/TestFlightCore/FrameworkExt/MonoBehaviourWindowPlus.cs
index 1f6d4d10..5043bde7 100644
--- a/TestFlightCore/TestFlightCore/FrameworkExt/MonoBehaviourWindowPlus.cs
+++ b/TestFlightCore/TestFlightCore/FrameworkExt/MonoBehaviourWindowPlus.cs
@@ -74,7 +74,15 @@ internal static Boolean DrawHorizontalSlider(ref Single dblVar, Single leftValue
Single intOld = dblVar;
dblVar = GUILayout.HorizontalSlider(dblVar, leftValue, rightValue, options);
- return DrawResultChanged(intOld, dblVar, "Integer HorizSlider");
+ return DrawResultChanged(intOld, dblVar, "Single HorizSlider");
+ }
+
+ internal static Boolean DrawHorizontalSlider(ref double dblVar, double leftValue, double rightValue, params GUILayoutOption[] options)
+ {
+ double dblOld = dblVar;
+
+ dblVar = (float)GUILayout.HorizontalSlider((float)dblVar, (float)leftValue, (float)rightValue, options);
+ return DrawResultChanged(dblOld, dblVar, "Double HorizSlider");
}
///
diff --git a/TestFlightCore/TestFlightCore/Resources.cs b/TestFlightCore/TestFlightCore/Resources.cs
index 2318984a..3385f987 100644
--- a/TestFlightCore/TestFlightCore/Resources.cs
+++ b/TestFlightCore/TestFlightCore/Resources.cs
@@ -33,113 +33,34 @@ internal class Resources
internal static Texture2D texPanel = new Texture2D(16, 16, TextureFormat.ARGB32, false);
- internal static Texture2D texBarBlue = new Texture2D(13, 13, TextureFormat.ARGB32, false);
- internal static Texture2D texBarBlue_Back = new Texture2D(13, 13, TextureFormat.ARGB32, false);
- internal static Texture2D texBarGreen = new Texture2D(13, 13, TextureFormat.ARGB32, false);
- internal static Texture2D texBarGreen_Back = new Texture2D(13, 13, TextureFormat.ARGB32, false);
-
- internal static Texture2D texBarHighlight = new Texture2D(9, 9, TextureFormat.ARGB32, false);
- internal static Texture2D texBarHighlightGreen = new Texture2D(9, 9, TextureFormat.ARGB32, false);
- internal static Texture2D texBarHighlightRed = new Texture2D(9, 9, TextureFormat.ARGB32, false);
internal static Texture2D btnChevronUp = new Texture2D(17, 16, TextureFormat.ARGB32, false);
internal static Texture2D btnChevronDown = new Texture2D(17, 16, TextureFormat.ARGB32, false);
- internal static Texture2D btnChevronLeft = new Texture2D(38, 38, TextureFormat.ARGB32, false);
- internal static Texture2D btnChevronRight = new Texture2D(38, 38, TextureFormat.ARGB32, false);
-
- internal static Texture2D btnViewAll = new Texture2D(16, 16, TextureFormat.ARGB32, false);
- internal static Texture2D btnViewTimes = new Texture2D(16, 16, TextureFormat.ARGB32, false);
-
- internal static Texture2D btnSettingsAttention = new Texture2D(17, 16, TextureFormat.ARGB32, false);
-
internal static Texture2D texPartWindowHead = new Texture2D(16, 16, TextureFormat.ARGB32, false);
- //internal static Texture2D texTooltipBackground; // = new Texture2D(9, 9);//, TextureFormat.ARGB32, false);
-
- internal static Texture2D texRateUp = new Texture2D(10, 10, TextureFormat.ARGB32, false);
- internal static Texture2D texRateDown = new Texture2D(10, 10, TextureFormat.ARGB32, false);
-
- internal static Texture2D btnAlarm = new Texture2D(16, 16, TextureFormat.ARGB32, false);
- internal static Texture2D btnAlarmEnabled = new Texture2D(16, 16, TextureFormat.ARGB32, false);
- internal static Texture2D btnAlarmWarn = new Texture2D(16, 16, TextureFormat.ARGB32, false);
- internal static Texture2D btnAlarmAlert = new Texture2D(16, 16, TextureFormat.ARGB32, false);
-
- //internal static Texture2D btnLock;
- //internal static Texture2D btnUnlock;
-
- internal static Texture2D btnDropDown = new Texture2D(10, 10, TextureFormat.ARGB32, false);
- internal static Texture2D btnPlay = new Texture2D(10, 10, TextureFormat.ARGB32, false);
- internal static Texture2D btnStop = new Texture2D(10, 10, TextureFormat.ARGB32, false);
-
- internal static Texture2D texResourceMove = new Texture2D(378, 9, TextureFormat.ARGB32, false);
-
internal static Texture2D texBox = new Texture2D(9, 9, TextureFormat.ARGB32, false);
internal static Texture2D texBoxUnity = new Texture2D(9, 9, TextureFormat.ARGB32, false);
internal static Texture2D texSeparatorV = new Texture2D(6, 2, TextureFormat.ARGB32, false);
internal static Texture2D texSeparatorH = new Texture2D(2, 20, TextureFormat.ARGB32, false);
- internal static Texture2D texAppLaunchIcon = new Texture2D(38, 38, TextureFormat.ARGB32, false);
-
internal static void LoadTextures()
{
MonoBehaviourExtended.LogFormatted("Loading Textures");
- LoadImageFromFile(ref btnChevronLeft, "ChevronLeft", PathPluginResources);
- LoadImageFromFile(ref btnChevronRight, "ChevronRight", PathPluginResources);
+ LoadImageFromFile(ref btnChevronUp, "ChevronUp.png", PathPluginResources);
+ LoadImageFromFile(ref btnChevronDown, "ChevronDown.png", PathPluginResources);
LoadImageFromFile(ref texPanel, "img_PanelBack.png");
- LoadImageFromFile(ref texBarBlue, "img_BarBlue.png");
- LoadImageFromFile(ref texBarBlue_Back, "img_BarBlue_Back.png");
- LoadImageFromFile(ref texBarGreen, "img_BarGreen.png");
- LoadImageFromFile(ref texBarGreen_Back, "img_BarGreen_Back.png");
-
- LoadImageFromFile(ref texBarHighlight, "img_BarHighlight.png");
- LoadImageFromFile(ref texBarHighlightGreen, "img_BarHighlightGreen.png");
- LoadImageFromFile(ref texBarHighlightRed, "img_BarHighlightRed.png");
-
- LoadImageFromFile(ref btnChevronUp, "img_buttonChevronUp.png");
- LoadImageFromFile(ref btnChevronDown, "img_buttonChevronDown.png");
-
- LoadImageFromFile(ref btnViewAll, "img_buttonEye.png");
- LoadImageFromFile(ref btnViewTimes, "img_buttonClock.png");
-
- LoadImageFromFile(ref btnSettingsAttention, "img_buttonSettingsAttention.png");
-
LoadImageFromFile(ref texPartWindowHead, "img_PartWindowHead.png");
- //LoadImageFromFile(ref texTooltipBackground, "tex_TooltipBackground.png");
-
- LoadImageFromFile(ref texRateUp, "img_RateUp.png");
- LoadImageFromFile(ref texRateDown, "img_RateDown.png");
-
- LoadImageFromFile(ref btnAlarm, "img_Alarm.png");
- LoadImageFromFile(ref btnAlarmEnabled, "img_AlarmEnabled.png");
- LoadImageFromFile(ref btnAlarmWarn, "img_AlarmWarn.png");
- LoadImageFromFile(ref btnAlarmAlert, "img_AlarmAlert.png");
-
- //LoadImageFromFile(ref btnLock, "img_Lock.png");
- //LoadImageFromFile(ref btnUnlock, "img_Unlock.png");
-
- LoadImageFromFile(ref btnDropDown, "img_DropDown.png");
- LoadImageFromFile(ref btnPlay, "img_Play.png");
- LoadImageFromFile(ref btnStop, "img_Stop.png");
- //LoadImageFromFile(ref btnDropDownSep, "img_DropDownSep.png");
-
- //LoadImageFromFile(ref texDropDownListBox, "tex_DropDownListBox.png");
- //LoadImageFromFile(ref texDropDownListBoxUnity, "tex_DropDownListBoxUnity.png");
-
- LoadImageFromFile(ref texResourceMove, "img_ResourceMove.png");
-
LoadImageFromFile(ref texBox, "tex_Box.png");
LoadImageFromFile(ref texBoxUnity, "tex_BoxUnity.png");
LoadImageFromFile(ref texSeparatorH, "img_SeparatorHorizontal.png");
LoadImageFromFile(ref texSeparatorV, "img_SeparatorVertical.png");
-
- LoadImageFromFile(ref texAppLaunchIcon, "KSPARPaBig.png", PathPluginToolbarIcons);
}
diff --git a/TestFlightCore/TestFlightCore/Settings.cs b/TestFlightCore/TestFlightCore/Settings.cs
index cc961e17..e5c34303 100644
--- a/TestFlightCore/TestFlightCore/Settings.cs
+++ b/TestFlightCore/TestFlightCore/Settings.cs
@@ -33,7 +33,8 @@ public Settings(String FilePath) : base(FilePath) {
public double globalReliabilityModifier;
[Persistent]
public double masterStatusUpdateFrequency;
- [Persistent] public int currentView;
+ [Persistent] public bool displaySettingsWindow;
+ [Persistent] public bool enableHUD;
}
}
diff --git a/TestFlightCore/TestFlightCore/StylesAndSkins.cs b/TestFlightCore/TestFlightCore/StylesAndSkins.cs
index 435d2d10..3e8abe82 100644
--- a/TestFlightCore/TestFlightCore/StylesAndSkins.cs
+++ b/TestFlightCore/TestFlightCore/StylesAndSkins.cs
@@ -9,7 +9,7 @@
using UnityEngine;
using KSPPluginFramework;
-namespace KSPAlternateResourcePanel
+namespace TestFlightCore
{
internal class Styles
{
@@ -32,24 +32,8 @@ internal class Styles
private static GUIStyle stylePanel;
- internal static GUIStyle styleAlarmButton;
-
- internal static GUIStyle styleBarName;
- internal static GUIStyle styleBarDef;
-
- internal static GUIStyle styleBarBlue;
- internal static GUIStyle styleBarBlue_Back;
- internal static GUIStyle styleBarBlue_Thin;
- internal static GUIStyle styleBarGreen;
- internal static GUIStyle styleBarGreen_Back;
- internal static GUIStyle styleBarGreen_Thin;
internal static GUIStyle styleBarText;
- internal static GUIStyle styleBarRateText;
-
- internal static GUIStyle styleBarHighlight;
- internal static GUIStyle styleBarHighlightGreen;
- internal static GUIStyle styleBarHighlightRed;
internal static GUIStyle styleText;
internal static GUIStyle styleTextCenter;
@@ -59,9 +43,10 @@ internal class Styles
internal static GUIStyle styleTextYellow;
internal static GUIStyle styleTextYellowBold;
- internal static GUIStyle styleStageText;
- internal static GUIStyle styleStageTextHead;
- //internal static GUIStyle styleStageButton;
+ internal static GUIStyle textStyleSafe;
+ internal static GUIStyle textStyleWarning;
+ internal static GUIStyle textStyleCritical;
+
internal static GUIStyle stylePartWindowPanel;
internal static GUIStyle stylePartWindowPanelUnity;
@@ -72,14 +57,12 @@ internal class Styles
internal static GUIStyle styleToggle;
internal static GUIStyle styleSettingsArea;
- internal static GUIStyle styleResourceSettingsArea;
internal static GUIStyle styleDropDownGlyph;
internal static GUIStyle styleSeparatorV;
internal static GUIStyle styleSeparatorH;
- internal static GUIStyle styleDragInsert;
///
/// This one sets up the styles we use
@@ -184,34 +167,6 @@ internal static void InitStyles()
#endregion
#region Common Styles
- styleAlarmButton = new GUIStyle();
- styleAlarmButton.fixedWidth=16;
- styleAlarmButton.fixedHeight=16;
-
- styleBarName = new GUIStyle() { fixedHeight = 16, fixedWidth = 32 };
- styleBarName.normal.textColor = Color.white;
- //styleBarName.alignment = TextAnchor.MiddleCenter;
-
- //styleBarDef = new GUIStyle(GUI.skin.box);
- styleBarDef = new GUIStyle(SkinsLibrary.DefUnitySkin.box);
- styleBarDef.border = new RectOffset(2, 2, 2, 2);
- styleBarDef.normal.textColor = Color.white;
- styleBarDef.fixedHeight = 15;
- styleBarDef.alignment = TextAnchor.UpperCenter;
-
- styleBarBlue = new GUIStyle(styleBarDef);
- styleBarBlue.normal.background = TestFlight.Resources.texBarBlue;
- styleBarBlue_Back = new GUIStyle(styleBarDef);
- styleBarBlue_Back.normal.background = TestFlight.Resources.texBarBlue_Back;
- styleBarBlue_Thin = new GUIStyle(styleBarBlue);
- styleBarBlue_Thin.border = new RectOffset(0, 0, 0, 0);
- styleBarGreen = new GUIStyle(styleBarDef);
- styleBarGreen.normal.background = TestFlight.Resources.texBarGreen;
- styleBarGreen_Back = new GUIStyle(styleBarDef);
- styleBarGreen_Back.normal.background = TestFlight.Resources.texBarGreen_Back;
- styleBarGreen_Thin = new GUIStyle(styleBarGreen);
- styleBarGreen_Thin.border = new RectOffset(0, 0, 0, 0);
-
styleText = new GUIStyle(SkinsLibrary.DefUnitySkin.label);
styleText.fontSize = 12;
styleText.alignment = TextAnchor.MiddleLeft;
@@ -220,7 +175,7 @@ internal static void InitStyles()
styleTextGreen = new GUIStyle(styleText);
styleTextGreen.normal.textColor = new Color32(183, 254, 0, 255); ;
- styleTextYellow = new GUIStyle(styleText);
+ styleTextYellow = new GUIStyle(styleText);
styleTextYellow.normal.textColor = Color.yellow;
styleTextYellowBold = new GUIStyle(styleTextYellow);
styleTextYellowBold.fontStyle = FontStyle.Bold;
@@ -234,28 +189,14 @@ internal static void InitStyles()
styleBarText.alignment = TextAnchor.MiddleCenter;
styleBarText.normal.textColor = new Color(255, 255, 255, 0.8f);
- styleBarRateText = new GUIStyle(styleBarText);
- styleBarRateText.alignment = TextAnchor.MiddleRight;
-
- styleBarHighlight = new GUIStyle();
- styleBarHighlight.normal.background = TestFlight.Resources.texBarHighlight;
- styleBarHighlight.border = new RectOffset(3, 3, 3, 3);
-
- styleBarHighlightGreen = new GUIStyle(styleBarHighlight);
- styleBarHighlightGreen.normal.background = TestFlight.Resources.texBarHighlightGreen;
- styleBarHighlightRed = new GUIStyle(styleBarHighlight);
- styleBarHighlightRed.normal.background = TestFlight.Resources.texBarHighlightRed;
-
- styleStageText = new GUIStyle(GUI.skin.label);
- styleStageText.normal.textColor = new Color(207, 207, 207);
- styleStageText.wordWrap = false;
-
-
- styleStageTextHead = new GUIStyle(styleStageText);
- styleStageTextHead.fontStyle = FontStyle.Bold;
- styleStageTextHead.wordWrap = false;
+ textStyleSafe = new GUIStyle(styleText);
+ textStyleSafe.normal.textColor = new Color32(133, 153, 0, 255);
+ textStyleWarning = new GUIStyle(styleText);
+ textStyleWarning.normal.textColor = new Color32(203, 75, 22, 255);
+ textStyleCritical = new GUIStyle(styleText);
+ textStyleCritical.normal.textColor = new Color32(220, 50, 47, 255);
styleToggle = new GUIStyle(HighLogic.Skin.toggle);
styleToggle.normal.textColor = new Color(207, 207, 207);
@@ -265,10 +206,6 @@ internal static void InitStyles()
styleSettingsArea = new GUIStyle(HighLogic.Skin.textArea);
styleSettingsArea.padding = new RectOffset(0, 0, 0, 4);
- styleResourceSettingsArea = new GUIStyle(styleSettingsArea);
- styleResourceSettingsArea.padding = new RectOffset(1, 0, 0, 0);
- styleResourceSettingsArea.margin.left = 0;
-
styleDropDownGlyph = new GUIStyle();
styleDropDownGlyph.alignment = TextAnchor.MiddleCenter;
@@ -282,11 +219,6 @@ internal static void InitStyles()
styleSeparatorH.border = new RectOffset(6, 6, 0, 0);
styleSeparatorH.fixedHeight = 2;
- //the border determins which bit doesnt repeat
- styleDragInsert = new GUIStyle();
- styleDragInsert.normal.background = TestFlight.Resources.texResourceMove;
- styleDragInsert.border = new RectOffset(8, 8, 3, 3);
-
#endregion
}
#endregion
@@ -317,6 +249,11 @@ internal static void InitSkins()
SkinsLibrary.AddStyle("Default", "DropDownListBox", styleDropDownListBox);
SkinsLibrary.AddStyle("Default", "DropDownListItem", styleDropDownListItem);
+ SkinsLibrary.AddStyle("Default", "SafeText", textStyleSafe);
+ SkinsLibrary.AddStyle("Default", "WarningText", textStyleWarning);
+ SkinsLibrary.AddStyle("Default", "CriticalText", textStyleCritical);
+
+
//Now a Unity Style one
GUISkin DefUnity = SkinsLibrary.CopySkin(SkinsLibrary.DefSkinType.Unity);
DefUnity.window = DefUnity.box;
@@ -341,6 +278,11 @@ internal static void InitSkins()
SkinsLibrary.AddStyle("Unity", "DropDownListBox", styleDropDownListBoxUnity);
SkinsLibrary.AddStyle("Unity", "DropDownListItem", styleDropDownListItem);
+ SkinsLibrary.AddStyle("Unity", "SafeText", textStyleSafe);
+ SkinsLibrary.AddStyle("Unity", "WarningText", textStyleWarning);
+ SkinsLibrary.AddStyle("Unity", "CriticalText", textStyleCritical);
+
+
////Now a Unity Style one with KSP buttons
GUISkin UnityWKSPButtons = SkinsLibrary.CopySkin("Unity");
UnityWKSPButtons.button = DefKSP.button;
diff --git a/TestFlightCore/TestFlightCore/TestFlight.cs b/TestFlightCore/TestFlightCore/TestFlight.cs
index a29cd0c8..603ce789 100644
--- a/TestFlightCore/TestFlightCore/TestFlight.cs
+++ b/TestFlightCore/TestFlightCore/TestFlight.cs
@@ -196,7 +196,7 @@ public class TestFlightManagerScenario : ScenarioModule
public List partsPackedStrings;
public Dictionary knownVessels;
- Settings settings = null;
+ internal Settings settings = null;
public double pollingInterval = 5.0f;
public bool processInactiveVessels = true;
diff --git a/TestFlightCore/TestFlightCore/TestFlightCore.cs b/TestFlightCore/TestFlightCore/TestFlightCore.cs
index e2f85995..002b4752 100644
--- a/TestFlightCore/TestFlightCore/TestFlightCore.cs
+++ b/TestFlightCore/TestFlightCore/TestFlightCore.cs
@@ -11,7 +11,7 @@ namespace TestFlightCore
/// This is the core PartModule of the TestFlight system, and is the module that everything else plugins into.
/// All relevant data for working in the system, as well as all usable API methods live here.
///
- public class TestFlightCore : PartModule, ITestFlightCore
+ public class TestFlightCore : PartModuleExtended, ITestFlightCore
{
private float lastFailureCheck = 0f;
private float lastPolling = 0.0f;
diff --git a/TestFlightCore/TestFlightCore/TestFlightCore.csproj b/TestFlightCore/TestFlightCore/TestFlightCore.csproj
index cf0974fe..5d33a1bc 100644
--- a/TestFlightCore/TestFlightCore/TestFlightCore.csproj
+++ b/TestFlightCore/TestFlightCore/TestFlightCore.csproj
@@ -69,6 +69,7 @@
+
diff --git a/TestFlightCore/TestFlightCore/TestFlightWindow.cs b/TestFlightCore/TestFlightCore/TestFlightWindow.cs
index a340cc1a..c00adddd 100644
--- a/TestFlightCore/TestFlightCore/TestFlightWindow.cs
+++ b/TestFlightCore/TestFlightCore/TestFlightWindow.cs
@@ -30,14 +30,11 @@ internal override void Start()
}
psm.Load(ScenarioRunner.fetch);
tfScenario = game.scenarios.Select(s => s.moduleRef).OfType().SingleOrDefault();
- base.Start();
- }
-
- internal override void Awake()
- {
+ settings = tfScenario.settings;
if (settings == null)
{
- settings = new Settings("../settings.cgf");
+ settings = new Settings("../settings.cfg");
+ tfScenario.settings = settings;
}
string assemblyPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string filePath = System.IO.Path.Combine(assemblyPath, "../settings.cfg").Replace("\\","/");
@@ -50,20 +47,27 @@ internal override void Awake()
settings.minTimeBetweenFailurePoll = 60;
settings.processAllVessels = false;
settings.masterStatusUpdateFrequency = 10;
- settings.currentView = 0;
+ settings.displaySettingsWindow = true;
settings.Save();
}
settings.Load();
StartCoroutine("AddToToolbar");
// Start up our UI Update worker
StartRepeatingWorker(2);
+ TestFlight.Resources.LoadTextures();
+ base.Start();
+ }
+
+ internal override void Awake()
+ {
base.Awake();
}
internal override void OnGUIOnceOnly()
{
- Styles.Init();
- SkinsLibrary.SetCurrent("Default");
+ Styles.InitStyles();
+ Styles.InitSkins();
+ SkinsLibrary.SetCurrent("Unity");
// Default position and size -- will get proper bounds calculated when needed
WindowRect = new Rect(0, 50, 500, 50);
DragEnabled = true;
@@ -193,18 +197,35 @@ internal override void DrawWindow(Int32 id)
{
GUILayout.BeginVertical();
Dictionary masterStatus = tfScenario.GetMasterStatus();
+ GUIContent settingsButton = new GUIContent(TestFlight.Resources.btnChevronDown, "Open Settings Panel");
+ if (settings.displaySettingsWindow)
+ {
+ settingsButton.image = TestFlight.Resources.btnChevronUp;
+ settingsButton.tooltip = "Close Settings Panel";
+ }
+
if (masterStatus == null)
{
GUILayout.BeginHorizontal();
- GUILayout.Button(TestFlight.Resources.btnChevronDown);
GUILayout.Label("TestFlight is starting up...");
+ if (GUILayout.Button(settingsButton, GUILayout.Width(38)))
+ {
+ settings.displaySettingsWindow = !settings.displaySettingsWindow;
+ CalculateWindowBounds();
+ settings.Save();
+ }
GUILayout.EndHorizontal();
}
else if (masterStatus.Count() <= 0)
{
GUILayout.BeginHorizontal();
- GUILayout.Button(new GUIContent(TestFlight.Resources.btnChevronLeft, "Open Settings Pane"));
GUILayout.Label("TestFlight is not currently tracking any vessels");
+ if (GUILayout.Button(settingsButton, GUILayout.Width(38)))
+ {
+ settings.displaySettingsWindow = !settings.displaySettingsWindow;
+ CalculateWindowBounds();
+ settings.Save();
+ }
GUILayout.EndHorizontal();
}
else
@@ -212,7 +233,6 @@ internal override void DrawWindow(Int32 id)
// Display information on active vessel
Guid currentVessl = FlightGlobals.ActiveVessel.id;
GUILayout.BeginHorizontal();
- GUILayout.Button(TestFlight.Resources.btnChevronDown);
GUILayout.Label("MSD for " + masterStatus[currentVessl].vesselName);
GUILayout.EndHorizontal();
foreach (PartStatus status in masterStatus[currentVessl].allPartsStatus)
@@ -250,6 +270,83 @@ internal override void DrawWindow(Int32 id)
GUILayout.EndHorizontal();
}
+ if (GUILayout.Button(settingsButton, GUILayout.Width(38)))
+ {
+ settings.displaySettingsWindow = !settings.displaySettingsWindow;
+ CalculateWindowBounds();
+ settings.Save();
+ }
+ }
+
+ // Draw settings pane if opened
+ if (settings.displaySettingsWindow)
+ {
+ GUILayout.Space(5);
+ GUILayout.Label("", Styles.styleSeparatorH, GUILayout.Width(WindowRect.width - 15), GUILayout.Height(2));
+
+ GUILayout.Label("GUI Settings");
+ GUILayout.BeginHorizontal();
+ if (DrawToggle(ref settings.enableHUD, "Enable HUD in Flight Scene", Styles.styleToggle))
+ {
+ settings.Save();
+ }
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Label(new GUIContent("Master Status Update Frequency", "Sets how often the Master Status Display is updated.\nLower settings will make the MSD respond to vessel changes faster but at the possible cost of performance."));
+ if (DrawHorizontalSlider(ref settings.masterStatusUpdateFrequency, 0, 30, GUILayout.Width(300)))
+ {
+ settings.Save();
+ }
+ GUILayout.Label(String.Format("{0,5:f2}", settings.masterStatusUpdateFrequency));
+ GUILayout.EndHorizontal();
+
+ GUILayout.Label("Performance Settings");
+ GUILayout.BeginHorizontal();
+ GUILayout.Label(new GUIContent("Minimum Update Rate", "Define the time in seconds between updates to all parts.\nSetting this lower will ensure you always have up to date data, but might be a performance issue on large craft.\nIncrease this if you find it affecting performance"));
+ if (DrawHorizontalSlider(ref settings.minTimeBetweenDataPoll, 0, 10, GUILayout.Width(300)))
+ {
+ settings.Save();
+ }
+ GUILayout.Label(String.Format("{0,5:f2}", settings.minTimeBetweenDataPoll));
+ GUILayout.EndHorizontal();
+
+ GUILayout.Label("Difficulty Settings");
+ GUILayout.BeginHorizontal();
+ GUILayout.Label(new GUIContent("MinimumTime Between Failure Checks", "Define the minimum time in seconds that the system will check all parts to see if any have failed.\nConsider this a difficulty slider of sorts, as the more often checks are done, the more often you can run into failures"));
+ if (DrawHorizontalSlider(ref settings.minTimeBetweenFailurePoll, 15, 120, GUILayout.Width(300)))
+ {
+ settings.Save();
+ }
+ GUILayout.Label(String.Format("{0,5:f2}", settings.minTimeBetweenFailurePoll));
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Label(new GUIContent("Flight Data Multiplier", "Overall difficulty slider.\nIncrease to make all parts accumuate flight data faster. Decrease to make them accumulate flight data slower.\nA setting of 1 is normal rate"));
+ if (DrawHorizontalSlider(ref settings.flightDataMultiplier, 0.5, 2, GUILayout.Width(300)))
+ {
+ settings.Save();
+ }
+ GUILayout.Label(String.Format("{0,5:f2}", settings.flightDataMultiplier));
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Label(new GUIContent("Flight Data Engineer Multiplier", "Overall difficulty slider\nIncreases or decreases the bonus applied to the accumulation of flight data from having Engineers in your crew.\nA setting of 1 is normal difficulty."));
+ if (DrawHorizontalSlider(ref settings.flightDataEngineerMultiplier, 0.5, 2, GUILayout.Width(300)))
+ {
+ settings.Save();
+ }
+ GUILayout.Label(String.Format("{0,5:f2}", settings.flightDataEngineerMultiplier));
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Label(new GUIContent("Global Reliability Modifier", "Overall difficulty slider\nStraight modifier added to the final reliability calculation for a part."));
+ if (DrawHorizontalSlider(ref settings.globalReliabilityModifier, -25, 25, GUILayout.Width(300)))
+ {
+ settings.Save();
+ }
+ GUILayout.Label(String.Format("{0,5:f2}", settings.globalReliabilityModifier));
+ GUILayout.EndHorizontal();
}
GUILayout.EndVertical();
diff --git a/TestFlightCore/TestFlightCore/UserInterface.cs b/TestFlightCore/TestFlightCore/UserInterface.cs
index ccd83428..09d287ed 100644
--- a/TestFlightCore/TestFlightCore/UserInterface.cs
+++ b/TestFlightCore/TestFlightCore/UserInterface.cs
@@ -14,7 +14,7 @@
namespace TestFlightCore
{
- internal static class Styles
+ internal static class OldStyles
{
internal static GUIStyle panelStyle;
@@ -23,6 +23,14 @@ internal static class Styles
internal static GUIStyle textStyleSafe;
internal static GUIStyle textStyleStandard;
+ internal static GUIStyle stylePanel;
+ internal static GUIStyle styleButton;
+ internal static GUIStyle styleButtonUnity;
+ internal static GUIStyle styleButtonMain;
+ internal static GUIStyle styleButtonMainUnity;
+ internal static GUIStyle styleButtonSettings;
+
+
internal static void Init()
{
Debug.Log("TestFlight Styles: Init");
@@ -30,6 +38,11 @@ internal static void Init()
// panelStyle.border = new RectOffset(6, 6, 6, 6);
// panelStyle.padding = new RectOffset(8, 3, 7, 0);
+ stylePanel = new GUIStyle();
+ stylePanel.normal.background = TestFlight.Resources.texPanel;
+ stylePanel.border = new RectOffset(6, 6, 6, 6);
+ stylePanel.padding = new RectOffset(8, 3, 7, 0);
+
textStyleStandard = new GUIStyle(SkinsLibrary.DefUnitySkin.label);
textStyleStandard.fontSize = 12;
textStyleStandard.alignment = TextAnchor.MiddleLeft;
@@ -45,11 +58,52 @@ internal static void Init()
textStyleCritical = new GUIStyle(textStyleStandard);
textStyleCritical.normal.textColor = new Color32(220, 50, 47, 255);
- GUISkin skinDefault = SkinsLibrary.CopySkin(SkinsLibrary.DefSkinType.Unity);
- skinDefault.font = SkinsLibrary.DefUnitySkin.font;
-// skinDefault.window = panelStyle;
- skinDefault.label = new GUIStyle(textStyleStandard);
- SkinsLibrary.AddSkin("Default", skinDefault);
+ styleButton = new GUIStyle(SkinsLibrary.DefUnitySkin.button);
+ styleButton.name = "ButtonGeneral";
+ styleButton.normal.background = SkinsLibrary.DefKSPSkin.button.normal.background;
+ styleButton.hover.background = SkinsLibrary.DefKSPSkin.button.hover.background;
+ styleButton.normal.textColor = new Color(207, 207, 207);
+ styleButton.fontStyle = FontStyle.Normal;
+ styleButton.fixedHeight = 20;
+ styleButton.padding.top = 2;
+
+ styleButtonUnity = new GUIStyle(styleButton);
+ styleButtonUnity.normal.background = SkinsLibrary.DefUnitySkin.button.normal.background;
+ styleButtonUnity.hover.background = SkinsLibrary.DefUnitySkin.button.hover.background;
+
+ styleButtonMain = new GUIStyle(styleButton);
+ styleButtonMain.name = "ButtonMain";
+ styleButtonMain.fixedHeight = 20;
+
+ styleButtonMainUnity = new GUIStyle(styleButtonMain);
+ styleButtonMainUnity.normal.background = SkinsLibrary.DefUnitySkin.button.normal.background;
+ styleButtonMainUnity.hover.background = SkinsLibrary.DefUnitySkin.button.hover.background;
+
+
+ styleButtonSettings = new GUIStyle(styleButton);
+ styleButtonSettings.name = "ButtonSettings";
+ styleButtonSettings.padding = new RectOffset(1, 1, 1, 1);
+
+
+ //Default Skin
+// GUISkin DefKSP = SkinsLibrary.CopySkin(SkinsLibrary.DefSkinType.KSP);
+// DefKSP.window = stylePanel;
+// DefKSP.font = SkinsLibrary.DefUnitySkin.font;
+// DefKSP.horizontalSlider.margin.top = 8;
+// SkinsLibrary.AddSkin("Default", DefKSP);
+//
+// //Adjust Default Skins
+// SkinsLibrary.List["Default"].button = new GUIStyle(styleButton);
+// SkinsLibrary.List["Default"].label = new GUIStyle(styleText);
+//
+// //Add Styles once skin is added
+// SkinsLibrary.AddStyle("Default", styleTooltipStyle);
+// SkinsLibrary.AddStyle("Default", styleButton);
+// SkinsLibrary.AddStyle("Default", styleButtonMain);
+// SkinsLibrary.AddStyle("Default", styleButtonSettings);
+// SkinsLibrary.AddStyle("Default", "DropDownButton", styleDropDownButton);
+// SkinsLibrary.AddStyle("Default", "DropDownListBox", styleDropDownListBox);
+// SkinsLibrary.AddStyle("Default", "DropDownListItem", styleDropDownListItem);
}
}
}