Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Transitioned to Json Settings #6113

Merged
merged 34 commits into from
Oct 7, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
82ebfc9
BaseJsonSettingsModel v3 test
d2dyno1 Sep 13, 2021
7cc8a70
Showcase of ISettingsSharingContext
d2dyno1 Sep 13, 2021
707a5db
Transfer more settings into new format
d2dyno1 Sep 15, 2021
57a3342
Transition more settings and added settings merger
d2dyno1 Sep 15, 2021
230239f
Fixed UI not being updated after a setting is changed
d2dyno1 Sep 15, 2021
d0ceec8
Hopefully fix OnSettingChangedEvent not being raised
d2dyno1 Sep 16, 2021
fb0fa9d
Added back caching feature to Bundles
d2dyno1 Sep 16, 2021
7f47567
Fix build
d2dyno1 Sep 16, 2021
5f9fdf1
Remove some stuff from old SettingsViewModel
d2dyno1 Sep 16, 2021
7bfeeba
Added missing service registration StartupSettingsService
gave92 Sep 19, 2021
81ce4fc
Removed ported settings definitions from SettingsViewModel
gave92 Sep 19, 2021
98ea1c9
Add back AppCenter logging for settings
gave92 Sep 19, 2021
004a103
Merged even more settings
d2dyno1 Sep 19, 2021
a416b02
Merge remote-tracking branch 'upstream/main' into iusersettings
d2dyno1 Sep 19, 2021
f419fc8
Fix file tag selection
gave92 Sep 19, 2021
4e042ea
Merge branch 'iusersettings' of https://github.com/d2dyno1/Files into…
gave92 Sep 19, 2021
a82b3db
Use TValue type for defaultValue
d2dyno1 Sep 19, 2021
3355da1
Added IFileTagsSettingsService
d2dyno1 Sep 19, 2021
d92b402
Added IBundlesSettingsService
d2dyno1 Sep 19, 2021
32a40b5
Fix InvalidCastException
gave92 Sep 19, 2021
259af5d
Merge branch 'iusersettings' of https://github.com/d2dyno1/Files into…
gave92 Sep 19, 2021
e95ed78
Resolve conflicts
d2dyno1 Sep 27, 2021
ae9af73
Merge branch 'iusersettings' of https://github.com/d2dyno1/Files into…
d2dyno1 Sep 27, 2021
29c471c
Fix conflicts
d2dyno1 Oct 1, 2021
160a974
Fix 1
d2dyno1 Oct 1, 2021
d23d911
Fix 2
d2dyno1 Oct 1, 2021
f0af6df
Merge branch 'main' into iusersettings
d2dyno1 Oct 5, 2021
b6c6889
Merge remote-tracking branch 'upstream/main' into iusersettings
d2dyno1 Oct 6, 2021
47dcf6d
Fixed changing settings not updating the UI
d2dyno1 Oct 6, 2021
0bce908
Fix build
d2dyno1 Oct 6, 2021
e054723
Fix IsVerticalTabFlyoutEnabled
d2dyno1 Oct 6, 2021
d17e216
Fix NRE
d2dyno1 Oct 6, 2021
d042b20
Fix startup issue
d2dyno1 Oct 6, 2021
d0b2b52
Merge branch 'iusersettings' of https://github.com/d2dyno1/Files into…
d2dyno1 Oct 6, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Files/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@
using Files.Filesystem.FilesystemHistory;
using Files.Helpers;
using Files.Models.Settings;
using Files.Services;
using Files.Services.Implementation;
using Files.SettingsInterfaces;
using Files.UserControls.MultitaskingControl;
using Files.ViewModels;
using Files.Views;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Toolkit.Mvvm.DependencyInjection;
using Microsoft.Toolkit.Uwp;
using Microsoft.Toolkit.Uwp.Helpers;
using Microsoft.Toolkit.Uwp.Notifications;
Expand Down Expand Up @@ -59,6 +63,8 @@ sealed partial class App : Application
public static OngoingTasksViewModel OngoingTasksViewModel { get; } = new OngoingTasksViewModel();
public static SecondaryTileHelper SecondaryTileHelper { get; private set; } = new SecondaryTileHelper();

public IServiceProvider Services { get; private set; }

public App()
{
// Initialize logger
Expand All @@ -69,6 +75,23 @@ public App()
InitializeComponent();
Suspending += OnSuspending;
LeavingBackground += OnLeavingBackground;

this.Services = ConfigureServices();
Ioc.Default.ConfigureServices(Services);
}

private IServiceProvider ConfigureServices()
{
ServiceCollection services = new ServiceCollection();

services
// Base IUserSettingsService
.AddSingleton<IUserSettingsService, UserSettingsService>()

// Children settings (from IUserSettingsService)
.AddSingleton<IFilesAndFoldersSettingsService, FilesAndFoldersSettingsService>();

return services.BuildServiceProvider();
}

private static async Task EnsureSettingsAndConfigurationAreBootstrapped()
Expand Down
2 changes: 2 additions & 0 deletions Files/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ public static class LocalSettings

public const string BundlesSettingsFileName = "bundles.json";

public const string UserSettingsFileName = "user_settings.json";

public const string FileTagSettingsFileName = "filetags.json";
}

Expand Down
18 changes: 17 additions & 1 deletion Files/Files.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,18 @@
<Compile Include="Helpers\ZipHelpers.cs" />
<Compile Include="Interacts\ItemManipulationModel.cs" />
<Compile Include="ISearchBox.cs" />
<Compile Include="Models\JsonSettings\ISettingsSharingContext.cs" />
<Compile Include="Models\JsonSettings\IJsonSettingsDatabase.cs" />
<Compile Include="Models\JsonSettings\IJsonSettingsSerializer.cs" />
<Compile Include="Models\JsonSettings\Implementation\CachingJsonSettingsDatabase.cs" />
<Compile Include="Models\JsonSettings\Implementation\DefaultJsonSettingsDatabase.cs" />
<Compile Include="Models\JsonSettings\Implementation\DefaultJsonSettingsSerializer.cs" />
<Compile Include="Models\JsonSettings\Implementation\DefaultSettingsSerializer.cs" />
<Compile Include="Models\JsonSettings\ISettingsSerializer.cs" />
<Compile Include="Services\IFilesAndFoldersSettingsService.cs" />
<Compile Include="Services\Implementation\FilesAndFoldersSettingsService.cs" />
<Compile Include="Services\Implementation\UserSettingsService.cs" />
<Compile Include="Services\IUserSettingsService.cs" />
<Compile Include="UserControls\ColoredIcon.xaml.cs">
<DependentUpon>ColoredIcon.xaml</DependentUpon>
</Compile>
Expand Down Expand Up @@ -341,7 +353,7 @@
<Compile Include="ViewModels\SettingsViewModels\SidebarViewModel.cs" />
<Compile Include="ViewModels\SearchBoxViewModel.cs" />
<Compile Include="ViewModels\SidebarViewModel.cs" />
<Compile Include="Models\Settings\BaseJsonSettingsModel.cs" />
<Compile Include="Models\JsonSettings\BaseJsonSettingsModel.cs" />
<Compile Include="ViewModels\ColumnsViewModel.cs" />
<Compile Include="ViewModels\Pages\YourHomeViewModel.cs" />
<Compile Include="ViewModels\StatusCenterViewModel.cs" />
Expand Down Expand Up @@ -1412,6 +1424,9 @@
<PackageReference Include="Microsoft.Data.Sqlite.Core">
<Version>5.0.9</Version>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.DependencyInjection">
<Version>5.0.2</Version>
</PackageReference>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.12</Version>
</PackageReference>
Expand Down Expand Up @@ -1503,6 +1518,7 @@
<Name>Windows Desktop Extensions for the UWP</Name>
</SDKReference>
</ItemGroup>
<ItemGroup />
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '16.0' ">
<VisualStudioVersion>16.0</VisualStudioVersion>
</PropertyGroup>
Expand Down
4 changes: 3 additions & 1 deletion Files/Filesystem/FileTagsHelper.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Common;
using Files.Filesystem.StorageItems;
using Files.Helpers;
using Files.Models.JsonSettings;
using Files.Models.JsonSettings.Implementation;
using Files.Models.Settings;
using Microsoft.Toolkit.Uwp;
using Microsoft.Toolkit.Uwp.Helpers;
Expand Down Expand Up @@ -106,7 +108,7 @@ public FileTagsSettings()

public IList<FileTag> FileTagList
{
get => Get<IList<FileTag>>(() => new List<FileTag>()
get => Get<List<FileTag>>(new List<FileTag>()
{
new FileTag("Blue", "#0072BD"),
new FileTag("Orange", "#D95319"),
Expand Down
12 changes: 9 additions & 3 deletions Files/Filesystem/Search/FolderSearch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Files.Extensions;
using Files.Filesystem.StorageItems;
using Files.Helpers;
using Files.Services;
using Microsoft.Toolkit.Mvvm.DependencyInjection;
using Microsoft.Toolkit.Uwp;
using System;
using System.Collections.Generic;
Expand All @@ -22,6 +24,8 @@ namespace Files.Filesystem.Search
{
public class FolderSearch
{
private IFilesAndFoldersSettingsService FilesAndFoldersSettingsService { get; } = Ioc.Default.GetService<IFilesAndFoldersSettingsService>();

private const uint defaultStepSize = 500;

public string Query { get; set; }
Expand Down Expand Up @@ -185,7 +189,8 @@ private async Task SearchTagsAsync(string folder, IList<ListedItem> results, Can
{
var isSystem = ((FileAttributes)findData.dwFileAttributes & FileAttributes.System) == FileAttributes.System;
var isHidden = ((FileAttributes)findData.dwFileAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;
bool shouldBeListed = !isHidden || (App.AppSettings.AreHiddenItemsVisible && (!isSystem || !App.AppSettings.AreSystemItemsHidden));

bool shouldBeListed = !isHidden || (FilesAndFoldersSettingsService.AreHiddenItemsVisible && (!isSystem || !App.AppSettings.AreSystemItemsHidden));

if (shouldBeListed)
{
Expand Down Expand Up @@ -245,7 +250,7 @@ private async Task AddItemsAsync(string folder, IList<ListedItem> results, Cance
hiddenOnlyFromWin32 = true;
}

if (!hiddenOnlyFromWin32 || App.AppSettings.AreHiddenItemsVisible)
if (!hiddenOnlyFromWin32 || FilesAndFoldersSettingsService.AreHiddenItemsVisible)
{
await SearchWithWin32Async(folder, hiddenOnlyFromWin32, UsedMaxItemCount - (uint)results.Count, results, token);
//foreach (var item in)
Expand All @@ -269,6 +274,7 @@ private async Task SearchWithWin32Async(string folder, bool hiddenOnly, uint max

if (hFile != IntPtr.Zero)
{
IFilesAndFoldersSettingsService filesAndFoldersSettingsService = Ioc.Default.GetService<IFilesAndFoldersSettingsService>();
await Task.Run(() =>
{
var hasNextFile = false;
Expand All @@ -284,7 +290,7 @@ await Task.Run(() =>
var isHidden = ((FileAttributes)findData.dwFileAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;
bool shouldBeListed = hiddenOnly ?
isHidden && (!isSystem || !App.AppSettings.AreSystemItemsHidden) :
!isHidden || (App.AppSettings.AreHiddenItemsVisible && (!isSystem || !App.AppSettings.AreSystemItemsHidden));
!isHidden || (filesAndFoldersSettingsService.AreHiddenItemsVisible && (!isSystem || !filesAndFoldersSettingsService.AreSystemItemsHidden));

if (shouldBeListed)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using Files.Extensions;
using Files.Helpers;
using Files.Helpers.FileListCache;
using Files.Services;
using Microsoft.Toolkit.Mvvm.DependencyInjection;
using Microsoft.Toolkit.Uwp;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -37,11 +39,13 @@ Func<List<ListedItem>, Task> intermediateAction
var hasNextFile = false;
var count = 0;

IFilesAndFoldersSettingsService filesAndFoldersSettingsService = Ioc.Default.GetService<IFilesAndFoldersSettingsService>();

do
{
var isSystem = ((FileAttributes)findData.dwFileAttributes & FileAttributes.System) == FileAttributes.System;
var isHidden = ((FileAttributes)findData.dwFileAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;
if (!isHidden || (App.AppSettings.AreHiddenItemsVisible && (!isSystem || !App.AppSettings.AreSystemItemsHidden)))
if (!isHidden || (filesAndFoldersSettingsService.AreHiddenItemsVisible && (!isSystem || !App.AppSettings.AreSystemItemsHidden)))
{
if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
{
Expand Down
170 changes: 170 additions & 0 deletions Files/Models/JsonSettings/BaseJsonSettingsModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
using Files.Helpers;
using Files.Models.JsonSettings.Implementation;
using Newtonsoft.Json.Linq;
using System.Runtime.CompilerServices;

namespace Files.Models.JsonSettings
{
/// <summary>
/// Clipboard Canvas
/// A base class to easily manage all application's settings.
/// </summary>
public abstract class BaseJsonSettingsModel : ISettingsSharingContext
{
#region Protected Members

protected int registeredMembers = 0;

protected ISettingsSharingContext settingsSharingContext;

protected readonly IJsonSettingsSerializer jsonSettingsSerializer;

protected readonly ISettingsSerializer settingsSerializer;

#endregion Protected Members

#region Properties

private string _FilePath;
public string FilePath
{
get => settingsSharingContext?.FilePath ?? _FilePath;
protected set => _FilePath = value;
}

private IJsonSettingsDatabase _JsonSettingsDatabase;
public IJsonSettingsDatabase JsonSettingsDatabase
{
get => settingsSharingContext?.JsonSettingsDatabase ?? _JsonSettingsDatabase;
protected set => _JsonSettingsDatabase = value;
}

#endregion Properties

#region Constructor

public BaseJsonSettingsModel()
{
}

public BaseJsonSettingsModel(string filePath)
: this (filePath, null, null, null)
{
}

public BaseJsonSettingsModel(ISettingsSharingContext settingsSharingContext)
{
RegisterSettingsContext(settingsSharingContext);
Initialize();
}

public BaseJsonSettingsModel(string filePath, bool isCachingEnabled,
IJsonSettingsSerializer jsonSettingsSerializer = null,
ISettingsSerializer settingsSerializer = null)
{
this.FilePath = filePath;
Initialize();

this.jsonSettingsSerializer = jsonSettingsSerializer;
this.settingsSerializer = settingsSerializer;

// Fallback
this.jsonSettingsSerializer ??= new DefaultJsonSettingsSerializer();
this.settingsSerializer ??= new DefaultSettingsSerializer(this.FilePath);

if (isCachingEnabled)
{
this.JsonSettingsDatabase = new CachingJsonSettingsDatabase(this.jsonSettingsSerializer, this.settingsSerializer);
}
else
{
this.JsonSettingsDatabase = new DefaultJsonSettingsDatabase(this.jsonSettingsSerializer, this.settingsSerializer);
}
}

public BaseJsonSettingsModel(string filePath,
IJsonSettingsSerializer jsonSettingsSerializer,
ISettingsSerializer settingsSerializer,
IJsonSettingsDatabase jsonSettingsDatabase)
{
this.FilePath = filePath;
Initialize();

this.jsonSettingsSerializer = jsonSettingsSerializer;
this.settingsSerializer = settingsSerializer;
this.JsonSettingsDatabase = jsonSettingsDatabase;

// Fallback
this.jsonSettingsSerializer ??= new DefaultJsonSettingsSerializer();
this.settingsSerializer ??= new DefaultSettingsSerializer(this.FilePath);
this.JsonSettingsDatabase ??= new DefaultJsonSettingsDatabase(this.jsonSettingsSerializer, this.settingsSerializer);
}

#endregion Constructor

#region Helpers

protected virtual void Initialize()
{
// Create the file
NativeFileOperationsHelper.CreateFileForWrite((settingsSharingContext?.FilePath ?? FilePath), false).Dispose();
}

public virtual object ExportSettings()
{
return (settingsSharingContext?.JsonSettingsDatabase ?? JsonSettingsDatabase)?.ExportSettings();
}

public virtual void ImportSettings(object import)
{
(settingsSharingContext?.JsonSettingsDatabase ?? JsonSettingsDatabase)?.ImportSettings(import);
}

public bool RegisterSettingsContext(ISettingsSharingContext settingsSharingContext)
{
this.settingsSharingContext = settingsSharingContext;
return true;
}

public ISettingsSharingContext GetContext()
{
registeredMembers++;
return settingsSharingContext ?? this;
}

#endregion Helpers

#region Get, Set

protected virtual TValue Get<TValue>(TValue defaultValue, [CallerMemberName] string propertyName = "")
{
if (string.IsNullOrEmpty(propertyName))
{
return defaultValue;
}

object value = (settingsSharingContext?.JsonSettingsDatabase ?? JsonSettingsDatabase).GetValue(propertyName, defaultValue);

if (value is JToken jTokenValue)
{
return jTokenValue.ToObject<TValue>();
}
else
{
return (TValue)value;
}
}

protected virtual bool Set<TValue>(TValue value, [CallerMemberName] string propertyName = "")
{
if (string.IsNullOrEmpty(propertyName))
{
return false;
}

return (settingsSharingContext?.JsonSettingsDatabase ?? JsonSettingsDatabase).UpdateKey(propertyName, value);
}

#endregion Get, Set
}
}
17 changes: 17 additions & 0 deletions Files/Models/JsonSettings/IJsonSettingsDatabase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace Files.Models.JsonSettings
{
public interface IJsonSettingsDatabase
{
object GetValue(string key, object defaultValue = null);

bool AddKey(string key, object value);

bool RemoveKey(string key);

bool UpdateKey(string key, object newValue);

void ImportSettings(object import);

object ExportSettings();
}
}
Loading