@@ -62,17 +62,16 @@ public NewProject(string unityVersion, string suggestedName, string targetFolder
6262
6363 txtNewProjectFolder . Text = targetFolder ;
6464
65+ UpdateCreateButtonsEnabledState ( ) ;
66+
6567 if ( MainWindow . unityInstallationsSource . Count == 0 )
6668 {
6769 Tools . SetStatus ( "No Unity installations found! Please add Unity installations first." ) ;
6870 isInitializing = false ;
6971 btnCreateNewProject . IsEnabled = false ;
72+ btnCreateNewProjectAndRepo . IsEnabled = false ;
7073 return ;
7174 }
72- else
73- {
74- btnCreateNewProject . IsEnabled = true ;
75- }
7675
7776 // fill available versions, only replace if it's a different collection instance
7877 if ( ! ReferenceEquals ( gridAvailableVersions . ItemsSource , MainWindow . unityInstallationsSource ) )
@@ -217,10 +216,26 @@ void UpdateModulesDropdown(string version)
217216
218217 bool isCreatingProject = false ;
219218 private async void BtnCreateNewProject_Click ( object sender , RoutedEventArgs e )
219+ {
220+ await CreateNewProject ( withRepo : false ) ;
221+ }
222+
223+ private async void btnCreateNewProjectAndRepo_Click ( object sender , RoutedEventArgs e )
224+ {
225+ await CreateNewProject ( withRepo : true ) ;
226+ }
227+
228+ private async Task CreateNewProject ( bool withRepo )
220229 {
221230 if ( isCreatingProject ) return ;
222231 isCreatingProject = true ;
223232
233+ btnCreateNewProject . IsEnabled = false ;
234+ btnCreateNewProjectAndRepo . IsEnabled = false ;
235+
236+ try
237+ {
238+
224239 // check if projectname already exists (only if should be automatically created name)
225240 var targetPath = Path . Combine ( targetFolder , txtNewProjectName . Text ) ;
226241 if ( txtNewProjectName . IsEnabled == true && Directory . Exists ( targetPath ) == true )
@@ -279,9 +294,7 @@ private async void BtnCreateNewProject_Click(object sender, RoutedEventArgs e)
279294 Settings . Default . Save ( ) ;
280295 }
281296
282- btnCreateNewProject . IsEnabled = false ;
283-
284- if ( chkEnableVersionControl . IsChecked == true )
297+ if ( withRepo && chkEnableVersionControl . IsChecked == true )
285298 {
286299 // setup local git
287300 try
@@ -352,7 +365,7 @@ private async void BtnCreateNewProject_Click(object sender, RoutedEventArgs e)
352365 } // if version control enabled
353366
354367 // create readme if enabled
355- if ( chkAddReadme . IsChecked == true )
368+ if ( withRepo && chkAddReadme . IsChecked == true )
356369 {
357370 var readmePath = Path . Combine ( txtNewProjectFolder . Text , txtNewProjectName . Text , "README.md" ) ;
358371 try
@@ -370,7 +383,7 @@ private async void BtnCreateNewProject_Click(object sender, RoutedEventArgs e)
370383 }
371384
372385 // download .gitignore if enabled
373- if ( chkAddUnityGitIgnore . IsChecked == true )
386+ if ( withRepo && chkAddUnityGitIgnore . IsChecked == true )
374387 {
375388 //var gitIgnoreUrl = "https://raw.githubusercontent.com/github/gitignore/refs/heads/main/Unity.gitignore";
376389
@@ -391,13 +404,12 @@ private async void BtnCreateNewProject_Click(object sender, RoutedEventArgs e)
391404 {
392405 Tools . SetStatus ( "Failed to create .gitignore file for this project." ) ;
393406 }
394- }
407+ } // if add gitignore
395408
396- if ( chkEnableVersionControl . IsChecked == true )
409+ if ( withRepo && chkEnableVersionControl . IsChecked == true )
397410 {
398411 if ( chkInitialCommit . IsChecked == true )
399412 {
400- Console . WriteLine ( 1 ) ;
401413 try
402414 {
403415 await GithubActions . RunGitAsync ( Path . Combine ( txtNewProjectFolder . Text , txtNewProjectName . Text ) , "add ." ) ;
@@ -421,11 +433,26 @@ private async void BtnCreateNewProject_Click(object sender, RoutedEventArgs e)
421433
422434 } // if version control enabled
423435
424- btnCreateNewProject . IsEnabled = true ;
425- isCreatingProject = false ;
436+ }
437+ finally
438+ {
439+ isCreatingProject = false ;
440+ UpdateCreateButtonsEnabledState ( ) ;
441+ }
426442
427443 DialogResult = true ;
428- } // BtnCreateNewProject_Click
444+ }
445+
446+ private void UpdateCreateButtonsEnabledState ( )
447+ {
448+ bool folderExists = Directory . Exists ( txtNewProjectFolder . Text ) ;
449+ bool projectNameAvailable = ! string . IsNullOrWhiteSpace ( txtNewProjectName . Text ) && ! Directory . Exists ( Path . Combine ( targetFolder , txtNewProjectName . Text ) ) ;
450+ bool onlineTemplateReady = ! ( listOnlineTemplates . SelectedItem is OnlineTemplateItem selectedOnlineTemplate ) || selectedOnlineTemplate . IsDownloaded ;
451+ bool versionControlEnabled = chkEnableVersionControl . IsChecked == true ;
452+
453+ btnCreateNewProject . IsEnabled = folderExists && projectNameAvailable && onlineTemplateReady && ! isCreatingProject ;
454+ btnCreateNewProjectAndRepo . IsEnabled = btnCreateNewProject . IsEnabled && versionControlEnabled ;
455+ }
429456
430457
431458 private void BtnCancelNewProject_Click ( object sender , RoutedEventArgs e )
@@ -434,7 +461,7 @@ private void BtnCancelNewProject_Click(object sender, RoutedEventArgs e)
434461 }
435462
436463
437- private void Window_PreviewKeyDown ( object sender , KeyEventArgs e )
464+ private async void Window_PreviewKeyDown ( object sender , KeyEventArgs e )
438465 {
439466 switch ( e . Key )
440467 {
@@ -460,7 +487,7 @@ private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
460487 e . Handled = true ; // override writing to textbox
461488 break ;
462489 case Key . Enter : // enter, create proj
463- BtnCreateNewProject_Click ( null , null ) ;
490+ await CreateNewProject ( withRepo : false ) ;
464491 e . Handled = true ;
465492 break ;
466493 case Key . Escape : // esc cancel
@@ -523,15 +550,15 @@ private void TxtNewProjectName_TextChanged(object sender, TextChangedEventArgs e
523550 System . Console . WriteLine ( "Project already exists" ) ;
524551 txtNewProjectName . BorderBrush = Brushes . Red ; // not visible if focused
525552 txtNewProjectName . ToolTip = "Project folder already exists" ;
526- btnCreateNewProject . IsEnabled = false ;
527553 }
528554 else
529555 {
530556 txtNewProjectName . BorderBrush = null ;
531- btnCreateNewProject . IsEnabled = true ;
532557 txtNewProjectName . ToolTip = "" ;
533558 }
534559
560+ UpdateCreateButtonsEnabledState ( ) ;
561+
535562 //System.Console.WriteLine("newProjectName: " + txtNewProjectName.Text);
536563
537564 newProjectName = txtNewProjectName . Text ;
@@ -612,14 +639,14 @@ private void CmbNewProjectPlatform_DropDownOpened(object sender, System.EventArg
612639 previousSelectedModuleIndex = cmbNewProjectPlatform . SelectedIndex ;
613640 }
614641
615- private void gridAvailableVersions_PreviewMouseDoubleClick ( object sender , MouseButtonEventArgs e )
642+ private async void gridAvailableVersions_PreviewMouseDoubleClick ( object sender , MouseButtonEventArgs e )
616643 {
617644 // check that we clicked actually on a row
618645 var src = VisualTreeHelper . GetParent ( ( DependencyObject ) e . OriginalSource ) ;
619646 var srcType = src . GetType ( ) ;
620647 if ( srcType == typeof ( ContentPresenter ) )
621648 {
622- BtnCreateNewProject_Click ( null , null ) ;
649+ await CreateNewProject ( withRepo : false ) ;
623650 }
624651 }
625652
@@ -635,14 +662,7 @@ private void chkEnableVersionControl_Checked(object sender, RoutedEventArgs e)
635662 {
636663 bool state = chkEnableVersionControl . IsChecked == true ;
637664
638- if ( state == true )
639- {
640- btnCreateNewProject . Content = "Create Project + GitHub Repo" ;
641- }
642- else
643- {
644- btnCreateNewProject . Content = "Create Project" ;
645- }
665+ btnCreateNewProjectAndRepo . IsEnabled = state ;
646666
647667 if ( isInitializing ) return ;
648668
@@ -699,16 +719,16 @@ private void txtNewProjectFolder_TextChanged(object sender, TextChangedEventArgs
699719 if ( Directory . Exists ( txtNewProjectFolder . Text ) == false )
700720 {
701721 txtNewProjectFolder . BorderBrush = Brushes . Red ; // not visible if focused
702- btnCreateNewProject . IsEnabled = false ;
703722 btnCreateMissingFolder . IsEnabled = true ;
704723 }
705724 else
706725 {
707726 txtNewProjectFolder . BorderBrush = null ;
708- btnCreateNewProject . IsEnabled = true ;
709727 targetFolder = txtNewProjectFolder . Text ;
710728 btnCreateMissingFolder . IsEnabled = false ;
711729 }
730+
731+ UpdateCreateButtonsEnabledState ( ) ;
712732 }
713733
714734 private void btnCreateMissingFolder_Click ( object sender , RoutedEventArgs e )
@@ -942,8 +962,6 @@ private void listOnlineTemplates_SelectionChanged(object sender, SelectionChange
942962 cmbNewProjectTemplate . IsEnabled = false ;
943963 cmbNewProjectTemplate . SelectedIndex = 0 ; // Reset to default
944964
945- // disable create button if template not downloaded yet
946- btnCreateNewProject . IsEnabled = selectedTemplate . IsDownloaded ;
947965 btnCreateNewProject . Content = selectedTemplate . IsDownloaded ? "Create Project" : "Download Template First >" ;
948966 }
949967 else
@@ -955,9 +973,10 @@ private void listOnlineTemplates_SelectionChanged(object sender, SelectionChange
955973 cmbNewProjectTemplate . IsEnabled = true ;
956974
957975 // enable create button
958- btnCreateNewProject . IsEnabled = true ;
959976 btnCreateNewProject . Content = "Create Project" ;
960977 }
978+
979+ UpdateCreateButtonsEnabledState ( ) ;
961980 }
962981
963982 private async void btnDownloadTemplate_Click ( object sender , RoutedEventArgs e )
@@ -1230,6 +1249,5 @@ private void txtTokenInput_PasswordChanged(object sender, RoutedEventArgs e)
12301249 btnAuthorizeToken . IsEnabled = tokenSeemsOK ;
12311250 }
12321251
1233-
12341252 } // class NewProject
12351253} // namespace UnityLauncherPro
0 commit comments