/ src / modules / cmdpal / ext / SamplePagesExtension / SampleDataTransferPage.cs
SampleDataTransferPage.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System;
  6  using System.Globalization;
  7  using Microsoft.CommandPalette.Extensions;
  8  using Microsoft.CommandPalette.Extensions.Toolkit;
  9  using Windows.ApplicationModel.DataTransfer;
 10  using Windows.Storage.Streams;
 11  
 12  namespace SamplePagesExtension;
 13  
 14  internal sealed partial class SampleDataTransferPage : ListPage
 15  {
 16      private readonly IListItem[] _items;
 17  
 18      public SampleDataTransferPage()
 19      {
 20          var dataPackageWithText = CreateDataPackageWithText();
 21          var dataPackageWithDelayedText = CreateDataPackageWithDelayedText();
 22          var dataPackageWithImage = CreateDataPackageWithImage();
 23  
 24          _items =
 25          [
 26              new ListItem(new NoOpCommand())
 27              {
 28                  Title = "Draggable item with a plain text",
 29                  Subtitle = "A sample page demonstrating how to drag and drop data",
 30                  DataPackage = dataPackageWithText,
 31              },
 32              new ListItem(new NoOpCommand())
 33              {
 34                  Title = "Draggable item with a lazily rendered plain text",
 35                  Subtitle = "A sample page demonstrating how to drag and drop data with delayed rendering",
 36                  DataPackage = dataPackageWithDelayedText,
 37              },
 38              new ListItem(new NoOpCommand())
 39              {
 40                  Title = "Draggable item with an image",
 41                  Subtitle = "This item has an image - package contains both file and a bitmap",
 42                  Icon = IconHelpers.FromRelativePath("Assets/Images/Swirls.png"),
 43                  DataPackage = dataPackageWithImage,
 44              },
 45              new ListItem(new SampleDataTransferOnGridPage())
 46              {
 47                  Title = "Drag & drop grid",
 48                  Subtitle = "A sample page demonstrating a grid list of items",
 49                  Icon = new IconInfo("\uF0E2"),
 50              }
 51          ];
 52      }
 53  
 54      private static DataPackage CreateDataPackageWithText()
 55      {
 56          var dataPackageWithText = new DataPackage
 57          {
 58              Properties =
 59              {
 60                  Title = "Item with data package with text",
 61                  Description = "This item has associated text with it",
 62              },
 63              RequestedOperation = DataPackageOperation.Copy,
 64          };
 65          dataPackageWithText.SetText("Text data in the Data Package");
 66          return dataPackageWithText;
 67      }
 68  
 69      private static DataPackage CreateDataPackageWithDelayedText()
 70      {
 71          var dataPackageWithDelayedText = new DataPackage
 72          {
 73              Properties =
 74              {
 75                  Title = "Item with delayed render data in the data package",
 76                  Description = "This items has an item associated with it that is evaluated when requested for the first time",
 77              },
 78              RequestedOperation = DataPackageOperation.Copy,
 79          };
 80          dataPackageWithDelayedText.SetDataProvider(StandardDataFormats.Text, request =>
 81          {
 82              var d = request.GetDeferral();
 83              try
 84              {
 85                  request.SetData(DateTime.Now.ToString("G", CultureInfo.CurrentCulture));
 86              }
 87              finally
 88              {
 89                  d.Complete();
 90              }
 91          });
 92          return dataPackageWithDelayedText;
 93      }
 94  
 95      private static DataPackage CreateDataPackageWithImage()
 96      {
 97          var dataPackageWithImage = new DataPackage
 98          {
 99              Properties =
100              {
101                  Title = "Item with delayed render image in the data package",
102                  Description = "This items has an image associated with it that is evaluated when requested for the first time",
103              },
104              RequestedOperation = DataPackageOperation.Copy,
105          };
106          dataPackageWithImage.SetDataProvider(StandardDataFormats.Bitmap, async void (request) =>
107          {
108              var deferral = request.GetDeferral();
109              try
110              {
111                  var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Images/Swirls.png"));
112                  var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
113                  var streamRef = RandomAccessStreamReference.CreateFromStream(stream);
114                  request.SetData(streamRef);
115              }
116              finally
117              {
118                  deferral.Complete();
119              }
120          });
121          dataPackageWithImage.SetDataProvider(StandardDataFormats.StorageItems, async void (request) =>
122          {
123              var deferral = request.GetDeferral();
124              try
125              {
126                  var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Images/Swirls.png"));
127                  var items = new[] { file };
128                  request.SetData(items);
129              }
130              finally
131              {
132                  deferral.Complete();
133              }
134          });
135          return dataPackageWithImage;
136      }
137  
138      public override IListItem[] GetItems() => _items;
139  }
140  
141  [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "Samples")]
142  internal sealed partial class SampleDataTransferOnGridPage : ListPage
143  {
144      public SampleDataTransferOnGridPage()
145      {
146          GridProperties = new GalleryGridLayout
147          {
148              ShowTitle = true,
149              ShowSubtitle = true,
150          };
151      }
152  
153      public override IListItem[] GetItems()
154      {
155          return [
156              new ListItem(new NoOpCommand())
157              {
158                  Title = "Red Rectangle",
159                  Subtitle = "Drag me",
160                  Icon = IconHelpers.FromRelativePath("Assets/Images/RedRectangle.png"),
161                  DataPackage = CreateDataPackageForImage("Assets/Images/RedRectangle.png"),
162              },
163              new ListItem(new NoOpCommand())
164              {
165                  Title = "Swirls",
166                  Subtitle = "Drop me",
167                  Icon = IconHelpers.FromRelativePath("Assets/Images/Swirls.png"),
168                  DataPackage = CreateDataPackageForImage("Assets/Images/Swirls.png"),
169              },
170              new ListItem(new NoOpCommand())
171              {
172                  Title = "Windows Digital",
173                  Subtitle = "Drag me",
174                  Icon = IconHelpers.FromRelativePath("Assets/Images/Win-Digital.png"),
175                  DataPackage = CreateDataPackageForImage("Assets/Images/Win-Digital.png"),
176              },
177              new ListItem(new NoOpCommand())
178              {
179                  Title = "Red Rectangle",
180                  Subtitle = "Drop me",
181                  Icon = IconHelpers.FromRelativePath("Assets/Images/RedRectangle.png"),
182                  DataPackage = CreateDataPackageForImage("Assets/Images/RedRectangle.png"),
183              },
184              new ListItem(new NoOpCommand())
185              {
186                  Title = "Space",
187                  Subtitle = "Drag me",
188                  Icon = IconHelpers.FromRelativePath("Assets/Images/Space.png"),
189                  DataPackage = CreateDataPackageForImage("Assets/Images/Space.png"),
190              },
191              new ListItem(new NoOpCommand())
192              {
193                  Title = "Swirls",
194                  Subtitle = "Drop me",
195                  Icon = IconHelpers.FromRelativePath("Assets/Images/Swirls.png"),
196                  DataPackage = CreateDataPackageForImage("Assets/Images/Swirls.png"),
197              },
198              new ListItem(new NoOpCommand())
199              {
200                  Title = "Windows Digital",
201                  Subtitle = "Drag me",
202                  Icon = IconHelpers.FromRelativePath("Assets/Images/Win-Digital.png"),
203                  DataPackage = CreateDataPackageForImage("Assets/Images/Win-Digital.png"),
204              },
205          ];
206      }
207  
208      private static DataPackage CreateDataPackageForImage(string relativePath)
209      {
210          var dataPackageWithImage = new DataPackage
211          {
212              Properties =
213              {
214                  Title = "Image",
215                  Description = "This item has an image associated with it.",
216              },
217              RequestedOperation = DataPackageOperation.Copy,
218          };
219  
220          var imageUri = new Uri($"ms-appx:///{relativePath}");
221  
222          dataPackageWithImage.SetDataProvider(StandardDataFormats.Bitmap, async (request) =>
223          {
224              var deferral = request.GetDeferral();
225              try
226              {
227                  var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(imageUri);
228                  var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
229                  var streamRef = RandomAccessStreamReference.CreateFromStream(stream);
230                  request.SetData(streamRef);
231              }
232              finally
233              {
234                  deferral.Complete();
235              }
236          });
237  
238          dataPackageWithImage.SetDataProvider(StandardDataFormats.StorageItems, async (request) =>
239          {
240              var deferral = request.GetDeferral();
241              try
242              {
243                  var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(imageUri);
244                  var items = new[] { file };
245                  request.SetData(items);
246              }
247              finally
248              {
249                  deferral.Complete();
250              }
251          });
252          return dataPackageWithImage;
253      }
254  }