Add tooltips across Settings and the menu-bar quick controls#313
Merged
Conversation
Surfaces .help() copy on every interactive control so hovering reveals what the setting does and the trade-off, rather than forcing users to guess. Settings whose effect is obvious from the label (Open Folder, Quit, Open Welcome Guide) are intentionally left untipped to avoid noise. Also drops the redundant description paragraphs above the Languages and Custom Rules editors, since the tooltip on the section label now carries that copy and the body Text was hurting density. The Suggestion Delay caption is replaced by a tooltip on the Stepper itself for the same reason.
Adds .help() copy to the Engine and Selected Model pickers, the Folder row and its buttons, the Add App button, and the Open Settings button in the permission rows. The status text rows (Availability, Runtime) are left untipped since they already describe themselves. The Use LM Studio button picks its tooltip based on whether ~/.lmstudio/models exists: enabled state explains what it does, disabled state explains why it's disabled. Reuses the same fileExists check that already drives .disabled(...), so no extra IO.
Adds .help() to every toggle and picker that exists in both surfaces (Enable Globally, Enable in <app>, Include Clipboard Context, Allow Multi-line, Engine, Length) so hovering in the menu-bar panel reveals the same context as the Settings window. Tightens the existing Fast Mode copy to match the rewrite in Settings. Footer buttons (Settings, Check for Updates, Quit) stay untipped since their labels are self-explanatory.
| Toggle("Enable in \(application.applicationName)", isOn: appEnabledBinding(for: application)) | ||
| .toggleStyle(.switch) | ||
| .controlSize(.small) | ||
| .help("Disable Cotabby just in this app. Overrides Enable Globally.") |
Contributor
There was a problem hiding this comment.
The tooltip on the per-app toggle reads "Disable Cotabby just in this app" regardless of the toggle's current state. When the toggle is already off (Cotabby disabled for this app) and the user hovers, the tooltip implies the action is to disable — but they'd actually be re-enabling it. A neutral, bidirectional description avoids this mismatch.
Suggested change
| .help("Disable Cotabby just in this app. Overrides Enable Globally.") | |
| .help("Override the global switch for this app only. Overrides Enable Globally.") |
This was referenced May 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Every interactive control in Settings and the menu-bar quick-controls panel now has a
.help("...")tooltip explaining what it does, with the trade-off named when there is one (latency vs. context, CPU vs. snappiness, etc.). Self-explanatory buttons (Open Folder, Quit, Open Welcome Guide) are intentionally left untipped to avoid noise. The redundant description paragraphs above the Languages, Custom Rules, and Suggestion Delay controls have been removed, since the new tooltips carry their copy and the body text was hurting density.Validation
Not verified in the running app: I did not manually hover every control to read the rendered tooltip popovers, since tooltip strings are inert at compile time and the failure mode for a typo is just bad copy on hover, not a crash.
Linked issues
No tracked issue. Direct request.
Risk / rollout notes
.help(...)calls on existing controls. No behavior changes, no settings migrations, no pbxproj edits.Use LM Studiobutton now picks its tooltip based on whether~/.lmstudio/modelsexists. Reuses the sameFileManager.default.fileExistscheck that already drives.disabled(...), so no extra IO. Worst case if that check ever drifts, the tooltip wording disagrees with the disabled state, which is purely cosmetic.Accept Punctuation With WordandFast Modewas rewritten for consistent voice (no em dashes, lead with the verb / outcome). The Fast Mode change appears in both Settings and the menu-bar panel so they stay in sync.Text(...)rows were removed (LanguageTagsEditorline 43,CustomRulesEditorline 44,SettingsViewPerformance section). If you'd rather keep that copy visible without hovering, easy to put back.Greptile Summary
This PR adds
.help(...)tooltip strings to every interactive control inSettingsView,MenuBarView,CustomRulesEditor, andLanguageTagsEditor, and removes three now-redundant captionTextrows whose copy has been folded into the new tooltips..help()modifiers; no logic, state, or layout is changed beyond extractinglmStudioAvailableas a localletso the existingFileManager.default.fileExistscheck is shared between.disabled()and the new conditional.help()(net I/O is unchanged).Textviews (LanguageTagsEditor,CustomRulesEditor,SettingsViewPerformance section) are removed; their content is preserved in the tooltip copy, at the cost of requiring a hover to read it.Confidence Score: 5/5
Safe to merge; all changes are additive tooltip strings with no behavioral side effects.
Every change is a
.help(...)string or a cosmetic copy tweak. The one structural change — extractinglmStudioAvailable— is a clean refactor that reduces the number offileExistscalls from one-per-modifier to one-per-render. The three removed captionTextviews are matched by equivalent tooltip copy, so no information is lost. No logic, state, navigation, or persistence is altered.No files require special attention.
Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[User hovers control] --> B{Has .help modifier?} B -- Yes --> C[Show tooltip popover] B -- No --> D[No tooltip shown] subgraph LM Studio Path E[Render LabeledContent Folder] E --> F["let lmStudioAvailable = FileManager.fileExists(...)"] F --> G[".disabled(!lmStudioAvailable)"] F --> H{lmStudioAvailable?} H -- true --> I["tooltip: Point Cotabby at LM Studio..."] H -- false --> J["tooltip: Install LM Studio first..."] endReviews (1): Last reviewed commit: "Mirror the new Settings tooltips on the ..." | Re-trigger Greptile