Skip to content

oplog,list: refactor scrolling with Scrollable/StreamableList interface#429

Merged
idursun merged 1 commit intoidursun:mainfrom
baggiiiie:yc/oplog-scrolling
Dec 20, 2025
Merged

oplog,list: refactor scrolling with Scrollable/StreamableList interface#429
idursun merged 1 commit intoidursun:mainfrom
baggiiiie:yc/oplog-scrolling

Conversation

@baggiiiie
Copy link
Copy Markdown
Collaborator

@baggiiiie baggiiiie commented Dec 16, 2025

oplog,list: refactor scrolling with Scrollable/StreamableList interface

Refactored revisions/operation_log scrolling to have an IScrollableList
interface, with scroll method for navigation, which handles:

  • Boundary detection (top/bottom of list)
  • Page vs. single-step navigation
  • Streaming/infinite scroll support
  • User feedback messages (reaching top/bottom of list)

Also added a IStreamableList to handle streaming data that needs to by
loaded dynamically

@baggiiiie baggiiiie force-pushed the yc/oplog-scrolling branch 2 times, most recently from feacba7 to 037e5ad Compare December 16, 2025 14:38
@oliverpool
Copy link
Copy Markdown
Contributor

I can confirm that this fixes #360 with the following config: 👍

[keys]
scroll_down = []
scroll_up = []

[keys.preview]
half_page_down = ["pgdown"]
half_page_up = ["pgup"]

}

// IListScroll defines the interface for list models that support navigation
type IListScroll interface {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

I am not sure about this interface, more specifically the shape of it. At first glance, it has IList and IListCursor which means this is a list and it will have a cursor. But then there's navigationconfig, which has ContextName, NavigationMessage, some concept of streaming all munched together. If I were to implement something that implements this interface, then I would have to look at its implementations first to make sense what all those mean. (Obviously I know what they mean, but I am saying all these things from the point of someone who is interacting with the codebase the very first time).

I would probably call it IScrollableList which conveys the message that this is a list, and it is scrollable. And then I would add methods that would make sense for a scrollable list (e.g. VisibleRange() (int, int)

I would probably move the streaming related methods to a new interface (e.g. IStreamableList).

These are just ideas that I came up with in a few mins, the actual implementation can be different but probably will be along those lines.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

thanks for the feedback!
yup makes sense! the previous interface wasn't clear and a NavigationConfig is quite a vague concept to capture all information needed for scrolling.

i have updated IScrollableList and IStreamableList, much cleaner now

if result.NewCursor != 0 {
t.Errorf("Expected cursor to remain 0 for empty list, got %d", result.NewCursor)
}
if result.NavigateMessage != nil {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

You should be able to use assert.NotNil here.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

done!

@baggiiiie baggiiiie force-pushed the yc/oplog-scrolling branch 2 times, most recently from 90ff104 to f902096 Compare December 19, 2025 11:16
@baggiiiie baggiiiie changed the title oplog,list: add pageup/down to oplog with IListScroll interface oplog,list: refactor scrolling with Scrollable/StreamableList interface Dec 19, 2025
Refactored revisions/operation_log scrolling to have an IScrollableList
interface, with `scroll` method for navigation, which handles:
- Boundary detection (top/bottom of list)
- Page vs. single-step navigation
- Streaming/infinite scroll support
- User feedback messages (reaching top/bottom of list)

Also added a IStreamableList to handle streaming data that needs to by
loaded dynamically
Copy link
Copy Markdown
Owner

@idursun idursun left a comment

Choose a reason for hiding this comment

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

Thanks!

@idursun idursun merged commit 97f4cc2 into idursun:main Dec 20, 2025
4 checks passed
@baggiiiie baggiiiie deleted the yc/oplog-scrolling branch December 20, 2025 23:56
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 9, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [idursun/jjui](https://github.com/idursun/jjui) | patch | `v0.9.8` → `v0.9.9` |

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>idursun/jjui (idursun/jjui)</summary>

### [`v0.9.9`](https://github.com/idursun/jjui/releases/tag/v0.9.9)

[Compare Source](idursun/jjui@v0.9.8...v0.9.9)

### Release Notes

Another release with small improvements and bug fixes. Thanks to all contributors!

#### 🎉 New Features

##### Custom Commands & Lua API Enhancements

- **Custom Commands with Sequence Keys** ([#&#8203;420](idursun/jjui#420))
  - Added `key_sequence` property allowing custom commands to be invoked with multiple key presses in sequence
  - Added `desc` property for command descriptions
  - Introduced sequence overlay UI showing available key sequences when first key is pressed
  - Example: `key_sequence = ["w", "b", "l"]`

- **Lua API: Choose Method and UI** ([#&#8203;427](idursun/jjui#427)) ([#&#8203;442](idursun/jjui#442))
  - New `choose()` function for interactive selection prompts in Lua scripts
  - New `input()` function to prompt users for text input with customizable title and prompt
  - New `split_lines()` function for text processing

- **Lua API: Await on Operation Results** ([#&#8203;422](idursun/jjui#422))
  - `start_inline_describe()` now returns boolean indicating if operation was applied or cancelled
  - Enables conditional command execution based on user actions
  - Fixes [#&#8203;310](idursun/jjui#310)

- **Lua API: Interactive Commands** ([commit 8b257263](idursun/jjui@8b257263))
  - Added `jj_interactive` Lua function for interactive jj command execution

##### Navigation & UI Improvements

- **Ace Jump for Operations** ([#&#8203;445](idursun/jjui#445))
  - Pressing 'f' in set\_parents/duplicate/rebase/squash modes now triggers ace jump
  - After jump completes, returns to the original operation mode instead of normal mode
  - Closes [#&#8203;394](idursun/jjui#394)

- **Preview Width Variable** ([#&#8203;452](idursun/jjui#452))
  - Added `$preview_width` placeholder variable for preview commands
  - Exposes actual view width (in columns) to enable tools like delta to use `--side-by-side` correctly
  - Width updates dynamically when preview pane is resized
  - Similar to fzf's `$FZF_PREVIEW_COLUMNS`

- **Configurable Flash Message Display Time** ([#&#8203;456](idursun/jjui#456))
  - New config key: `ui.flash_message_display_seconds` (default: 4)
  - Special value `0` means messages display until manually dismissed
  - Fixes [#&#8203;455](idursun/jjui#455)

- **Page Up/Down Key Configuration** ([#&#8203;437](idursun/jjui#437))
  - ScrollUp/Down keys now registered in config instead of hardcoded
  - Keys exposed to configuration for customization
  - Fixes [#&#8203;360](idursun/jjui#360)

##### SSH & Authentication

- **SSH Askpass Support** ([#&#8203;423](idursun/jjui#423))
  - New `[ssh] hijack_askpass` setting to prompt for SSH passphrases/PINs within jjui
  - Works on Linux and macOS
  - Properly handles prompt overriding and cancellation
  - Fixes [#&#8203;100](idursun/jjui#100)

#### 🐛 Bug Fixes

- **Exec Command History** ([#&#8203;458](idursun/jjui#458))
  - Fixed issue where selected command history wasn't applied in exec mode
  - Input value now properly updated when selecting from fuzzy/regex suggestions
  - Selected commands correctly saved to history

- **Menu Pagination Display** ([#&#8203;446](idursun/jjui#446))
  - Fixed incorrect `%d/%d` pagination display
  - Height now calculated before pagination render
  - Added tab/shift+tab to short help menu
  - Fixes [#&#8203;444](idursun/jjui#444)

- **Flash Message Width** ([#&#8203;432](idursun/jjui#432))
  - Added maxWidth (50% of screen) to flash message rendering
  - Messages now properly line-wrap instead of extending beyond window width

- **Operation Log Refresh** ([#&#8203;431](idursun/jjui#431))
  - Operation log now returns Refresh and SelectionChanged messages upon closing
  - Fixes [#&#8203;430](idursun/jjui#430)

- **Custom Commands List Sorting** ([commit 3fa9783a](idursun/jjui@3fa9783a))
  - Fixed custom commands list to use stable sort
  - Fixes [#&#8203;424](idursun/jjui#424)

- **JJ Error Pass-through** ([#&#8203;421](idursun/jjui#421))
  - jjui now properly passes through stderr from jj commands
  - Error messages are more informative and show actual jj errors

- **Navigation Message Display** ([commit 94a4a874](idursun/jjui@94a4a874))
  - Navigation messages now only shown for paged scrolls

#### What's Changed

- main: pass through jj error by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;421](idursun/jjui#421)
- feat(lua): add ability to await on operation results (cancelled/applied) by [@&#8203;idursun](https://github.com/idursun) in [#&#8203;422](idursun/jjui#422)
- oplog: return Refresh and SelectionChanged upon oplog closing by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;431](idursun/jjui#431)
- feat(nix): add comprehensive nix flake by [@&#8203;doprz](https://github.com/doprz) in [#&#8203;426](idursun/jjui#426)
- Add option to hijack SSH Askpass to prompt for passphrase/pin by [@&#8203;oliverpool](https://github.com/oliverpool) in [#&#8203;423](idursun/jjui#423)
- feat(lua): add choose method and ui by [@&#8203;idursun](https://github.com/idursun) in [#&#8203;427](idursun/jjui#427)
- flash: add maxWidth to flash msg rendering by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;432](idursun/jjui#432)
- keys: add pageup/down to keys config by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;437](idursun/jjui#437)
- chore(github): Add Adda0 as an automatic reviewer for Nix-related changes by [@&#8203;Adda0](https://github.com/Adda0) in [#&#8203;440](idursun/jjui#440)
- feat: add .editorconfig by [@&#8203;doprz](https://github.com/doprz) in [#&#8203;434](idursun/jjui#434)
- Add input and log to custom\_commands API by [@&#8203;ArnaudBger](https://github.com/ArnaudBger) in [#&#8203;442](idursun/jjui#442)
- oplog,list: refactor scrolling with Scrollable/StreamableList interface by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;429](idursun/jjui#429)
- menu: calculate height before pagination render by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;446](idursun/jjui#446)
- operations: enable ace jump for set\_parents/duplicate/rebase/squash by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;445](idursun/jjui#445)
- feat: make flash message display time configurable by [@&#8203;living180](https://github.com/living180) in [#&#8203;456](idursun/jjui#456)
- feat: add $width variable for preview commands by [@&#8203;pablospe](https://github.com/pablospe) in [#&#8203;452](idursun/jjui#452)
- status: fix exec command history not applied by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;458](idursun/jjui#458)

#### New Contributors

- [@&#8203;doprz](https://github.com/doprz) made their first contribution in [#&#8203;426](idursun/jjui#426)
- [@&#8203;oliverpool](https://github.com/oliverpool) made their first contribution in [#&#8203;423](idursun/jjui#423)
- [@&#8203;living180](https://github.com/living180) made their first contribution in [#&#8203;456](idursun/jjui#456)
- [@&#8203;pablospe](https://github.com/pablospe) made their first contribution in [#&#8203;452](idursun/jjui#452)

**Full Changelog**: <idursun/jjui@v0.9.8...v0.9.9>

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiI0Mi43NS4xIiwidXBkYXRlZEluVmVyIjoiNDIuNzUuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6OnBhdGNoIl19-->
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.

3 participants