├── .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 | --------------------------------------------------------------------------------