Skip to content

Conversation

@faisal-990
Copy link
Contributor

@faisal-990 faisal-990 commented Aug 31, 2025

The defaultFilePanel function previously hardcoded focusType to 'focus', causing multiple panels to appear focused simultaneously.

Now, defaultFilePanel accepts a focusType parameter, allowing callers to initialize panels with the correct focus state. This ensures only one panel is focused at initialization, and others are set to 'noneFocus' or 'secondFocus' as needed.

Fixes the inconsistent panel focus issue introduced in PR #759.

Summary by CodeRabbit

  • New Features
    • Added per-panel focus behavior: the first panel now receives primary focus while additional panels get secondary focus. This improves keyboard navigation, clarifies which panel is active, and reduces accidental interactions when working with multiple panels.
  • Style
    • Minor formatting cleanup in sorting options with no impact on functionality or behavior.

The defaultFilePanel function previously hardcoded focusType to 'focus',
causing multiple panels to appear focused simultaneously.

Now, defaultFilePanel accepts a focusType parameter, allowing callers
to initialize panels with the correct focus state. This ensures only
one panel is focused at initialization, and others are set to 'noneFocus'
or 'secondFocus' as needed.

Fixes the inconsistent panel focus issue introduced in PR yorukot#759.
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 31, 2025

Walkthrough

Updates focus handling for file panels: the first panel receives focus and subsequent panels receive secondFocus. The defaultFilePanel function now accepts a focus type parameter, and filePanelSlice computes and passes the appropriate focus type. Minor formatting adjustment to a sorting options slice.

Changes

Cohort / File(s) Summary of Changes
Per-panel focus handling
src/internal/type_utils.go
Added per-panel focus selection in filePanelSlice. Changed defaultFilePanel signature to func defaultFilePanel(dir string, currentFocusType filePanelFocusType) filePanel and used the provided currentFocusType to set focusType. Minor formatting change to sorting options.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor App
  participant TU as type_utils.go
  participant FP as FilePanel

  App->>TU: filePanelSlice(dirs)
  loop for each dir in dirs
    TU->>TU: determine focusType (first: focus, others: secondFocus)
    TU->>FP: defaultFilePanel(dir, focusType)
    activate FP
    FP-->>TU: filePanel with focusType
    deactivate FP
  end
  TU-->>App: []filePanel (first focused, others secondFocused)
  note over App,TU: Control flow modified to pass focusType into panel construction
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related issues

Poem

A bunny taps keys with nimble might,
First pane aglow, the others light,
Focus hops—then lands just right,
Panels line up, left to right,
Thump-thump! the UI feels so bright. 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/internal/type_utils.go (2)

53-74: Signature change ripple: ensure all call sites updated; consider a temporary compatibility helper

Changing defaultFilePanel to require a filePanelFocusType is sensible. Verify all invocations compile and pass an explicit focus type. If you want a softer transition, add a small wrapper (unexported) used only by legacy code and remove it in a follow-up.

Example wrapper (optional, short-lived):

// deprecated: prefer defaultFilePanel(dir, focusType)
func defaultFocusedFilePanel(dir string) filePanel {
	return defaultFilePanel(dir, focus)
}

One nit: currentFocusType reads more clearly as initialFocusType.

-func defaultFilePanel(dir string, currentFocusType filePanelFocusType) filePanel {
+func defaultFilePanel(dir string, initialFocusType filePanelFocusType) filePanel {
   return filePanel{
     ...
-    focusType:        currentFocusType,
+    focusType:        initialFocusType,
     ...
   }
}

53-74: Keep sort options height in sync with the options list

Hard-coding height: 4 risks drift. Compute it from the options slice to avoid future mismatches.

-func defaultFilePanel(dir string, currentFocusType filePanelFocusType) filePanel {
-	return filePanel{
+func defaultFilePanel(dir string, currentFocusType filePanelFocusType) filePanel {
+	opts := []string{
+		string(sortingName),
+		string(sortingSize),
+		string(sortingDateModified),
+		string(sortingFileType),
+	}
+	return filePanel{
 		render:   0,
 		cursor:   0,
 		location: dir,
 		sortOptions: sortOptionsModel{
 			width:  20,
-			height: 4,
+			height: len(opts),
 			open:   false,
 			cursor: common.Config.DefaultSortType,
 			data: sortOptionsModelData{
-				options: []string{
-					string(sortingName), string(sortingSize),
-					string(sortingDateModified), string(sortingFileType),
-				},
+				options: opts,
 				selected: common.Config.DefaultSortType,
 				reversed: common.Config.SortOrderReversed,
 			},
 		},
 		panelMode:        browserMode,
 		focusType:        currentFocusType,
 		directoryRecords: make(map[string]directoryRecord),
 		searchBar:        common.GenerateSearchBar(),
 	}
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between fdcaf98 and 73cb291.

📒 Files selected for processing (1)
  • src/internal/type_utils.go (2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: lazysegtree
PR: yorukot/superfile#0
File: :0-0
Timestamp: 2025-04-12T12:00:32.688Z
Learning: In PR #767 for yorukot/superfile, the focus is on moving code (especially sidebar-related functionality) to a more organized structure without changing functionality. Pre-existing issues should be ignored since the purpose is code reorganization, not fixing existing problems.
🧬 Code graph analysis (1)
src/internal/type_utils.go (4)
src/internal/handle_panel_navigation.go (5)
  • m (136-145)
  • m (160-171)
  • m (148-157)
  • m (78-109)
  • m (174-186)
src/internal/function.go (1)
  • returnFocusType (58-63)
src/internal/type.go (1)
  • filePanels (149-155)
src/internal/handle_panel_movement.go (1)
  • m (107-122)
🔇 Additional comments (1)
src/internal/type_utils.go (1)

42-48: Initialization logic verified
Confirmed no other default initialization path assigns focus to all panels; navigation assignments are expected behavior.

@faisal-990
Copy link
Contributor Author

PR #1033 raised for the fix. Kindly review the changes.

Copy link
Collaborator

@lazysegtree lazysegtree left a comment

Choose a reason for hiding this comment

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

LGTM. Thanks @faisal-990

@lazysegtree
Copy link
Collaborator

Failures due to

@lazysegtree lazysegtree merged commit 982d5a6 into yorukot:main Aug 31, 2025
11 of 15 checks passed
@faisal-990
Copy link
Contributor Author

@lazysegtree thanks for the review . Do you have some suggestions to refactor this filePanelFocusType typed constant? or should i change the names to something more intuitive ,and make the default focusType to noneFocus instead of second Focus.
Also i would like to look into this #938 issue , if it still needs work ?

@lazysegtree
Copy link
Collaborator

Do you have some suggestions to refactor this filePanelFocusType typed constant?

The constants themselves dont make any sense. Only thing there should be is isFocussed bool variable. The entire usage of this focusType needs to be fixed, and replaced with a simpler bool variable.

@lazysegtree
Copy link
Collaborator

Yes #938 Needs work. The tests are flaky and fails and works on retry.

@faisal-990
Copy link
Contributor Author

Alright , so i would like to work on these issues , if possible kindly assign me these #1033 and #938 .

@lazysegtree
Copy link
Collaborator

Github isn't letting me assign you. You can just comment on them saying you are working on it.

faisal-990 added a commit to faisal-990/superfile that referenced this pull request Sep 4, 2025
The previous implementation used a typed constant
with multiple states (noneFocus, secondFocus, focus). This has been
deprecated in favor of a simpler  boolean field.

This makes it easier to determine whether the panel is focused (true) or
not (false), removes unnecessary enum complexity, and improves
readability/maintainability of the file panel logic.

Refs: yorukot#1033
lazysegtree added a commit that referenced this pull request Sep 9, 2025
#1040)

The filePanelFocusType typed constant with multiple states (noneFocus,
secondFocus, focus) added unnecessary complexity for managing panel
focus. It also made the code harder to read and maintain.
Solution

Replaced filePanelFocusType with a simple isFocused boolean field in
filePanel.
isFocused = true → panel is focused
isFocused = false → panel is not focused

This change removes unused constants and simplifies focus handling.




Refs #1033 
Refs #1030 

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- Refactor
- Simplified panel focus handling to a single, consistent indicator
across navigation, rendering, and key interactions, improving
reliability and consistency in focus behavior.
- Style
  - Minor formatting cleanups for readability without changing behavior.
- Chores
- Consolidated internal variable declarations and adjusted logging to
reflect the updated focus indicator.

No user-facing features changed; interactions should feel more
consistent and stable, especially when switching panels and using the
sidebar or process bar.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: lazysegtree <59679977+lazysegtree@users.noreply.github.com>
@faisal-990 faisal-990 deleted the multipleFocusFix branch September 9, 2025 16:54
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Oct 15, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [yorukot/superfile](https://github.com/yorukot/superfile) | minor | `v1.3.3` -> `v1.4.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>yorukot/superfile (yorukot/superfile)</summary>

### [`v1.4.0`](https://github.com/yorukot/superfile/releases/tag/v1.4.0)

[Compare Source](yorukot/superfile@v1.3.3...v1.4.0)

Hey folks. Releasing v1.4.0 with many new features, improvements, and bug fixes.

We have an async file preview now, a zoxide panel, and various new features improving UX.

#### Install:

[**Click me to know how to install**](https://github.com/yorukot/superfile?tab=readme-ov-file#installation)

#### Highlights

- We have the Zoxide Panel now. Ensure zoxide is installed on your system, set `zoxide_support` to `true` in the config, and press `z` to use zoxide. <img width="645" height="295" alt="Image" src="https://github.com/user-attachments/assets/238f6549-5318-49d1-a3a0-14cf8a686955" />

- File previewing is now async, meaning reduced lag while scrolling through images, or on slow systems.

- Many bug fixes. See 'Detailed Change Summary'

##### Internal Updates

- Most file operations are now truly async with the usage of the recommended `tea.Cmd` pattern.
- Enabled many new linters to improve code quality.
- Moved golangci-lint to v2. Now developers don't need to keep the old v1 in their systems.
- Refactored file preview in its own package for better maintainability and readability.
- Fixed flaky unit tests.

#### Detailed Change Summary

<details><summary>Details</summary>
<p>

##### Update
- feat: File operation via tea cmd [#&#8203;963](yorukot/superfile#963) by @&#8203;lazysegtree
- feat: processbar improvements, package separation, better channel management [#&#8203;973](yorukot/superfile#973) by @&#8203;lazysegtree
- feat: enable lll and recvcheck linter, fix tests, more refactors [#&#8203;977](yorukot/superfile#977) by @&#8203;lazysegtree
- feat: Remove channel for notification models [#&#8203;979](yorukot/superfile#979) by @&#8203;lazysegtree
- feat: enable cyclop, funlen, gocognit, gocyclo linters, and refactor large functions [#&#8203;984](yorukot/superfile#984) by @&#8203;lazysegtree
- feat: Add a new hotkey to handle cd-on-quit whenever needed [#&#8203;924](yorukot/superfile#924) by @&#8203;ahmed-habbachi
- feat: added option to permanently delete files [#&#8203;987](yorukot/superfile#987) by @&#8203;hupender
- feat: Preview panel separation [#&#8203;1021](yorukot/superfile#1021) by @&#8203;lazysegtree
- feat: Add search functionality to help menu [#&#8203;1011](yorukot/superfile#1011) by @&#8203;iZarrios
- feat: Use zoxide lib [#&#8203;1036](yorukot/superfile#1036) by @&#8203;lazysegtree
- feat: Add zoxide directory tracking on navigation [#&#8203;1041](yorukot/superfile#1041) by @&#8203;lazysegtree
- feat: Zoxide integration [#&#8203;1039](yorukot/superfile#1039) by @&#8203;lazysegtree
- feat: Select mode with better feedback [#&#8203;1074](yorukot/superfile#1074) by @&#8203;lazysegtree
- feat: owner/group in the metadata [#&#8203;1093](yorukot/superfile#1093) by @&#8203;xelavopelk
- feat: Async zoxide [#&#8203;1104](yorukot/superfile#1104) by @&#8203;lazysegtree

##### Bug Fix
- fix: sorting in searchbar [#&#8203;985](yorukot/superfile#985) by @&#8203;hupender
- fix: Async rendering, Include clipboard check in paste items, and update linter configs [#&#8203;997](yorukot/superfile#997) by @&#8203;lazysegtree
- fix: Move utility functions to utils package [#&#8203;1012](yorukot/superfile#1012) by @&#8203;lazysegtree
- fix: Refactoring and separation of preview panel and searchbar in help menu [#&#8203;1013](yorukot/superfile#1013) by @&#8203;lazysegtree
- fix(filePanel): allow focusType to be set correctly [#&#8203;1033](yorukot/superfile#1033) by @&#8203;faisal-990
- fix(ci): Update gomod2nix.toml, allow pre release in version output, release 1.4.0-rc1, bug fixes, and improvements [#&#8203;1054](yorukot/superfile#1054) by @&#8203;lazysegtree
- fix(nix): resolve build failures in the nix flake [#&#8203;1068](yorukot/superfile#1068) by @&#8203;Frost-Phoenix
- fix: Retry the file deletion to prevent flakies (#&#8203;938) [#&#8203;1076](yorukot/superfile#1076) by @&#8203;lazysegtree
- fix(issue-1066): Fixed issue where enter was not searchable [#&#8203;1078](yorukot/superfile#1078) by @&#8203;Simpaqt
- fix(#&#8203;1073): Tech debt fix [#&#8203;1077](yorukot/superfile#1077) by @&#8203;Simpaqt
- fix: fix deleted directory not able to remove from pins (#&#8203;1067) [#&#8203;1081](yorukot/superfile#1081) by @&#8203;yorukot
- fix: fix child process spawning attached [#&#8203;1084](yorukot/superfile#1084) by @&#8203;guemidiborhane
- fix: always clear images when showing a FullScreenStyle [#&#8203;1094](yorukot/superfile#1094) by @&#8203;snikoletopoulos
- fix: Allow j and k keys in zoxide [#&#8203;1102](yorukot/superfile#1102) by @&#8203;lazysegtree
- fix: Zoxide improvements and 1.4.0-rc2 [#&#8203;1105](yorukot/superfile#1105) by @&#8203;lazysegtree
- fix: rename cursor beginning on wrong character because of multiple dots in name (#&#8203;813) [#&#8203;1112](yorukot/superfile#1112) by @&#8203;SyedAsadK
- fix: check and fix file panel scroll position on height changes [#&#8203;1095](yorukot/superfile#1095) by @&#8203;snikoletopoulos

##### Optimization
- perf(website): optimize font loading and asset organization [#&#8203;1089](yorukot/superfile#1089) by @&#8203;yorukot

##### Documentation
- docs: fix incorrect zoxide plugin config name [#&#8203;1049](yorukot/superfile#1049) by @&#8203;shree-xvi
- docs(hotkeys): Fix typo in vimHotkeys.toml comments [#&#8203;1080](yorukot/superfile#1080) by @&#8203;wleoncio
- docs: add section for core maintainers in README.md [#&#8203;1088](yorukot/superfile#1088) by @&#8203;yorukot
- chore: add winget install instruction to readme and website [#&#8203;943](yorukot/superfile#943) by @&#8203;claykom

##### Dependencies
- chore(deps): update dependency go to v1.25.0, golangci-lint to v2, golangci-lint actions to v8 [#&#8203;750](yorukot/superfile#750) by @&#8203;renovate[bot]
- chore(deps): update amannn/action-semantic-pull-request action to v6 [#&#8203;1006](yorukot/superfile#1006) by @&#8203;renovate[bot]
- chore(deps): update actions/first-interaction action to v3 [#&#8203;1005](yorukot/superfile#1005) by @&#8203;renovate[bot]
- chore(deps): update actions/checkout action to v5 [#&#8203;1004](yorukot/superfile#1004) by @&#8203;renovate[bot]
- chore(deps): bump astro from 5.10.1 to 5.12.8 [#&#8203;982](yorukot/superfile#982) by @&#8203;dependabot[bot]
- fix(deps): update module golang.org/x/mod to v0.27.0 [#&#8203;989](yorukot/superfile#989) by @&#8203;renovate[bot]
- fix(deps): update dependency @&#8203;expressive-code/plugin-collapsible-sections to v0.41.3 [#&#8203;990](yorukot/superfile#990) by @&#8203;renovate[bot]
- fix(deps): update dependency sharp to v0.34.3 [#&#8203;992](yorukot/superfile#992) by @&#8203;renovate[bot]
- fix(deps): update dependency @&#8203;expressive-code/plugin-line-numbers to v0.41.3 [#&#8203;991](yorukot/superfile#991) by @&#8203;renovate[bot]
- chore(deps): update dependency go to v1.25.0 [#&#8203;994](yorukot/superfile#994) by @&#8203;renovate[bot]
- fix(deps): update astro monorepo [#&#8203;995](yorukot/superfile#995) by @&#8203;renovate[bot]
- fix(deps): update dependency @&#8203;astrojs/starlight to ^0.35.0 [#&#8203;1000](yorukot/superfile#1000) by @&#8203;renovate[bot]
- fix(deps): update module github.com/urfave/cli/v3 to v3.4.1 [#&#8203;1001](yorukot/superfile#1001) by @&#8203;renovate[bot]
- fix(deps): update module golang.org/x/text to v0.28.0 [#&#8203;1003](yorukot/superfile#1003) by @&#8203;renovate[bot]

##### Misc
- chore: migrate from superfile.netlify.app to superfile.dev [#&#8203;1087](yorukot/superfile#1087) by @&#8203;yorukot
- refactor(filepanel): replace filePanelFocusType with isFocused boolean [#&#8203;1040](yorukot/superfile#1040) by @&#8203;faisal-990
- refactor(ansi): Migrate from github.com/charmbracelet/x/exp/term/ansi to github.com/charmbracelet/x/ansi [#&#8203;1044](yorukot/superfile#1044) by @&#8203;faisal-990
- refactor: common operation on pinned directory file using PinnedManager [#&#8203;1085](yorukot/superfile#1085) by @&#8203;Manaswa-S
- test: unit tests for pinned manager [#&#8203;1090](yorukot/superfile#1090) by @&#8203;Manaswa-S

</p>
</details> 

#### New Contributors
* @&#8203;hupender made their first contribution in yorukot/superfile#985
* @&#8203;ahmed-habbachi made their first contribution in yorukot/superfile#924
* @&#8203;iZarrios made their first contribution in yorukot/superfile#1011
* @&#8203;faisal-990 made their first contribution in yorukot/superfile#1033
* @&#8203;shree-xvi made their first contribution in yorukot/superfile#1049
* @&#8203;Simpaqt made their first contribution in yorukot/superfile#1078
* @&#8203;wleoncio made their first contribution in yorukot/superfile#1080
* @&#8203;guemidiborhane made their first contribution in yorukot/superfile#1084
* @&#8203;Manaswa-S made their first contribution in yorukot/superfile#1085
* @&#8203;xelavopelk made their first contribution in yorukot/superfile#1093
* @&#8203;snikoletopoulos made their first contribution in yorukot/superfile#1094
* @&#8203;SyedAsadK made their first contribution in yorukot/superfile#1112

**Full Changelog**: <yorukot/superfile@v1.3.3...v1.4.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants