MainPage.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #pragma once
  2. #include "MainPage.g.h"
  3. #include "Model/ConfigViewModel.h"
  4. using namespace winrt;
  5. using namespace Windows::ApplicationModel::DataTransfer;
  6. using namespace Windows::Foundation;
  7. using namespace Windows::Foundation::Collections;
  8. using namespace Windows::Storage;
  9. using namespace Windows::UI::Core;
  10. using namespace Windows::UI::Xaml;
  11. using namespace Windows::UI::Xaml::Controls;
  12. using namespace Windows::UI::Xaml::Input;
  13. namespace winrt::Maple_App::implementation
  14. {
  15. template<typename T>
  16. concept ConvertableToIStorageItem = std::convertible_to<T, IStorageItem>;
  17. static const hstring CONFIG_PATH_SETTING_KEY = L"CONFIG_PATH";
  18. static const hstring NETIF_SETTING_KEY = L"NETIF";
  19. std::string getNormalizedExtentionFromPath(const winrt::hstring& path);
  20. struct MainPage : MainPageT<MainPage>
  21. {
  22. MainPage();
  23. static DependencyProperty ConfigItemsProperty();
  24. IObservableVector<Maple_App::ConfigViewModel> ConfigItems();
  25. void Page_Loaded(IInspectable const& sender, RoutedEventArgs const& e);
  26. void ConfigSetAsDefaultMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  27. void ConfigRenameMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  28. fire_and_forget ConfigDeleteMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  29. void RenameDialogPrimaryButton_Click(IInspectable const& sender, ContentDialogButtonClickEventArgs const& e);
  30. void RenameDialogText_KeyDown(IInspectable const& sender, KeyRoutedEventArgs const& e);
  31. fire_and_forget ConfigCreateMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  32. fire_and_forget ConfigImportMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  33. fire_and_forget ConfigDuplicateMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  34. void MainPivot_PivotItemLoaded(Pivot const& sender, PivotItemEventArgs const& args);
  35. void NetifCombobox_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
  36. void ConfigListView_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
  37. void ConfigListView_DragItemsStarting(IInspectable const& sender, DragItemsStartingEventArgs const& e);
  38. void ConfigListView_DragOver(IInspectable const& sender, DragEventArgs const& e);
  39. fire_and_forget ConfigListView_Drop(IInspectable const& sender, DragEventArgs const& e);
  40. void ConfigItem_DoubleTapped(IInspectable const& sender, DoubleTappedRoutedEventArgs const& e);
  41. void WindowWidth_CurrentStateChanged(IInspectable const& sender, VisualStateChangedEventArgs const& e);
  42. void MainSplitView_PaneClosing(SplitView const& sender, SplitViewPaneClosingEventArgs const& args);
  43. fire_and_forget GenerateProfileButton_Click(IInspectable const& sender, RoutedEventArgs const& e);
  44. private:
  45. inline static DependencyProperty m_configItemsProperty =
  46. DependencyProperty::Register(
  47. L"ConfigItems",
  48. xaml_typename<IObservableVector<Maple_App::ConfigViewModel>>(),
  49. xaml_typename<Maple_App::MainPage>(),
  50. nullptr
  51. );
  52. inline static DependencyProperty m_renamedNameProperty =
  53. DependencyProperty::Register(
  54. L"RenamedName",
  55. xaml_typename<winrt::hstring>(),
  56. xaml_typename<Maple_App::MainPage>(),
  57. nullptr
  58. );
  59. inline static SystemNavigationManager NavigationManager{ nullptr };
  60. IStorageFolder m_configFolder{ nullptr };
  61. Maple_App::ConfigViewModel m_defaultConfig{ nullptr };
  62. static IAsyncAction NotifyUser(const hstring& message);
  63. static IAsyncOperation<IStorageFolder> InitializeConfigFolder();
  64. static IAsyncOperation<StorageFile> CopyDefaultConfig(const IStorageFolder& configFolder, const hstring& desiredName);
  65. static IAsyncOperation<StorageFile> CopyDefaultJsonConfig(const IStorageFolder& configFolder, const hstring& desiredName);
  66. void RequestRenameItem(const Maple_App::ConfigViewModel& item);
  67. void SetAsDefault(const Maple_App::ConfigViewModel& item);
  68. fire_and_forget ConfirmRename();
  69. IAsyncAction LoadConfigs();
  70. template<ConvertableToIStorageItem T>
  71. IAsyncAction ImportFiles(const IVectorView<T>& items) {
  72. const auto lifetime = get_strong();
  73. const auto& targetDir = co_await InitializeConfigFolder();
  74. // TODO: concurrency
  75. for (const auto& item : items) {
  76. const auto& file = item.try_as<IStorageFile>();
  77. if (file == nullptr) {
  78. continue;
  79. }
  80. auto ext = getNormalizedExtentionFromPath(file.Path());
  81. if (ext != ".json" && ext != ".conf" && ext != ".mmdb" && ext != ".dat") {
  82. continue;
  83. }
  84. const auto& newFile = co_await file.CopyAsync(targetDir, file.Name(), NameCollisionOption::GenerateUniqueName);
  85. ConfigItems().Append(co_await ConfigViewModel::FromFile(newFile, false));
  86. }
  87. }
  88. };
  89. }
  90. namespace winrt::Maple_App::factory_implementation
  91. {
  92. struct MainPage : MainPageT<MainPage, implementation::MainPage>
  93. {
  94. };
  95. }