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
3 changes: 2 additions & 1 deletion src/Files.App/Data/Items/DetailsLayoutColumnItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ public double NormalMinLength

private GridLength _UserLength = new(200, GridUnitType.Pixel);

[RegistryIgnore]
// Persisted through UserLengthPixels: JSON can't read a GridLength back and would reset the width to 0
[RegistryIgnore, JsonIgnore]
public GridLength UserLength
{
get => _UserLength;
Expand Down
36 changes: 34 additions & 2 deletions src/Files.App/Helpers/Layout/LayoutPreferencesDatabase.Linux.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,11 @@ public void Import(string json)
var entries = new List<LayoutPreferencesFileEntry>();
foreach (var item in items ?? [])
{
if (!string.IsNullOrEmpty(item.FilePath))
entries.Add(new LayoutPreferencesFileEntry { FilePath = item.FilePath, FileId = GetId(item.FilePath), Preferences = item.LayoutPreferencesManager });
if (string.IsNullOrEmpty(item.FilePath))
continue;

RepairColumnWidths(item.LayoutPreferencesManager);
entries.Add(new LayoutPreferencesFileEntry { FilePath = item.FilePath, FileId = GetId(item.FilePath), Preferences = item.LayoutPreferencesManager });
}

Save(entries);
Expand Down Expand Up @@ -140,6 +143,9 @@ private List<LayoutPreferencesFileEntry> Load()
var path = DatabasePath;
if (File.Exists(path))
entries = JsonSerializer.Deserialize(File.ReadAllText(path), AppJsonSerializerContext.Default.ListLayoutPreferencesFileEntry) ?? entries;

foreach (var entry in entries)
RepairColumnWidths(entry.Preferences);
}
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or System.Text.Json.JsonException)
{
Expand All @@ -149,6 +155,32 @@ private List<LayoutPreferencesFileEntry> Load()
return _entries = entries;
}

// Earlier builds saved every column width as 0 (the GridLength round trip), which renders Details rows empty.
// Widths of 0 are never valid, since hidden columns are tracked separately, so they fall back to the default width.
private static void RepairColumnWidths(LayoutPreferencesItem? preferences)
{
if (preferences?.ColumnsViewModel is not { } columns)
return;

var stored = Columns(columns);
if (stored.All(column => column.UserLengthPixels > 0))
return;

var defaults = Columns(new LayoutPreferencesItem().ColumnsViewModel);
for (var i = 0; i < stored.Length; i++)
{
if (!(stored[i].UserLengthPixels > 0))
stored[i].UserLengthPixels = defaults[i].UserLengthPixels;
}

static DetailsLayoutColumnItem[] Columns(ColumnsViewModel c) =>
[
c.IconColumn, c.GitStatusColumn, c.GitLastCommitDateColumn, c.GitLastCommitMessageColumn, c.GitCommitAuthorColumn,
c.GitLastCommitShaColumn, c.TagColumn, c.NameColumn, c.StatusColumn, c.DateModifiedColumn, c.PathColumn,
c.OriginalPathColumn, c.ItemTypeColumn, c.DateDeletedColumn, c.DateCreatedColumn, c.SizeColumn,
];
}

private void Save(List<LayoutPreferencesFileEntry> entries)
{
_entries = entries;
Expand Down
Loading