diff --git a/OpenTabletArtist/ViewModels/AboutViewModel.cs b/OpenTabletArtist/ViewModels/AboutViewModel.cs index 4442570..f697e83 100644 --- a/OpenTabletArtist/ViewModels/AboutViewModel.cs +++ b/OpenTabletArtist/ViewModels/AboutViewModel.cs @@ -37,10 +37,11 @@ public AboutViewModel(IDialogService? dialogs = null, Func? detectedTab /// The user manual, rendered on GitHub. public string UserManualUrl => $"{RepoUrl}/blob/master/docs/user/USERMANUAL.md"; - /// The Drawing Tablet community Discord — where users should go for help (#568). Deliberately - /// not the OpenTabletDriver forums: an issue is only forwarded to OTD once it's confirmed to be an OTD - /// problem, so the first stop is the OTA help channel. - public string HelpDiscordUrl => "https://discord.gg/Rr2MXeM7Ny"; + /// The manual's "Getting help" page — where to ask, and what to include when you do. Replaces + /// the Help card that used to sit on Home (#568): the guidance outgrew a paragraph, and a page can say + /// what to include in a post without turning the column into an essay. The Discord link lives there + /// now, along with the reason it is the first stop rather than the OpenTabletDriver forums. + public string HelpUrl => $"{RepoUrl}/blob/master/docs/user/HELP.md"; /// App version, read from the assembly so it never drifts (the release workflow stamps /// the tag version at build). Moved here from the sidebar footer so version info lives on About. @@ -48,9 +49,10 @@ public AboutViewModel(IDialogService? dialogs = null, Func? detectedTab Assembly.GetExecutingAssembly() .GetCustomAttribute()?.InformationalVersion); - /// "Version v0.6.0 BETA"-style label for the About card — folds in the BETA tag that used - /// to sit in the title bar (#home-version). - public string AppVersionLabel => $"Version {AppVersion} BETA"; + /// "Version v0.6.0 BETA." — a closing sentence for the About paragraph rather than a line or + /// a heading suffix of its own. The version is reference matter: worth having to hand when reporting a + /// problem, not worth its own row in the column. + public string AppVersionSentence => $"Version {AppVersion} BETA."; /// Opens a URL in the user's default browser. [RelayCommand] diff --git a/OpenTabletArtist/Views/AboutView.axaml b/OpenTabletArtist/Views/AboutView.axaml index 9f47359..0f9aead 100644 --- a/OpenTabletArtist/Views/AboutView.axaml +++ b/OpenTabletArtist/Views/AboutView.axaml @@ -3,94 +3,77 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="using:OpenTabletArtist.Controls"> - - - - - - - OpenTablet Artist is an alternative, artist-friendly experience for OpenTabletDriver on Windows. - - - - - + + + + + - - - - - - - Post in the #help-forum channel on the Drawing Tablet Discord and put “OTA” in the title, so it reaches the right people. - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/OpenTabletArtist/Views/AboutView.axaml.cs b/OpenTabletArtist/Views/AboutView.axaml.cs index 1d4b35a..c9980f6 100644 --- a/OpenTabletArtist/Views/AboutView.axaml.cs +++ b/OpenTabletArtist/Views/AboutView.axaml.cs @@ -1,60 +1,12 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Controls.Documents; -using Avalonia.Input; -using OpenTabletArtist.ViewModels; namespace OpenTabletArtist.Views; +// (The inline-link plumbing that used to live here went with the Help card. Avalonia has no inline +// hyperlink, so making one phrase of a paragraph clickable meant hit-testing the pointer against that +// run's character range in the text layout — about fifty lines of it, for one sentence. The help text is +// a manual page now, reached by an ordinary link in RESOURCES, so none of it is needed.) public partial class AboutView : UserControl { - // "Drawing Tablet Discord" is a plain (accent + underline) Run so it aligns exactly to the text - // baseline. Avalonia has no inline hyperlink, and an embedded InlineUIContainer button won't - // baseline-align in flowing text — so we make just that run clickable by hit-testing the pointer - // against its character range in the paragraph. - private static readonly Cursor HandCursor = new(StandardCursorType.Hand); - private (int start, int length)? _linkRange; - - public AboutView() - { - InitializeComponent(); - } - - // Character range of the DiscordLink run within the paragraph. TextLayout indexes the same inline - // texts we sum here, so the offsets line up. Cached after the first lookup (the inlines are static). - private (int start, int length) LinkRange() - { - if (_linkRange is { } cached) return cached; - int start = 0; - if (HelpText.Inlines is { } inlines) - { - foreach (var inline in inlines) - { - if (inline == DiscordLink) - return (_linkRange = (start, (DiscordLink.Text ?? string.Empty).Length)).Value; - if (inline is Run run) start += run.Text?.Length ?? 0; - } - } - return (_linkRange = (0, 0)).Value; - } - - private bool IsOverLink(Point p) - { - var (start, length) = LinkRange(); - if (length == 0) return false; - var hit = HelpText.TextLayout.HitTestPoint(p); - if (!hit.IsInside) return false; - int pos = hit.CharacterHit.FirstCharacterIndex; - return pos >= start && pos < start + length; - } - - private void OnHelpPointerMoved(object? sender, PointerEventArgs e) - => HelpText.Cursor = IsOverLink(e.GetPosition(HelpText)) ? HandCursor : Cursor.Default; - - private void OnHelpPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (!e.GetCurrentPoint(HelpText).Properties.IsLeftButtonPressed) return; - if (IsOverLink(e.GetPosition(HelpText)) && DataContext is AboutViewModel vm) - vm.OpenUrlCommand.Execute(vm.HelpDiscordUrl); - } + public AboutView() => InitializeComponent(); } diff --git a/OpenTabletArtist/Views/DashboardView.axaml b/OpenTabletArtist/Views/DashboardView.axaml index 8113986..1753a8d 100644 --- a/OpenTabletArtist/Views/DashboardView.axaml +++ b/OpenTabletArtist/Views/DashboardView.axaml @@ -10,10 +10,104 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -131,90 +225,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/user/HELP.md b/docs/user/HELP.md new file mode 100644 index 0000000..e1e0ed7 --- /dev/null +++ b/docs/user/HELP.md @@ -0,0 +1,25 @@ +# Getting help + +*(Part of the [User Manual](USERMANUAL.md).)* + +## Try Troubleshooting first + +Most of what people run into is already covered in **[Troubleshooting](TROUBLESHOOTING.md)** — the daemon not connecting, a tablet not being detected, pressure not working in an art app, settings that won't stick. + +## Where to ask + +Post in the **#help-forum** channel on the [Drawing Tablet Discord](https://discord.gg/Rr2MXeM7Ny), and put **"OTA"** in the title so it reaches the right people. + +That's deliberately *not* the OpenTabletDriver forums. Most issues aren't OTD-specific, and starting in the OTA channel gets them to people who know this app — anything that turns out to be a driver problem can be passed on from there. + +If you've found a bug or want to request a feature, [open an issue on GitHub](https://github.com/TheSevenPens/OpenTabletArtist/issues) instead. + +## What to include + +A post with these answered usually gets sorted in one reply: + +- **Your OTA version** — on the **Home** page, in parentheses next to *ABOUT*. +- **Your tablet** — the model as it appears in the tablet switcher, and whether OTA shows it as connected. +- **What you expected, and what happened instead.** If it's about how the pen feels, say which app you were drawing in. +- **Whether the daemon is connected** — Home tells you, and **Advanced → Daemon** has the details. +- **A screenshot**, if anything looks wrong on screen. diff --git a/docs/user/USERMANUAL.md b/docs/user/USERMANUAL.md index cb68178..88715c5 100644 --- a/docs/user/USERMANUAL.md +++ b/docs/user/USERMANUAL.md @@ -48,6 +48,7 @@ Every paired or connected tablet also appears on **Home** under *Your tablets*. - **[Settings page](SETTINGS.md)** — Presets · Hotkeys · Appearance · System (Startup/Shortcut/Driver Cleanup) · Developer. - **[Advanced page](ADVANCED.md)** — Daemon · Console · Drivers · Configs · Diagnostics · Plugins. - **[Plugins](PLUGINS.md)** — what ships with OTA, what the Pen Dynamics plugin does, and whether you need any others. +- **[Getting help](HELP.md)** — where to ask when something isn't working, and what to include. ## System tray & background mode @@ -71,3 +72,7 @@ The OTD daemon is a separate process and keeps running after our app's window cl ## Troubleshooting **See [Troubleshooting](TROUBLESHOOTING.md).** + +## Getting help + +If Troubleshooting doesn't cover it, **see [Getting help](HELP.md)** — where to ask, and what to include so the first reply is a useful one.