فهرست منبع

Drag and drop config

bdbai 4 سال پیش
والد
کامیت
882446b226
5فایلهای تغییر یافته به همراه73 افزوده شده و 5 حذف شده
  1. 7 2
      Maple.App/EditPage.cpp
  2. 54 1
      Maple.App/MainPage.cpp
  3. 4 0
      Maple.App/MainPage.h
  4. 6 1
      Maple.App/MainPage.xaml
  5. 2 1
      Maple.App/pch.h

+ 7 - 2
Maple.App/EditPage.cpp

@@ -20,8 +20,13 @@ namespace winrt::Maple_App::implementation
         const auto& param = e.Parameter().as<Maple_App::ConfigViewModel>();
 
         m_file = param.File();
-        const auto& text = co_await FileIO::ReadTextAsync(param.File(), UnicodeEncoding::Utf8);
-        EditBox().Document().SetText(TextSetOptions::None, text);
+        try {
+            const auto& text = co_await FileIO::ReadTextAsync(param.File(), UnicodeEncoding::Utf8);
+            EditBox().Document().SetText(TextSetOptions::None, text);
+        }
+        catch (const winrt::hresult_error&) {
+            EditBox().Document().SetText(TextSetOptions::None, L"Invalid configuration file");
+        }
         const auto weakThis = lifetime->get_weak();
         m_saveModifiedContent = [weakThis]() -> IAsyncAction {
             if (const auto self{ weakThis.get() }) {

+ 54 - 1
Maple.App/MainPage.cpp

@@ -1,6 +1,7 @@
 #include "pch.h"
 #include "MainPage.h"
 #include "MainPage.g.cpp"
+#include <filesystem>
 #include <winrt/Windows.Networking.Vpn.h>
 #include "Model\Netif.h"
 
@@ -279,6 +280,59 @@ namespace winrt::Maple_App::implementation
         MainContentFrame().Navigate(xaml_typename<EditPage>(), e.AddedItems().First().Current());
     }
 
+    void MainPage::ConfigListView_DragItemsStarting(IInspectable const&, DragItemsStartingEventArgs const& e)
+    {
+        std::vector<IStorageItem> files;
+        files.reserve(static_cast<size_t>(e.Items().Size()));
+        for (const auto& obj : e.Items()) {
+            const auto& item = obj.try_as<Maple_App::ConfigViewModel>();
+            if (item == nullptr) {
+                continue;
+            }
+            files.push_back(item.File());
+        }
+        const auto& data = e.Data();
+        data.SetStorageItems(files);
+        data.RequestedOperation(DataPackageOperation::Copy);
+    }
+
+    void MainPage::ConfigListView_DragOver(IInspectable const&, DragEventArgs const& e)
+    {
+        if (static_cast<uint32_t>(e.AllowedOperations() & DataPackageOperation::Copy) == 0
+            || !e.DataView().Contains(StandardDataFormats::StorageItems())) {
+            e.AcceptedOperation(DataPackageOperation::None);
+            return;
+        }
+        e.AcceptedOperation(DataPackageOperation::Copy);
+    }
+    fire_and_forget MainPage::ConfigListView_Drop(IInspectable const&, DragEventArgs const& e)
+    {
+        const auto lifetime = get_strong();
+        const auto& dataView = e.DataView();
+        if (static_cast<uint32_t>(e.AllowedOperations() & DataPackageOperation::Copy) == 0
+            || !dataView.Contains(StandardDataFormats::StorageItems())) {
+            return;
+        }
+
+        const auto& items = co_await dataView.GetStorageItemsAsync();
+        const auto& targetDir = co_await InitializeConfigFolder();
+        for (const auto& item : items) {
+            const auto& file = item.try_as<IStorageFile>();
+            if (file == nullptr) {
+                continue;
+            }
+            auto ext = std::filesystem::path(std::wstring_view(file.Path())).extension().string();
+            std::transform(ext.begin(), ext.end(), ext.begin(), [](const auto ch) {
+                return std::tolower(ch);
+                });
+            if (ext != ".json" && ext != ".conf") {
+                continue;
+            }
+            const auto& newFile = co_await file.CopyAsync(targetDir, file.Name(), NameCollisionOption::GenerateUniqueName);
+            ConfigItems().Append(co_await ConfigViewModel::FromFile(newFile, false));
+        }
+    }
+
     void MainPage::WindowWidth_CurrentStateChanged(IInspectable const&, VisualStateChangedEventArgs const& e)
     {
         const auto& state = e.NewState();
@@ -314,4 +368,3 @@ namespace winrt::Maple_App::implementation
         }
     }
 }
-

+ 4 - 0
Maple.App/MainPage.h

@@ -4,6 +4,7 @@
 #include "Model/ConfigViewModel.h"
 
 using namespace winrt;
+using namespace Windows::ApplicationModel::DataTransfer;
 using namespace Windows::Foundation;
 using namespace Windows::Foundation::Collections;
 using namespace Windows::Storage;
@@ -34,6 +35,9 @@ namespace winrt::Maple_App::implementation
         void MainPivot_PivotItemLoaded(Pivot const& sender, PivotItemEventArgs const& args);
         void NetifCombobox_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
         void ConfigListView_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
+        void ConfigListView_DragItemsStarting(IInspectable const& sender, DragItemsStartingEventArgs const& e);
+        void ConfigListView_DragOver(IInspectable const& sender, DragEventArgs const& e);
+        fire_and_forget ConfigListView_Drop(IInspectable const& sender, DragEventArgs const& e);
         void ConfigItem_DoubleTapped(IInspectable const& sender, DoubleTappedRoutedEventArgs const& e);
         void WindowWidth_CurrentStateChanged(IInspectable const& sender, VisualStateChangedEventArgs const& e);
         void MainSplitView_PaneClosing(SplitView const& sender, SplitViewPaneClosingEventArgs const& args);

+ 6 - 1
Maple.App/MainPage.xaml

@@ -28,8 +28,13 @@
                             x:Name="ConfigListView"
                             Grid.Row="0"
                             SelectionMode="Single"
+                            CanDragItems="True"
+                            AllowDrop="True"
                             ItemsSource="{x:Bind ConfigItems, Mode=OneWay}"
-                            SelectionChanged="ConfigListView_SelectionChanged">
+                            SelectionChanged="ConfigListView_SelectionChanged"
+                            DragItemsStarting="ConfigListView_DragItemsStarting"
+                            DragOver="ConfigListView_DragOver"
+                            Drop="ConfigListView_Drop">
                             <ListView.ItemContainerStyle>
                                 <Style TargetType="ListViewItem">
                                     <Setter Property="HorizontalContentAlignment" Value="Stretch"/>

+ 2 - 1
Maple.App/pch.h

@@ -3,10 +3,11 @@
 #include <unknwn.h>
 #include <restrictederrorinfo.h>
 #include <hstring.h>
+#include <winrt/Windows.ApplicationModel.Activation.h>
+#include <winrt/Windows.ApplicationModel.DataTransfer.h>
 #include <winrt/Windows.Foundation.h>
 #include <winrt/Windows.Foundation.Collections.h>
 #include <winrt/Windows.Foundation.Metadata.h>
-#include <winrt/Windows.ApplicationModel.Activation.h>
 #include <winrt/Windows.Storage.h>
 #include <winrt/Windows.Storage.FileProperties.h>
 #include <winrt/Windows.UI.Core.h>