├── .gitignore
├── WSplit
├── WSplit.v11.suo
├── WSplit.v12.suo
├── Resources
│ ├── AppIcon.ico
│ ├── ClockFont.ttf
│ ├── FontIcon.png
│ ├── DisplayIcon.png
│ ├── HotkeyIcon.png
│ ├── MissingIcon.png
│ ├── OptionsIcon.png
│ ├── video-display.png
│ ├── Keys
│ │ ├── 202
│ │ │ ├── keys_001.png
│ │ │ ├── keys_002.png
│ │ │ ├── keys_003.png
│ │ │ ├── keys_004.png
│ │ │ ├── keys_005.png
│ │ │ ├── keys_006.png
│ │ │ ├── keys_007.png
│ │ │ ├── keys_008.png
│ │ │ ├── keys_009.png
│ │ │ ├── keys_010.png
│ │ │ ├── keys_011.png
│ │ │ ├── keys_012.png
│ │ │ ├── keys_013.png
│ │ │ ├── keys_014.png
│ │ │ ├── keys_015.png
│ │ │ ├── keys_016.png
│ │ │ ├── keys_017.png
│ │ │ ├── keys_018.png
│ │ │ ├── keys_019.png
│ │ │ ├── keys_020.png
│ │ │ ├── keys_021.png
│ │ │ ├── keys_022.png
│ │ │ ├── keys_023.png
│ │ │ ├── keys_024.png
│ │ │ ├── keys_025.png
│ │ │ ├── keys_026.png
│ │ │ ├── keys_027.png
│ │ │ ├── keys_028.png
│ │ │ ├── keys_029.png
│ │ │ ├── keys_030.png
│ │ │ ├── keys_031.png
│ │ │ ├── keys_032.png
│ │ │ ├── keys_033.png
│ │ │ ├── keys_034.png
│ │ │ ├── keys_035.png
│ │ │ ├── keys_036.png
│ │ │ ├── keys_037.png
│ │ │ ├── keys_038.png
│ │ │ ├── keys_039.png
│ │ │ ├── keys_040.png
│ │ │ ├── keys_041.png
│ │ │ ├── keys_042.png
│ │ │ ├── keys_043.png
│ │ │ ├── keys_044.png
│ │ │ ├── keys_045.png
│ │ │ ├── keys_046.png
│ │ │ ├── keys_047.png
│ │ │ ├── keys_048.png
│ │ │ ├── keys_049.png
│ │ │ ├── keys_050.png
│ │ │ ├── keys_051.png
│ │ │ ├── keys_052.png
│ │ │ ├── keys_053.png
│ │ │ ├── keys_054.png
│ │ │ ├── keys_055.png
│ │ │ ├── keys_056.png
│ │ │ ├── keys_057.png
│ │ │ ├── keys_058.png
│ │ │ ├── keys_059.png
│ │ │ ├── keys_060.png
│ │ │ ├── keys_061.png
│ │ │ ├── keys_062.png
│ │ │ ├── keys_063.png
│ │ │ ├── keys_064.png
│ │ │ ├── keys_065.png
│ │ │ ├── keys_066.png
│ │ │ ├── keys_067.png
│ │ │ ├── keys_068.png
│ │ │ ├── keys_069.png
│ │ │ ├── keys_070.png
│ │ │ ├── keys_071.png
│ │ │ ├── keys_072.png
│ │ │ ├── keys_073.png
│ │ │ ├── keys_074.png
│ │ │ ├── keys_075.png
│ │ │ ├── keys_076.png
│ │ │ ├── keys_077.png
│ │ │ ├── keys_078.png
│ │ │ ├── keys_079.png
│ │ │ ├── keys_080.png
│ │ │ ├── keys_081.png
│ │ │ ├── keys_082.png
│ │ │ ├── keys_083.png
│ │ │ ├── keys_084.png
│ │ │ ├── keys_085.png
│ │ │ ├── keys_086.png
│ │ │ ├── keys_087.png
│ │ │ ├── keys_088.png
│ │ │ ├── keys_089.png
│ │ │ ├── keys_090.png
│ │ │ ├── keys_091.png
│ │ │ ├── keys_092.png
│ │ │ ├── keys_093.png
│ │ │ ├── keys_094.png
│ │ │ ├── keys_095.png
│ │ │ ├── keys_096.png
│ │ │ ├── keys_097.png
│ │ │ ├── keys_098.png
│ │ │ ├── keys_099.png
│ │ │ ├── keys_100.png
│ │ │ ├── keys_101.png
│ │ │ ├── keys_102.png
│ │ │ ├── keys_103.png
│ │ │ ├── keys_104.png
│ │ │ ├── keys_105.png
│ │ │ ├── keys_106.png
│ │ │ ├── keys_107.png
│ │ │ ├── keys_108.png
│ │ │ ├── keys_109.png
│ │ │ ├── keys_110.png
│ │ │ ├── keys_111.png
│ │ │ ├── keys_112.png
│ │ │ ├── keys_113.png
│ │ │ ├── keys_114.png
│ │ │ ├── keys_115.png
│ │ │ ├── keys_116.png
│ │ │ ├── keys_117.png
│ │ │ ├── keys_118.png
│ │ │ ├── keys_119.png
│ │ │ ├── keys_120.png
│ │ │ ├── keys_121.png
│ │ │ ├── keys_122.png
│ │ │ ├── keys_123.png
│ │ │ ├── keys_124.png
│ │ │ ├── keys_125.png
│ │ │ ├── keys_126.png
│ │ │ ├── keys_127.png
│ │ │ ├── keys_128.png
│ │ │ ├── keys_129.png
│ │ │ ├── keys_130.png
│ │ │ ├── keys_131.png
│ │ │ ├── keys_132.png
│ │ │ ├── keys_133.png
│ │ │ ├── keys_134.png
│ │ │ ├── keys_135.png
│ │ │ ├── keys_136.png
│ │ │ ├── keys_137.png
│ │ │ ├── keys_138.png
│ │ │ ├── keys_139.png
│ │ │ ├── keys_140.png
│ │ │ ├── keys_141.png
│ │ │ ├── keys_142.png
│ │ │ ├── keys_143.png
│ │ │ ├── keys_144.png
│ │ │ ├── keys_145.png
│ │ │ ├── keys_146.png
│ │ │ ├── keys_147.png
│ │ │ ├── keys_148.png
│ │ │ ├── keys_149.png
│ │ │ ├── keys_150.png
│ │ │ └── keys_151.png
│ │ └── read me.txt
│ ├── Raw
│ │ ├── OptionsIcon.ico
│ │ └── OptionsIcon.png
│ └── 201301150940035209.rar
├── WS2_icons
│ ├── 1_Desktop_Icons
│ │ ├── icon_016.png
│ │ ├── icon_032.png
│ │ ├── icon_048.png
│ │ ├── icon_128.png
│ │ ├── icon_256.png
│ │ └── icon_512.png
│ ├── 2_Android_Icons
│ │ ├── icon_036.png
│ │ ├── icon_048.png
│ │ └── icon_072.png
│ └── 3_iPhone_Icons
│ │ ├── icon_029.png
│ │ ├── icon_048.png
│ │ ├── icon_057.png
│ │ ├── icon_072.png
│ │ └── icon_512.png
├── app.config
├── WSplitTimer
│ ├── Program.cs
│ ├── StartAtDialog.cs
│ ├── DViewSetColumnsDialog.cs
│ ├── Properties
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ └── Settings.cs
│ ├── StartAtDialog.Designer.cs
│ ├── StartAtDialog.resx
│ ├── CustomizeColors.resx
│ ├── DViewSetColumnsDialog.resx
│ ├── RunEditor.resx
│ ├── BackgroundImageDialog.resx
│ ├── DViewSetColumnsDialog.Designer.cs
│ ├── MessageBoxEx.cs
│ └── SettingsDialog.cs
├── _IMAGE_FILE_HEADER.cs
├── WSplit.csproj.user
├── WSplitUtil.cs
├── WSplit.sln
├── AssemblyInfo.cs
├── Options list.txt
├── Properties
│ ├── Resources.Designer.cs
│ └── Resources.resx
├── Segment.cs
├── DualStopwatch.cs
├── LiveSplitXMLReader.cs
├── WSplit.csproj
└── Split.cs
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/
2 | obj/
3 |
4 |
--------------------------------------------------------------------------------
/WSplit/WSplit.v11.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WSplit.v11.suo
--------------------------------------------------------------------------------
/WSplit/WSplit.v12.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WSplit.v12.suo
--------------------------------------------------------------------------------
/WSplit/Resources/AppIcon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/AppIcon.ico
--------------------------------------------------------------------------------
/WSplit/Resources/ClockFont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/ClockFont.ttf
--------------------------------------------------------------------------------
/WSplit/Resources/FontIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/FontIcon.png
--------------------------------------------------------------------------------
/WSplit/Resources/DisplayIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/DisplayIcon.png
--------------------------------------------------------------------------------
/WSplit/Resources/HotkeyIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/HotkeyIcon.png
--------------------------------------------------------------------------------
/WSplit/Resources/MissingIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/MissingIcon.png
--------------------------------------------------------------------------------
/WSplit/Resources/OptionsIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/OptionsIcon.png
--------------------------------------------------------------------------------
/WSplit/Resources/video-display.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/video-display.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_001.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_001.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_002.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_002.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_003.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_004.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_005.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_006.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_006.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_007.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_007.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_008.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_008.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_009.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_010.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_011.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_011.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_012.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_013.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_013.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_014.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_014.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_015.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_015.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_016.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_016.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_017.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_018.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_019.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_019.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_020.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_020.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_021.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_021.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_022.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_022.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_023.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_023.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_024.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_025.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_025.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_026.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_026.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_027.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_027.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_028.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_028.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_029.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_029.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_030.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_030.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_031.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_031.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_032.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_032.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_033.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_033.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_034.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_034.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_035.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_035.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_036.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_036.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_037.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_037.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_038.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_038.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_039.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_039.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_040.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_040.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_041.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_041.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_042.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_042.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_043.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_043.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_044.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_044.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_045.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_045.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_046.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_046.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_047.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_047.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_048.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_048.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_049.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_049.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_050.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_050.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_051.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_051.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_052.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_052.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_053.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_053.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_054.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_054.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_055.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_055.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_056.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_056.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_057.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_057.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_058.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_058.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_059.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_059.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_060.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_060.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_061.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_061.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_062.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_062.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_063.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_063.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_064.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_064.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_065.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_065.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_066.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_066.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_067.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_067.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_068.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_068.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_069.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_069.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_070.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_070.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_071.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_071.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_072.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_072.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_073.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_073.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_074.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_074.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_075.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_075.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_076.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_076.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_077.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_077.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_078.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_078.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_079.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_079.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_080.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_080.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_081.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_081.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_082.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_082.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_083.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_083.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_084.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_084.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_085.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_085.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_086.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_086.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_087.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_087.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_088.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_088.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_089.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_089.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_090.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_090.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_091.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_091.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_092.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_092.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_093.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_093.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_094.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_094.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_095.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_095.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_096.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_096.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_097.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_097.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_098.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_098.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_099.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_099.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_100.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_101.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_101.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_102.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_102.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_103.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_103.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_104.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_104.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_105.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_105.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_106.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_106.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_107.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_107.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_108.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_108.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_109.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_109.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_110.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_110.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_111.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_111.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_112.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_112.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_113.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_113.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_114.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_115.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_115.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_116.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_116.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_117.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_117.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_118.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_118.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_119.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_119.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_120.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_121.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_121.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_122.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_122.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_123.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_123.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_124.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_124.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_125.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_126.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_126.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_127.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_127.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_128.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_129.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_129.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_130.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_130.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_131.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_131.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_132.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_132.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_133.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_133.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_134.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_134.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_135.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_135.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_136.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_136.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_137.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_137.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_138.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_138.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_139.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_139.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_140.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_140.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_141.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_141.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_142.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_142.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_143.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_143.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_144.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_145.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_145.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_146.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_146.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_147.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_147.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_148.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_148.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_149.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_149.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_150.png
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/202/keys_151.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Keys/202/keys_151.png
--------------------------------------------------------------------------------
/WSplit/Resources/Raw/OptionsIcon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Raw/OptionsIcon.ico
--------------------------------------------------------------------------------
/WSplit/Resources/Raw/OptionsIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/Raw/OptionsIcon.png
--------------------------------------------------------------------------------
/WSplit/Resources/201301150940035209.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/Resources/201301150940035209.rar
--------------------------------------------------------------------------------
/WSplit/WS2_icons/1_Desktop_Icons/icon_016.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/1_Desktop_Icons/icon_016.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/1_Desktop_Icons/icon_032.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/1_Desktop_Icons/icon_032.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/1_Desktop_Icons/icon_048.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/1_Desktop_Icons/icon_048.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/1_Desktop_Icons/icon_128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/1_Desktop_Icons/icon_128.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/1_Desktop_Icons/icon_256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/1_Desktop_Icons/icon_256.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/1_Desktop_Icons/icon_512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/1_Desktop_Icons/icon_512.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/2_Android_Icons/icon_036.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/2_Android_Icons/icon_036.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/2_Android_Icons/icon_048.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/2_Android_Icons/icon_048.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/2_Android_Icons/icon_072.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/2_Android_Icons/icon_072.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/3_iPhone_Icons/icon_029.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/3_iPhone_Icons/icon_029.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/3_iPhone_Icons/icon_048.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/3_iPhone_Icons/icon_048.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/3_iPhone_Icons/icon_057.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/3_iPhone_Icons/icon_057.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/3_iPhone_Icons/icon_072.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/3_iPhone_Icons/icon_072.png
--------------------------------------------------------------------------------
/WSplit/WS2_icons/3_iPhone_Icons/icon_512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitrofski/WSplit/HEAD/WSplit/WS2_icons/3_iPhone_Icons/icon_512.png
--------------------------------------------------------------------------------
/WSplit/app.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/WSplit/Resources/Keys/read me.txt:
--------------------------------------------------------------------------------
1 | Welcome to 4-designer.com!
2 | All resources of this website are uploaded by users. Plase notify us at skywu128@msn.com if any file infringes on your intellectural property rights, and we will remove the file immediately.
3 | Pin for file decompression: 4-designer.com
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | WSplit
2 | ======
3 | This project was started a while back by Wodanaz, a SpeedDemosArchive member and was further developed by me, Nitrofski, in late 2013. It is now released to public. You may fork this project and bring new modifications, or complete modifications that I started working on but never got into finishing.
4 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/Program.cs:
--------------------------------------------------------------------------------
1 | namespace WSplitTimer
2 | {
3 | using System;
4 | using System.Windows.Forms;
5 |
6 | internal static class Program
7 | {
8 | [STAThread]
9 | private static void Main()
10 | {
11 | Application.EnableVisualStyles();
12 | Application.SetCompatibleTextRenderingDefault(false);
13 | Application.Run(new WSplit());
14 | }
15 | }
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/WSplit/_IMAGE_FILE_HEADER.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 |
4 | [StructLayout(LayoutKind.Sequential)]
5 | internal struct _IMAGE_FILE_HEADER
6 | {
7 | public ushort Machine;
8 | public ushort NumberOfSections;
9 | public uint TimeDateStamp;
10 | public uint PointerToSymbolTable;
11 | public uint NumberOfSymbols;
12 | public ushort SizeOfOptionalHeader;
13 | public ushort Characteristics;
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/WSplit/WSplit.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | publier\
5 |
6 |
7 |
8 |
9 |
10 | fr-FR
11 | false
12 |
13 |
--------------------------------------------------------------------------------
/WSplit/WSplitUtil.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Globalization;
6 |
7 | class WSplitUtil
8 | {
9 | public static double timeParse(string timeString)
10 | {
11 | double num = 0.0;
12 | foreach (string str in timeString.Split(new char[] { ':' }))
13 | {
14 | double num2;
15 | if (double.TryParse(str, NumberStyles.AllowDecimalPoint, CultureInfo.CreateSpecificCulture(""), out num2))
16 | num = (num * 60.0) + num2;
17 | }
18 | return num;
19 | }
20 | }
21 |
22 |
--------------------------------------------------------------------------------
/WSplit/WSplit.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2012
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WSplit", "WSplit.csproj", "{5E89D3CD-D50A-41A1-9842-6089C07E125A}"
5 | EndProject
6 | Global
7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
8 | Debug|x86 = Debug|x86
9 | Release|x86 = Release|x86
10 | EndGlobalSection
11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
12 | {5E89D3CD-D50A-41A1-9842-6089C07E125A}.Debug|x86.ActiveCfg = Debug|x86
13 | {5E89D3CD-D50A-41A1-9842-6089C07E125A}.Debug|x86.Build.0 = Debug|x86
14 | {5E89D3CD-D50A-41A1-9842-6089C07E125A}.Release|x86.ActiveCfg = Release|x86
15 | {5E89D3CD-D50A-41A1-9842-6089C07E125A}.Release|x86.Build.0 = Release|x86
16 | EndGlobalSection
17 | GlobalSection(SolutionProperties) = preSolution
18 | HideSolutionNode = FALSE
19 | EndGlobalSection
20 | EndGlobal
21 |
--------------------------------------------------------------------------------
/WSplit/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | // Assembly WSplit, Version 1.4.4.0
2 |
3 | [assembly: System.Reflection.AssemblyCopyright("")]
4 | [assembly: System.Runtime.InteropServices.Guid("3d0f306a-21aa-4248-86e3-339c61d7efe4")]
5 | [assembly: System.Reflection.AssemblyFileVersion("1.5.3.0")]
6 | [assembly: System.Reflection.AssemblyProduct("WSplit")]
7 | [assembly: System.Reflection.AssemblyTrademark("")]
8 | [assembly: System.Runtime.InteropServices.ComVisible(false)]
9 | [assembly: System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
10 | [assembly: System.Runtime.CompilerServices.CompilationRelaxations(8)]
11 | [assembly: System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true)]
12 | [assembly: System.Reflection.AssemblyTitle("WSplit")]
13 | [assembly: System.Reflection.AssemblyDescription("")]
14 | [assembly: System.Reflection.AssemblyConfiguration("")]
15 | [assembly: System.Reflection.AssemblyCompany("")]
16 |
17 |
--------------------------------------------------------------------------------
/WSplit/Options list.txt:
--------------------------------------------------------------------------------
1 | WSplit options:
2 |
3 | - "General"
4 | #-Double Tap Guard
5 | #-Fallback options
6 | #-Load most recent
7 | -(Always on top?)
8 | #-Refresh Rate
9 | #-Save window position
10 |
11 |
12 | - "Hotkeys" (Put in "General" to take more space?)
13 | #-Enabled/Disabled
14 | #-Toggle Key
15 | #-Next Key
16 | #-Previous Key
17 | #-Pause Key
18 | #-Reset Key
19 | #-Split Key
20 | #-Stop Key
21 |
22 | - "Display" (Split into more to take less place?)
23 | #-(Display mode?)
24 | #-Show blanks (Detailed)
25 | #-Show blanks (Wide)
26 | #-Show last (Detailed)
27 | #-Show last (Wide)
28 | #-Nb of segments displayed (will be more specific)
29 | #-Opacity
30 | #-Icons
31 | #-Show attempt count
32 | #-Show title
33 | #-Background type
34 |
35 | - "Font"
36 | #-Clock font (Digital or default/chosen)
37 | #-Clock font (Choice)
38 |
39 |
40 | - Contextual menu
41 | -Track best as...
42 | -Background type
43 | -Clock accent
44 | -Clock font (Digital or default/chosen)
45 | -Clock decimal separator
46 | -Compare against
47 | -Display mode
48 | -Always on top
49 | -(Opacity? Is it worth keeping it here since I'll put it in the setting window anyways)
50 | -Recent files list
51 | -Show attempt count
52 | -Show title
53 |
54 |
55 | - Other
56 | -Clock size
57 | -First run
58 | -Window position
59 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/StartAtDialog.cs:
--------------------------------------------------------------------------------
1 | namespace WSplitTimer
2 | {
3 | using System;
4 | using System.Collections.Generic;
5 | using System.ComponentModel;
6 | using System.Data;
7 | using System.Drawing;
8 | using System.Linq;
9 | using System.Text;
10 | using System.Text.RegularExpressions;
11 | using System.Windows.Forms;
12 |
13 | public partial class StartAtDialog : Form
14 | {
15 | public StartAtDialog()
16 | {
17 | InitializeComponent();
18 | }
19 |
20 | public string StartingTime
21 | {
22 | get
23 | {
24 | return textBoxOffset.Text.Trim();
25 | }
26 | }
27 |
28 | public bool UseDelay
29 | {
30 | get
31 | {
32 | return checkBoxDelay.Checked;
33 | }
34 | }
35 |
36 | private void textBoxOffset_KeyPress(object sender, KeyPressEventArgs e)
37 | {
38 | if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != ':' && e.KeyChar != '.' && e.KeyChar != ',')
39 | {
40 | e.Handled = true;
41 | }
42 | }
43 |
44 | private void textBoxOffset_TextChanged(object sender, EventArgs e)
45 | {
46 | if (Regex.IsMatch(this.textBoxOffset.Text, "[^0-9:.,]"))
47 | {
48 | this.textBoxOffset.Text = Regex.Replace(this.textBoxOffset.Text, "[^0-9:.,]", "");
49 | }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/DViewSetColumnsDialog.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Data;
5 | using System.Drawing;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Windows.Forms;
9 | using WSplitTimer.Properties;
10 |
11 | namespace WSplitTimer
12 | {
13 | public partial class DViewSetColumnsDialog : Form
14 | {
15 | public DViewSetColumnsDialog()
16 | {
17 | InitializeComponent();
18 | this.checkBoxOldTime.Checked = Settings.Profile.DViewShowOld;
19 | this.checkBoxBestTime.Checked = Settings.Profile.DViewShowBest;
20 | this.checkBoxSumOfBests.Checked = Settings.Profile.DViewShowSumOfBests;
21 |
22 | this.checkBoxAlwaysShowComp.Checked = Settings.Profile.DViewShowComp;
23 | this.checkBoxLiveTime.Checked = Settings.Profile.DViewShowLive;
24 | this.checkBoxLiveDelta.Checked = Settings.Profile.DViewShowDeltas;
25 | }
26 |
27 | private void buttonOk_Click(object sender, EventArgs e)
28 | {
29 | Settings.Profile.DViewShowOld = this.checkBoxOldTime.Checked;
30 | Settings.Profile.DViewShowBest = this.checkBoxBestTime.Checked;
31 | Settings.Profile.DViewShowSumOfBests = this.checkBoxSumOfBests.Checked;
32 |
33 | Settings.Profile.DViewShowComp = this.checkBoxAlwaysShowComp.Checked;
34 | Settings.Profile.DViewShowLive = this.checkBoxLiveTime.Checked;
35 | Settings.Profile.DViewShowDeltas = this.checkBoxLiveDelta.Checked;
36 | base.DialogResult = DialogResult.OK;
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/WSplit/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/WSplit/Segment.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 | using System.Drawing.Drawing2D;
4 |
5 | public class Segment
6 | {
7 | public double BackupBest;
8 | public double BackupBestSegment;
9 | public double BestSegment;
10 | public double BestTime;
11 | public Image GrayIcon;
12 | public Bitmap GrayIcon16;
13 | public Bitmap GrayIcon24;
14 | public Bitmap GrayIcon32;
15 | private Image icon;
16 | public Bitmap Icon16;
17 | public Bitmap Icon24;
18 | public Bitmap Icon32;
19 | public string IconPath;
20 | public double LiveTime;
21 | public string Name;
22 | public double OldTime;
23 | public Color TimeColor;
24 | public string TimeString;
25 | public int TimeWidth;
26 |
27 | public Segment(string name)
28 | {
29 | this.IconPath = "";
30 | this.TimeString = "";
31 | this.TimeColor = Color.White;
32 | this.Name = name;
33 | }
34 |
35 | public Segment(string name, double oldtime, double besttime, double bestseg)
36 | {
37 | this.IconPath = "";
38 | this.TimeString = "";
39 | this.TimeColor = Color.White;
40 | this.Name = name;
41 | this.OldTime = oldtime;
42 | this.BestTime = besttime;
43 | this.BackupBest = besttime;
44 | this.BestSegment = bestseg;
45 | this.BackupBestSegment = bestseg;
46 | }
47 |
48 | private void prerenderSizes()
49 | {
50 | Bitmap image = new Bitmap(16, 16);
51 | Bitmap bitmap2 = new Bitmap(16, 16);
52 | Bitmap bitmap3 = new Bitmap(24, 24);
53 | Bitmap bitmap4 = new Bitmap(24, 24);
54 | Bitmap bitmap5 = new Bitmap(32, 32);
55 | Bitmap bitmap6 = new Bitmap(32, 32);
56 |
57 | Graphics graphics = Graphics.FromImage(image);
58 | graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
59 | graphics.DrawImage(this.icon, 0, 0, 16, 16);
60 | this.Icon16 = image;
61 |
62 | graphics = Graphics.FromImage(bitmap3);
63 | graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
64 | graphics.DrawImage(this.icon, 0, 0, 24, 24);
65 | this.Icon24 = bitmap3;
66 |
67 | graphics = Graphics.FromImage(bitmap5);
68 | graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
69 | graphics.DrawImage(this.icon, 0, 0, 32, 32);
70 | this.Icon32 = bitmap5;
71 |
72 | graphics = Graphics.FromImage(bitmap2);
73 | graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
74 | graphics.DrawImage(this.GrayIcon, 0, 0, 16, 16);
75 | this.GrayIcon16 = bitmap2;
76 |
77 | graphics = Graphics.FromImage(bitmap4);
78 | graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
79 | graphics.DrawImage(this.GrayIcon, 0, 0, 24, 24);
80 | this.GrayIcon24 = bitmap4;
81 |
82 | graphics = Graphics.FromImage(bitmap6);
83 | graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
84 | graphics.DrawImage(this.GrayIcon, 0, 0, 32, 32);
85 | this.GrayIcon32 = bitmap6;
86 | }
87 |
88 | public Image Icon
89 | {
90 | get
91 | {
92 | return this.icon;
93 | }
94 | set
95 | {
96 | this.icon = value;
97 | Bitmap icon = (Bitmap) this.icon;
98 | Bitmap bitmap2 = new Bitmap(this.icon.Width, this.icon.Height);
99 | for (int i = 0; i < this.icon.Width; i++)
100 | {
101 | for (int j = 0; j < this.icon.Height; j++)
102 | {
103 | Color pixel = icon.GetPixel(i, j);
104 | int num3 = (int) (((pixel.R * 0.3) + (pixel.G * 0.59)) + (pixel.B * 0.11));
105 | bitmap2.SetPixel(i, j, Color.FromArgb(pixel.A, ((num3 * 4) + pixel.R) / 5, ((num3 * 4) + pixel.G) / 5, ((num3 * 4) + pixel.B) / 5));
106 | }
107 | }
108 | this.GrayIcon = bitmap2;
109 | this.prerenderSizes();
110 | }
111 | }
112 | }
113 |
114 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace WSplitTimer.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WSplitTimer.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 |
63 | ///
64 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
65 | ///
66 | internal static System.Drawing.Icon AppIcon {
67 | get {
68 | object obj = ResourceManager.GetObject("AppIcon", resourceCulture);
69 | return ((System.Drawing.Icon)(obj));
70 | }
71 | }
72 |
73 | ///
74 | /// Looks up a localized resource of type System.Byte[].
75 | ///
76 | internal static byte[] ClockFont {
77 | get {
78 | object obj = ResourceManager.GetObject("ClockFont", resourceCulture);
79 | return ((byte[])(obj));
80 | }
81 | }
82 |
83 | ///
84 | /// Looks up a localized resource of type System.Drawing.Bitmap.
85 | ///
86 | internal static System.Drawing.Bitmap MissingIcon {
87 | get {
88 | object obj = ResourceManager.GetObject("MissingIcon", resourceCulture);
89 | return ((System.Drawing.Bitmap)(obj));
90 | }
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/WSplit/DualStopwatch.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 |
4 | public class DualStopwatch
5 | {
6 | private bool fallbackIsRunning;
7 | private long pauseTicks;
8 | private TimeSpan pauseTime = TimeSpan.Zero;
9 | private long startTicks;
10 | private DateTime startTime;
11 | private Stopwatch systimer = new Stopwatch();
12 | public bool useFallback;
13 |
14 | // Used for when the timer starts at a time greater than 0 ticks
15 | private TimeSpan startedAt = TimeSpan.Zero;
16 |
17 | public DualStopwatch(bool useFallbackMethod)
18 | {
19 | this.useFallback = useFallbackMethod;
20 | }
21 |
22 | public void Reset()
23 | {
24 | this.systimer.Reset();
25 | this.pauseTime = TimeSpan.Zero;
26 | this.pauseTicks = 0L;
27 | this.startedAt = TimeSpan.Zero;
28 | this.fallbackIsRunning = false;
29 | }
30 |
31 | public void StartAt(TimeSpan offset)
32 | {
33 | // If the timer wasn't already running and it was not paused, apply the offset
34 | if (!this.systimer.IsRunning && !this.fallbackIsRunning && this.pauseTime.Ticks >= 0L)
35 | startedAt = offset;
36 | Start();
37 | }
38 |
39 | public void Start()
40 | {
41 | this.systimer.Start();
42 | if (!this.fallbackIsRunning && this.pauseTime.Ticks > 0L)
43 | {
44 | this.startTime = DateTime.UtcNow - this.pauseTime;
45 | this.pauseTime = TimeSpan.Zero;
46 | this.startTicks = Environment.TickCount - this.pauseTicks;
47 | this.pauseTicks = 0L;
48 | }
49 | else
50 | {
51 | this.startTime = DateTime.UtcNow;
52 | this.startTicks = Environment.TickCount;
53 | }
54 | this.fallbackIsRunning = true;
55 | }
56 |
57 | public void Stop()
58 | {
59 | this.systimer.Stop();
60 | if (this.fallbackIsRunning)
61 | {
62 | this.pauseTime = (TimeSpan) (DateTime.UtcNow - this.startTime);
63 | this.pauseTicks = Environment.TickCount - this.startTicks;
64 | this.fallbackIsRunning = false;
65 | }
66 | }
67 |
68 | public double driftMilliseconds
69 | {
70 | get
71 | {
72 | return (this.fallbackElapsed.TotalMilliseconds - this.systimer.Elapsed.TotalMilliseconds);
73 | }
74 | }
75 |
76 | public TimeSpan Elapsed
77 | {
78 | get
79 | {
80 | if (this.useFallback)
81 | {
82 | return this.fallbackElapsed + startedAt;
83 | }
84 | return this.systimer.Elapsed + startedAt;
85 | }
86 | }
87 |
88 | public long ElapsedMilliseconds
89 | {
90 | get
91 | {
92 | if (this.useFallback)
93 | {
94 | return (long)Math.Truncate(this.fallbackElapsed.TotalMilliseconds + startedAt.TotalMilliseconds);
95 | //return (long) Math.Round(this.fallbackElapsed.TotalMilliseconds + startedAt.TotalMilliseconds);
96 | }
97 | return (long)Math.Truncate(this.systimer.ElapsedMilliseconds + startedAt.TotalMilliseconds);
98 | //return (long) Math.Round(this.systimer.ElapsedMilliseconds + startedAt.TotalMilliseconds);
99 | }
100 | }
101 |
102 | public long ElapsedTicks
103 | {
104 | get
105 | {
106 | return this.Elapsed.Ticks;
107 | }
108 | }
109 |
110 | private TimeSpan fallbackElapsed
111 | {
112 | get
113 | {
114 | if (!this.fallbackIsRunning)
115 | {
116 | return this.pauseTime;
117 | }
118 | TimeSpan span = (TimeSpan) (DateTime.UtcNow - this.startTime);
119 | TimeSpan span2 = TimeSpan.FromMilliseconds(Environment.TickCount - this.startTicks);
120 | if (span2 < TimeSpan.Zero)
121 | {
122 | span2 += TimeSpan.FromMilliseconds(4294967295);
123 | }
124 | double num = Math.Abs((double) (span.TotalMilliseconds - span2.TotalMilliseconds));
125 | if ((num > 500.0) && (Math.Abs((double) (num / span.TotalMilliseconds)) > 0.00013888888888888889))
126 | {
127 | return span2;
128 | }
129 | return span;
130 | }
131 | }
132 |
133 | public bool IsRunning
134 | {
135 | get
136 | {
137 | if (this.useFallback)
138 | {
139 | return this.fallbackIsRunning;
140 | }
141 | return this.systimer.IsRunning;
142 | }
143 | }
144 | }
145 |
146 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/StartAtDialog.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace WSplitTimer
2 | {
3 | partial class StartAtDialog
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.textBoxOffset = new System.Windows.Forms.TextBox();
32 | this.labelOffset = new System.Windows.Forms.Label();
33 | this.checkBoxDelay = new System.Windows.Forms.CheckBox();
34 | this.buttonStart = new System.Windows.Forms.Button();
35 | this.buttonCancel = new System.Windows.Forms.Button();
36 | this.SuspendLayout();
37 | //
38 | // textBoxOffset
39 | //
40 | this.textBoxOffset.Location = new System.Drawing.Point(79, 12);
41 | this.textBoxOffset.Name = "textBoxOffset";
42 | this.textBoxOffset.Size = new System.Drawing.Size(147, 20);
43 | this.textBoxOffset.TabIndex = 0;
44 | this.textBoxOffset.Text = "0:00";
45 | this.textBoxOffset.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
46 | this.textBoxOffset.TextChanged += new System.EventHandler(this.textBoxOffset_TextChanged);
47 | this.textBoxOffset.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBoxOffset_KeyPress);
48 | //
49 | // labelOffset
50 | //
51 | this.labelOffset.AutoSize = true;
52 | this.labelOffset.Location = new System.Drawing.Point(12, 15);
53 | this.labelOffset.Name = "labelOffset";
54 | this.labelOffset.Size = new System.Drawing.Size(61, 13);
55 | this.labelOffset.TabIndex = 1;
56 | this.labelOffset.Text = "Start offset:";
57 | //
58 | // checkBoxDelay
59 | //
60 | this.checkBoxDelay.AutoSize = true;
61 | this.checkBoxDelay.Checked = true;
62 | this.checkBoxDelay.CheckState = System.Windows.Forms.CheckState.Checked;
63 | this.checkBoxDelay.Location = new System.Drawing.Point(12, 42);
64 | this.checkBoxDelay.Name = "checkBoxDelay";
65 | this.checkBoxDelay.Size = new System.Drawing.Size(90, 17);
66 | this.checkBoxDelay.TabIndex = 2;
67 | this.checkBoxDelay.Text = "Still use delay";
68 | this.checkBoxDelay.UseVisualStyleBackColor = true;
69 | //
70 | // buttonStart
71 | //
72 | this.buttonStart.DialogResult = System.Windows.Forms.DialogResult.OK;
73 | this.buttonStart.Location = new System.Drawing.Point(108, 38);
74 | this.buttonStart.Name = "buttonStart";
75 | this.buttonStart.Size = new System.Drawing.Size(56, 23);
76 | this.buttonStart.TabIndex = 3;
77 | this.buttonStart.Text = "Start";
78 | this.buttonStart.UseVisualStyleBackColor = true;
79 | //
80 | // buttonCancel
81 | //
82 | this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
83 | this.buttonCancel.Location = new System.Drawing.Point(170, 38);
84 | this.buttonCancel.Name = "buttonCancel";
85 | this.buttonCancel.Size = new System.Drawing.Size(56, 23);
86 | this.buttonCancel.TabIndex = 4;
87 | this.buttonCancel.Text = "Cancel";
88 | this.buttonCancel.UseVisualStyleBackColor = true;
89 | //
90 | // StartAtDialog
91 | //
92 | this.AcceptButton = this.buttonStart;
93 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
94 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
95 | this.CancelButton = this.buttonCancel;
96 | this.ClientSize = new System.Drawing.Size(238, 72);
97 | this.Controls.Add(this.buttonCancel);
98 | this.Controls.Add(this.buttonStart);
99 | this.Controls.Add(this.checkBoxDelay);
100 | this.Controls.Add(this.labelOffset);
101 | this.Controls.Add(this.textBoxOffset);
102 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
103 | this.MaximizeBox = false;
104 | this.MinimizeBox = false;
105 | this.Name = "StartAtDialog";
106 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
107 | this.Text = "Start at...";
108 | this.ResumeLayout(false);
109 | this.PerformLayout();
110 |
111 | }
112 |
113 | #endregion
114 |
115 | private System.Windows.Forms.TextBox textBoxOffset;
116 | private System.Windows.Forms.Label labelOffset;
117 | private System.Windows.Forms.CheckBox checkBoxDelay;
118 | private System.Windows.Forms.Button buttonStart;
119 | private System.Windows.Forms.Button buttonCancel;
120 |
121 | }
122 | }
--------------------------------------------------------------------------------
/WSplit/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/StartAtDialog.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/CustomizeColors.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/DViewSetColumnsDialog.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/RunEditor.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 310, 17
122 |
123 |
124 | 150, 17
125 |
126 |
127 | 17, 17
128 |
129 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/BackgroundImageDialog.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 17, 17
122 |
123 |
124 | This dialog is the base of an unfinished
125 | Background Image feature. If you wish to help
126 | complete this feature and make WSplit a better
127 | timer, please consider visiting
128 | https://github.com/Nitrofski/WSplit
129 |
130 |
131 | 68
132 |
133 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 |
122 | ..\..\Resources\AppIcon.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
123 |
124 |
125 | ..\..\Resources\ClockFont.ttf;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
126 |
127 |
128 | ..\..\Resources\MissingIcon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
129 |
130 |
--------------------------------------------------------------------------------
/WSplit/LiveSplitXMLReader.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Xml;
6 | using System.Windows.Forms;
7 | using System.Collections;
8 |
9 | public class LiveSplitXMLReader
10 | {
11 | private const String GAME_NAME = "GameName";
12 | private const String CATEGORY_NAME = "CategoryName";
13 | private const String OFFSET = "Offset";
14 | private const String ATTEMPTS_COUNT = "AttemptCount";
15 | private const String SEGMENTS = "Segments";
16 | private const String SEGMENT_NAME = "Name";
17 | private const String SPLIT_TIMES = "SplitTimes";
18 | private const String BEST_SEGMENT = "BestSegmentTime";
19 |
20 | private Split split;
21 | private XmlDocument xmlDocument;
22 |
23 | public LiveSplitXMLReader()
24 | {
25 | this.split = new Split();
26 | xmlDocument = new XmlDocument();
27 | }
28 |
29 | ///
30 | /// Read split information from the file and returns it.
31 | ///
32 | /// The filename of the LiveSplit XML file.
33 | /// The split with all its information.
34 | public Split ReadSplit(String file)
35 | {
36 | xmlDocument.Load(file);
37 | StringBuilder stringBuilder = new StringBuilder();
38 | String runTitle = "";
39 | String attemptsCountString = "";
40 | String startDelay = "";
41 | int attemptsCount = 0;
42 | XmlNodeList rootNode;
43 | List segments = new List();
44 |
45 | rootNode = xmlDocument.DocumentElement.SelectNodes("/Run");
46 | foreach(XmlNode runNode in rootNode)
47 | {
48 | foreach (XmlNode infoNode in runNode.ChildNodes)
49 | {
50 | if (infoNode.Name == GAME_NAME)
51 | {
52 | stringBuilder.Append(infoNode.InnerText + " ");
53 | }
54 | else if (infoNode.Name == CATEGORY_NAME)
55 | {
56 | stringBuilder.Append(infoNode.InnerText);
57 | }
58 | else if (infoNode.Name == OFFSET)
59 | {
60 | startDelay = infoNode.InnerText;
61 | }
62 | else if (infoNode.Name == ATTEMPTS_COUNT)
63 | {
64 | attemptsCountString = infoNode.InnerText;
65 | }
66 | else if (infoNode.Name == SEGMENTS)
67 | {
68 | PopulateSegments(segments, infoNode);
69 | }
70 | }
71 | }
72 |
73 | runTitle = stringBuilder.ToString();
74 | this.split.RunTitle = runTitle;
75 | this.split.StartDelay = SetRunDelay(startDelay);
76 | Int32.TryParse(attemptsCountString, out attemptsCount);
77 | this.split.AttemptsCount = attemptsCount;
78 | this.split.segments = segments;
79 | return this.split;
80 | }
81 |
82 | ///
83 | /// In livesplit you can have a delay or start the run later. In wsplit you can only delay the start of a run.
84 | /// So in livesplit if there is a delay, there will be a "-" in front of the time. If we see this "-" we read after the time after it
85 | /// to set the time delay in the Split. If there is not "-" it means that the run start later and we do nothing with it.
86 | ///
87 | /// The initial delay string from the file.
88 | /// The delay into the form of a int.
89 | private int SetRunDelay(String delayString)
90 | {
91 | String delayStringModified = "";
92 | int delay = 0;
93 |
94 | if (delayString.IndexOf('-') != -1)
95 | {
96 | delayStringModified = delayString.Remove(0, 1);
97 | delay = ParseDelayString(delayStringModified);
98 | }
99 |
100 | return delay;
101 | }
102 |
103 | ///
104 | /// Take the delay string from the livesplit file and convert it into int.
105 | ///
106 | /// The delay into the form of a String.
107 | /// The delay into the form of a int.
108 | private int ParseDelayString(String delayString)
109 | {
110 | int delay = 0;
111 | int delayTimeSection = 0;
112 | String[] timeSection = delayString.Split(':');
113 | String[] secondsAndMilliseconds = timeSection[timeSection.Length - 1].Split('.');
114 | //Millseconds
115 | if (secondsAndMilliseconds.Length == 2)
116 | {
117 | if (Int32.TryParse(secondsAndMilliseconds[1].Substring(0, 2), out delayTimeSection))
118 | {
119 | delay += (delayTimeSection * 10);
120 | }
121 | }
122 | //Seconds
123 | if (Int32.TryParse(secondsAndMilliseconds[0], out delayTimeSection))
124 | {
125 | delay += (delayTimeSection * 1000);
126 | }
127 | //Minutes
128 | if (Int32.TryParse(timeSection[1], out delayTimeSection))
129 | {
130 | delay += (delayTimeSection * 60 * 1000);
131 | }
132 | //Hours
133 | if (Int32.TryParse(timeSection[0], out delayTimeSection))
134 | {
135 | delay += (delayTimeSection * 3600 * 1000);
136 | }
137 | return delay;
138 | }
139 |
140 | ///
141 | /// Read the segments from the file and populate the segment list.
142 | ///
143 | /// The array list of segments.
144 | /// The node containing the segments in the xml file.
145 | private void PopulateSegments(List segments, XmlNode segmentsNode)
146 | {
147 | Segment newSegment;
148 | String segmentName = "";
149 | double segmentBestTime = 0.0;
150 | double segmentBestSegment = 0.0;
151 | XmlNode nodeSegmentTime;
152 | foreach(XmlNode segmentNode in segmentsNode.ChildNodes)
153 | {
154 | foreach (XmlNode segmentInfoNode in segmentNode.ChildNodes)
155 | {
156 | if (segmentInfoNode.Name == SEGMENT_NAME)
157 | {
158 | segmentName = segmentInfoNode.InnerText;
159 | }
160 | else if (segmentInfoNode.Name == SPLIT_TIMES)
161 | {
162 | nodeSegmentTime = segmentInfoNode.FirstChild.FirstChild;
163 | segmentBestTime = WSplitUtil.timeParse(nodeSegmentTime.InnerText);
164 | }
165 | else if (segmentInfoNode.Name == BEST_SEGMENT)
166 | {
167 | nodeSegmentTime = segmentInfoNode.FirstChild;
168 | segmentBestSegment = WSplitUtil.timeParse(nodeSegmentTime.InnerText);
169 | }
170 | }
171 | newSegment = new Segment(segmentName, 0.0, segmentBestTime, segmentBestSegment);
172 | segments.Add(newSegment);
173 | }
174 | }
175 | }
176 |
177 |
--------------------------------------------------------------------------------
/WSplit/WSplit.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | local
5 | 7.10.377
6 | 2.0
7 | {5E89D3CD-D50A-41A1-9842-6089C07E125A}
8 | Debug
9 | WSplit
10 | WinExe
11 | v4.6
12 |
13 |
14 | publier\
15 | true
16 | Disk
17 | false
18 | Foreground
19 | 7
20 | Days
21 | false
22 | false
23 | true
24 | 0
25 | 1.0.0.%2a
26 | false
27 | false
28 | true
29 | bin
30 |
31 |
32 | AnyCPU
33 | true
34 | full
35 | false
36 | bin
37 | DEBUG;TRACE
38 | prompt
39 | 4
40 | false
41 |
42 |
43 | x86
44 | pdbonly
45 | true
46 | bin
47 | TRACE
48 | prompt
49 | 4
50 | false
51 |
52 |
53 | Resources\AppIcon.ico
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | True
70 | True
71 | Resources.resx
72 |
73 |
74 | Form
75 |
76 |
77 | BackgroundImageDialog.cs
78 |
79 |
80 | Form
81 |
82 |
83 | Form
84 |
85 |
86 | Form
87 |
88 |
89 | DViewSetColumnsDialog.cs
90 |
91 |
92 |
93 | True
94 | True
95 | Resources.resx
96 |
97 |
98 |
99 | Form
100 |
101 |
102 |
103 | Form
104 |
105 |
106 | SettingsDialog.cs
107 |
108 |
109 | Form
110 |
111 |
112 | StartAtDialog.cs
113 |
114 |
115 |
116 |
117 |
118 | Form
119 |
120 |
121 |
122 |
123 |
124 |
125 | Form
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 | False
136 | Microsoft .NET Framework 4.5 %28x86 et x64%29
137 | true
138 |
139 |
140 | False
141 | .NET Framework 3.5 SP1 Client Profile
142 | false
143 |
144 |
145 | False
146 | .NET Framework 3.5 SP1
147 | false
148 |
149 |
150 |
151 |
152 | ResXFileCodeGenerator
153 | Resources.Designer.cs
154 |
155 |
156 | BackgroundImageDialog.cs
157 |
158 |
159 | CustomizeColors.cs
160 |
161 |
162 | DViewSetColumnsDialog.cs
163 |
164 |
165 | ResXFileCodeGenerator
166 | Resources.Designer.cs
167 |
168 |
169 | RunEditor.cs
170 |
171 |
172 | SettingsDialog.cs
173 |
174 |
175 | StartAtDialog.cs
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/DViewSetColumnsDialog.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace WSplitTimer
2 | {
3 | partial class DViewSetColumnsDialog
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.checkBoxAlwaysShowComp = new System.Windows.Forms.CheckBox();
32 | this.checkBoxOldTime = new System.Windows.Forms.CheckBox();
33 | this.checkBoxBestTime = new System.Windows.Forms.CheckBox();
34 | this.checkBoxSumOfBests = new System.Windows.Forms.CheckBox();
35 | this.checkBoxLiveTime = new System.Windows.Forms.CheckBox();
36 | this.checkBoxLiveDelta = new System.Windows.Forms.CheckBox();
37 | this.groupBoxCompColumns = new System.Windows.Forms.GroupBox();
38 | this.buttonOk = new System.Windows.Forms.Button();
39 | this.buttonCancel = new System.Windows.Forms.Button();
40 | this.groupBoxCompColumns.SuspendLayout();
41 | this.SuspendLayout();
42 | //
43 | // checkBoxAlwaysShowComp
44 | //
45 | this.checkBoxAlwaysShowComp.AutoSize = true;
46 | this.checkBoxAlwaysShowComp.Location = new System.Drawing.Point(12, 60);
47 | this.checkBoxAlwaysShowComp.Name = "checkBoxAlwaysShowComp";
48 | this.checkBoxAlwaysShowComp.Size = new System.Drawing.Size(201, 17);
49 | this.checkBoxAlwaysShowComp.TabIndex = 0;
50 | this.checkBoxAlwaysShowComp.Text = "Always show default comparison time";
51 | this.checkBoxAlwaysShowComp.UseVisualStyleBackColor = true;
52 | //
53 | // checkBoxOldTime
54 | //
55 | this.checkBoxOldTime.AutoSize = true;
56 | this.checkBoxOldTime.Location = new System.Drawing.Point(6, 19);
57 | this.checkBoxOldTime.Name = "checkBoxOldTime";
58 | this.checkBoxOldTime.Size = new System.Drawing.Size(64, 17);
59 | this.checkBoxOldTime.TabIndex = 1;
60 | this.checkBoxOldTime.Text = "Old time";
61 | this.checkBoxOldTime.UseVisualStyleBackColor = true;
62 | //
63 | // checkBoxBestTime
64 | //
65 | this.checkBoxBestTime.AutoSize = true;
66 | this.checkBoxBestTime.Location = new System.Drawing.Point(76, 19);
67 | this.checkBoxBestTime.Name = "checkBoxBestTime";
68 | this.checkBoxBestTime.Size = new System.Drawing.Size(69, 17);
69 | this.checkBoxBestTime.TabIndex = 2;
70 | this.checkBoxBestTime.Text = "Best time";
71 | this.checkBoxBestTime.UseVisualStyleBackColor = true;
72 | //
73 | // checkBoxSumOfBests
74 | //
75 | this.checkBoxSumOfBests.AutoSize = true;
76 | this.checkBoxSumOfBests.Location = new System.Drawing.Point(151, 19);
77 | this.checkBoxSumOfBests.Name = "checkBoxSumOfBests";
78 | this.checkBoxSumOfBests.Size = new System.Drawing.Size(87, 17);
79 | this.checkBoxSumOfBests.TabIndex = 3;
80 | this.checkBoxSumOfBests.Text = "Sum of bests";
81 | this.checkBoxSumOfBests.UseVisualStyleBackColor = true;
82 | //
83 | // checkBoxLiveTime
84 | //
85 | this.checkBoxLiveTime.AutoSize = true;
86 | this.checkBoxLiveTime.Location = new System.Drawing.Point(12, 83);
87 | this.checkBoxLiveTime.Name = "checkBoxLiveTime";
88 | this.checkBoxLiveTime.Size = new System.Drawing.Size(94, 17);
89 | this.checkBoxLiveTime.TabIndex = 4;
90 | this.checkBoxLiveTime.Text = "Show live time";
91 | this.checkBoxLiveTime.UseVisualStyleBackColor = true;
92 | //
93 | // checkBoxLiveDelta
94 | //
95 | this.checkBoxLiveDelta.AutoSize = true;
96 | this.checkBoxLiveDelta.Location = new System.Drawing.Point(12, 106);
97 | this.checkBoxLiveDelta.Name = "checkBoxLiveDelta";
98 | this.checkBoxLiveDelta.Size = new System.Drawing.Size(139, 17);
99 | this.checkBoxLiveDelta.TabIndex = 5;
100 | this.checkBoxLiveDelta.Text = "Show live run delta (+/-)";
101 | this.checkBoxLiveDelta.UseVisualStyleBackColor = true;
102 | //
103 | // groupBoxCompColumns
104 | //
105 | this.groupBoxCompColumns.Controls.Add(this.checkBoxOldTime);
106 | this.groupBoxCompColumns.Controls.Add(this.checkBoxBestTime);
107 | this.groupBoxCompColumns.Controls.Add(this.checkBoxSumOfBests);
108 | this.groupBoxCompColumns.Location = new System.Drawing.Point(12, 12);
109 | this.groupBoxCompColumns.Name = "groupBoxCompColumns";
110 | this.groupBoxCompColumns.Size = new System.Drawing.Size(244, 42);
111 | this.groupBoxCompColumns.TabIndex = 6;
112 | this.groupBoxCompColumns.TabStop = false;
113 | this.groupBoxCompColumns.Text = "Show comparison columns...";
114 | //
115 | // buttonOk
116 | //
117 | this.buttonOk.Location = new System.Drawing.Point(12, 129);
118 | this.buttonOk.Name = "buttonOk";
119 | this.buttonOk.Size = new System.Drawing.Size(119, 23);
120 | this.buttonOk.TabIndex = 7;
121 | this.buttonOk.Text = "OK";
122 | this.buttonOk.UseVisualStyleBackColor = true;
123 | this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click);
124 | //
125 | // buttonCancel
126 | //
127 | this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
128 | this.buttonCancel.Location = new System.Drawing.Point(137, 129);
129 | this.buttonCancel.Name = "buttonCancel";
130 | this.buttonCancel.Size = new System.Drawing.Size(119, 23);
131 | this.buttonCancel.TabIndex = 8;
132 | this.buttonCancel.Text = "Cancel";
133 | this.buttonCancel.UseVisualStyleBackColor = true;
134 | //
135 | // DViewSetColumnsDialog
136 | //
137 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
138 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
139 | this.ClientSize = new System.Drawing.Size(268, 164);
140 | this.Controls.Add(this.buttonCancel);
141 | this.Controls.Add(this.buttonOk);
142 | this.Controls.Add(this.groupBoxCompColumns);
143 | this.Controls.Add(this.checkBoxLiveDelta);
144 | this.Controls.Add(this.checkBoxLiveTime);
145 | this.Controls.Add(this.checkBoxAlwaysShowComp);
146 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
147 | this.MaximizeBox = false;
148 | this.MinimizeBox = false;
149 | this.Name = "DViewSetColumnsDialog";
150 | this.Text = "Select columns...";
151 | this.groupBoxCompColumns.ResumeLayout(false);
152 | this.groupBoxCompColumns.PerformLayout();
153 | this.ResumeLayout(false);
154 | this.PerformLayout();
155 |
156 | }
157 |
158 | #endregion
159 |
160 | private System.Windows.Forms.CheckBox checkBoxAlwaysShowComp;
161 | private System.Windows.Forms.CheckBox checkBoxOldTime;
162 | private System.Windows.Forms.CheckBox checkBoxBestTime;
163 | private System.Windows.Forms.CheckBox checkBoxSumOfBests;
164 | private System.Windows.Forms.CheckBox checkBoxLiveTime;
165 | private System.Windows.Forms.CheckBox checkBoxLiveDelta;
166 | private System.Windows.Forms.GroupBox groupBoxCompColumns;
167 | private System.Windows.Forms.Button buttonOk;
168 | private System.Windows.Forms.Button buttonCancel;
169 | }
170 | }
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/MessageBoxEx.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 | using System.Text;
4 | using System.Drawing;
5 | using System.Runtime.InteropServices;
6 | using System.Threading;
7 |
8 | namespace WSplitTimer
9 | {
10 | public class MessageBoxEx
11 | {
12 | private static IWin32Window _owner;
13 | private static HookProc _hookProc;
14 | private static IntPtr _hHook;
15 |
16 | public static DialogResult Show(string text)
17 | {
18 | Initialize();
19 | return MessageBox.Show(text);
20 | }
21 |
22 | public static DialogResult Show(string text, string caption)
23 | {
24 | Initialize();
25 | return MessageBox.Show(text, caption);
26 | }
27 |
28 | public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)
29 | {
30 | Initialize();
31 | return MessageBox.Show(text, caption, buttons);
32 | }
33 |
34 | public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
35 | {
36 | Initialize();
37 | return MessageBox.Show(text, caption, buttons, icon);
38 | }
39 |
40 | public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
41 | {
42 | Initialize();
43 | return MessageBox.Show(text, caption, buttons, icon, defButton);
44 | }
45 |
46 | public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
47 | {
48 | Initialize();
49 | return MessageBox.Show(text, caption, buttons, icon, defButton, options);
50 | }
51 |
52 | public static DialogResult Show(IWin32Window owner, string text)
53 | {
54 | _owner = owner;
55 | Initialize();
56 | return MessageBox.Show(owner, text);
57 | }
58 |
59 | public static DialogResult Show(IWin32Window owner, string text, string caption)
60 | {
61 | _owner = owner;
62 | Initialize();
63 | return MessageBox.Show(owner, text, caption);
64 | }
65 |
66 | public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
67 | {
68 | _owner = owner;
69 | Initialize();
70 | return MessageBox.Show(owner, text, caption, buttons);
71 | }
72 |
73 | public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
74 | {
75 | _owner = owner;
76 | Initialize();
77 | return MessageBox.Show(owner, text, caption, buttons, icon);
78 | }
79 |
80 | public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
81 | {
82 | _owner = owner;
83 | Initialize();
84 | return MessageBox.Show(owner, text, caption, buttons, icon, defButton);
85 | }
86 |
87 | public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
88 | {
89 | _owner = owner;
90 | Initialize();
91 | return MessageBox.Show(owner, text, caption, buttons, icon,
92 | defButton, options);
93 | }
94 |
95 | public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
96 |
97 | public delegate void TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);
98 |
99 | public const int WH_CALLWNDPROCRET = 12;
100 |
101 | public enum CbtHookAction : int
102 | {
103 | HCBT_MOVESIZE = 0,
104 | HCBT_MINMAX = 1,
105 | HCBT_QS = 2,
106 | HCBT_CREATEWND = 3,
107 | HCBT_DESTROYWND = 4,
108 | HCBT_ACTIVATE = 5,
109 | HCBT_CLICKSKIPPED = 6,
110 | HCBT_KEYSKIPPED = 7,
111 | HCBT_SYSCOMMAND = 8,
112 | HCBT_SETFOCUS = 9
113 | }
114 |
115 | [DllImport("user32.dll")]
116 | private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);
117 |
118 | [DllImport("user32.dll")]
119 | private static extern int MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
120 |
121 | [DllImport("User32.dll")]
122 | public static extern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);
123 |
124 | [DllImport("User32.dll")]
125 | public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
126 |
127 | [DllImport("user32.dll")]
128 | public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
129 |
130 | [DllImport("user32.dll")]
131 | public static extern int UnhookWindowsHookEx(IntPtr idHook);
132 |
133 | [DllImport("user32.dll")]
134 | public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
135 |
136 | [DllImport("user32.dll")]
137 | public static extern int GetWindowTextLength(IntPtr hWnd);
138 |
139 | [DllImport("user32.dll")]
140 | public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);
141 |
142 | [DllImport("user32.dll")]
143 | public static extern int EndDialog(IntPtr hDlg, IntPtr nResult);
144 |
145 | [StructLayout(LayoutKind.Sequential)]
146 | public struct CWPRETSTRUCT
147 | {
148 | public IntPtr lResult;
149 | public IntPtr lParam;
150 | public IntPtr wParam;
151 | public uint message;
152 | public IntPtr hwnd;
153 | } ;
154 |
155 | static MessageBoxEx()
156 | {
157 | _hookProc = new HookProc(MessageBoxHookProc);
158 | _hHook = IntPtr.Zero;
159 | }
160 |
161 | private static void Initialize()
162 | {
163 | if (_hHook != IntPtr.Zero)
164 | {
165 | throw new NotSupportedException("multiple calls are not supported");
166 | }
167 |
168 | if (_owner != null)
169 | {
170 | #pragma warning disable
171 | _hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, _hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
172 | #pragma warnign restore
173 | }
174 | }
175 |
176 | private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
177 | {
178 | if (nCode < 0)
179 | {
180 | return CallNextHookEx(_hHook, nCode, wParam, lParam);
181 | }
182 |
183 | CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
184 | IntPtr hook = _hHook;
185 |
186 | if (msg.message == (int)CbtHookAction.HCBT_ACTIVATE)
187 | {
188 | try
189 | {
190 | CenterWindow(msg.hwnd);
191 | }
192 | finally
193 | {
194 | UnhookWindowsHookEx(_hHook);
195 | _hHook = IntPtr.Zero;
196 | }
197 | }
198 |
199 | return CallNextHookEx(hook, nCode, wParam, lParam);
200 | }
201 |
202 | private static void CenterWindow(IntPtr hChildWnd)
203 | {
204 | Rectangle recChild = new Rectangle(0, 0, 0, 0);
205 | bool success = GetWindowRect(hChildWnd, ref recChild);
206 |
207 | int width = recChild.Width - recChild.X;
208 | int height = recChild.Height - recChild.Y;
209 |
210 | Rectangle recParent = new Rectangle(0, 0, 0, 0);
211 | success = GetWindowRect(_owner.Handle, ref recParent);
212 |
213 | Point ptCenter = new Point(0, 0);
214 | ptCenter.X = recParent.X + ((recParent.Width - recParent.X) / 2);
215 | ptCenter.Y = recParent.Y + ((recParent.Height - recParent.Y) / 2);
216 |
217 |
218 | Point ptStart = new Point(0, 0);
219 | ptStart.X = (ptCenter.X - (width / 2));
220 | ptStart.Y = (ptCenter.Y - (height / 2));
221 |
222 | ptStart.X = (ptStart.X < 0) ? 0 : ptStart.X;
223 | ptStart.Y = (ptStart.Y < 0) ? 0 : ptStart.Y;
224 |
225 | int result = MoveWindow(hChildWnd, ptStart.X, ptStart.Y, width,
226 | height, false);
227 | }
228 | }
229 | }
230 |
--------------------------------------------------------------------------------
/WSplit/Split.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | public class Split
5 | {
6 | private String runTitle;
7 | private String runGoal;
8 | private int attemptsCount;
9 | private int startDelay;
10 | public CompareType CompType;
11 | private int liveIndex;
12 | public bool NewBestTime;
13 | private bool oldFaster;
14 | public List segments = new List();
15 | private String runFile;
16 | private bool unsavedSplits;
17 |
18 | public String RunTitle
19 | {
20 | set { this.runTitle = value; }
21 | get { return this.runTitle; }
22 | }
23 |
24 | public String RunGoal
25 | {
26 | set { this.runGoal = value; }
27 | get { return this.runGoal; }
28 | }
29 |
30 | public int AttemptsCount
31 | {
32 | set { this.attemptsCount = value; }
33 | get { return this.attemptsCount; }
34 | }
35 |
36 | public int StartDelay
37 | {
38 | set { this.startDelay = value; }
39 | get { return this.startDelay; }
40 | }
41 |
42 | public String RunFile
43 | {
44 | set { this.runFile = value; }
45 | get { return this.runFile; }
46 | }
47 |
48 | public Boolean UnsavedSplit
49 | {
50 | set { this.unsavedSplits = value; }
51 | get { return this.unsavedSplits; }
52 | }
53 |
54 | public void Add(Segment s)
55 | {
56 | this.segments.Add(s);
57 | if ((s.BestTime != 0.0) && ((s.BestTime < s.OldTime) || (s.OldTime == 0.0)))
58 | {
59 | this.oldFaster = false;
60 | }
61 | else
62 | {
63 | this.oldFaster = true;
64 | }
65 | }
66 |
67 | public void Clear()
68 | {
69 | this.segments.Clear();
70 | this.Reset();
71 | }
72 |
73 | public double CompTime()
74 | {
75 | return this.CompTime(Math.Min(this.liveIndex, this.LastIndex));
76 | }
77 |
78 | // Now has the ability to return the sum of bests as the comparison time
79 | public double CompTime(int index)
80 | {
81 | if ((index < 0) || (index > this.LastIndex))
82 | {
83 | return 0.0;
84 | }
85 | if (this.CompType != CompareType.Best)
86 | {
87 | if (this.CompType == CompareType.Old)
88 | {
89 | return this.segments[index].OldTime;
90 | }
91 | if (this.CompType == CompareType.SumOfBests)
92 | {
93 | return this.SumOfBests(index);
94 | }
95 | if (this.oldFaster)
96 | {
97 | return this.segments[index].OldTime;
98 | }
99 | }
100 | return this.segments[index].BestTime;
101 | }
102 |
103 | public double SumOfBests(int index)
104 | {
105 | double sum = 0.0;
106 | for (int i = 0; i <= index; ++i)
107 | {
108 | if (this.segments[i].BestSegment == 0.0)
109 | return 0.0;
110 | sum += this.segments[i].BestSegment;
111 | }
112 | return sum;
113 | }
114 |
115 | public void DoSplit(double time)
116 | {
117 | if (this.LiveRun && !this.Done)
118 | {
119 | this.segments[this.liveIndex].LiveTime = time;
120 | if ((this.liveIndex == this.LastIndex) && ((this.segments[this.LastIndex].LiveTime < this.segments[this.LastIndex].BestTime) || (this.segments[this.LastIndex].BestTime == 0.0)))
121 | {
122 | this.NewBestTime = true;
123 | }
124 | this.liveIndex++;
125 | }
126 | }
127 |
128 | public double LastDelta(int index)
129 | {
130 | if ((index > 0) && (index <= this.LastIndex))
131 | {
132 | for (int i = index - 1; i >= 0; i--)
133 | {
134 | if ((this.segments[i].LiveTime != 0.0) && (this.CompTime(i) != 0.0))
135 | {
136 | return (this.segments[i].LiveTime - this.CompTime(i));
137 | }
138 | }
139 | }
140 | return 0.0;
141 | }
142 |
143 | public double LiveSegment(int index)
144 | {
145 | if ((index >= 0) && (index <= this.LastIndex))
146 | {
147 | double liveTime = this.segments[index].LiveTime;
148 | if ((index <= 0) || (liveTime <= 0.0))
149 | {
150 | return liveTime;
151 | }
152 | if (this.segments[index - 1].LiveTime > 0.0)
153 | {
154 | return (liveTime - this.segments[index - 1].LiveTime);
155 | }
156 | }
157 | return 0.0;
158 | }
159 |
160 | public void LiveToOld()
161 | {
162 | foreach (Segment segment in this.segments)
163 | {
164 | segment.OldTime = segment.LiveTime;
165 | }
166 | }
167 |
168 | public void Next()
169 | {
170 | if (this.liveIndex < this.LastIndex)
171 | {
172 | this.DoSplit(0.0);
173 | }
174 | }
175 |
176 | public void Previous()
177 | {
178 | this.liveIndex--;
179 | this.CurrentSegment.LiveTime = 0.0;
180 | this.NewBestTime = false;
181 | }
182 |
183 | public void Reset()
184 | {
185 | foreach (Segment segment in this.segments)
186 | {
187 | segment.BackupBest = segment.BestTime;
188 | segment.BackupBestSegment = segment.BestSegment;
189 | segment.LiveTime = 0.0;
190 | }
191 | this.liveIndex = 0;
192 | this.NewBestTime = false;
193 | }
194 |
195 | public void RestoreBest()
196 | {
197 | foreach (Segment segment in this.segments)
198 | {
199 | segment.BestTime = segment.BackupBest;
200 | segment.BestSegment = segment.BackupBestSegment;
201 | }
202 | if (this.LastIndex >= 0)
203 | {
204 | if ((this.segments[this.LastIndex].BestTime != 0.0) && ((this.segments[this.LastIndex].BestTime < this.segments[this.LastIndex].OldTime) || (this.segments[this.LastIndex].OldTime == 0.0)))
205 | {
206 | this.oldFaster = false;
207 | }
208 | else
209 | {
210 | this.oldFaster = true;
211 | }
212 | }
213 | }
214 |
215 | public double RunDelta(double time, int index)
216 | {
217 | if ((this.CompTime(index) > 0.0) && (time > 0.0))
218 | {
219 | return (time - this.CompTime(index));
220 | }
221 | return 0.0;
222 | }
223 |
224 | public double RunDeltaAt(int index)
225 | {
226 | if ((index >= 0) && (index <= this.LastIndex))
227 | {
228 | return this.RunDelta(this.segments[index].LiveTime, index);
229 | }
230 | return 0.0;
231 | }
232 |
233 | public double SegDelta(double time, int index)
234 | {
235 | if (this.CompTime(index) > 0.0)
236 | {
237 | return (this.RunDelta(time, index) - this.LastDelta(index));
238 | }
239 | return 0.0;
240 | }
241 |
242 | public bool NeedUpdate(bool bestOverall)
243 | {
244 | // This will never return true if no run is loaded.
245 | if (NewBestTime)
246 | return true;
247 | for (int i = 0; i <= this.LastIndex; ++i)
248 | {
249 | if (((!bestOverall && this.segments[i].LiveTime != 0.0) && (this.segments[i].LiveTime < this.segments[i].BestTime || this.segments[i].BestTime == 0.0)) // If !bestoverall and the split is faster than before
250 | || (this.segments[i].LiveTime != 0.0 && (i == 0 || this.segments[i - 1].LiveTime != 0.0) && (this.segments[i].BestSegment == 0.0 || this.LiveSegment(i) < this.segments[i].BestSegment))) // Or if it's a new Best Segment
251 | return true;
252 | }
253 | return false;
254 | }
255 |
256 | public void UpdateBest(bool bestOverall)
257 | {
258 | // Updates each segment if needed
259 | foreach (Segment segment in this.segments)
260 | {
261 | if ((bestOverall && this.NewBestTime) || ((!bestOverall && (segment.LiveTime != 0.0)) && ((segment.LiveTime < segment.BestTime) || (segment.BestTime == 0.0))))
262 | {
263 | segment.BestTime = segment.LiveTime;
264 | }
265 | }
266 |
267 | // Gets rid of incoherences
268 | double bestTime = 0.0;
269 | for (int i = this.LastIndex; i >= 0; i--)
270 | {
271 | if (this.segments[i].BestTime != 0.0)
272 | {
273 | if (bestTime == 0.0)
274 | {
275 | bestTime = this.segments[this.LastIndex].BestTime;
276 | }
277 | if (this.segments[i].BestTime > bestTime)
278 | {
279 | this.segments[i].BestTime = 0.0;
280 | }
281 | else
282 | {
283 | bestTime = this.segments[i].BestTime;
284 | }
285 | }
286 | }
287 |
288 | // Updates bests if needed
289 | for (int j = 0; j <= this.LastIndex; j++)
290 | {
291 | if (((this.segments[j].LiveTime != 0.0) && ((j == 0) || (this.segments[j - 1].LiveTime != 0.0))) && ((this.LiveSegment(j) < this.segments[j].BestSegment) || (this.segments[j].BestSegment == 0.0)))
292 | {
293 | this.segments[j].BestSegment = this.LiveSegment(j);
294 | }
295 | }
296 | if (this.LastIndex >= 0)
297 | {
298 | if ((this.segments[this.LastIndex].BestTime != 0.0) && ((this.segments[this.LastIndex].BestTime < this.segments[this.LastIndex].OldTime) || (this.segments[this.LastIndex].OldTime == 0.0)))
299 | {
300 | this.oldFaster = false;
301 | }
302 | else
303 | {
304 | this.oldFaster = true;
305 | }
306 | }
307 |
308 | NewBestTime = false;
309 | }
310 |
311 | public CompareType ComparingType
312 | {
313 | get
314 | {
315 | if (this.CompType != CompareType.Fastest)
316 | {
317 | return this.CompType;
318 | }
319 | if (this.oldFaster)
320 | {
321 | return CompareType.Old;
322 | }
323 | return CompareType.Best;
324 | }
325 | }
326 |
327 | public int Count
328 | {
329 | get
330 | {
331 | return this.segments.Count;
332 | }
333 | }
334 |
335 | public Segment CurrentSegment
336 | {
337 | get
338 | {
339 | if (this.LiveRun && !this.Done)
340 | {
341 | return this.segments[this.liveIndex];
342 | }
343 | return new Segment(null);
344 | }
345 | }
346 |
347 | public bool Done
348 | {
349 | get
350 | {
351 | return (this.LiveRun && (this.LiveIndex > this.LastIndex));
352 | }
353 | }
354 |
355 | public int LastIndex
356 | {
357 | get
358 | {
359 | return (this.segments.Count - 1);
360 | }
361 | }
362 |
363 | public Segment LastSegment
364 | {
365 | get
366 | {
367 | if (this.LiveRun)
368 | {
369 | return this.segments[this.LastIndex];
370 | }
371 | return new Segment(null);
372 | }
373 | }
374 |
375 | public int LiveIndex
376 | {
377 | get
378 | {
379 | return this.liveIndex;
380 | }
381 | }
382 |
383 | public bool LiveRun
384 | {
385 | get
386 | {
387 | return (this.segments.Count > 0);
388 | }
389 | }
390 |
391 | public enum CompareType
392 | {
393 | Fastest,
394 | Old,
395 | Best,
396 | SumOfBests
397 | }
398 | }
399 |
400 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/Properties/Settings.cs:
--------------------------------------------------------------------------------
1 | namespace WSplitTimer.Properties
2 | {
3 | using System;
4 | using System.CodeDom.Compiler;
5 | using System.Collections.Specialized;
6 | using System.ComponentModel;
7 | using System.Configuration;
8 | using System.Diagnostics;
9 | using System.Drawing;
10 | using System.Runtime.CompilerServices;
11 | using System.Windows.Forms;
12 |
13 | [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0"), CompilerGenerated]
14 | internal sealed class Settings : ApplicationSettingsBase
15 | {
16 | private static Settings defaultInstance = ((Settings)SettingsBase.Synchronized(new Settings()));
17 |
18 | public static Settings Profile
19 | {
20 | get { return defaultInstance; }
21 | }
22 |
23 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("True")]
24 | public bool BestAsOverall
25 | {
26 | get { return (bool) this["BestAsOverall"]; }
27 | set { this["BestAsOverall"] = value; }
28 | }
29 |
30 | [DefaultSettingValue("True"), DebuggerNonUserCode, UserScopedSetting]
31 | public bool ClockAccent
32 | {
33 | get { return (bool) this["ClockAccent"]; }
34 | set { this["ClockAccent"] = value; }
35 | }
36 |
37 | [DebuggerNonUserCode, UserScopedSetting, DefaultSettingValue("240, 50")]
38 | public Size ClockSize
39 | {
40 | get { return (Size) this["ClockSize"]; }
41 | set { this["ClockSize"] = value; }
42 | }
43 |
44 | [DebuggerNonUserCode, UserScopedSetting, DefaultSettingValue("0")]
45 | public int CompareAgainst
46 | {
47 | get { return (int) this["CompareAgainst"]; }
48 | set { this["CompareAgainst"] = value; }
49 | }
50 |
51 | [DebuggerNonUserCode, UserScopedSetting, DefaultSettingValue("True")]
52 | public bool DigitalClock
53 | {
54 | get { return (bool) this["DigitalClock"]; }
55 | set { this["DigitalClock"] = value; }
56 | }
57 |
58 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("False")]
59 | public bool DisplayBlankSegs
60 | {
61 | get { return (bool) this["DisplayBlankSegs"]; }
62 | set { this["DisplayBlankSegs"] = value; }
63 | }
64 |
65 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("3")]
66 | public int DisplayMode
67 | {
68 | get { return (int) this["DisplayMode"]; }
69 | set { this["DisplayMode"] = value; }
70 | }
71 |
72 | [UserScopedSetting, DefaultSettingValue("10"), DebuggerNonUserCode]
73 | public int DisplaySegs
74 | {
75 | get { return (int) this["DisplaySegs"]; }
76 | set { this["DisplaySegs"] = value; }
77 | }
78 |
79 | [DebuggerNonUserCode, UserScopedSetting, DefaultSettingValue("500")]
80 | public int DoubleTapGuard
81 | {
82 | get { return (int) this["DoubleTapGuard"]; }
83 | set { this["DoubleTapGuard"] = value; }
84 | }
85 |
86 | [UserScopedSetting, DefaultSettingValue("False"), DebuggerNonUserCode]
87 | public bool DViewDeltaMarks
88 | {
89 | get { return (bool) this["DViewDeltaMarks"]; }
90 | set { this["DViewDeltaMarks"] = value; }
91 | }
92 |
93 | [DefaultSettingValue("False"), DebuggerNonUserCode, UserScopedSetting]
94 | public bool DViewOnTop
95 | {
96 | get { return (bool) this["DViewOnTop"]; }
97 | set { this["DViewOnTop"] = value; }
98 | }
99 |
100 | [DefaultSettingValue("False"), UserScopedSetting, DebuggerNonUserCode]
101 | public bool DViewShowOld
102 | {
103 | get { return (bool) this["DViewShowOld"]; }
104 | set { this["DViewShowOld"] = value; }
105 | }
106 |
107 | [DefaultSettingValue("False"), UserScopedSetting, DebuggerNonUserCode]
108 | public bool DViewShowBest
109 | {
110 | get { return (bool)this["DViewShowBest"]; }
111 | set { this["DViewShowBest"] = value; }
112 | }
113 |
114 | [DefaultSettingValue("False"), UserScopedSetting, DebuggerNonUserCode]
115 | public bool DViewShowSumOfBests
116 | {
117 | get { return (bool)this["DViewShowSumOfBests"]; }
118 | set { this["DViewShowSumOfBests"] = value; }
119 | }
120 |
121 | [DebuggerNonUserCode, UserScopedSetting, DefaultSettingValue("True")]
122 | public bool DViewShowComp
123 | {
124 | get { return (bool) this["DViewShowComp"]; }
125 | set { this["DViewShowComp"] = value; }
126 | }
127 |
128 | [UserScopedSetting, DefaultSettingValue("True"), DebuggerNonUserCode]
129 | public bool DViewShowDeltas
130 | {
131 | get { return (bool) this["DViewShowDeltas"]; }
132 | set { this["DViewShowDeltas"] = value; }
133 | }
134 |
135 | [DefaultSettingValue("True"), UserScopedSetting, DebuggerNonUserCode]
136 | public bool DViewShowLive
137 | {
138 | get { return (bool) this["DViewShowLive"]; }
139 | set { this["DViewShowLive"] = value; }
140 | }
141 |
142 | [UserScopedSetting, DefaultSettingValue("False"), DebuggerNonUserCode]
143 | public bool DViewShowSegs
144 | {
145 | get { return (bool) this["DViewShowSegs"]; }
146 | set { this["DViewShowSegs"] = value; }
147 | }
148 |
149 | [DefaultSettingValue("2"), DebuggerNonUserCode, UserScopedSetting]
150 | public int FallbackPreference
151 | {
152 | get { return (int) this["FallbackPreference"]; }
153 | set { this["FallbackPreference"] = value; }
154 | }
155 |
156 | [DebuggerNonUserCode, DefaultSettingValue("True"), UserScopedSetting]
157 | public bool FirstRun
158 | {
159 | get { return (bool) this["FirstRun"]; }
160 | set { this["FirstRun"] = value; }
161 | }
162 |
163 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("")]
164 | public string LastFile
165 | {
166 | get { return (string) this["LastFile"]; }
167 | set { this["LastFile"] = value; }
168 | }
169 |
170 | [DebuggerNonUserCode, DefaultSettingValue("True"), UserScopedSetting]
171 | public bool LoadMostRecent
172 | {
173 | get { return (bool) this["LoadMostRecent"]; }
174 | set { this["LoadMostRecent"] = value; }
175 | }
176 |
177 | [DebuggerNonUserCode, DefaultSettingValue("False"), UserScopedSetting]
178 | public bool RainbowSplits
179 | {
180 | get { return (bool)this["RainbowSplits"]; }
181 | set { this["RainbowSplits"] = value; }
182 | }
183 |
184 | [DebuggerNonUserCode, DefaultSettingValue("False"), UserScopedSetting]
185 | public bool SplitTimes
186 | {
187 | get { return (bool)this["SplitTimes"]; }
188 | set { this["SplitTimes"] = value; }
189 | }
190 |
191 | [DebuggerNonUserCode, DefaultSettingValue("True"), UserScopedSetting]
192 | public bool ShowPrevSeg
193 | {
194 | get { return (bool)this["ShowPrevSeg"]; }
195 | set { this["ShowPrevSeg"] = value; }
196 | }
197 |
198 | [DebuggerNonUserCode, DefaultSettingValue("False"), UserScopedSetting]
199 | public bool ShowTimeSave
200 | {
201 | get { return (bool)this["ShowTimeSave"]; }
202 | set { this["ShowTimeSave"] = value; }
203 | }
204 |
205 | [DebuggerNonUserCode, DefaultSettingValue("False"), UserScopedSetting]
206 | public bool ShowSoB
207 | {
208 | get { return (bool)this["ShowSoB"]; }
209 | set { this["ShowSoB"] = value; }
210 | }
211 |
212 | [DebuggerNonUserCode, DefaultSettingValue("False"), UserScopedSetting]
213 | public bool PredPB
214 | {
215 | get { return (bool)this["PredPB"]; }
216 | set { this["PredPB"] = value; }
217 | }
218 |
219 | [DebuggerNonUserCode, DefaultSettingValue("False"), UserScopedSetting]
220 | public bool PredBest
221 | {
222 | get { return (bool)this["PredBest"]; }
223 | set { this["PredBest"] = value; }
224 | }
225 |
226 | [DebuggerNonUserCode, DefaultSettingValue("True"), UserScopedSetting]
227 | public bool HGrad
228 | {
229 | get { return (bool)this["HGrad"]; }
230 | set { this["HGrad"] = value; }
231 | }
232 |
233 | [DebuggerNonUserCode, DefaultSettingValue("36"), UserScopedSetting]
234 | public int WideHeight
235 | {
236 | get { return (int)this["WideHeight"]; }
237 | set { this["WideHeight"] = value; }
238 | }
239 |
240 | [DebuggerNonUserCode, DefaultSettingValue("0"), UserScopedSetting]
241 | public int Width
242 | {
243 | get { return (int)this["Width"]; }
244 | set { this["Width"] = value; }
245 | }
246 |
247 | [DebuggerNonUserCode, DefaultSettingValue(""), UserScopedSetting]
248 | public string last
249 | {
250 | get { return (string)this["last"]; }
251 | set { this["last"] = value; }
252 | }
253 |
254 | [DefaultSettingValue("False"), DebuggerNonUserCode, UserScopedSetting]
255 | public bool OnTop
256 | {
257 | get { return (bool) this["OnTop"]; }
258 | set { this["OnTop"] = value; }
259 | }
260 |
261 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("1")]
262 | public double Opacity
263 | {
264 | get { return (double) this["Opacity"]; }
265 | set { this["Opacity"] = value; }
266 | }
267 |
268 | [UserScopedSetting, DefaultSettingValue("\r\n"), DebuggerNonUserCode]
269 | public StringCollection RecentFiles
270 | {
271 | get { return (StringCollection) this["RecentFiles"]; }
272 | set { this["RecentFiles"] = value; }
273 | }
274 |
275 | [UserScopedSetting, DefaultSettingValue("15"), DebuggerNonUserCode]
276 | public int RefreshRate
277 | {
278 | get { return (int) this["RefreshRate"]; }
279 | set { this["RefreshRate"] = value; }
280 | }
281 |
282 | [DefaultSettingValue("True"), DebuggerNonUserCode, UserScopedSetting]
283 | public bool SaveWindowPos
284 | {
285 | get { return (bool) this["SaveWindowPos"]; }
286 | set { this["SaveWindowPos"] = value; }
287 | }
288 |
289 | [DefaultSettingValue("0"), DebuggerNonUserCode, UserScopedSetting]
290 | public int SegmentIcons
291 | {
292 | get { return (int) this["SegmentIcons"]; }
293 | set { this["SegmentIcons"] = value; }
294 | }
295 |
296 | [DefaultSettingValue("False"), DebuggerNonUserCode, UserScopedSetting]
297 | public bool ShowAttempts
298 | {
299 | get { return (bool) this["ShowAttempts"]; }
300 | set { this["ShowAttempts"] = value; }
301 | }
302 |
303 | [DefaultSettingValue("True"), UserScopedSetting, DebuggerNonUserCode]
304 | public bool ShowDecimalSeparator
305 | {
306 | get { return (bool) this["ShowDecimalSeparator"]; }
307 | set { this["ShowDecimalSeparator"] = value; }
308 | }
309 |
310 | [DebuggerNonUserCode, DefaultSettingValue("True"), UserScopedSetting]
311 | public bool ShowLastDetailed
312 | {
313 | get { return (bool) this["ShowLastDetailed"]; }
314 | set { this["ShowLastDetailed"] = value; }
315 | }
316 |
317 | [DefaultSettingValue("True"), UserScopedSetting, DebuggerNonUserCode]
318 | public bool ShowLastWide
319 | {
320 | get { return (bool) this["ShowLastWide"]; }
321 | set { this["ShowLastWide"] = value; }
322 | }
323 |
324 | [DefaultSettingValue("True"), UserScopedSetting, DebuggerNonUserCode]
325 | public bool ShowTitle
326 | {
327 | get { return (bool) this["ShowTitle"]; }
328 | set { this["ShowTitle"] = value; }
329 | }
330 |
331 | [DefaultSettingValue("True"), UserScopedSetting, DebuggerNonUserCode]
332 | public bool ShowGoal
333 | {
334 | get { return (bool)this["ShowGoal"]; }
335 | set { this["ShowGoal"] = value; }
336 | }
337 |
338 | [DebuggerNonUserCode, UserScopedSetting, DefaultSettingValue("False")]
339 | public bool WideSegBlanks
340 | {
341 | get { return (bool) this["WideSegBlanks"]; }
342 | set { this["WideSegBlanks"] = value; }
343 | }
344 |
345 | [DefaultSettingValue("3"), UserScopedSetting, DebuggerNonUserCode]
346 | public int WideSegs
347 | {
348 | get { return (int) this["WideSegs"]; }
349 | set { this["WideSegs"] = value; }
350 | }
351 |
352 | [DefaultSettingValue("20, 20"), UserScopedSetting, DebuggerNonUserCode]
353 | public Point WindowPosition
354 | {
355 | get { return (Point) this["WindowPosition"]; }
356 | set { this["WindowPosition"] = value; }
357 | }
358 |
359 | [DefaultSettingValue("Calibri"), UserScopedSetting, DebuggerNonUserCode]
360 | public String FontFamilySegments
361 | {
362 | get { return (string)this["FontFamilySegments"]; }
363 | set { this["FontFamilySegments"] = value; }
364 | }
365 |
366 | [DefaultSettingValue("1"), UserScopedSetting, DebuggerNonUserCode]
367 | public float FontMultiplierSegments
368 | {
369 | get { return (float)this["FontMultiplierSegments"]; }
370 | set { this["FontMultiplierSegments"] = value; }
371 | }
372 |
373 | [DefaultSettingValue("Microsoft Sans Serif"), UserScopedSetting, DebuggerNonUserCode]
374 | public String FontFamilyDView
375 | {
376 | get { return (string)this["FontFamilyDView"]; }
377 | set { this["FontFamilyDView"] = value; }
378 | }
379 |
380 | //
381 | // Hotkey related settings
382 | //
383 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("False")]
384 | public bool EnabledHotkeys
385 | {
386 | get { return (bool)this["EnabledHotkeys"]; }
387 | set { this["EnabledHotkeys"] = value; }
388 | }
389 |
390 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("None")]
391 | public Keys HotkeyToggleKey
392 | {
393 | get { return (Keys)this["HotkeyToggleKey"]; }
394 | set { this["HotkeyToggleKey"] = value; }
395 | }
396 |
397 | [DebuggerNonUserCode, DefaultSettingValue("None"), UserScopedSetting]
398 | public Keys NextKey
399 | {
400 | get { return (Keys)this["NextKey"]; }
401 | set { this["NextKey"] = value; }
402 | }
403 |
404 | [DefaultSettingValue("None"), UserScopedSetting, DebuggerNonUserCode]
405 | public Keys PauseKey
406 | {
407 | get { return (Keys)this["PauseKey"]; }
408 | set { this["PauseKey"] = value; }
409 | }
410 |
411 | [UserScopedSetting, DebuggerNonUserCode, DefaultSettingValue("None")]
412 | public Keys PrevKey
413 | {
414 | get { return (Keys)this["PrevKey"]; }
415 | set { this["PrevKey"] = value; }
416 | }
417 |
418 | [DefaultSettingValue("None"), UserScopedSetting, DebuggerNonUserCode]
419 | public Keys ResetKey
420 | {
421 | get { return (Keys)this["ResetKey"]; }
422 | set { this["ResetKey"] = value; }
423 | }
424 |
425 | [DefaultSettingValue("None"), UserScopedSetting, DebuggerNonUserCode]
426 | public Keys SplitKey
427 | {
428 | get { return (Keys)this["SplitKey"]; }
429 | set { this["SplitKey"] = value; }
430 | }
431 |
432 | [DefaultSettingValue("None"), UserScopedSetting, DebuggerNonUserCode]
433 | public Keys StopKey
434 | {
435 | get { return (Keys)this["StopKey"]; }
436 | set { this["StopKey"] = value; }
437 | }
438 |
439 | [DefaultSettingValue("None"), UserScopedSetting, DebuggerNonUserCode]
440 | public Keys CompTypeKey
441 | {
442 | get { return (Keys)this["CompTypeKey"]; }
443 | set { this["CompTypeKey"] = value; }
444 | }
445 |
446 | //
447 | // Background related settings
448 | //
449 |
450 | [DefaultSettingValue("False"), UserScopedSetting, DebuggerNonUserCode]
451 | public bool BackgroundBlack
452 | {
453 | get { return (bool)this["BackgroundBlack"]; }
454 | set { this["BackgroundBlack"] = value; }
455 | }
456 |
457 | [DefaultSettingValue("False"), UserScopedSetting, DebuggerNonUserCode]
458 | public bool BackgroundPlain
459 | {
460 | get { return (bool)this["BackgroundPlain"]; }
461 | set { this["BackgroundPlain"] = value; }
462 | }
463 |
464 | [DefaultSettingValue("False"), UserScopedSetting, DebuggerNonUserCode]
465 | public bool BackgroundImage
466 | {
467 | get { return (bool)this["BackgroundImage"]; }
468 | set { this["BackgroundImage"] = value; }
469 | }
470 |
471 | [DefaultSettingValue(""), UserScopedSetting, DebuggerNonUserCode]
472 | public String BackgroundImageFilename
473 | {
474 | get { return (String)this["BackgroundImageFilename"]; }
475 | set { this["BackgroundImageFilename"] = value; }
476 | }
477 |
478 | [DefaultSettingValue("0, 0, 0, 0"), UserScopedSetting, DebuggerNonUserCode]
479 | public Rectangle BackgroundImageSelection
480 | {
481 | get { return (Rectangle)this["BackgroundImageSelection"]; }
482 | set { this["BackgroundImageSelection"] = value; }
483 | }
484 |
485 | [DefaultSettingValue("100"), UserScopedSetting, DebuggerNonUserCode]
486 | public int BackgroundOpacity
487 | {
488 | get { return (int)this["BackgroundOpacity"]; }
489 | set { this["BackgroundOpacity"] = value; }
490 | }
491 | }
492 | }
493 |
494 |
--------------------------------------------------------------------------------
/WSplit/WSplitTimer/SettingsDialog.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Data;
5 | using System.Drawing;
6 | using System.Linq;
7 | using System.Runtime.InteropServices;
8 | using System.Text;
9 | using System.Text.RegularExpressions;
10 | using System.Windows.Forms;
11 | using WSplitTimer.Properties;
12 |
13 | namespace WSplitTimer
14 | {
15 | public partial class SettingsDialog : Form
16 | {
17 | private WSplit wsplit;
18 |
19 | private List panelList = new List();
20 | private int activePanel = -1;
21 |
22 | private List hotkeyList = new List();
23 | private int selectedHotkeyIndex;
24 | Keys newHotkey;
25 |
26 | private string[] fontNames = FontFamily.Families.Select(f => f.Name).ToArray();
27 |
28 | private BackgroundImageDialog backgroundImageDialog;
29 | private BackgroundImageDialog BackgroundImageDialog
30 | {
31 | get
32 | {
33 | if (this.backgroundImageDialog == null)
34 | this.backgroundImageDialog = new BackgroundImageDialog();
35 | return this.backgroundImageDialog;
36 | }
37 | }
38 |
39 | protected override CreateParams CreateParams
40 | {
41 | // Overriding this property as done here gets rid of graphical artifacts
42 | // that occur when many controls are updated at once.
43 | get
44 | {
45 | CreateParams cp = base.CreateParams;
46 | cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
47 | return cp;
48 | }
49 | }
50 |
51 | public string StartDelay
52 | {
53 | get { return this.textBoxStartDelay.Text; }
54 | set { this.textBoxStartDelay.Text = value; }
55 | }
56 |
57 | public int DetailedWidth
58 | {
59 | get { return (int)this.numericUpDownDetailedWidth.Value; }
60 | set { this.numericUpDownDetailedWidth.Value = value; }
61 | }
62 |
63 | public bool BackgroundSettingsChanged
64 | {
65 | get;
66 | private set;
67 | }
68 |
69 | private int ActivePanel
70 | {
71 | get { return this.activePanel; }
72 | set
73 | {
74 | this.activePanel = value;
75 | this.panelList[this.activePanel].BringToFront();
76 | }
77 | }
78 |
79 | public SettingsDialog()
80 | {
81 | InitializeComponent();
82 |
83 | // Setting up list view and panels:
84 | this.panelList.Add(this.panelGeneralOptions);
85 | this.panelList.Add(this.panelHotkeys);
86 | this.panelList.Add(this.panelFontSettings);
87 | this.panelList.Add(this.panelDisplaySettings);
88 |
89 | // Setting up other controls:
90 | this.hotkeyList.AddRange(new Keys[8]);
91 |
92 | this.listViewHotkeys.BeginUpdate();
93 | for (int i = 0; i < hotkeyList.Count; ++i)
94 | this.listViewHotkeys.Items[i].SubItems.Add("");
95 | this.listViewHotkeys.EndUpdate();
96 |
97 | this.comboBoxPrimWndFont.BeginUpdate();
98 | this.comboBoxPrimWndFont.Items.AddRange(this.fontNames);
99 | this.comboBoxPrimWndFont.EndUpdate();
100 |
101 | this.comboBoxDViewFont.BeginUpdate();
102 | this.comboBoxDViewFont.Items.AddRange(this.fontNames);
103 | this.comboBoxDViewFont.EndUpdate();
104 | }
105 |
106 | // Custom ShowDialog method, that will populate the settings before calling the default method
107 | public DialogResult ShowDialog(WSplit wsplit, int startupPanel)
108 | {
109 | this.wsplit = wsplit;
110 |
111 | ListView_SetItemSpacing(listViewPanelSelector, (short)listViewPanelSelector.ClientSize.Width, 76);
112 |
113 | // Moves the wanted panel on top of the others
114 | this.listViewPanelSelector.Items[startupPanel].Selected = true;
115 | this.ActivePanel = startupPanel;
116 |
117 | // Tell that, so far, there were no change in the background settings:
118 | this.BackgroundSettingsChanged = false;
119 |
120 | // If for some reason, a value is not compatible with WSplit, the settings
121 | // will automatically be brought back to default.
122 | try
123 | {
124 | this.PopulateSettings();
125 | }
126 | catch (Exception) // Any kind of exception
127 | {
128 | this.RestoreDefaults();
129 | MessageBoxEx.Show(this,
130 | "An error has occurred and your settings were brought back to defaults.",
131 | "Defaults Restored", MessageBoxButtons.OK, MessageBoxIcon.Error);
132 | }
133 |
134 | return base.ShowDialog(wsplit);
135 | }
136 |
137 | private void PopulateSettings()
138 | {
139 | //
140 | // Initializing controls with application global settings
141 | //
142 | // General options:
143 | this.trackBarDoubleTap.Value = Settings.Profile.DoubleTapGuard / 50;
144 | this.UpdateDoubleTapDelayDisplay();
145 | this.trackBarRefreshInterval.Value = Settings.Profile.RefreshRate;
146 | this.UpdateRefreshIntervalDisplay();
147 | this.comboBoxFallback.SelectedIndex = Settings.Profile.FallbackPreference;
148 | this.checkBoxWindowPos.Checked = Settings.Profile.SaveWindowPos;
149 | this.checkBoxReloadRun.Checked = Settings.Profile.LoadMostRecent;
150 | this.checkBox1.Checked = Settings.Profile.RainbowSplits;
151 | this.checkBox2.Checked = Settings.Profile.SplitTimes;
152 | this.numwv.Value = Settings.Profile.WideHeight;
153 |
154 | // Global hotkeys:
155 | this.checkBoxHotkeysEnabled.Checked = Settings.Profile.EnabledHotkeys;
156 |
157 | this.hotkeyList[0] = Settings.Profile.SplitKey;
158 | this.hotkeyList[1] = Settings.Profile.PauseKey;
159 | this.hotkeyList[2] = Settings.Profile.StopKey;
160 | this.hotkeyList[3] = Settings.Profile.ResetKey;
161 | this.hotkeyList[4] = Settings.Profile.PrevKey;
162 | this.hotkeyList[5] = Settings.Profile.NextKey;
163 | this.hotkeyList[6] = Settings.Profile.CompTypeKey;
164 | this.hotkeyList[7] = Settings.Profile.HotkeyToggleKey;
165 |
166 | this.listViewHotkeys.BeginUpdate();
167 | for (int i = 0; i < hotkeyList.Count; ++i)
168 | this.listViewHotkeys.Items[i].SubItems[1] = new ListViewItem.ListViewSubItem(this.listViewHotkeys.Items[i], FormatHotkey(hotkeyList[i]));
169 | this.listViewHotkeys.EndUpdate();
170 |
171 | this.selectedHotkeyIndex = 0;
172 | this.listViewHotkeys.Items[this.selectedHotkeyIndex].Selected = true;
173 |
174 | // Font settings:
175 | this.comboBoxPrimWndFont.SelectedItem =
176 | (fontNames.Any(f => f == Settings.Profile.FontFamilySegments)) ? Settings.Profile.FontFamilySegments : FontFamily.GenericSansSerif.Name;
177 | this.comboBoxDViewFont.SelectedItem =
178 | (fontNames.Any(f => f == Settings.Profile.FontFamilyDView)) ? Settings.Profile.FontFamilyDView : FontFamily.GenericSansSerif.Name;
179 |
180 | this.numericUpDownPrimWndMult.Value = (decimal)Settings.Profile.FontMultiplierSegments;
181 | this.checkBoxClockDigitalFont.Checked = Settings.Profile.DigitalClock;
182 |
183 | // Display settings:
184 | this.trackBarOpacity.Value = (int)(Settings.Profile.Opacity * 100);
185 |
186 | this.checkBoxShowTitle.Checked = Settings.Profile.ShowTitle;
187 | this.checkBoxShowAttemptCount.Checked = Settings.Profile.ShowAttempts;
188 | this.comboBoxIcons.SelectedIndex = Settings.Profile.SegmentIcons;
189 |
190 | switch ((WSplit.DisplayMode)Settings.Profile.DisplayMode)
191 | {
192 | case WSplit.DisplayMode.Timer: this.radioButtonDisplayTimer.Checked = true; break;
193 | case WSplit.DisplayMode.Compact: this.radioButtonDisplayCompact.Checked = true; break;
194 | case WSplit.DisplayMode.Wide: this.radioButtonDisplayWide.Checked = true; break;
195 | default: this.radioButtonDisplayDetailed.Checked = true; break;
196 | }
197 |
198 | this.checkBoxDetailedBlanks.Checked = Settings.Profile.DisplayBlankSegs;
199 | this.checkBoxDetailedShowLast.Checked = Settings.Profile.ShowLastDetailed;
200 | this.numericUpDownDetailedSegments.Value = Settings.Profile.DisplaySegs;
201 |
202 | this.checkBoxWideBlanks.Checked = Settings.Profile.WideSegBlanks;
203 | this.checkBoxWideShowLast.Checked = Settings.Profile.ShowLastWide;
204 | this.numericUpDownWideSegments.Value = Settings.Profile.WideSegs;
205 | }
206 |
207 | private void RestoreDefaults()
208 | {
209 | Settings.Profile.Reset();
210 | Settings.Profile.FirstRun = false;
211 | this.PopulateSettings();
212 | }
213 |
214 | public void ApplyChanges()
215 | {
216 | // Called manually after dialog is closed.
217 | // Saves all the control states in the Settings
218 |
219 | // General options:
220 | Settings.Profile.DoubleTapGuard = this.trackBarDoubleTap.Value * 50;
221 | Settings.Profile.RefreshRate = this.trackBarRefreshInterval.Value;
222 | Settings.Profile.FallbackPreference = this.comboBoxFallback.SelectedIndex;
223 | Settings.Profile.SaveWindowPos = this.checkBoxWindowPos.Checked;
224 | Settings.Profile.LoadMostRecent = this.checkBoxReloadRun.Checked;
225 | Settings.Profile.RainbowSplits = this.checkBox1.Checked;
226 | Settings.Profile.SplitTimes = this.checkBox2.Checked;
227 | Settings.Profile.WideHeight = (int)this.numwv.Value;
228 |
229 | // Global hotkeys:
230 | Settings.Profile.EnabledHotkeys = this.checkBoxHotkeysEnabled.Checked;
231 |
232 | Settings.Profile.SplitKey = this.hotkeyList[0];
233 | Settings.Profile.PauseKey = this.hotkeyList[1];
234 | Settings.Profile.StopKey = this.hotkeyList[2];
235 | Settings.Profile.ResetKey = this.hotkeyList[3];
236 | Settings.Profile.PrevKey = this.hotkeyList[4];
237 | Settings.Profile.NextKey = this.hotkeyList[5];
238 | Settings.Profile.CompTypeKey = this.hotkeyList[6];
239 | Settings.Profile.HotkeyToggleKey = this.hotkeyList[7];
240 |
241 | // Font settings:
242 | Settings.Profile.FontFamilySegments = (string)this.comboBoxPrimWndFont.SelectedItem;
243 | Settings.Profile.FontMultiplierSegments = (float)this.numericUpDownPrimWndMult.Value;
244 | Settings.Profile.DigitalClock = this.checkBoxClockDigitalFont.Checked;
245 |
246 | Settings.Profile.FontFamilyDView = (string)this.comboBoxDViewFont.SelectedItem;
247 |
248 | // Display settings:
249 | Settings.Profile.Opacity = this.trackBarOpacity.Value / 100.0;
250 |
251 | Settings.Profile.ShowTitle = this.checkBoxShowTitle.Checked;
252 | Settings.Profile.ShowAttempts = this.checkBoxShowAttemptCount.Checked;
253 | Settings.Profile.SegmentIcons = this.comboBoxIcons.SelectedIndex;
254 |
255 | if (this.radioButtonDisplayTimer.Checked)
256 | Settings.Profile.DisplayMode = (int)WSplit.DisplayMode.Timer;
257 | else if (this.radioButtonDisplayCompact.Checked)
258 | Settings.Profile.DisplayMode = (int)WSplit.DisplayMode.Compact;
259 | else if (this.radioButtonDisplayWide.Checked)
260 | Settings.Profile.DisplayMode = (int)WSplit.DisplayMode.Wide;
261 | else
262 | Settings.Profile.DisplayMode = (int)WSplit.DisplayMode.Detailed;
263 |
264 | Settings.Profile.DisplayBlankSegs = this.checkBoxDetailedBlanks.Checked;
265 | Settings.Profile.ShowLastDetailed = this.checkBoxDetailedShowLast.Checked;
266 | Settings.Profile.DisplaySegs = (int)this.numericUpDownDetailedSegments.Value;
267 |
268 | Settings.Profile.WideSegBlanks = this.checkBoxWideBlanks.Checked;
269 | Settings.Profile.ShowLastWide = this.checkBoxWideShowLast.Checked;
270 | Settings.Profile.WideSegs = (int)this.numericUpDownWideSegments.Value;
271 | }
272 |
273 | private string FormatHotkey(Keys key)
274 | {
275 | string str = "";
276 | Keys keys = key & Keys.KeyCode;
277 |
278 | if ((keys != Keys.ControlKey) && ((key & Keys.Control) == Keys.Control))
279 | str += "Ctrl+";
280 |
281 | if ((keys != Keys.ShiftKey) && ((key & Keys.Shift) == Keys.Shift))
282 | str += "Shift+";
283 |
284 | if ((keys != Keys.Menu) && ((key & Keys.Alt) == Keys.Alt))
285 | str += "Alt+";
286 |
287 | return (str + keys);
288 | }
289 |
290 | private void UpdateDoubleTapDelayDisplay()
291 | {
292 | if (this.trackBarDoubleTap.Value == 0)
293 | this.labelDoubleTapDisplay.Text = "Off";
294 | else
295 | this.labelDoubleTapDisplay.Text = (this.trackBarDoubleTap.Value * 50) + " ms";
296 | }
297 |
298 | private void UpdateRefreshIntervalDisplay()
299 | {
300 | this.labelRefreshIntervalDisplay.Text = this.trackBarRefreshInterval.Value + " ms";
301 | }
302 |
303 | private void UpdateOpacityDisplay()
304 | {
305 | this.labelOpacityDisplay.Text = this.trackBarOpacity.Value + "%";
306 | this.wsplit.Opacity = trackBarOpacity.Value / 100.0;
307 | }
308 |
309 | [DllImport("user32.dll")]
310 | public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
311 |
312 | public void ListView_SetItemSpacing(ListView listView, short leftPadding, short topPadding)
313 | {
314 | SendMessage(listView.Handle, 0x1035, IntPtr.Zero, (IntPtr)(((ushort)leftPadding) | (uint)(topPadding << 16)));
315 | }
316 |
317 | private void listViewPanelSelector_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
318 | {
319 | // If the item that sends the event is not the one that was already selected,
320 | // we proceed to the switch between the panels by bringing the selected one to the front
321 | if (this.ActivePanel != e.ItemIndex)
322 | {
323 | this.ActivePanel = e.ItemIndex;
324 | }
325 | }
326 |
327 | private void listViewPanelSelector_MouseUp(object sender, MouseEventArgs e)
328 | {
329 | // When the user is done clicking, the selected input is set to the last item
330 | // that got checked or unchecked. Therefore, if the user clicked on an item,
331 | // this item stays selected. If the user clicks the background, the last selected
332 | // item (which got unselected by clicking) is selected again.
333 | this.listViewPanelSelector.Items[this.activePanel].Selected = true;
334 | }
335 |
336 | private void trackBarDoubleTap_ValueChanged(object sender, EventArgs e)
337 | {
338 | this.UpdateDoubleTapDelayDisplay();
339 | }
340 |
341 | private void trackBarRefreshInterval_ValueChanged(object sender, EventArgs e)
342 | {
343 | this.UpdateRefreshIntervalDisplay();
344 | }
345 |
346 | private void listViewHotkeys_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
347 | {
348 | // Same as page selector ListView
349 | if (e.Item.Selected)
350 | {
351 | this.selectedHotkeyIndex = e.ItemIndex;
352 | this.textBoxHotkey.Text = FormatHotkey(this.hotkeyList[this.selectedHotkeyIndex]);
353 | }
354 | }
355 |
356 | private void listViewHotkeys_MouseUp(object sender, MouseEventArgs e)
357 | {
358 | // Same as page selector ListView
359 | this.listViewHotkeys.Items[this.selectedHotkeyIndex].Selected = true;
360 | this.textBoxHotkey.Focus();
361 | this.textBoxHotkey.Select(0, 0);
362 | }
363 |
364 | private void textBoxHotkey_KeyDown(object sender, KeyEventArgs e)
365 | {
366 | this.newHotkey = e.KeyData;
367 | this.textBoxHotkey.Text = FormatHotkey(this.newHotkey);
368 | }
369 |
370 | private void buttonSetHotkey_Click(object sender, EventArgs e)
371 | {
372 | this.hotkeyList[this.listViewHotkeys.SelectedIndices[0]] = this.newHotkey;
373 | this.listViewHotkeys.Items[this.listViewHotkeys.SelectedIndices[0]].SubItems[1].Text = this.FormatHotkey(this.newHotkey);
374 | }
375 |
376 | private void buttonClearHotkey_Click(object sender, EventArgs e)
377 | {
378 | this.newHotkey = Keys.None;
379 | this.hotkeyList[this.listViewHotkeys.SelectedIndices[0]] = this.newHotkey;
380 | this.listViewHotkeys.Items[this.listViewHotkeys.SelectedIndices[0]].SubItems[1].Text = this.FormatHotkey(this.newHotkey);
381 | this.textBoxHotkey.Text = this.FormatHotkey(this.newHotkey);
382 | }
383 |
384 | private void trackBarOpacity_ValueChanged(object sender, EventArgs e)
385 | {
386 | this.UpdateOpacityDisplay();
387 | }
388 |
389 | private void buttonDefaults_Click(object sender, EventArgs e)
390 | {
391 | if (MessageBoxEx.Show(this, "Are you sure?", "Restore Defaults", MessageBoxButtons.YesNo) == DialogResult.Yes)
392 | {
393 | this.RestoreDefaults();
394 | }
395 | }
396 |
397 | private void textBoxStartDelay_KeyPress(object sender, KeyPressEventArgs e)
398 | {
399 | if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != ':' && e.KeyChar != '.' && e.KeyChar != ',')
400 | e.Handled = true;
401 | }
402 |
403 | private void textBoxStartDelay_TextChanged(object sender, EventArgs e)
404 | {
405 | if (Regex.IsMatch(this.textBoxStartDelay.Text, "[^0-9:.,]"))
406 | this.textBoxStartDelay.Text = Regex.Replace(this.textBoxStartDelay.Text, "[^0-9:.,]", "");
407 | }
408 |
409 | private void buttonBackgroundImage_Click(object sender, EventArgs e)
410 | {
411 | // Shows the backgroundImageDialog and, if OK is clicked, apply the settings
412 | if (this.BackgroundImageDialog.ShowDialog(this, wsplit) == DialogResult.OK)
413 | {
414 | this.BackgroundImageDialog.ApplyChanges();
415 | this.BackgroundSettingsChanged = true;
416 | }
417 | }
418 | }
419 | }
420 |
--------------------------------------------------------------------------------