Skip to content

Commit fdbad7a

Browse files
committedDec 22, 2022
Merge branch 'dev'
* dev: (73 commits) Changed: get unity installs returns list instead of array, Editors: add uninstall context menu (fix #103) updates: add download & install button, add null version checks upgrade window: add Download & Install button, show red outline if project version is missing, adjust ui aligments fix changed download urls for Alpha, Beta fix: null ref is explore folder, without projects on the list (or filtered by search) rearrange settings panel (fix #40), set bigger minimum window width hide git branch text on streamermode if press up/down while tabcontrol is focused, move selection to grid recent project: disable opening project from datagrid header or scrollbar double clicks (fix #106) editors: add download win/linux dedicated server modules, new project: add tooltip if projectname already exists editors: add IL2CPP module download context menu fix null version code error from unity editor preview builds, add: browse Scripts folder parent, if missing scripts folder. improve release notes url parsing better default settings (window size, single instance, humanfriendly dates, override 40 max projects) fix: removing manually added project (without it being opened first) new project: autoselect win64 if no matching platform in selected unity, disable process hidden window on launch (whole editor was invisible) add "win64" as default platform, add releasetype (lts/alpha/beta) to new project dialog, move releasetype checking to Tools, fix preferred version initial value from "none" to null, fix launching empty folder from context menu, without preferred unity version add initscript for new quick projects started without name dialog, hide console window on process start (it was visible in unity 2023, not visible in older versions(?)), set enableProjectRename and showTargetPlatform settings as true by default) handle corrupt user config, take backup of user config (fix #99) ... # Conflicts: # UnityLauncherPro/Tools.cs (using dev)
2 parents b93fb89 + 771e8ae commit fdbad7a

25 files changed

+3495
-1706
lines changed
 

‎UnityLauncherPro/App.config

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
<?xml version="1.0" encoding="utf-8" ?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
3+
<runtime>
4+
<AppContextSwitchOverrides value="Switch.System.Windows.DoNotScaleForDpiChanges=false"/>
5+
</runtime>
36
<configSections>
4-
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
5-
<section name="UnityLauncherPro.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
7+
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
8+
<section name="UnityLauncherPro.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
69
</sectionGroup>
710
</configSections>
811
<startup>
9-
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
12+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
1013
</startup>
1114
<userSettings>
1215
<UnityLauncherPro.Properties.Settings>
@@ -16,14 +19,6 @@
1619
<setting name="windowHeight" serializeAs="String">
1720
<value>650</value>
1821
</setting>
19-
<setting name="rootFolders" serializeAs="Xml">
20-
<value>
21-
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
22-
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
23-
<string>C:\Program Files\</string>
24-
</ArrayOfString>
25-
</value>
26-
</setting>
2722
<setting name="minimizeToTaskbar" serializeAs="String">
2823
<value>True</value>
2924
</setting>
@@ -49,10 +44,10 @@
4944
<value>False</value>
5045
</setting>
5146
<setting name="preferredVersion" serializeAs="String">
52-
<value />
47+
<value/>
5348
</setting>
5449
<setting name="newProjectsRoot" serializeAs="String">
55-
<value />
50+
<value/>
5651
</setting>
5752
<setting name="askNameForQuickProject" serializeAs="String">
5853
<value>True</value>
@@ -67,7 +62,7 @@
6762
<value>False</value>
6863
</setting>
6964
<setting name="webglBuildPath" serializeAs="String">
70-
<value />
65+
<value/>
7166
</setting>
7267
<setting name="useCustomTheme" serializeAs="String">
7368
<value>False</value>
@@ -100,14 +95,47 @@
10095
<value>0</value>
10196
</setting>
10297
<setting name="templatePackagesFolder" serializeAs="String">
103-
<value />
98+
<value/>
10499
</setting>
105100
<setting name="newProjectPlatform" serializeAs="String">
106-
<value />
101+
<value/>
107102
</setting>
108103
<setting name="searchProjectPathAlso" serializeAs="String">
109104
<value>False</value>
110105
</setting>
106+
<setting name="checkPlasticBranch" serializeAs="String">
107+
<value>False</value>
108+
</setting>
109+
<setting name="shortcutBatchFileFolder" serializeAs="String">
110+
<value/>
111+
</setting>
112+
<setting name="rootFolders" serializeAs="Xml">
113+
<value>
114+
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
115+
<string>C:\Program Files\</string>
116+
</ArrayOfString>
117+
</value>
118+
</setting>
119+
<setting name="customInitFile" serializeAs="String">
120+
<value>InitializeProject.cs</value>
121+
</setting>
122+
<setting name="useInitScript" serializeAs="String">
123+
<value>False</value>
124+
</setting>
125+
<setting name="webglPort" serializeAs="String">
126+
<value>50000</value>
127+
</setting>
128+
<setting name="projectPaths" serializeAs="Xml">
129+
<value>
130+
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
131+
</value>
132+
</setting>
133+
<setting name="override40ProjectCount" serializeAs="String">
134+
<value>False</value>
135+
</setting>
136+
<setting name="maxProjectCount" serializeAs="String">
137+
<value>40</value>
138+
</setting>
111139
</UnityLauncherPro.Properties.Settings>
112140
</userSettings>
113-
</configuration>
141+
</configuration>

‎UnityLauncherPro/App.xaml

Lines changed: 531 additions & 6 deletions
Large diffs are not rendered by default.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows.Data;
4+
5+
namespace UnityLauncherPro.Converters
6+
{
7+
[ValueConversion(typeof(DateTime), typeof(String))]
8+
public class ReleaseDateConverter : IValueConverter
9+
{
10+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
11+
{
12+
if (value == null) return null;
13+
DateTime date = (DateTime)value;
14+
15+
// get first part of string until space character (updates only contain mm/dd/yyyy)
16+
string dateStrTrimmed = MainWindow.currentDateFormat;
17+
if (dateStrTrimmed.IndexOf(' ') > -1) dateStrTrimmed = dateStrTrimmed.Split(' ')[0];
18+
19+
return MainWindow.useHumanFriendlyDateFormat ? Tools.GetElapsedTime(date) : date.ToString(dateStrTrimmed);
20+
}
21+
22+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
23+
{
24+
// not used ?
25+
return DateTime.ParseExact((string)value, MainWindow.currentDateFormat, culture);
26+
}
27+
28+
}
29+
}

‎UnityLauncherPro/Data/BuildReport.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Collections.Generic;
2+
3+
namespace UnityLauncherPro
4+
{
5+
public class BuildReport
6+
{
7+
public long ElapsedTimeMS { set; get; }
8+
public List<BuildReportItem> Stats { set; get; } // overal per category sizes
9+
public List<BuildReportItem> Items { set; get; } // report rows
10+
}
11+
}

‎UnityLauncherPro/Data/BuildReportItem.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
public class BuildReportItem
44
{
55
// TODO use real values, so can sort and convert kb/mb
6+
public string Category { set; get; } // for category list
67
public string Size { set; get; }
78
public string Percentage { set; get; }
89
public string Path { set; get; }

‎UnityLauncherPro/Data/Project.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Diagnostics;
32
using System.Globalization;
43
using System.Windows.Data;
54

@@ -12,9 +11,9 @@ public class Project : IValueConverter
1211
public string Path { set; get; }
1312
public DateTime? Modified { set; get; }
1413
public string Arguments { set; get; }
15-
public string GITBranch { set; get; }
14+
public string GITBranch { set; get; } // TODO rename to Branch
1615
//public string TargetPlatform { set; get; }
17-
public string TargetPlatform { set; get; }
16+
public string TargetPlatform { set; get; } // TODO rename to Platform
1817
public string[] TargetPlatforms { set; get; }
1918
public bool folderExists { set; get; }
2019

‎UnityLauncherPro/Data/UnityInstallation.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace UnityLauncherPro
66
public class UnityInstallation : IValueConverter
77
{
88
public string Version { set; get; }
9+
public long VersionCode { set; get; } // version as number, cached for sorting
910
public string Path { set; get; } // exe path
1011
public DateTime? Installed { set; get; }
1112

@@ -15,6 +16,8 @@ public class UnityInstallation : IValueConverter
1516

1617
public bool IsPreferred { set; get; }
1718

19+
public string ReleaseType { set; get; } // Alpha, Beta, LTS.. TODO could be enum
20+
1821
// https://stackoverflow.com/a/5551986/5452781
1922
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
2023
{

‎UnityLauncherPro/GetProjects.cs

Lines changed: 159 additions & 81 deletions
Large diffs are not rendered by default.

‎UnityLauncherPro/GetUnityInstallations.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ public static class GetUnityInstallations
1313

1414

1515
// returns unity installations
16-
public static UnityInstallation[] Scan()
16+
public static List<UnityInstallation> Scan()
1717
{
18-
// convert settings list to string array
18+
// get list from settings
1919
var rootFolders = Properties.Settings.Default.rootFolders;
2020

2121
// unityversion, exe_path
2222
List<UnityInstallation> results = new List<UnityInstallation>();
2323

24-
// iterate all root folders
24+
// iterate all folders under root folders
2525
foreach (string rootFolder in rootFolders)
2626
{
2727
// if folder exists
@@ -59,6 +59,7 @@ public static UnityInstallation[] Scan()
5959
DateTime? installDate = Tools.GetLastModifiedTime(dataFolder);
6060
UnityInstallation unity = new UnityInstallation();
6161
unity.Version = version;
62+
unity.VersionCode = Tools.VersionAsLong(version); // cached version code
6263
unity.Path = exePath;
6364
unity.Installed = installDate;
6465
unity.IsPreferred = (version == MainWindow.preferredVersion);
@@ -83,11 +84,31 @@ public static UnityInstallation[] Scan()
8384
} // all root folders
8485

8586
// sort by version
86-
results.Sort((s1, s2) => Tools.VersionAsInt(s2.Version).CompareTo(Tools.VersionAsInt(s1.Version)));
87+
results.Sort((s1, s2) => s2.VersionCode.CompareTo(s1.VersionCode));
8788

88-
return results.ToArray();
89+
return results;
8990
} // scan()
9091

92+
public static bool HasUnityInstallations(string path)
93+
{
94+
var directories = Directory.GetDirectories(path);
95+
96+
// loop folders inside root
97+
for (int i = 0, length = directories.Length; i < length; i++)
98+
{
99+
var editorFolder = Path.Combine(directories[i], "Editor");
100+
if (Directory.Exists(editorFolder) == false) continue;
101+
102+
var editorExe = Path.Combine(editorFolder, "Unity.exe");
103+
if (File.Exists(editorExe) == false) continue;
104+
105+
// have atleast 1 installation
106+
return true;
107+
}
108+
109+
return false;
110+
}
111+
91112
// scans unity installation folder for installed platforms
92113
static string[] GetPlatforms(string dataFolder)
93114
{

‎UnityLauncherPro/GetUnityUpdates.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,39 @@ public static async Task<string> Scan()
4444
return result;
4545
}
4646

47-
public static Updates[] Parse(string items)// object sender, DownloadStringCompletedEventArgs e)
47+
public static Updates[] Parse(string items)
4848
{
4949
isDownloadingUnityList = false;
5050
//SetStatus("Downloading list of Unity versions ... done");
5151
var receivedList = items.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
5252
if (receivedList == null && receivedList.Length < 1) return null;
5353
Array.Reverse(receivedList);
54-
var updates = new List<Updates>();
54+
var releases = new Dictionary<string, Updates>();
5555
// parse into data
56+
string prevVersion = null;
5657
for (int i = 0, len = receivedList.Length; i < len; i++)
5758
{
5859
var row = receivedList[i].Split(',');
5960
var versionTemp = row[6].Trim('"');
60-
var u = new Updates();
61-
u.ReleaseDate = DateTime.ParseExact(row[3], "MM/dd/yyyy", CultureInfo.InvariantCulture); //DateTime ? lastUpdated = Tools.GetLastModifiedTime(csprojFile);
62-
u.Version = versionTemp;
63-
updates.Add(u);
61+
62+
if (versionTemp.Length < 1) continue;
63+
if (prevVersion == versionTemp) continue;
64+
65+
if (releases.ContainsKey(versionTemp) == false)
66+
{
67+
var u = new Updates();
68+
u.ReleaseDate = DateTime.ParseExact(row[3], "MM/dd/yyyy", CultureInfo.InvariantCulture);
69+
u.Version = versionTemp;
70+
releases.Add(versionTemp, u);
71+
}
72+
73+
prevVersion = versionTemp;
6474
}
6575

66-
return updates.ToArray();
76+
// convert to array
77+
var results = new Updates[releases.Count];
78+
releases.Values.CopyTo(results, 0);
79+
return results;
6780
}
6881

6982
}

‎UnityLauncherPro/MainWindow.xaml

Lines changed: 255 additions & 564 deletions
Large diffs are not rendered by default.

‎UnityLauncherPro/MainWindow.xaml.cs

Lines changed: 1226 additions & 288 deletions
Large diffs are not rendered by default.

‎UnityLauncherPro/NewProject.xaml

Lines changed: 9 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -5,180 +5,16 @@
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
xmlns:local="clr-namespace:UnityLauncherPro"
77
mc:Ignorable="d"
8-
Title="Create New Project" Height="310" Width="450" Background="{DynamicResource ThemeDarkestBackground}" PreviewKeyDown="Window_PreviewKeyDown" ResizeMode="NoResize" WindowStartupLocation="CenterOwner">
9-
<Window.Resources>
10-
<!-- custom buttons -->
11-
<Style x:Key="CustomButton" TargetType="{x:Type Button}">
12-
<Setter Property="SnapsToDevicePixels" Value="true"/>
13-
<Setter Property="OverridesDefaultStyle" Value="true"/>
14-
<Setter Property="Template">
15-
<Setter.Value>
16-
<ControlTemplate TargetType="{x:Type Button}">
17-
<Border x:Name="shortcutbutton" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}">
18-
<ContentPresenter Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
19-
</Border>
20-
<ControlTemplate.Triggers>
21-
<Trigger Property="IsMouseOver" Value="true">
22-
<Setter TargetName="shortcutbutton" Property="Background" Value="#FF494949" />
23-
</Trigger>
24-
<Trigger Property="IsPressed" Value="true">
25-
<Setter TargetName="shortcutbutton" Property="Background" Value="#FF0F0F0F" />
26-
</Trigger>
27-
<Trigger Property="IsFocused" Value="true">
28-
<Setter TargetName="shortcutbutton" Property="BorderBrush" Value="{DynamicResource ThemeSystemHighlight}" />
29-
<Setter TargetName="shortcutbutton" Property="BorderThickness" Value="1" />
30-
</Trigger>
31-
</ControlTemplate.Triggers>
32-
</ControlTemplate>
33-
</Setter.Value>
34-
</Setter>
35-
</Style>
36-
37-
<!--TODO move to styles-->
38-
<!-- datagrid rows & row selection -->
39-
<Style TargetType="DataGridRow">
40-
<Setter Property="Background" Value="{DynamicResource ThemeButtonBackground}" />
41-
<Setter Property="BorderBrush" Value="{x:Null}" />
42-
<Setter Property="BorderThickness" Value="0,0,0,0" />
43-
<Style.Triggers>
44-
<!--<Trigger Property="IsMouseOver" Value="True">
45-
<Setter Property="Background" Value="{StaticResource DataGridRowMouseOver}"/>
46-
</Trigger>-->
47-
<Trigger Property="IsSelected" Value="True">
48-
<Setter Property="Background" Value="{DynamicResource ThemeDataGridRowSelectedBackground}" />
49-
</Trigger>
50-
</Style.Triggers>
51-
</Style>
52-
53-
<!-- datagrid hide selected cell borders -->
54-
<Style TargetType="{x:Type DataGridCell}">
55-
<Setter Property="BorderBrush" Value="Transparent" />
56-
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
57-
<Setter Property="Margin" Value="0,0.5,0,0.5" />
58-
<Style.Triggers>
59-
<Trigger Property="IsSelected" Value="True">
60-
<Setter Property="Background" Value="Transparent" />
61-
</Trigger>
62-
<Trigger Property="IsSelected" Value="False">
63-
<Setter Property="Background" Value="Transparent" />
64-
</Trigger>
65-
</Style.Triggers>
66-
</Style>
67-
68-
<!-- datagrid scrollbar customization -->
69-
<!-- scrollbar top/bottom arrow buttons -->
70-
<Style x:Key="ScrollBarLineButton" TargetType="{x:Type RepeatButton}">
71-
<Setter Property="SnapsToDevicePixels" Value="True"/>
72-
<Setter Property="OverridesDefaultStyle" Value="true"/>
73-
<Setter Property="Focusable" Value="false"/>
74-
<Setter Property="Template">
75-
<Setter.Value>
76-
<ControlTemplate TargetType="{x:Type RepeatButton}">
77-
<!-- button background -->
78-
<Border Name="Border" Margin="1" CornerRadius="0" BorderThickness="0" Background="{DynamicResource ThemeButtonBackground}" BorderBrush="{x:Null}">
79-
<!-- arrow sign -->
80-
<Path HorizontalAlignment="Center" VerticalAlignment="Center" Fill="{DynamicResource ThemeScrollArrowForeground}" Data="{Binding Path=Content,RelativeSource={RelativeSource TemplatedParent}}" />
81-
</Border>
82-
<ControlTemplate.Triggers>
83-
<!-- NOTE order matters, if pressed is before mouseover, then it gets overwritten -->
84-
<Trigger Property="IsMouseOver" Value="true">
85-
<Setter TargetName="Border" Property="Background" Value="{DynamicResource ThemeTextBoxBackground}" />
86-
</Trigger>
87-
<Trigger Property="IsPressed" Value="true">
88-
<Setter TargetName="Border" Property="Background" Value="{DynamicResource ThemeScrollArrowPressed}" />
89-
</Trigger>
90-
<Trigger Property="IsEnabled" Value="false">
91-
<Setter Property="Foreground" Value="Black"/>
92-
</Trigger>
93-
</ControlTemplate.Triggers>
94-
</ControlTemplate>
95-
</Setter.Value>
96-
</Setter>
97-
</Style>
98-
99-
<Style x:Key="ScrollBarPageButton" TargetType="{x:Type RepeatButton}">
100-
<Setter Property="SnapsToDevicePixels" Value="True"/>
101-
<Setter Property="OverridesDefaultStyle" Value="true"/>
102-
<Setter Property="IsTabStop" Value="false"/>
103-
<Setter Property="Focusable" Value="false"/>
104-
<Setter Property="Template">
105-
<Setter.Value>
106-
<ControlTemplate TargetType="{x:Type RepeatButton}">
107-
<Border Background="Transparent" />
108-
</ControlTemplate>
109-
</Setter.Value>
110-
</Setter>
111-
</Style>
112-
113-
<!-- scroll thumb (elevator) bar -->
114-
<Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}">
115-
<Setter Property="SnapsToDevicePixels" Value="True"/>
116-
<Setter Property="OverridesDefaultStyle" Value="true"/>
117-
<Setter Property="IsTabStop" Value="false"/>
118-
<Setter Property="Focusable" Value="false"/>
119-
<Setter Property="Template">
120-
<Setter.Value>
121-
<ControlTemplate TargetType="{x:Type Thumb}">
122-
<Border Name="Border" CornerRadius="0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" />
123-
<ControlTemplate.Triggers>
124-
<Trigger Property="IsMouseOver" Value="true">
125-
<Setter TargetName="Border" Property="Background" Value="{DynamicResource ThemeScrollBarThumbFill}" />
126-
</Trigger>
127-
</ControlTemplate.Triggers>
128-
</ControlTemplate>
129-
</Setter.Value>
130-
</Setter>
131-
</Style>
132-
133-
<ControlTemplate x:Key="VerticalScrollBar" TargetType="{x:Type ScrollBar}">
134-
<Grid >
135-
<Grid.RowDefinitions>
136-
<RowDefinition MaxHeight="18"/>
137-
<RowDefinition Height="0.00001*"/>
138-
<RowDefinition MaxHeight="18"/>
139-
</Grid.RowDefinitions>
140-
<!-- scrollbar background -->
141-
<Border Grid.RowSpan="3" CornerRadius="0" Background="{DynamicResource ThemeScrollBarBackground}" />
142-
<!-- scrollbar top button -->
143-
<RepeatButton Grid.Row="0" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineUpCommand" Content="M 0 4 L 8 4 L 4 0 Z" />
144-
<Track Name="PART_Track" Grid.Row="1" IsDirectionReversed="true">
145-
<Track.DecreaseRepeatButton>
146-
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageUpCommand" />
147-
</Track.DecreaseRepeatButton>
148-
<Track.Thumb>
149-
<!-- scrollbar foreground -->
150-
<Thumb Style="{StaticResource ScrollBarThumb}" Margin="1,0,1,0" Background="{DynamicResource ThemeScrollBarFill}" BorderBrush="{x:Null}"/>
151-
</Track.Thumb>
152-
<Track.IncreaseRepeatButton>
153-
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageDownCommand" />
154-
</Track.IncreaseRepeatButton>
155-
</Track>
156-
<!-- scrollbar bottom button -->
157-
<RepeatButton Grid.Row="3" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineDownCommand" Content="M 0 0 L 4 4 L 8 0 Z" />
158-
</Grid>
159-
</ControlTemplate>
160-
161-
<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
162-
<Setter Property="SnapsToDevicePixels" Value="True"/>
163-
<Setter Property="OverridesDefaultStyle" Value="true"/>
164-
<Style.Triggers>
165-
<Trigger Property="Orientation" Value="Vertical">
166-
<Setter Property="Width" Value="18"/>
167-
<Setter Property="Height" Value="Auto" />
168-
<Setter Property="Template" Value="{StaticResource VerticalScrollBar}" />
169-
</Trigger>
170-
</Style.Triggers>
171-
</Style>
172-
173-
</Window.Resources>
8+
Title="Create New Project" Height="460" Width="450" Background="{DynamicResource ThemeDarkestBackground}" PreviewKeyDown="Window_PreviewKeyDown" ResizeMode="NoResize" WindowStartupLocation="CenterOwner" ShowInTaskbar="True">
1749

17510
<Grid>
17611
<StackPanel Margin="10,3">
17712
<Label Content="Unity Version" Foreground="{DynamicResource ThemeButtonForeground}" Margin="0,0,0,3" Padding="5,5,5,3" />
178-
<DataGrid x:Name="gridAvailableVersions" KeyboardNavigation.TabNavigation = "None" SelectionMode="Single" Height="120" Margin="0" VerticalAlignment="Top" HeadersVisibility="None" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" Foreground="{DynamicResource ThemeButtonForeground}" Background="{DynamicResource ThemeMainBackgroundColor}" SelectionChanged="GridAvailableVersions_SelectionChanged" IsTabStop="True" TabIndex="1" Loaded="GridAvailableVersions_Loaded" EnableRowVirtualization="False" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled">
13+
<DataGrid x:Name="gridAvailableVersions" KeyboardNavigation.TabNavigation = "None" SelectionMode="Single" Height="270" Margin="0" VerticalAlignment="Top" HeadersVisibility="None" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" Foreground="{DynamicResource ThemeButtonForeground}" Background="{DynamicResource ThemeMainBackgroundColor}" SelectionChanged="GridAvailableVersions_SelectionChanged" IsTabStop="True" TabIndex="1" Loaded="GridAvailableVersions_Loaded" EnableRowVirtualization="False" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" PreviewMouseDoubleClick="gridAvailableVersions_PreviewMouseDoubleClick">
17914
<DataGrid.Columns>
18015
<DataGridTextColumn Header="Version" Binding="{Binding Version}" IsReadOnly="True" CanUserResize="False" MinWidth="80" />
181-
<DataGridTextColumn Header="Platforms" Binding="{Binding PlatformsCombined}" IsReadOnly="True" CanUserResize="False" MinWidth="370" />
16+
<DataGridTextColumn Header="Platforms" Binding="{Binding PlatformsCombined}" IsReadOnly="True" CanUserResize="False" MinWidth="270" />
17+
<DataGridTextColumn Header="Release" Binding="{Binding ReleaseType}" IsReadOnly="True" CanUserResize="False" MinWidth="70" />
18218
</DataGrid.Columns>
18319
</DataGrid>
18420

@@ -204,17 +40,17 @@
20440
<ComboBox Grid.Column="2" x:Name="cmbNewProjectTemplate" DisplayMemberPath="Key" SelectedIndex="0" Margin="6,0,0,0" TabIndex="2" DropDownOpened="CmbNewProjectTemplate_DropDownOpened" />
20541
</Grid>
20642

207-
<Label x:Name="lblNewProjectFolder" Content="(folder)" Foreground="{DynamicResource ThemeButtonBackground}" Margin="0" FontSize="10" Padding="5,0,5,3" />
43+
<Label x:Name="lblNewProjectFolder" Content="(folder)" Foreground="{DynamicResource ThemeButtonForegroundDisabled}" Margin="0" FontSize="10" Padding="5,0,5,3" />
20844
<Grid HorizontalAlignment="Stretch" Margin="0,8,0,0">
20945
<Grid.ColumnDefinitions>
21046
<ColumnDefinition Width="*"/>
21147
<ColumnDefinition Width="*"/>
21248
</Grid.ColumnDefinitions>
213-
<Button Grid.Column="0" Style="{StaticResource CustomButton}" x:Name="btnCancelNewProject" Background="{DynamicResource ThemeButtonBackground}" Foreground="#FFC1C1C1" Margin="0,0,3,3" BorderBrush="{x:Null}" VerticalAlignment="Top" Height="35" Click="BtnCancelNewProject_Click" TabIndex="4" >
214-
<Label Foreground="{DynamicResource ThemeButtonForeground}" Content="Cancel"/>
49+
<Button Grid.Column="0" Style="{StaticResource CustomButton}" x:Name="btnCancelNewProject" Margin="0,0,3,3" BorderBrush="{x:Null}" VerticalAlignment="Top" Height="35" Click="BtnCancelNewProject_Click" TabIndex="4" >
50+
<Label Content="Cancel" Foreground="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}"/>
21551
</Button>
216-
<Button Grid.Column="1" Style="{StaticResource CustomButton}" x:Name="btnCreateNewProject" Background="{DynamicResource ThemeButtonBackground}" Foreground="#FFC1C1C1" Margin="3,0,0,3" BorderBrush="{x:Null}" VerticalAlignment="Top" Height="35" Click="BtnCreateNewProject_Click" TabIndex="3">
217-
<Label Foreground="{DynamicResource ThemeButtonForeground}" Content="_Create"/>
52+
<Button Grid.Column="1" Style="{StaticResource CustomButton}" x:Name="btnCreateNewProject" Margin="3,0,0,3" BorderBrush="{x:Null}" VerticalAlignment="Top" Height="35" Click="BtnCreateNewProject_Click" TabIndex="3">
53+
<Label Content="_Create" Foreground="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}"/>
21854
</Button>
21955
</Grid>
22056
</StackPanel>

‎UnityLauncherPro/NewProject.xaml.cs

Lines changed: 93 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.IO;
23
using System.Windows;
34
using System.Windows.Controls;
45
using System.Windows.Input;
@@ -19,26 +20,52 @@ public partial class NewProject : Window
1920
int previousSelectedTemplateIndex = -1;
2021
int previousSelectedModuleIndex = -1;
2122

22-
public NewProject(string unityVersion, string suggestedName, string targetFolder)
23+
static string targetFolder = null;
24+
25+
public NewProject(string unityVersion, string suggestedName, string targetFolder, bool nameIsLocked = false)
2326
{
2427
isInitializing = true;
2528
InitializeComponent();
2629

30+
NewProject.targetFolder = targetFolder;
31+
2732
// get version
2833
newVersion = unityVersion;
2934
newName = suggestedName;
3035

36+
txtNewProjectName.IsEnabled = !nameIsLocked;
37+
3138
txtNewProjectName.Text = newName;
3239
lblNewProjectFolder.Content = targetFolder;
3340

34-
// fill available versions, TODO could show which modules are installed
35-
if (gridAvailableVersions.ItemsSource == null) gridAvailableVersions.ItemsSource = MainWindow.unityInstallationsSource;
41+
// fill available versions
42+
if (gridAvailableVersions.ItemsSource == null)
43+
{
44+
// get release type info (not done in mainwindow yet, to avoid doing extra stuff)
45+
for (int i = 0, len = MainWindow.unityInstallationsSource.Count; i < len; i++)
46+
{
47+
var ver = MainWindow.unityInstallationsSource[i].Version;
48+
if (Tools.IsLTS(ver))
49+
{
50+
MainWindow.unityInstallationsSource[i].ReleaseType = "LTS";
51+
}
52+
else if (Tools.IsAlpha(ver))
53+
{
54+
MainWindow.unityInstallationsSource[i].ReleaseType = "Alpha";
55+
}
56+
else if (Tools.IsBeta(ver))
57+
{
58+
MainWindow.unityInstallationsSource[i].ReleaseType = "Beta";
59+
}
60+
}
3661

62+
gridAvailableVersions.ItemsSource = MainWindow.unityInstallationsSource;
63+
}
3764
// we have that version installed
3865
if (MainWindow.unityInstalledVersions.ContainsKey(unityVersion) == true)
3966
{
4067
// find this unity version, TODO theres probably easier way than looping all
41-
for (int i = 0; i < MainWindow.unityInstallationsSource.Length; i++)
68+
for (int i = 0; i < MainWindow.unityInstallationsSource.Count; i++)
4269
{
4370
if (MainWindow.unityInstallationsSource[i].Version == newVersion)
4471
{
@@ -81,27 +108,49 @@ void UpdateModulesDropdown(string version)
81108
// get modules and stick into combobox, NOTE we already have this info from GetProjects.Scan, so could access it
82109
platformsForThisUnity = Tools.GetPlatformsForUnityVersion(version);
83110
cmbNewProjectPlatform.ItemsSource = platformsForThisUnity;
84-
//System.Console.WriteLine(Tools.GetPlatformsForUnityVersion(version).Length);
85111

86112
var lastUsedPlatform = Properties.Settings.Default.newProjectPlatform;
87113

88114
for (int i = 0; i < platformsForThisUnity.Length; i++)
89115
{
90116
// set default platform (win64) if never used this setting before
91-
if ((lastUsedPlatform == null && platformsForThisUnity[i].ToLower() == "win64") || platformsForThisUnity[i] == lastUsedPlatform)
117+
if ((string.IsNullOrEmpty(lastUsedPlatform) && platformsForThisUnity[i].ToLower() == "win64") || platformsForThisUnity[i] == lastUsedPlatform)
92118
{
93119
cmbNewProjectPlatform.SelectedIndex = i;
94120
break;
95121
}
96122
}
97123

98-
//lblTemplateTitleAndCount.Content = "Templates: (" + (cmbNewProjectTemplate.Items.Count - 1) + ")";
99-
}
100-
124+
// if nothing found, use win64
125+
if (cmbNewProjectPlatform.SelectedIndex == -1)
126+
{
127+
//cmbNewProjectPlatform.SelectedIndex = cmbNewProjectPlatform.Items.Count > 1 ? 1 : 0;
128+
for (int i = 0; i < platformsForThisUnity.Length; i++)
129+
{
130+
if (platformsForThisUnity[i].ToLower() == "win64")
131+
{
132+
cmbNewProjectPlatform.SelectedIndex = i;
133+
break;
134+
}
135+
}
101136

137+
// if still nothing, use first
138+
if (cmbNewProjectPlatform.SelectedIndex == -1) cmbNewProjectPlatform.SelectedIndex = 0;
139+
//lblTemplateTitleAndCount.Content = "Templates: (" + (cmbNewProjectTemplate.Items.Count - 1) + ")";
140+
}
141+
}
102142

103143
private void BtnCreateNewProject_Click(object sender, RoutedEventArgs e)
104144
{
145+
// check if projectname already exists (only if should be automatically created name)
146+
var targetPath = Path.Combine(targetFolder, txtNewProjectName.Text);
147+
if (txtNewProjectName.IsEnabled == true && Directory.Exists(targetPath) == true)
148+
{
149+
System.Console.WriteLine("Project already exists");
150+
return;
151+
}
152+
153+
105154
templateZipPath = ((KeyValuePair<string, string>)cmbNewProjectTemplate.SelectedValue).Value;
106155
selectedPlatform = cmbNewProjectPlatform.SelectedValue.ToString();
107156
UpdateSelectedVersion();
@@ -181,8 +230,28 @@ void UpdateSelectedVersion()
181230
}
182231
}
183232

184-
private void TxtNewProjectName_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
233+
private void TxtNewProjectName_TextChanged(object sender, TextChangedEventArgs e)
185234
{
235+
if (isInitializing == true) return;
236+
237+
// validate new projectname that it doesnt exists already
238+
var targetPath = Path.Combine(targetFolder, txtNewProjectName.Text);
239+
if (Directory.Exists(targetPath) == true)
240+
{
241+
System.Console.WriteLine("Project already exists");
242+
txtNewProjectName.BorderBrush = Brushes.Red; // not visible if focused
243+
txtNewProjectName.ToolTip = "Project folder already exists";
244+
btnCreateNewProject.IsEnabled = false;
245+
}
246+
else
247+
{
248+
txtNewProjectName.BorderBrush = null;
249+
btnCreateNewProject.IsEnabled = true;
250+
txtNewProjectName.ToolTip = "";
251+
}
252+
253+
//System.Console.WriteLine("newProjectName: " + txtNewProjectName.Text);
254+
186255
newProjectName = txtNewProjectName.Text;
187256
}
188257

@@ -214,7 +283,8 @@ private void GridAvailableVersions_SelectionChanged(object sender, SelectionChan
214283
// new row selected, generate new project name for this version
215284
var k = gridAvailableVersions.SelectedItem as UnityInstallation;
216285
newVersion = k.Version;
217-
GenerateNewName();
286+
// no new name, if field is locked (because its folder name then)
287+
if (txtNewProjectName.IsEnabled == true) GenerateNewName();
218288

219289
// update templates list for selected unity version
220290
UpdateTemplatesDropDown(k.Path);
@@ -225,7 +295,7 @@ private void GridAvailableVersions_Loaded(object sender, RoutedEventArgs e)
225295
{
226296
// set initial default row color
227297
DataGridRow row = (DataGridRow)gridAvailableVersions.ItemContainerGenerator.ContainerFromIndex(gridAvailableVersions.SelectedIndex);
228-
// if now unitys available
298+
// if no unitys available
229299
if (row == null) return;
230300
//row.Background = Brushes.Green;
231301
row.Foreground = Brushes.White;
@@ -242,5 +312,16 @@ private void CmbNewProjectPlatform_DropDownOpened(object sender, System.EventArg
242312
{
243313
previousSelectedModuleIndex = cmbNewProjectPlatform.SelectedIndex;
244314
}
315+
316+
private void gridAvailableVersions_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
317+
{
318+
// check that we clicked actually on a row
319+
var src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);
320+
var srcType = src.GetType();
321+
if (srcType == typeof(ContentPresenter))
322+
{
323+
BtnCreateNewProject_Click(null, null);
324+
}
325+
}
245326
}
246327
}

‎UnityLauncherPro/Properties/Resources.Designer.cs

Lines changed: 18 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎UnityLauncherPro/Properties/Settings.Designer.cs

Lines changed: 119 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎UnityLauncherPro/Properties/Settings.settings

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,11 @@
33
<Profiles />
44
<Settings>
55
<Setting Name="windowWidth" Type="System.Int32" Scope="User">
6-
<Value Profile="(Default)">600</Value>
6+
<Value Profile="(Default)">880</Value>
77
</Setting>
88
<Setting Name="windowHeight" Type="System.Int32" Scope="User">
99
<Value Profile="(Default)">650</Value>
1010
</Setting>
11-
<Setting Name="rootFolders" Type="System.Collections.Specialized.StringCollection" Scope="User">
12-
<Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
13-
&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
14-
&lt;string&gt;C:\Program Files\&lt;/string&gt;
15-
&lt;/ArrayOfString&gt;</Value>
16-
</Setting>
1711
<Setting Name="minimizeToTaskbar" Type="System.Boolean" Scope="User">
1812
<Value Profile="(Default)">True</Value>
1913
</Setting>
@@ -39,7 +33,7 @@
3933
<Value Profile="(Default)">False</Value>
4034
</Setting>
4135
<Setting Name="AllowSingleInstanceOnly" Type="System.Boolean" Scope="User">
42-
<Value Profile="(Default)">False</Value>
36+
<Value Profile="(Default)">True</Value>
4337
</Setting>
4438
<Setting Name="preferredVersion" Type="System.String" Scope="User">
4539
<Value Profile="(Default)" />
@@ -51,13 +45,13 @@
5145
<Value Profile="(Default)">True</Value>
5246
</Setting>
5347
<Setting Name="enableProjectRename" Type="System.Boolean" Scope="User">
54-
<Value Profile="(Default)">False</Value>
48+
<Value Profile="(Default)">True</Value>
5549
</Setting>
5650
<Setting Name="streamerMode" Type="System.Boolean" Scope="User">
5751
<Value Profile="(Default)">False</Value>
5852
</Setting>
5953
<Setting Name="showTargetPlatform" Type="System.Boolean" Scope="User">
60-
<Value Profile="(Default)">False</Value>
54+
<Value Profile="(Default)">True</Value>
6155
</Setting>
6256
<Setting Name="webglBuildPath" Type="System.String" Scope="User">
6357
<Value Profile="(Default)" />
@@ -69,7 +63,7 @@
6963
<Value Profile="(Default)">theme.ini</Value>
7064
</Setting>
7165
<Setting Name="enablePlatformSelection" Type="System.Boolean" Scope="User">
72-
<Value Profile="(Default)">False</Value>
66+
<Value Profile="(Default)">True</Value>
7367
</Setting>
7468
<Setting Name="runAutomatically" Type="System.Boolean" Scope="User">
7569
<Value Profile="(Default)">False</Value>
@@ -81,7 +75,7 @@
8175
<Value Profile="(Default)">dd/MM/yyyy HH:mm:ss</Value>
8276
</Setting>
8377
<Setting Name="useHumandFriendlyLastModified" Type="System.Boolean" Scope="User">
84-
<Value Profile="(Default)">False</Value>
78+
<Value Profile="(Default)">True</Value>
8579
</Setting>
8680
<Setting Name="recentColumnsOrder" Type="System.Int32[]" Scope="User">
8781
<Value Profile="(Default)" />
@@ -102,10 +96,41 @@
10296
<Value Profile="(Default)" />
10397
</Setting>
10498
<Setting Name="newProjectPlatform" Type="System.String" Scope="User">
105-
<Value Profile="(Default)" />
99+
<Value Profile="(Default)">win64</Value>
106100
</Setting>
107101
<Setting Name="searchProjectPathAlso" Type="System.Boolean" Scope="User">
108102
<Value Profile="(Default)">False</Value>
109103
</Setting>
104+
<Setting Name="checkPlasticBranch" Type="System.Boolean" Scope="User">
105+
<Value Profile="(Default)">False</Value>
106+
</Setting>
107+
<Setting Name="shortcutBatchFileFolder" Type="System.String" Scope="User">
108+
<Value Profile="(Default)" />
109+
</Setting>
110+
<Setting Name="rootFolders" Type="System.Collections.Specialized.StringCollection" Scope="User">
111+
<Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
112+
&lt;ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
113+
&lt;string&gt;C:\Program Files\&lt;/string&gt;
114+
&lt;/ArrayOfString&gt;</Value>
115+
</Setting>
116+
<Setting Name="customInitFile" Type="System.String" Scope="User">
117+
<Value Profile="(Default)">InitializeProject.cs</Value>
118+
</Setting>
119+
<Setting Name="useInitScript" Type="System.Boolean" Scope="User">
120+
<Value Profile="(Default)">False</Value>
121+
</Setting>
122+
<Setting Name="webglPort" Type="System.Int32" Scope="User">
123+
<Value Profile="(Default)">50000</Value>
124+
</Setting>
125+
<Setting Name="projectPaths" Type="System.Collections.Specialized.StringCollection" Scope="User">
126+
<Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
127+
&lt;ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /&gt;</Value>
128+
</Setting>
129+
<Setting Name="override40ProjectCount" Type="System.Boolean" Scope="User">
130+
<Value Profile="(Default)">True</Value>
131+
</Setting>
132+
<Setting Name="maxProjectCount" Type="System.Int32" Scope="User">
133+
<Value Profile="(Default)">50</Value>
134+
</Setting>
110135
</Settings>
111136
</SettingsFile>

‎UnityLauncherPro/Resources/Colors.xaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
<SolidColorBrush x:Key="ThemeScrollBarEnabledForeground" Color="#FF000000"/>
3333

3434
<!--buttons-->
35-
<SolidColorBrush x:Key="ThemeButtonForegroundDisabled" Color="#FF707070"/>
35+
<SolidColorBrush x:Key="ThemeButtonForegroundDisabled" Color="#FF505050"/>
36+
<SolidColorBrush x:Key="ThemeButtonBackgroundDisabled" Color="#44707070"/>
3637
<SolidColorBrush x:Key="ThemeButtonBackgroundMouseOver" Color="#FF494949"/>
3738
<SolidColorBrush x:Key="ThemeButtonBackgroundPressed" Color="#FF0F0F0F"/>
3839
<SolidColorBrush x:Key="ThemeButtonBackground" Color="#FF3F3F46"/>

‎UnityLauncherPro/ThemeEditor.xaml

Lines changed: 0 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -18,191 +18,8 @@
1818
<KeyBinding Command="ApplicationCommands.Save" Gesture="Ctrl+S"/>
1919
</Window.InputBindings>
2020

21-
<!--TODO take from mainwindow?-->
2221
<Window.Resources>
23-
24-
<!-- datagrid header -->
25-
<Style x:Key="HeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
26-
<Setter Property="Background" Value="#4C3F3F46" />
27-
<Setter Property="Foreground" Value="#FFB6B6B6" />
28-
<Setter Property="BorderBrush" Value="#4C000000" />
29-
<Setter Property="BorderThickness" Value="0,0,1,1" />
30-
<Setter Property="SnapsToDevicePixels" Value="True" />
31-
<Setter Property="HorizontalContentAlignment" Value="Left" />
32-
<Setter Property="Height" Value="28" />
33-
<Setter Property="Padding" Value="6,2,2,2" />
34-
<Style.Triggers>
35-
<Trigger Property="IsMouseOver" Value="True">
36-
<Setter Property="Background" Value="#FF3F3F46"/>
37-
</Trigger>
38-
</Style.Triggers>
39-
</Style>
40-
41-
<!-- custom buttons -->
42-
<Style x:Key="CustomButton" TargetType="{x:Type Button}">
43-
<Setter Property="SnapsToDevicePixels" Value="true"/>
44-
<Setter Property="OverridesDefaultStyle" Value="true"/>
45-
<Setter Property="Template">
46-
<Setter.Value>
47-
<ControlTemplate TargetType="{x:Type Button}">
48-
<Border x:Name="shortcutbutton" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}">
49-
<ContentPresenter Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
50-
</Border>
51-
<ControlTemplate.Triggers>
52-
<Trigger Property="IsMouseOver" Value="true">
53-
<Setter TargetName="shortcutbutton" Property="Background" Value="#FF494949" />
54-
</Trigger>
55-
<Trigger Property="IsPressed" Value="true">
56-
<Setter TargetName="shortcutbutton" Property="Background" Value="#FF0F0F0F" />
57-
</Trigger>
58-
<Trigger Property="IsFocused" Value="true">
59-
<Setter TargetName="shortcutbutton" Property="BorderBrush" Value="#FF003D61" />
60-
<Setter TargetName="shortcutbutton" Property="BorderThickness" Value="1" />
61-
</Trigger>
62-
</ControlTemplate.Triggers>
63-
</ControlTemplate>
64-
</Setter.Value>
65-
</Setter>
66-
</Style>
67-
68-
<!--TODO move to styles-->
69-
<!-- datagrid rows & row selection -->
70-
<Style TargetType="DataGridRow">
71-
<Setter Property="Background" Value="#FF3F3F46" />
72-
<Setter Property="BorderBrush" Value="{x:Null}" />
73-
<Setter Property="BorderThickness" Value="0,0,0,0" />
74-
<Style.Triggers>
75-
<!--<Trigger Property="IsMouseOver" Value="True">
76-
<Setter Property="Background" Value="{StaticResource DataGridRowMouseOver}"/>
77-
</Trigger>-->
78-
<Trigger Property="IsSelected" Value="True">
79-
<Setter Property="Background" Value="#FF007ACC" />
80-
</Trigger>
81-
</Style.Triggers>
82-
</Style>
83-
84-
<!-- datagrid hide selected cell borders -->
85-
<Style TargetType="{x:Type DataGridCell}">
86-
<Setter Property="BorderBrush" Value="Transparent" />
87-
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
88-
<Setter Property="Margin" Value="0,0.5,0,0.5" />
89-
<Style.Triggers>
90-
<Trigger Property="IsSelected" Value="True">
91-
<Setter Property="Background" Value="Transparent" />
92-
</Trigger>
93-
<Trigger Property="IsSelected" Value="False">
94-
<Setter Property="Background" Value="Transparent" />
95-
</Trigger>
96-
</Style.Triggers>
97-
</Style>
98-
99-
<!-- datagrid scrollbar customization -->
100-
<!-- scrollbar top/bottom arrow buttons -->
101-
<Style x:Key="ScrollBarLineButton" TargetType="{x:Type RepeatButton}">
102-
<Setter Property="SnapsToDevicePixels" Value="True"/>
103-
<Setter Property="OverridesDefaultStyle" Value="true"/>
104-
<Setter Property="Focusable" Value="false"/>
105-
<Setter Property="Template">
106-
<Setter.Value>
107-
<ControlTemplate TargetType="{x:Type RepeatButton}">
108-
<!-- button background -->
109-
<Border Name="Border" Margin="1" CornerRadius="0" BorderThickness="0" Background="#FF3F3F46" BorderBrush="{x:Null}">
110-
<!-- arrow sign -->
111-
<Path HorizontalAlignment="Center" VerticalAlignment="Center" Fill="#FF5E5E64" Data="{Binding Path=Content,RelativeSource={RelativeSource TemplatedParent}}" />
112-
</Border>
113-
<ControlTemplate.Triggers>
114-
<!-- NOTE order matters, if pressed is before mouseover, then it gets overwritten -->
115-
<Trigger Property="IsMouseOver" Value="true">
116-
<Setter TargetName="Border" Property="Background" Value="#FF333337" />
117-
</Trigger>
118-
<Trigger Property="IsPressed" Value="true">
119-
<Setter TargetName="Border" Property="Background" Value="#FF838383" />
120-
</Trigger>
121-
<Trigger Property="IsEnabled" Value="false">
122-
<Setter Property="Foreground" Value="Black"/>
123-
</Trigger>
124-
</ControlTemplate.Triggers>
125-
</ControlTemplate>
126-
</Setter.Value>
127-
</Setter>
128-
</Style>
129-
130-
<Style x:Key="ScrollBarPageButton" TargetType="{x:Type RepeatButton}">
131-
<Setter Property="SnapsToDevicePixels" Value="True"/>
132-
<Setter Property="OverridesDefaultStyle" Value="true"/>
133-
<Setter Property="IsTabStop" Value="false"/>
134-
<Setter Property="Focusable" Value="false"/>
135-
<Setter Property="Template">
136-
<Setter.Value>
137-
<ControlTemplate TargetType="{x:Type RepeatButton}">
138-
<Border Background="Transparent" />
139-
</ControlTemplate>
140-
</Setter.Value>
141-
</Setter>
142-
</Style>
143-
144-
<!-- scroll thumb (elevator) bar -->
145-
<Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}">
146-
<Setter Property="SnapsToDevicePixels" Value="True"/>
147-
<Setter Property="OverridesDefaultStyle" Value="true"/>
148-
<Setter Property="IsTabStop" Value="false"/>
149-
<Setter Property="Focusable" Value="false"/>
150-
<Setter Property="Template">
151-
<Setter.Value>
152-
<ControlTemplate TargetType="{x:Type Thumb}">
153-
<Border Name="Border" CornerRadius="0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" />
154-
<ControlTemplate.Triggers>
155-
<Trigger Property="IsMouseOver" Value="true">
156-
<Setter TargetName="Border" Property="Background" Value="#FF6A6969" />
157-
</Trigger>
158-
</ControlTemplate.Triggers>
159-
</ControlTemplate>
160-
</Setter.Value>
161-
</Setter>
162-
</Style>
163-
164-
<ControlTemplate x:Key="VerticalScrollBar" TargetType="{x:Type ScrollBar}">
165-
<Grid >
166-
<Grid.RowDefinitions>
167-
<RowDefinition MaxHeight="18"/>
168-
<RowDefinition Height="0.00001*"/>
169-
<RowDefinition MaxHeight="18"/>
170-
</Grid.RowDefinitions>
171-
<!-- scrollbar background -->
172-
<Border Grid.RowSpan="3" CornerRadius="0" Background="#FF151515" />
173-
<!-- scrollbar top button -->
174-
<RepeatButton Grid.Row="0" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineUpCommand" Content="M 0 4 L 8 4 L 4 0 Z" />
175-
<Track Name="PART_Track" Grid.Row="1" IsDirectionReversed="true">
176-
<Track.DecreaseRepeatButton>
177-
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageUpCommand" />
178-
</Track.DecreaseRepeatButton>
179-
<Track.Thumb>
180-
<!-- scrollbar foreground -->
181-
<Thumb Style="{StaticResource ScrollBarThumb}" Margin="1,0,1,0" Background="#FF47474B" BorderBrush="{x:Null}"/>
182-
</Track.Thumb>
183-
<Track.IncreaseRepeatButton>
184-
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageDownCommand" />
185-
</Track.IncreaseRepeatButton>
186-
</Track>
187-
<!-- scrollbar bottom button -->
188-
<RepeatButton Grid.Row="3" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineDownCommand" Content="M 0 0 L 4 4 L 8 0 Z" />
189-
</Grid>
190-
</ControlTemplate>
191-
192-
<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
193-
<Setter Property="SnapsToDevicePixels" Value="True"/>
194-
<Setter Property="OverridesDefaultStyle" Value="true"/>
195-
<Style.Triggers>
196-
<Trigger Property="Orientation" Value="Vertical">
197-
<Setter Property="Width" Value="18"/>
198-
<Setter Property="Height" Value="Auto" />
199-
<Setter Property="Template" Value="{StaticResource VerticalScrollBar}" />
200-
</Trigger>
201-
</Style.Triggers>
202-
</Style>
203-
20422
<local:ThemeColor x:Key="SolidColorBrushConverter"/>
205-
20623
</Window.Resources>
20724

20825
<Grid>

‎UnityLauncherPro/Tools.cs

Lines changed: 739 additions & 112 deletions
Large diffs are not rendered by default.

‎UnityLauncherPro/UnityLauncherPro.csproj

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<OutputType>WinExe</OutputType>
99
<RootNamespace>UnityLauncherPro</RootNamespace>
1010
<AssemblyName>UnityLauncherPro</AssemblyName>
11-
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
11+
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
1212
<FileAlignment>512</FileAlignment>
1313
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
1414
<WarningLevel>4</WarningLevel>
@@ -29,6 +29,7 @@
2929
<IsWebBootstrapper>false</IsWebBootstrapper>
3030
<UseApplicationTrust>false</UseApplicationTrust>
3131
<BootstrapperEnabled>true</BootstrapperEnabled>
32+
<TargetFrameworkProfile />
3233
</PropertyGroup>
3334
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
3435
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -52,8 +53,13 @@
5253
<PropertyGroup>
5354
<ApplicationIcon>Images/icon.ico</ApplicationIcon>
5455
</PropertyGroup>
56+
<PropertyGroup />
57+
<PropertyGroup>
58+
<ApplicationManifest>app.manifest</ApplicationManifest>
59+
</PropertyGroup>
5560
<ItemGroup>
5661
<Reference Include="System" />
62+
<Reference Include="System.Configuration" />
5763
<Reference Include="System.Data" />
5864
<Reference Include="System.Drawing" />
5965
<Reference Include="System.Windows.Forms" />
@@ -75,7 +81,9 @@
7581
<Generator>MSBuild:Compile</Generator>
7682
<SubType>Designer</SubType>
7783
</ApplicationDefinition>
84+
<Compile Include="Converters\ReleaseDateConverter.cs" />
7885
<Compile Include="Converters\LastModifiedConverter.cs" />
86+
<Compile Include="Data\BuildReport.cs" />
7987
<Compile Include="Data\BuildReportItem.cs" />
8088
<Compile Include="Data\Platform.cs" />
8189
<Compile Include="Data\Tabs.cs" />
@@ -146,6 +154,7 @@
146154
<Generator>ResXFileCodeGenerator</Generator>
147155
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
148156
</EmbeddedResource>
157+
<None Include="app.manifest" />
149158
<None Include="Properties\Settings.settings">
150159
<Generator>SettingsSingleFileGenerator</Generator>
151160
<LastGenOutput>Settings.Designer.cs</LastGenOutput>

‎UnityLauncherPro/UpgradeWindow.xaml

Lines changed: 39 additions & 187 deletions
Large diffs are not rendered by default.

‎UnityLauncherPro/UpgradeWindow.xaml.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,22 @@ public UpgradeWindow(string currentVersion, string projectPath, string commandLi
2020
InitializeComponent();
2121
txtCurrentVersion.Text = currentVersion;
2222
gridAvailableVersions.ItemsSource = MainWindow.unityInstalledVersions;
23-
2423
gridAvailableVersions.SelectedItem = null;
2524

26-
// autoselect nearest one FIXME doesnt work with 5.x (should suggest next highest installed in 201x.x)
25+
// we have current version info in project
2726
if (string.IsNullOrEmpty(currentVersion) == false)
2827
{
2928
// enable release and dl buttons
3029
btnOpenReleasePage.IsEnabled = true;
3130
btnDownload.IsEnabled = true;
3231

32+
// if dont have exact version, show red outline
33+
if (MainWindow.unityInstalledVersions.ContainsKey(currentVersion) == false)
34+
{
35+
txtCurrentVersion.BorderBrush = Brushes.Red;
36+
txtCurrentVersion.BorderThickness = new Thickness(1);
37+
}
38+
3339
// find nearest version
3440
string nearestVersion = Tools.FindNearestVersion(currentVersion, MainWindow.unityInstalledVersions.Keys.ToList());
3541
if (nearestVersion != null)
@@ -48,7 +54,7 @@ public UpgradeWindow(string currentVersion, string projectPath, string commandLi
4854
}
4955
}
5056
}
51-
else // we dont have current version
57+
else // we dont have current version info in project
5258
{
5359
btnOpenReleasePage.IsEnabled = false;
5460
btnDownload.IsEnabled = false;
@@ -110,6 +116,19 @@ private void BtnDownload_Click(object sender, RoutedEventArgs e)
110116
}
111117
}
112118

119+
private void btnInstall_Click(object sender, RoutedEventArgs e)
120+
{
121+
string url = Tools.GetUnityReleaseURL(txtCurrentVersion.Text);
122+
if (string.IsNullOrEmpty(url) == false)
123+
{
124+
Tools.DownloadAndInstall(url, txtCurrentVersion.Text);
125+
}
126+
else
127+
{
128+
Console.WriteLine("Failed getting Unity Installer URL for " + txtCurrentVersion.Text);
129+
}
130+
}
131+
113132
private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
114133
{
115134
// override Enter for datagrid
@@ -144,6 +163,12 @@ private void GridAvailableVersions_PreviewKeyDown(object sender, KeyEventArgs e)
144163
private void GridAvailableVersions_Loaded(object sender, RoutedEventArgs e)
145164
{
146165
Tools.SetFocusToGrid(gridAvailableVersions);
166+
167+
// bolded for current item
168+
DataGridRow row = (DataGridRow)((DataGrid)sender).ItemContainerGenerator.ContainerFromIndex(gridAvailableVersions.SelectedIndex);
169+
if (row == null) return;
170+
row.Foreground = Brushes.White;
171+
row.FontWeight = FontWeights.Bold;
147172
}
148173

149174
private void GridAvailableVersions_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
@@ -163,5 +188,6 @@ void Upgrade()
163188
DialogResult = true;
164189
}
165190

191+
166192
}
167193
}

‎UnityLauncherPro/app.manifest

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
3+
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
4+
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
5+
<security>
6+
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
7+
<!-- UAC Manifest Options
8+
If you want to change the Windows User Account Control level replace the
9+
requestedExecutionLevel node with one of the following.
10+
11+
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
12+
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
13+
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
14+
15+
Specifying requestedExecutionLevel element will disable file and registry virtualization.
16+
Remove this element if your application requires this virtualization for backwards
17+
compatibility.
18+
-->
19+
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
20+
</requestedPrivileges>
21+
</security>
22+
</trustInfo>
23+
24+
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
25+
<application>
26+
<!-- A list of the Windows versions that this application has been tested on
27+
and is designed to work with. Uncomment the appropriate elements
28+
and Windows will automatically select the most compatible environment. -->
29+
30+
<!-- Windows Vista -->
31+
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
32+
33+
<!-- Windows 7 -->
34+
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
35+
36+
<!-- Windows 8 -->
37+
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
38+
39+
<!-- Windows 8.1 -->
40+
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
41+
42+
<!-- Windows 10 -->
43+
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
44+
45+
</application>
46+
</compatibility>
47+
48+
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
49+
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
50+
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
51+
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config.
52+
53+
Makes the application long-path aware. See https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
54+
55+
<application xmlns="urn:schemas-microsoft-com:asm.v3">
56+
<windowsSettings>
57+
<!-- The combination of below two tags have the following effect :
58+
1) Per-Monitor for >= Windows 10 Anniversary Update
59+
2) System < Windows 10 Anniversary Update -->
60+
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
61+
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
62+
</windowsSettings>
63+
</application>
64+
65+
66+
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
67+
<!--
68+
<dependency>
69+
<dependentAssembly>
70+
<assemblyIdentity
71+
type="win32"
72+
name="Microsoft.Windows.Common-Controls"
73+
version="6.0.0.0"
74+
processorArchitecture="*"
75+
publicKeyToken="6595b64144ccf1df"
76+
language="*"
77+
/>
78+
</dependentAssembly>
79+
</dependency>
80+
-->
81+
82+
</assembly>

‎appveyor.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
version: 1.0.{build}
2+
branches:
3+
only:
4+
- dev
25
skip_tags: true
3-
image: Visual Studio 2017
6+
skip_branch_with_pr: true
7+
image: Visual Studio 2022
48
configuration: Release
59
only_commits:
610
message: /#build/
@@ -16,3 +20,6 @@ deploy:
1620
auth_token:
1721
secure: kmYSrl7Mx/PFDGcyC5gS/vpW2UJCVguEXZsQ0LtkfwmSzx+3noZOyPrbZQ8uWX2B
1822
artifact: deploy
23+
prerelease: true
24+
on:
25+
branch: dev

0 commit comments

Comments
 (0)
Please sign in to comment.