Skip to content

Conversation

ghost1372
Copy link
Contributor

@ghost1372 ghost1372 commented Aug 7, 2025

This PR replaces the legacy ApplicationData-based settings system with a new SettingsHelper class. It adds support for both packaged and unpackaged app scenarios.

Closes #1924.

Old Settings System:

appData.LocalSettings.Values[SettingsKeys.IsLeftMode] = true;
New Settings System:

SettingsHelper.Current.IsLeftMode = true;

Note

Settings are automatically saved when changed.

SettingsHelper Architecture:

Uses an ISettingsProvider abstraction.
In packaged mode: uses ApplicationDataContainer.
In unpackaged mode: uses JsonSettingsProvider.

Adding a New Setting:

public bool IsEnabled
{
    get => GetOrCreateDefault<bool>(true);
    set => Set(value);
}

ghost1372 referenced this pull request Aug 10, 2025
…centralize settings keys (#1900)

## Description
- Replace `Windows.Storage.ApplicationData` with
`Microsoft.Windows.Storage.ApplicationData`.
- Centralize Settings Keys in a `SettingsKeys` Class.
- define key constants in `ScratchPadPage`.

## Motivation and Context
- Closes #1892
- Closes #1893

## How Has This Been Tested?
**Manually tested**

## Screenshots (if appropriate):

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)

Co-authored-by: Niels Laute <[email protected]>
Copy link
Contributor

@Zakariathr22 Zakariathr22 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a few points that I think are important, but of course after hearing @marcelwgn’s opinion about them.

@niels9001 niels9001 requested review from Copilot and marcelwgn August 30, 2025 13:00
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors the application settings system by replacing the legacy ApplicationData-based approach with a new SettingsHelper class that provides type-safe property access and supports both packaged and unpackaged app scenarios.

  • Introduces a new SettingsHelper class with an ISettingsProvider abstraction
  • Replaces string-based settings keys with strongly-typed properties
  • Adds JSON-based settings storage for unpackaged apps while maintaining ApplicationData support for packaged apps

Reviewed Changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
SettingsHelper/SettingsHelper.cs New settings class with type-safe properties and update methods
SettingsHelper/Providers/* Provider abstraction with ApplicationData and JSON implementations
SettingsHelper/ObservableSettings.cs Base class providing property change notifications and storage operations
SettingsHelper/Internals/* Support classes for JSON serialization and list operations
SettingsKeys.cs Removed legacy string-based settings keys
Various pages/helpers Updated to use new SettingsHelper.Current API instead of legacy methods

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment on lines +67 to +70
catch (Exception)
{
HandleCorruptedFile();
}
Copy link
Preview

Copilot AI Aug 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Catching generic Exception can hide unexpected errors. Consider catching specific exceptions like JsonException or IOException for better error handling.

Suggested change
catch (Exception)
{
HandleCorruptedFile();
}
catch (JsonException)
{
HandleCorruptedFile();
}
catch (IOException)
{
HandleCorruptedFile();
}

Copilot uses AI. Check for mistakes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having multiple specific exceptions can be useful for clarity, but in this case, it may not be necessary. We could handle multiple error cases with a single exception type, which would allow us to catch all errors uniformly instead of only the predefined ones.

Comment on lines +41 to +45
catch (Exception)
{
HandleCorruptedKey(key);
return default;
}
Copy link
Preview

Copilot AI Aug 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Catching generic Exception can hide unexpected errors. Consider catching specific exceptions like JsonException or InvalidCastException for better error handling.

Suggested change
catch (Exception)
{
HandleCorruptedKey(key);
return default;
}
catch (JsonException)
{
HandleCorruptedKey(key);
return default;
}
catch (InvalidCastException)
{
HandleCorruptedKey(key);
return default;
}
catch (FormatException)
{
HandleCorruptedKey(key);
return default;
}

Copilot uses AI. Check for mistakes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like above

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

UnPackaged Mode is Broken
3 participants