Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
17 changes: 17 additions & 0 deletions Files/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@
{
public static class Constants
{
public static class AdaptiveLayout
{
public const float ExtraLargeThreshold = 85.0f;

public const float LargeThreshold = 80.0f;

public const float MediumThreshold = 60.0f;

public const float SmallThreshold = 25.0f;

public const float ExtraSmallThreshold = 15.0f;

public const int ItemsRequirementForDetails1 = 6;

public const int ItemsRequirementForDetails2 = 16;
}

public static class ImageRes
{
// See imageres.dll for more icon indexes to add
Expand Down
1 change: 1 addition & 0 deletions Files/Files.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@
<Compile Include="Filesystem\Permissions\UserGroup.cs" />
<Compile Include="Helpers\ItemListDisplayHelpers\GroupedCollection.cs" />
<Compile Include="Helpers\ItemListDisplayHelpers\GroupingHelper.cs" />
<Compile Include="Helpers\MathHelpers.cs" />
<Compile Include="Helpers\UniversalLogWriter.cs" />
<Compile Include="Helpers\SaveImageToFile.cs" />
<Compile Include="Filesystem\FolderHelpers.cs" />
Expand Down
100 changes: 66 additions & 34 deletions Files/Helpers/AdaptiveLayoutHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
{
if (App.AppSettings.AreLayoutPreferencesPerFolder && App.AppSettings.AdaptiveLayoutEnabled && !folderSettings.LayoutPreference.IsAdaptiveLayoutOverridden)
{
Action layoutDetails = () => folderSettings.ToggleLayoutModeDetailsView.Execute(false);
Action layoutTiles = () => folderSettings.ToggleLayoutModeTiles.Execute(false);
Action layoutGridView = () => folderSettings.ToggleLayoutModeGridView.Execute(folderSettings.GridViewSize);

bool desktopIniFound = false;

string path = filesystemViewModel?.WorkingDirectory;
Expand Down Expand Up @@ -40,31 +44,31 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
{
case "Documents":
{
folderSettings.ToggleLayoutModeTiles.Execute(false);
layoutDetails();
break;
}

case "Pictures":
{
folderSettings.ToggleLayoutModeGridView.Execute(folderSettings.GridViewSize);
layoutGridView();
break;
}

case "Music":
{
folderSettings.ToggleLayoutModeDetailsView.Execute(false);
layoutDetails();
break;
}

case "Videos":
{
folderSettings.ToggleLayoutModeGridView.Execute(folderSettings.GridViewSize);
layoutGridView();
break;
}

default:
{
folderSettings.ToggleLayoutModeDetailsView.Execute(false);
layoutDetails();
break;
}
}
Expand All @@ -84,47 +88,75 @@ public static bool PredictLayoutMode(FolderSettingsViewModel folderSettings, Ite
return false;
}

int imagesAndVideosCount = filesystemViewModel.FilesAndFolders.Where((item) =>

!string.IsNullOrEmpty(item.FileExtension)

// Images
&& (ImagePreviewViewModel.Extensions.Any((ext) => item.FileExtension.Equals(ext, StringComparison.OrdinalIgnoreCase))
int allItemsCount = filesystemViewModel.FilesAndFolders.Count;

// Audio & Video
|| MediaPreviewViewModel.Extensions.Any((ext) => item.FileExtension.Equals(ext, StringComparison.OrdinalIgnoreCase))
)).Count();
int mediaCount;
int imagesCount;
int foldersCount;
int miscFilesCount;

int foldersCount = filesystemViewModel.FilesAndFolders.Where((item) => item.PrimaryItemAttribute == StorageItemTypes.Folder).Count();
float mediaPercentage;
float imagesPercentage;
float foldersPercentage;
float miscFilesPercentage;

int otherFilesCount = filesystemViewModel.FilesAndFolders.Count - (imagesAndVideosCount + foldersCount);

if (foldersCount > 0)
{ // There are folders in current directory
if ((filesystemViewModel.FilesAndFolders.Count - imagesAndVideosCount) < (filesystemViewModel.FilesAndFolders.Count - 20) || (filesystemViewModel.FilesAndFolders.Count <= 20 && imagesAndVideosCount >= 5))
{ // Most of items are images/videos
folderSettings.ToggleLayoutModeTiles.Execute(false);
mediaCount = filesystemViewModel.FilesAndFolders.Where((item) =>
{
return !string.IsNullOrEmpty(item.FileExtension) && MediaPreviewViewModel.Extensions.Any((ext) => item.FileExtension.Equals(ext, StringComparison.OrdinalIgnoreCase));
}).Count();
imagesCount = filesystemViewModel.FilesAndFolders.Where((item) =>
{
return !string.IsNullOrEmpty(item.FileExtension) && ImagePreviewViewModel.Extensions.Any((ext) => item.FileExtension.Equals(ext, StringComparison.OrdinalIgnoreCase));
}).Count();
foldersCount = filesystemViewModel.FilesAndFolders.Where((item) => item.PrimaryItemAttribute == StorageItemTypes.Folder).Count();
miscFilesCount = allItemsCount - (mediaCount + imagesCount + foldersCount);

mediaPercentage = (float)((float)mediaCount / (float)allItemsCount) * 100.0f;
imagesPercentage = (float)((float)imagesCount / (float)allItemsCount) * 100.0f;
foldersPercentage = (float)((float)foldersCount / (float)allItemsCount) * 100.0f;
miscFilesPercentage = (float)((float)miscFilesCount / (float)allItemsCount) * 100.0f;

// Decide layout mode

// Mostly files + folders, lesser media and image files | Mostly folders
if ((foldersPercentage + miscFilesPercentage) > Constants.AdaptiveLayout.LargeThreshold)
{
if (allItemsCount > Constants.AdaptiveLayout.ItemsRequirementForDetails1)
{
layoutDetails();
}
else
{
folderSettings.ToggleLayoutModeDetailsView.Execute(false);
layoutTiles();
}
}
else
{ // There are only files
if (imagesAndVideosCount == filesystemViewModel.FilesAndFolders.Count)
{ // Only images/videos
folderSettings.ToggleLayoutModeGridView.Execute(folderSettings.GridViewSize);
}
else if (otherFilesCount < 20)
{ // Most of files are images/videos
folderSettings.ToggleLayoutModeTiles.Execute(false);
// Mostly images, probably an images folder
else if (imagesPercentage > Constants.AdaptiveLayout.ExtraLargeThreshold
|| (imagesPercentage > Constants.AdaptiveLayout.MediumThreshold
&& (mediaPercentage + miscFilesPercentage + foldersPercentage) > Constants.AdaptiveLayout.SmallThreshold
&& (miscFilesPercentage + foldersPercentage) < Constants.AdaptiveLayout.ExtraSmallThreshold))
{
layoutGridView();
}
// Mostly media i.e. sound files, videos
else if (mediaPercentage > Constants.AdaptiveLayout.ExtraLargeThreshold
|| (mediaPercentage > Constants.AdaptiveLayout.MediumThreshold
&& (imagesPercentage + miscFilesPercentage + foldersPercentage) > Constants.AdaptiveLayout.SmallThreshold
&& (miscFilesPercentage + foldersPercentage) < Constants.AdaptiveLayout.ExtraSmallThreshold))
{
if (allItemsCount > Constants.AdaptiveLayout.ItemsRequirementForDetails2)
{
layoutDetails();
}
else
{ // Images/videos and other files
folderSettings.ToggleLayoutModeDetailsView.Execute(false);
{
layoutTiles();
}
}
else
{
layoutDetails();
}

return true;
}
Expand Down
16 changes: 16 additions & 0 deletions Files/Helpers/MathHelpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Files.Helpers
{
public static class MathHelpers
{
public static int Gcd(int x, int y)
{
return y == 0 ? Math.Abs(x) : Gcd(y, x % y);
}
}
}
2 changes: 1 addition & 1 deletion Files/ViewModels/FolderSettingsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ public static LayoutPreferences FromCompositeValue(ApplicationDataCompositeValue
GridViewSize = (int)compositeValue[nameof(GridViewSize)],
DirectorySortOption = (SortOption)(int)compositeValue[nameof(DirectorySortOption)],
DirectorySortDirection = (SortDirection)(int)compositeValue[nameof(DirectorySortDirection)],
IsAdaptiveLayoutOverridden = (bool?)compositeValue[nameof(IsAdaptiveLayoutOverridden)] != null,
IsAdaptiveLayoutOverridden = compositeValue[nameof(IsAdaptiveLayoutOverridden)] is bool val ? val : false,
};

if (compositeValue.TryGetValue(nameof(DirectoryGroupOption), out var gpOption))
Expand Down