* 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
140 lines
4.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|