Skip to content

Fix: Fixed crash on the tags settings page #11447

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

Merged
merged 11 commits into from
Mar 16, 2023
33 changes: 26 additions & 7 deletions src/Files.App/Helpers/ColorHelpers.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,53 @@
using CommunityToolkit.WinUI.Helpers;
using System;
using System.Globalization;
using Windows.UI;

namespace Files.App.Helpers
{
internal static class ColorHelpers
{
private const int COLOR_LENGTH = 7;
private const int COLOR_LENGTH_INCLUDING_ALPHA = 9;

private static readonly Color unknownTagColor = Color.FromArgb(255, 0x9E, 0xA3, 0xA1);

/// <summary>
/// Converts Hex to Windows.UI.Color.
/// </summary>
public static Color FromHex(string colorHex)
public static Color FromHex(string? colorHex)
{
// If Hex string is invalid, return Unknown Tag's color
if (
string.IsNullOrWhiteSpace(colorHex) ||
(colorHex.Length != COLOR_LENGTH && colorHex.Length != COLOR_LENGTH_INCLUDING_ALPHA)
)
return unknownTagColor;

colorHex = colorHex.Replace("#", string.Empty);

var alphaOffset = colorHex.Length == 8 ? 2 : 0;

var a = alphaOffset == 2 ? (byte)Convert.ToUInt32(colorHex.Substring(0, 2), 16) : (byte)255;
var r = (byte)Convert.ToUInt32(colorHex.Substring(alphaOffset, 2), 16);
var g = (byte)Convert.ToUInt32(colorHex.Substring(alphaOffset + 2, 2), 16);
var b = (byte)Convert.ToUInt32(colorHex.Substring(alphaOffset + 4, 2), 16);
var a = (byte)255;
var alphaValid = alphaOffset == 0 || byte.TryParse(colorHex.AsSpan(0, 2), NumberStyles.HexNumber, null, out a);

if (
alphaValid &&
byte.TryParse(colorHex.AsSpan(alphaOffset, 2), NumberStyles.HexNumber, null, out byte r) &&
byte.TryParse(colorHex.AsSpan(alphaOffset + 2, 2), NumberStyles.HexNumber, null, out byte g) &&
byte.TryParse(colorHex.AsSpan(alphaOffset + 4, 2), NumberStyles.HexNumber, null, out byte b)
)
return Color.FromArgb(a, r, g, b);

return Color.FromArgb(a, r, g, b);
return unknownTagColor;
}

/// <summary>
/// Converts Uint to Windows.UI.Color.
/// </summary>
public static Color FromUint(this uint value)
{
return Windows.UI.Color.FromArgb((byte)((value >> 24) & 0xFF),
return Color.FromArgb((byte)((value >> 24) & 0xFF),
(byte)((value >> 16) & 0xFF),
(byte)((value >> 8) & 0xFF),
(byte)(value & 0xFF));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Files.App.Extensions;
using Files.App.Filesystem;
using Files.App.Helpers;
using Files.App.Serialization;
using Files.App.Serialization.Implementation;
using Files.Backend.Services.Settings;
Expand Down Expand Up @@ -38,7 +39,15 @@ public FileTagsSettingsService()

public IList<TagViewModel> FileTagList
{
get => Get<List<TagViewModel>>(DefaultFileTags);
get
{
var tags = Get<List<TagViewModel>>(DefaultFileTags);

foreach (var tag in tags!)
tag.Color = ColorHelpers.FromHex(tag.Color).ToString();

return tags;
}
set
{
Set(value);
Expand Down Expand Up @@ -168,14 +177,14 @@ public override object ExportSettings()

private void UntagAllFiles(string uid)
{
var tagDoDelete = new string [] { uid };
var tagDoDelete = new string[] { uid };

foreach (var item in FileTagsHelper.GetDbInstance().GetAll())
{
if (item.Tags.Contains(uid))
{
{
FileTagsHelper.WriteFileTag(
item.FilePath,
item.FilePath,
item.Tags.Except(tagDoDelete).ToArray());
}
}
Expand Down