|  | @@ -4,6 +4,7 @@
 | 
	
		
			
				|  |  |  #include "EditPage.g.cpp"
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +using namespace std::literals::chrono_literals;
 | 
	
		
			
				|  |  |  using namespace winrt;
 | 
	
		
			
				|  |  |  using namespace winrt::Windows::Storage::Streams;
 | 
	
		
			
				|  |  |  using namespace winrt::Windows::UI::Text;
 | 
	
	
		
			
				|  | @@ -52,14 +53,51 @@ namespace winrt::Maple_App::implementation
 | 
	
		
			
				|  |  |              m_loaded++;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    void EditPage::SaveButton_Click(IInspectable const&, RoutedEventArgs const&) {
 | 
	
		
			
				|  |  | -        SaveDocument();
 | 
	
		
			
				|  |  | +    fire_and_forget EditPage::SaveButton_Click(IInspectable const& sender, RoutedEventArgs const&) {
 | 
	
		
			
				|  |  | +        const auto lifetime = get_strong();
 | 
	
		
			
				|  |  | +        const auto& placementTarget = sender.try_as<FrameworkElement>();
 | 
	
		
			
				|  |  | +        const auto currentValidateRequest = ++validateRequest;
 | 
	
		
			
				|  |  | +        ValidConfigFlyout().Hide();
 | 
	
		
			
				|  |  | +        InvalidConfigFlyout().Hide();
 | 
	
		
			
				|  |  | +        co_await SaveDocument();
 | 
	
		
			
				|  |  | +        if (validateRequest != currentValidateRequest) {
 | 
	
		
			
				|  |  | +            co_return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Validate
 | 
	
		
			
				|  |  | +        const auto& path = winrt::to_string(m_file.Path());
 | 
	
		
			
				|  |  | +        co_await winrt::resume_background();
 | 
	
		
			
				|  |  | +        const auto result = leaf_test_config(path.data());
 | 
	
		
			
				|  |  | +        co_await winrt::resume_foreground(Dispatcher());
 | 
	
		
			
				|  |  | +        if (validateRequest != currentValidateRequest) {
 | 
	
		
			
				|  |  | +            co_return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        switch (result)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +        case LEAF_ERR_OK:
 | 
	
		
			
				|  |  | +            ValidConfigFlyout().ShowAt(placementTarget);
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  | +        case LEAF_ERR_CONFIG:
 | 
	
		
			
				|  |  | +            InvalidConfigFlyout().ShowAt(placementTarget);
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  | +        default:
 | 
	
		
			
				|  |  | +            // TODO: handle errors
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        co_await winrt::resume_after(2s);
 | 
	
		
			
				|  |  | +        co_await winrt::resume_foreground(Dispatcher());
 | 
	
		
			
				|  |  | +        if (validateRequest != currentValidateRequest) {
 | 
	
		
			
				|  |  | +            co_return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        ValidConfigFlyout().Hide();
 | 
	
		
			
				|  |  | +        InvalidConfigFlyout().Hide();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      void EditPage::HelpButton_Click(IInspectable const&, RoutedEventArgs const&) {
 | 
	
		
			
				|  |  |          const auto _ = winrt::Windows::System::Launcher::LaunchUriAsync(Uri{ L"https://github.com/eycorsican/leaf/blob/master/README.zh.md" });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      IAsyncAction EditPage::SaveDocument()
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +        const auto lifetime = get_strong();
 | 
	
		
			
				|  |  |          if (!SaveButton().IsEnabled()) {
 | 
	
		
			
				|  |  |              co_return;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -74,5 +112,3 @@ namespace winrt::Maple_App::implementation
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 |