71 lines
3.4 KiB
Markdown
71 lines
3.4 KiB
Markdown
# SettingsPage
|
||
|
||
**Namespace:** `FrymasterBadgeApp`
|
||
**Base Class:** `ContentPage`
|
||
**Purpose:** Configuration interface for managing file storage paths (Photos, Logos, Images) and global UI theme preferences.
|
||
|
||
## 🔑 Constants & Fields
|
||
| Name | Type | Access | Description |
|
||
|------|------|--------|-------------|
|
||
| `PhotoPathKey` | `const string` | `private` | Preference key: `"PhotoBasePath"` |
|
||
| `LogoPathKey` | `const string` | `private` | Preference key: `"LogoBasePath"` |
|
||
| `ImagesPathKey` | `const string` | `private` | Preference key: `"ImagesBasePath"` |
|
||
| `ThemePrefKey` | `const string` | `private` | Preference key: `"AppTheme"` |
|
||
|
||
## 🛠 Constructor
|
||
### `SettingsPage()`
|
||
- **Access:** `public`
|
||
- **Behavior:**
|
||
1. Calls `InitializeComponent()`.
|
||
2. Loads current paths and theme via helper methods.
|
||
3. Wires `ThemePicker.SelectedIndexChanged` to `ApplyThemeSelection()`.
|
||
4. Overrides default back button behavior to navigate `Shell.Current.GoToAsync("..")`.
|
||
|
||
## 📦 Methods
|
||
|
||
### `LoadCurrentSettings()`
|
||
- **Access:** `private`
|
||
- **Behavior:** Reads photo, logo, and image paths from `Preferences.Default`. Falls back to `C:\FrymasterData\...` and populates corresponding UI entries.
|
||
|
||
### `LoadCurrentThemePreference()`
|
||
- **Access:** `private`
|
||
- **Behavior:** Reads `"AppTheme"` preference. Maps to `Light`/`Dark`/`System`, updates `ThemePicker.SelectedIndex` and `Application.Current.UserAppTheme`.
|
||
|
||
### `ApplyThemeSelection()`
|
||
- **Access:** `private`
|
||
- **Behavior:** Reads `ThemePicker.SelectedIndex`. Updates `UserAppTheme` and persists selection to `Preferences.Default`. Handles null picker defensively.
|
||
|
||
### `OnPickPhotoFolderClicked`, `OnPickLogoFolderClicked`, `OnPickImagesFolderClicked`
|
||
- **Access:** `private async void`
|
||
- **Behavior:** Wrappers that invoke `PickFolderAsync` with specific update callbacks and dialog titles.
|
||
|
||
### `PickFolderAsync(Action<FolderPickerResult> onSuccess, string title)`
|
||
- **Access:** `private async Task`
|
||
- **Parameters:**
|
||
- `onSuccess` (`Action<FolderPickerResult>`) – Callback on successful selection.
|
||
- `title` (`string`) – Picker dialog title.
|
||
- **Behavior:** Invokes `FolderPicker.Default.PickAsync()`. On success, executes callback and calls `VerifyDirectory()`. Catches and displays alerts on failure.
|
||
|
||
### `OnSaveClicked(object sender, EventArgs e)`
|
||
- **Access:** `private async void`
|
||
- **Behavior:**
|
||
1. Trims and validates all three paths. Alerts if any are empty.
|
||
2. Saves paths to `Preferences.Default`.
|
||
3. Updates `StatusLabel` with success/error message and color.
|
||
4. Shows `Toast` (non-critical, wrapped in try/catch).
|
||
5. **Intentionally omits auto-navigation** to prevent known Shell navigation crashes.
|
||
6. Logs extensively via `AppLogger`.
|
||
|
||
### `SafeCreateDirectory(string path)`
|
||
- **Access:** `private static`
|
||
- **Behavior:** *(Commented out in current code but present)* Creates directory if missing. Logs failures but suppresses crashes.
|
||
|
||
### `VerifyDirectory(string path)`
|
||
- **Access:** `private static`
|
||
- **Behavior:** Checks `Directory.Exists(path)`. Creates it if missing. Used immediately after folder selection.
|
||
|
||
---
|
||
**💡 Developer Notes:**
|
||
- Uses `CommunityToolkit.Maui.Alerts` and `Storage` for modern picker/toast functionality.
|
||
- Hardcoded fallback paths (`C:\FrymasterData\...`) should be platform-aware for iOS/macOS/Android.
|
||
- Explicitly avoids `Shell.Current.GoToAsync("..")` after save to maintain navigation stability. |