Skip to content

[FEATURE] - Pinned Results#4347

Draft
01Dri wants to merge 118 commits into
Flow-Launcher:devfrom
01Dri:feature/pinned-results
Draft

[FEATURE] - Pinned Results#4347
01Dri wants to merge 118 commits into
Flow-Launcher:devfrom
01Dri:feature/pinned-results

Conversation

@01Dri

@01Dri 01Dri commented Mar 12, 2026

Copy link
Copy Markdown
Contributor

Changes

  • New option to add a result or a query to pinned results.

  • Added two visual styles for pinned results:

    • List
    • Grid

Observations

  • Added logic to filter out pinned results when querying after a plugin is uninstalled.
  • Added Keyboard navigation of Ctrl + G when using the Grid style.
  • Pinned Results or queries to the List or Grid.

Preview

example.1.mp4
example.2.mp4

Future

  • Add resources for preview panel in xaml theme file & theme setting page (Need onesounds's help).

@prlabeler prlabeler Bot added the enhancement New feature or request label Mar 12, 2026
@01Dri 01Dri closed this Mar 12, 2026
@github-actions github-actions Bot added this to the 2.2.0 milestone Mar 12, 2026
@01Dri 01Dri changed the title [FEATURE~[´Ç [FEATURE Mar 12, 2026
@01Dri 01Dri changed the title [FEATURE [FEATURE] - Pinned Results Mar 12, 2026
@coderabbitai

coderabbitai Bot commented Mar 12, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a "Pinned Results" feature: new storage and pinned-result model, settings and UI (list/grid), ViewModel and MainWindow wiring for pin/unpin and execution, ResultHelper signature change, PluginManager helper, and a small uninstall-flow change capturing uninstall result.

Changes

Cohort / File(s) Summary
Storage & Model
Flow.Launcher/Storage/Pinned.cs, Flow.Launcher/Storage/PinnedResultItem.cs
New pinned-results storage and item type: max-10 collection, add/upsert/dedup, AddOrRemove/Remove/Exists, equality by result or result+query, DeepCopy, LastPinnedAt/Query/IsQuery, and plugin ico-path refresh via PluginManager.
ViewModel & App logic
Flow.Launcher/ViewModel/MainViewModel.cs, Flow.Launcher/App.xaml.cs
MainViewModel integrated pinned lifecycle, exposed PinnedResults and IsContextMenuVisible, added context-menu pin/unpin actions, persistence and refresh flows; App startup refreshes/shows pinned results at init points.
UI & Presentation
Flow.Launcher/MainWindow.xaml, Flow.Launcher/MainWindow.xaml.cs, Flow.Launcher/Languages/en.xaml
Added Pinned Results UI block (ListBox/UniformGrid) with selection/click handling and ExecutePinnedResult handler; added localization keys for pinned-results UI.
Settings & Preferences
Flow.Launcher.Infrastructure/UserSettings/Settings.cs, Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml, Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
New settings: EnablePinnedResults, ShouldCleanPinnedResultsFromUninstalledPlugins, PinnedResultsLayout enum/property; UI toggle and layout selector plus PinnedLayoutData/PinnedLayouts.
Result Processing
Flow.Launcher/Helper/ResultHelper.cs
Replaced concrete overload with generic PopulateResultsAsync<T>(T item, string query) where T : Result and updated call sites to pass explicit query.
Plugin subsystem
Flow.Launcher.Core/Plugin/PluginManager.cs, Flow.Launcher.Core/Plugin/PluginInstaller.cs
Added PluginManager.GetAllPluginsIds(); PluginInstaller now captures UninstallPluginAsync result into a boolean and sets Settings.ShouldCleanPinnedResultsFromUninstalledPlugins accordingly (uses boolean early-return pattern).

Sequence Diagram

sequenceDiagram
    participant User
    participant UI as MainWindow UI
    participant VM as MainViewModel
    participant Storage as Pinned Storage
    participant PluginMgr as PluginManager

    User->>UI: Pin item (click / context menu)
    UI->>VM: OnPinnedItemClick / Pin command
    VM->>Storage: Add(result, query)
    Storage->>PluginMgr: Resolve plugin directory / ico path
    PluginMgr-->>Storage: Directory / IDs
    Storage-->>VM: Item added/updated
    VM->>Storage: Persist pinned storage

    UI->>VM: RefreshPinnedResults (startup / query change)
    VM->>Storage: GetPinnedResultItems(query)
    Storage-->>VM: Filtered pinned items
    VM->>UI: Render PinnedResults (List/Grid)

    User->>UI: Click pinned item
    UI->>VM: ExecutePinnedResult(item)
    VM->>VM: result.ExecuteAsync(ActionContext)
    VM->>UI: Hide window if requested
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested reviewers

  • jjw24
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.53% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title '[FEATURE] - Pinned Results' accurately and concisely describes the main feature being added, aligning well with the changeset's core objective.
Description check ✅ Passed The pull request description clearly details the new pinned results feature, including the ability to pin results or queries, two visual styles (List and Grid), plugin uninstallation filtering, and keyboard navigation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

5 issues found across 13 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs">

<violation number="1" location="Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs:151">
P2: PinnedLayouts dropdown is added but its labels are never refreshed in UpdateEnumDropdownLocalizations, so changing language won’t update this dropdown’s localized labels.</violation>
</file>

<file name="Flow.Launcher.Infrastructure/UserSettings/Settings.cs">

<violation number="1" location="Flow.Launcher.Infrastructure/UserSettings/Settings.cs:393">
P2: Public backing auto-property will be serialized separately, creating an unintended extra settings key and bypassing `OnPropertyChanged` when deserialized.</violation>
</file>

<file name="Flow.Launcher/Storage/Pinned.cs">

<violation number="1" location="Flow.Launcher/Storage/Pinned.cs:18">
P2: Evicts the oldest pin before checking for an existing pin, which can drop an unrelated item when re-pinning an already pinned result at max capacity.</violation>

<violation number="2" location="Flow.Launcher/Storage/Pinned.cs:53">
P2: AddOrRemove uses query-aware existence but query-unaware removal, which can remove the wrong pinned item when same result is pinned under multiple queries.</violation>
</file>

<file name="Flow.Launcher/Storage/PinnedResultItem.cs">

<violation number="1" location="Flow.Launcher/Storage/PinnedResultItem.cs:69">
P2: DeepCopy rebuilds OriginQuery from the serialized Query string, which is empty for non-query pinned items, losing the original OriginQuery copied from the underlying Result.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread Flow.Launcher.Infrastructure/UserSettings/Settings.cs Outdated
Comment thread Flow.Launcher/Storage/Pinned.cs
Comment thread Flow.Launcher/Storage/Pinned.cs Outdated
Comment thread Flow.Launcher/Storage/PinnedResultItem.cs Outdated
@01Dri

01Dri commented Apr 16, 2026

Copy link
Copy Markdown
Contributor Author

What are your thoughts about adding/replacing keyboard down arrow to enter pinned result grid view?

I have added this functionality, can you test? thanks!

Comment thread Flow.Launcher/ResultGrid.xaml.cs
@jjw24 jjw24 removed the bug Something isn't working label Jun 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Support for pinning results

5 participants