From 2a727c71217ae08e844df60cd09c38b2dc8d4779 Mon Sep 17 00:00:00 2001 From: whimsical-c4lic0 Date: Thu, 26 Feb 2026 19:10:52 -0600 Subject: [PATCH] Improve help text on config page --- .../ViewModels/ConfigCategoryViewModel.cs | 59 ++---------- OF DL.Gui/ViewModels/ConfigFieldViewModel.cs | 5 +- OF DL.Gui/ViewModels/MainWindowViewModel.cs | 90 +++++++++---------- OF DL.Gui/Views/MainWindow.axaml | 15 ++-- 4 files changed, 62 insertions(+), 107 deletions(-) diff --git a/OF DL.Gui/ViewModels/ConfigCategoryViewModel.cs b/OF DL.Gui/ViewModels/ConfigCategoryViewModel.cs index 030f458..2c75a67 100644 --- a/OF DL.Gui/ViewModels/ConfigCategoryViewModel.cs +++ b/OF DL.Gui/ViewModels/ConfigCategoryViewModel.cs @@ -5,6 +5,12 @@ namespace OF_DL.Gui.ViewModels; public sealed class ConfigCategoryViewModel : ViewModelBase { + private const string SpecificDateFilterOptionHelpText = + "Downloads posts (does not apply to messages) before or after the chosen date."; + + private const string FolderStructureOptionHelpText = + "Choose which content types get separate folders, including unlocked PPV posts and messages."; + public ConfigCategoryViewModel(string categoryName, IEnumerable fields) { CategoryName = categoryName; @@ -111,29 +117,7 @@ public sealed class ConfigCategoryViewModel : ViewModelBase FolderPerPaidMessageField != null && FolderPerMessageField != null; - public string SpecificDateFilterHelpText - { - get - { - List parts = []; - if (!string.IsNullOrWhiteSpace(DownloadOnlySpecificDatesField?.HelpText)) - { - parts.Add(DownloadOnlySpecificDatesField.HelpText); - } - - if (!string.IsNullOrWhiteSpace(DownloadDateSelectionField?.HelpText)) - { - parts.Add(DownloadDateSelectionField.HelpText); - } - - if (!string.IsNullOrWhiteSpace(CustomDateField?.HelpText)) - { - parts.Add(CustomDateField.HelpText); - } - - return string.Join(" ", parts.Distinct(StringComparer.Ordinal)); - } - } + public string SpecificDateFilterHelpText => SpecificDateFilterOptionHelpText; public string RateLimitHelpText { @@ -154,34 +138,7 @@ public sealed class ConfigCategoryViewModel : ViewModelBase } } - public string FolderStructureHelpText - { - get - { - List parts = []; - if (!string.IsNullOrWhiteSpace(FolderPerPaidPostField?.HelpText)) - { - parts.Add(FolderPerPaidPostField.HelpText); - } - - if (!string.IsNullOrWhiteSpace(FolderPerPostField?.HelpText)) - { - parts.Add(FolderPerPostField.HelpText); - } - - if (!string.IsNullOrWhiteSpace(FolderPerPaidMessageField?.HelpText)) - { - parts.Add(FolderPerPaidMessageField.HelpText); - } - - if (!string.IsNullOrWhiteSpace(FolderPerMessageField?.HelpText)) - { - parts.Add(FolderPerMessageField.HelpText); - } - - return string.Join(" ", parts.Distinct(StringComparer.Ordinal)); - } - } + public string FolderStructureHelpText => FolderStructureOptionHelpText; public bool HasSpecificDateFilterHelpText => !string.IsNullOrWhiteSpace(SpecificDateFilterHelpText); diff --git a/OF DL.Gui/ViewModels/ConfigFieldViewModel.cs b/OF DL.Gui/ViewModels/ConfigFieldViewModel.cs index 5da9742..bb0260a 100644 --- a/OF DL.Gui/ViewModels/ConfigFieldViewModel.cs +++ b/OF DL.Gui/ViewModels/ConfigFieldViewModel.cs @@ -99,10 +99,7 @@ public partial class ConfigFieldViewModel : ViewModelBase } SelectedFileNameVariable = AvailableFileNameVariables.FirstOrDefault(); - string availableVariables = - string.Join(", ", AvailableFileNameVariables.Select(variable => $"{{{variable}}}")); - string fileNameHelpText = - $"Available variables: {availableVariables}. Include {{mediaId}} or {{filename}} to avoid collisions."; + const string fileNameHelpText = "Include {mediaId} or {filename} to avoid filename collisions."; HelpText = string.IsNullOrWhiteSpace(HelpText) ? fileNameHelpText : $"{HelpText} {fileNameHelpText}"; diff --git a/OF DL.Gui/ViewModels/MainWindowViewModel.cs b/OF DL.Gui/ViewModels/MainWindowViewModel.cs index 05235c1..2b80064 100644 --- a/OF DL.Gui/ViewModels/MainWindowViewModel.cs +++ b/OF DL.Gui/ViewModels/MainWindowViewModel.cs @@ -78,88 +78,88 @@ public partial class MainWindowViewModel( private static readonly Dictionary s_configHelpTextByProperty = new(StringComparer.Ordinal) { [nameof(Config.FFmpegPath)] = - "Path to the FFmpeg executable. If blank, OF-DL will try the app directory and PATH.", + "Path to the FFmpeg executable. Leave blank to auto-detect from the app folder or PATH.", [nameof(Config.FFprobePath)] = - "Path to the FFprobe executable. If blank, OF-DL will try FFmpeg's directory, the app directory, and PATH.", + "Path to the FFprobe executable. Leave blank to auto-detect from FFmpeg's folder, the app folder, or PATH.", [nameof(Config.DownloadPath)] = - "Base download folder. If blank, OF-DL uses __user_data__/sites/OnlyFans/{username}.", + "Base download folder. Leave blank to use __user_data__/sites/OnlyFans/{username}.", [nameof(Config.DrmVideoDurationMatchThreshold)] = - "Minimum DRM video duration match threshold. Higher values are stricter. 100% requires an exact duration match. 98% is the recommended value.", - [nameof(Config.DownloadVideos)] = "Download video media when enabled.", - [nameof(Config.DownloadImages)] = "Download image media when enabled.", - [nameof(Config.DownloadAudios)] = "Download audio media when enabled.", + "Minimum DRM duration match required. 98% is recommended; 100% requires an exact match.", + [nameof(Config.DownloadVideos)] = "Include videos in downloads.", + [nameof(Config.DownloadImages)] = "Include images in downloads.", + [nameof(Config.DownloadAudios)] = "Include audio files in downloads.", [nameof(Config.DownloadAvatarHeaderPhoto)] = - "Download creator avatar and header images when enabled.", - [nameof(Config.DownloadPosts)] = "Download free posts when enabled.", - [nameof(Config.DownloadPaidPosts)] = "Download paid posts when enabled.", - [nameof(Config.DownloadArchived)] = "Download archived posts when enabled.", - [nameof(Config.DownloadStreams)] = "Download posts from the Streams tab when enabled.", - [nameof(Config.DownloadStories)] = "Download stories when enabled.", - [nameof(Config.DownloadHighlights)] = "Download highlights when enabled.", + "Include creator avatar and header images.", + [nameof(Config.DownloadPosts)] = "Include free posts.", + [nameof(Config.DownloadPaidPosts)] = "Include unlocked PPV posts.", + [nameof(Config.DownloadArchived)] = "Include archived posts.", + [nameof(Config.DownloadStreams)] = "Include stream posts from the Streams tab.", + [nameof(Config.DownloadStories)] = "Include stories.", + [nameof(Config.DownloadHighlights)] = "Include highlights.", [nameof(Config.DownloadMessages)] = - "Download free media from messages (including paid-message previews) when enabled.", + "Include free message media and paid-message preview media.", [nameof(Config.DownloadPaidMessages)] = - "Download paid media from messages (excluding preview media) when enabled.", + "Include unlocked PPV message media (excluding preview media).", [nameof(Config.IgnoreOwnMessages)] = - "Ignore your own sent messages and do not download media sent by your account.", + "Skip messages sent by your account and any media attached to them.", [nameof(Config.DownloadPostsIncrementally)] = - "Only download new posts after the latest downloaded post in metadata DB.", + "Only fetch posts newer than the latest saved post in metadata.", [nameof(Config.BypassContentForCreatorsWhoNoLongerExist)] = - "Allow downloading accessible purchased content for deleted creators.", + "Try downloading accessible purchased content even when a creator account no longer exists.", [nameof(Config.DownloadDuplicatedMedia)] = - "When enabled, duplicate media can be downloaded instead of being skipped.", + "Allow duplicate media to be downloaded instead of skipped.", [nameof(Config.SkipAds)] = - "Skip posts/messages containing #ad or free-trial links when enabled.", + "Skip posts and messages that contain #ad or free-trial links.", [nameof(Config.DownloadOnlySpecificDates)] = - "Limit downloads by date using DownloadDateSelection and CustomDate.", + "Enable post date filtering using Date Selection and Custom Date.", [nameof(Config.DownloadDateSelection)] = - "Choose whether date filtering uses content before or after CustomDate.", + "Choose whether post filtering uses content before or after Custom Date.", [nameof(Config.CustomDate)] = - "Date used for date-filtered downloads (yyyy-MM-dd).", + "Date used for post filtering (yyyy-MM-dd).", [nameof(Config.ShowScrapeSize)] = - "Show total byte size instead of item counts during download progress.", + "Show estimated total bytes instead of item counts while preparing downloads.", [nameof(Config.DisableTextSanitization)] = - "Store post/message text as-is without XML stripping.", + "Store post and message text as-is without XML stripping.", [nameof(Config.DownloadVideoResolution)] = - "Choose preferred video resolution (source, 240, or 720 when available).", + "Preferred video resolution when alternatives are available.", [nameof(Config.PaidPostFileNameFormat)] = - "Custom filename format for paid posts. See custom filename formats docs.", + "Filename pattern for unlocked PPV posts.", [nameof(Config.PostFileNameFormat)] = - "Custom filename format for free posts/archived/streams. See custom filename formats docs.", + "Filename pattern for free posts, archived posts, and streams.", [nameof(Config.PaidMessageFileNameFormat)] = - "Custom filename format for paid messages. See custom filename formats docs.", + "Filename pattern for unlocked PPV message media.", [nameof(Config.MessageFileNameFormat)] = - "Custom filename format for free messages. See custom filename formats docs.", + "Filename pattern for free message media.", [nameof(Config.RenameExistingFilesWhenCustomFormatIsSelected)] = - "Rename previously downloaded files when custom filename format is enabled.", + "Rename existing downloaded files to match current custom filename formats.", [nameof(Config.CreatorConfigs)] = - "Per-creator filename format overrides. Values here override global filename formats.", + "Per-creator filename format overrides in JSON. These override global formats.", [nameof(Config.FolderPerPaidPost)] = - "Create a separate folder per paid post when enabled.", + "Create a separate folder for each unlocked PPV post.", [nameof(Config.FolderPerPost)] = - "Create a separate folder per free post when enabled.", + "Create a separate folder for each free post.", [nameof(Config.FolderPerPaidMessage)] = - "Create a separate folder per paid message when enabled.", + "Create a separate folder for each unlocked PPV message.", [nameof(Config.FolderPerMessage)] = - "Create a separate folder per free message when enabled.", + "Create a separate folder for each free message.", [nameof(Config.IncludeExpiredSubscriptions)] = - "Include expired subscriptions in user selection.", + "Show expired subscriptions in creator selection.", [nameof(Config.IncludeRestrictedSubscriptions)] = - "Include restricted creators in scraping and download flow.", + "Include restricted creators during scraping and downloads.", [nameof(Config.IgnoredUsersListName)] = - "Users in this list are ignored during scraping. Empty means no users are ignored.", + "Skip creators that belong to this OnlyFans list.", [nameof(Config.Timeout)] = - "HTTP timeout override in seconds (-1 uses default behavior).", + "HTTP timeout in seconds. Use -1 for default behavior.", [nameof(Config.LimitDownloadRate)] = "Enable download speed limiting.", [nameof(Config.DownloadLimitInMbPerSec)] = - "Download rate limit in MB/s when rate limiting is enabled.", + "Maximum download speed in MB/s when rate limiting is enabled.", [nameof(Config.Theme)] = - "GUI theme for the configuration and download screens.", + "Choose the GUI theme.", [nameof(Config.HideMissingCdmKeysWarning)] = - "Hide the missing CDM keys warning before downloads start.", + "Skip the missing CDM keys confirmation before downloads start.", [nameof(Config.LoggingLevel)] = - "Log verbosity written to logs/OFDL.txt." + "Minimum log level written to logs/OFDL.txt." }; private static readonly Dictionary s_lightThemeBrushes = new(StringComparer.Ordinal) diff --git a/OF DL.Gui/Views/MainWindow.axaml b/OF DL.Gui/Views/MainWindow.axaml index 86405cd..b13b8b9 100644 --- a/OF DL.Gui/Views/MainWindow.axaml +++ b/OF DL.Gui/Views/MainWindow.axaml @@ -761,14 +761,15 @@ + Orientation="Horizontal" + Spacing="8"> - + VerticalAlignment="Center" /> +