public static void SaveSnapSizes(VariablesFile settingsFile)
 {
     for (int i = 0; i < CornerSnapSizes.Count; i++)
     {
         string name = "CornerSnapSizes" + i;
         string val = CornerSnapSizes[i].X + "," + CornerSnapSizes[i].Y + "," + CornerSnapSizes[i].Width + "," + CornerSnapSizes[i].Height;
         settingsFile.variables.GetVariable(name, val).SetValue(val);
     }
     for (int i = 0; i < SideSnapSizes.Count; i++)
     {
         string name = "SideSnapSizes" + i;
         string val = SideSnapSizes[i].X + "," + SideSnapSizes[i].Y + "," + SideSnapSizes[i].Width + "," + SideSnapSizes[i].Height;
         settingsFile.variables.GetVariable(name, val).SetValue(val);
     }
     for (int i = 0; i < TopSnapSizes.Count; i++)
     {
         string name = "TopSnapSizes" + i;
         string val = TopSnapSizes[i].X + "," + TopSnapSizes[i].Y + "," + TopSnapSizes[i].Width + "," + TopSnapSizes[i].Height;
         settingsFile.variables.GetVariable(name, val).SetValue(val);
     }
     for (int i = 0; i < CenterSnapSizes.Count; i++)
     {
         string name = "CenterSnapSizes" + i;
         string val = CenterSnapSizes[i].X + "," + CenterSnapSizes[i].Y + "," + CenterSnapSizes[i].Width + "," + CenterSnapSizes[i].Height;
         settingsFile.variables.GetVariable(name, val).SetValue(val);
     }
 }
        /// <summary>
        /// Load variables from config file and update real time settings
        /// </summary>
        public void LoadConfig()
        {
            settingsFile = new VariablesFile(configFilePath, null, false);
            VariableLibrary vars = settingsFile.variables;

            //load variables
            bool snapHotKeysEnabled = WindowManager.SnapHotKeysEnabled_Default;
            WindowManager.SnapHotKeysEnabled = vars.GetVariable("SnapWindowHotKeysEnabled", ref snapHotKeysEnabled, true).Boolean;
            bool snapAltHotKeysEnabled = WindowManager.SnapAltHotKeysEnabled_Default;
            WindowManager.SnapAltHotKeysEnabled = vars.GetVariable("SnapAltWindowHotKeysEnabled", ref snapAltHotKeysEnabled, true).Boolean;
            bool miscHotKeysEnabled = WindowManager.MiscHotKeysEnabled_Default;
            WindowManager.MiscHotKeysEnabled = vars.GetVariable("MiscWindowHotKeysEnabled", ref miscHotKeysEnabled, true).Boolean;
            WindowManager.LoadSnapSizes(settingsFile);
            Log.I("Finisihed loading config");
            //re-write config file in case one didn't exist already
            SaveConfig();
        }
        public static void LoadSnapSizes(VariablesFile settingsFile=null)
        {
            float oneThird = 1f / 3f;
            float oneThirdRoundUp = 1 - 2 * oneThird;//catch rounding error for last third

            List<RectangleF> defaultCornerSnapSizes = new List<RectangleF>(3);
            defaultCornerSnapSizes.Add(new RectangleF(0, 0, 0.5f, 0.5f));
            defaultCornerSnapSizes.Add(new RectangleF(0, 0, 1 - oneThirdRoundUp, 0.5f));
            defaultCornerSnapSizes.Add(new RectangleF(0, 0, oneThird, 0.5f));

            List<RectangleF> defaultSideSnapSizes = new List<RectangleF>(3);
            defaultSideSnapSizes.Add(new RectangleF(0, 0, 0.5f, 1));
            defaultSideSnapSizes.Add(new RectangleF(0, 0, 1 - oneThirdRoundUp, 1));
            defaultSideSnapSizes.Add(new RectangleF(0, 0, oneThird, 1));

            List<RectangleF> defaultTopSnapSizes = new List<RectangleF>(4);
            defaultTopSnapSizes.Add(new RectangleF(0, 0, 1, 0.5f));
            defaultTopSnapSizes.Add(new RectangleF(oneThird / 2, 0, oneThirdRoundUp * 2, 0.5f));//2/3 center full height with 1/6 open edges
            defaultTopSnapSizes.Add(new RectangleF(0.25f, 0, 0.5f, 0.5f));//1/2 center full height with 1/4 open edges
            defaultTopSnapSizes.Add(new RectangleF(oneThird, 0, oneThirdRoundUp, 0.5f));

            List<RectangleF> defaultCenterSnapSizes = new List<RectangleF>(4);
            defaultCenterSnapSizes.Add(new RectangleF(0, 0, 1, 1));
            defaultCenterSnapSizes.Add(new RectangleF(oneThird / 2, 0, oneThirdRoundUp * 2, 1));//2/3 center full height with 1/6 open edges
            defaultCenterSnapSizes.Add(new RectangleF(0.25f, 0, 0.5f, 1));//1/2 center full height with 1/4 open edges
            defaultCenterSnapSizes.Add(new RectangleF(oneThird, 0, oneThirdRoundUp, 1));

            if (settingsFile == null)
            {//default values
                CornerSnapSizes = defaultCornerSnapSizes;
                SideSnapSizes = defaultSideSnapSizes;
                TopSnapSizes = defaultTopSnapSizes;
                CenterSnapSizes = defaultCenterSnapSizes;
            }
            else
            {
                CornerSnapSizes = new List<RectangleF>();
                SideSnapSizes = new List<RectangleF>();
                TopSnapSizes = new List<RectangleF>();
                CenterSnapSizes = new List<RectangleF>();

                bool anyFound = false;
                for (int i = 0; i <= SnapSizeMaxCount; i++)
                {
                    Variable var = settingsFile.variables.FindVariable("CornerSnapSizes" + i);
                    if (var != null)//add to snapSizes
                    {
                        RectangleF val = FreshArchives.ParseRectangleF(var.GetValueSaveString());
                        if (val != RectangleF.Empty)
                        {
                            anyFound = true;
                            CornerSnapSizes.Add(val);
                        }
                        else
                            settingsFile.variables.RemoveVariable(var);
                    }
                }
                if (!anyFound) CornerSnapSizes = defaultCornerSnapSizes;

                anyFound = false;
                for (int i = 0; i <= SnapSizeMaxCount; i++)
                {
                    Variable var = settingsFile.variables.FindVariable("SideSnapSizes" + i);
                    if (var != null)//add to snapSizes
                    {
                        RectangleF val = FreshArchives.ParseRectangleF(var.GetValueSaveString());
                        if (val != RectangleF.Empty)
                        {
                            anyFound = true;
                            SideSnapSizes.Add(val);
                        }
                        else
                            settingsFile.variables.RemoveVariable(var);
                    }
                }
                if (!anyFound) SideSnapSizes = defaultSideSnapSizes;

                anyFound = false;
                for (int i = 0; i <= SnapSizeMaxCount; i++)
                {
                    Variable var = settingsFile.variables.FindVariable("TopSnapSizes" + i);
                    if (var != null)//add to snapSizes
                    {
                        RectangleF val = FreshArchives.ParseRectangleF(var.GetValueSaveString());
                        if (val != RectangleF.Empty)
                        {
                            anyFound = true;
                            TopSnapSizes.Add(val);
                        }
                        else
                            settingsFile.variables.RemoveVariable(var);
                    }
                }
                if (!anyFound) TopSnapSizes = defaultTopSnapSizes;

                anyFound = false;
                for (int i = 0; i <= SnapSizeMaxCount; i++)
                {
                    Variable var = settingsFile.variables.FindVariable("CenterSnapSizes" + i);
                    if (var != null)//add to snapSizes
                    {
                        RectangleF val = FreshArchives.ParseRectangleF(var.GetValueSaveString());
                        if (val != RectangleF.Empty)
                        {
                            anyFound = true;
                            CenterSnapSizes.Add(val);
                        }
                        else
                            settingsFile.variables.RemoveVariable(var);
                    }
                }
                if (!anyFound) CenterSnapSizes = defaultCenterSnapSizes;
            }
        }
        public ScriptLine(string line, VariablesFile script, IScriptReader parentScriptReader)
        {
            Content = line;
            Type = LineType.Comment;//untill proven wrong
            if (line.Trim().Length == 0 || line.Trim().Substring(0, 2).Equals(VariablesFile.SCRIPT_COMMENT))
                {
                    //comment or blank - ignore
                }
                else
                {
                    if (line.Substring(0, 3).ToUpper().Equals(VariablesFile.SCRIPT_COMMAND_VARIABLE))
                    {
                        //variable definition
                        line = line.Substring(3).Trim(); //
                        string varName = line.Substring(0, line.IndexOf("=")).Trim();
                        string varValue = line.Substring(line.IndexOf("=") + 1).Trim();
                        Variable = new Variable(varName,varValue);

                        Type = LineType.Variable;//untill proven wrong
                    }
                    else if (line.Substring(0, 4).ToUpper().Equals(VariablesFile.SCRIPT_COMMAND_LOAD))
                    {
                        line = line.Substring(4).Trim();
                        //should preserver this files path so a sibling file can use relative pathing
                        script.LoadFile(line);

                        Type = LineType.Command;//untill proven wrong
                    }
                    else
                    {
                        //continue to write code for cmds - script language - borring!!!!
                        if (parentScriptReader != null)
                            parentScriptReader.ParseScriptLine(line);
                    }
                }
        }