Files
FluentTerminal/FluentTerminal.App/Services/ImageFileSystemService.cs
T
Leonardo Di Stasio 37b4fd283a Add theme background image feature (#545)
* Add a background image property in theme

* Add the browse command to theme settings page

The goal was to create a command that permit to browse user pictures.
The user can now select is picture by browsing file or to simply copy the
link of the image in the textbox.

* Try to show the image that we download

* Change the save image method in file service

We call the method `ImportImageFile` so that we can show a picker dialog
and directly import the image in the roaming folder.
We make some check to avoid the application crash, still need to test

* Reorganize the UI for image import

* Add background brush converter

Now that we have a background image we need to set the background according
to the theme color or the selected image.
To do this we need to use the `ThemeViewModel` and the new converter to
select the right brush to use (`ImageBrush` or ` AcrylicBrush`)

* Use the File object insted of a image path

* Add background style to content and toolbar

* Create the ImageFile object

* Use the ImageFile object so that we can serialize the theme

* Remove commented code

* Remove the base64 string of the image file

* Disable if it's a preinstalled theme

* Add new event when background image changed

* Make the RemoveImportedImage method async

* Subscribe to background image event and change background in code behind

* Add the delete background image command

* Remove unused converters that we created

* Save background image in temporary folder

* Remove the temporary images and save the last one

* Implement the cancel and delete background

* Show the background image in terminal

* Split the image file methods in another interface

* Change the name of image saving method

* Prepare the object and methods to export encoded image

* Add import method to deserialize correctly the theme

* Remove the private from the set accessor

* Implememnt the import method

* Implement the conversion base64 image to real image

* Create the background image and import it

* Fix some actions bug

* Get the new image file name after import

* Fix some bugs when the image is deleted

* Move the background image in terminal view

* Translate the background image text

* Add the delete background command

* Fix the background image deletion if we click on cancel

* Add background opacity property to terminal view model

* Need to create a theme changed event

If we don't notify the view that the selected theme has changed with
another theme that has the same background but a different background image
we'll never see this image appear.
In fact the background change is triggered by the background color change.

* Remove the background from the theme settings page

* Fix error of last edited image

* Fix image background aspect ratio
2019-10-20 10:30:52 +02:00

140 lines
4.8 KiB
C#

using FluentTerminal.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using System.Threading.Tasks;
using Windows.Graphics.Imaging;
using Windows.Security.Cryptography;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
namespace FluentTerminal.App.Services
{
public class ImageFileSystemService : IImageFileSystemService
{
public async Task RemoveTemporaryBackgroundThemeImage()
{
var folder = await ApplicationData.Current
.LocalCacheFolder
.TryGetItemAsync("BackgroundThemeTmp");
if (folder == null)
{
return;
}
var backgroundThemeTmpFolder =
await ApplicationData.Current
.LocalCacheFolder
.GetFolderAsync(
"BackgroundThemeTmp");
await backgroundThemeTmpFolder.DeleteAsync();
}
public async Task<ImageFile> ImportTemporaryImageFile(IEnumerable<string> fileTypes)
{
var picker = new FileOpenPicker
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary
};
foreach (var fileType in fileTypes)
{
picker.FileTypeFilter.Add(fileType);
}
var file = await picker.PickSingleFileAsync();
if (file != null)
{
var backgroundThemeTmpFolder =
await ApplicationData.Current
.LocalCacheFolder
.CreateFolderAsync(
"BackgroundThemeTmp",
CreationCollisionOption.OpenIfExists);
var item = await backgroundThemeTmpFolder.TryGetItemAsync(file.Name);
if (item == null)
{
var storageFile = await file.CopyAsync(backgroundThemeTmpFolder, file.Name);
return new ImageFile(
storageFile.DisplayName,
storageFile.FileType,
$@"{backgroundThemeTmpFolder.Path}\{storageFile.Name}");
}
return new ImageFile(
file.DisplayName,
file.FileType,
$@"{backgroundThemeTmpFolder.Path}\{item.Name}");
}
return null;
}
public async Task RemoveImportedImage(string fileName)
{
var backgroundThemeFolder = await ApplicationData.Current.RoamingFolder
.CreateFolderAsync("BackgroundTheme", CreationCollisionOption.OpenIfExists);
var item = await backgroundThemeFolder.TryGetItemAsync(fileName);
if (item != null)
{
var file = await backgroundThemeFolder.GetFileAsync(fileName);
await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
}
}
public string EncodeImage(ImageFile imageFile)
{
if(imageFile == null)
{
return string.Empty;
}
if (!System.IO.File.Exists(imageFile.Path))
{
return string.Empty;
}
return Convert.ToBase64String(System.IO.File.ReadAllBytes(imageFile.Path));
}
public async Task<ImageFile> ImportThemeImage(ImageFile backgroundImage, string encodedImage)
{
var bitmapData = Convert.FromBase64String(encodedImage);
MemoryStream streamBitmap = new MemoryStream(bitmapData);
var localFolder = await ApplicationData.Current
.RoamingFolder
.CreateFolderAsync("BackgroundTheme", CreationCollisionOption.OpenIfExists);
var storageFile = await localFolder
.CreateFileAsync(
$"{backgroundImage.Name}{backgroundImage.FileType}",
CreationCollisionOption.GenerateUniqueName);
using (Stream stream = await storageFile.OpenStreamForWriteAsync())
{
stream.Seek(0, SeekOrigin.Begin);
streamBitmap.WriteTo(stream);
}
return new ImageFile(storageFile.DisplayName,
storageFile.FileType,
storageFile.Path);
}
}
}