Commit graph

70 commits

Author SHA1 Message Date
vrubelroman
bd157b41b0 fix: fallback to home dir on startup, skip session save of SSH remote paths
- Use os.UserHomeDir() as fallback instead of os.Getwd()
- In saveSession(), skip saving pane path when pane is in remote mode
- In applyPaneSession(), verify directory is readable (not just exists)
2026-05-12 15:18:44 +03:00
vrubelroman
2cf198cea8 chore: bump version to v0.2.4 2026-05-04 01:37:10 +03:00
vrubelroman
cb40a1d008 fix: remote directory size calculation via SFTP Walk on Space key 2026-05-04 01:27:06 +03:00
vrubelroman
f3b2fe59c4 feat: auto-refresh directory listing, enabled by default every 5s 2026-05-04 01:07:22 +03:00
vrubelroman
a9ccff8635 fix: reset cursor on enter dir and persist full cursor memory across sessions 2026-05-04 00:36:34 +03:00
vrubelroman
d5569ecdd0 fix: reset scroll offset when preserveKey changes cursor to avoid hidden top entries on go-parent 2026-05-04 00:29:04 +03:00
vrubelroman
152d45c7af feat: persist session state (folder, cursor, active pane) on exit and restore on launch 2026-05-04 00:16:44 +03:00
vrubelroman
b31fffbce4 chore: bump version to v0.2.3 2026-04-29 16:49:43 +03:00
vrubelroman
be7addcb2a chore: bump version to v0.2.2 2026-04-29 16:47:13 +03:00
vrubelroman
c4707d9300 fix: help dialog cleanup + theme selector polish
Help dialog (F1):
- Rename title 'Keyboard and Mouse Help' → 'Keyboard Help'
- Remove entire 'Dialogs and Transfers' section
  (all keys r, a, n, x shown in footer bar)
- Remove 'o', 's', 'q' entries (shown in footer as F9/o, F12/s, F10/q)
- Update 't' from 'cycle theme' → 'select theme'

Theme selector dialog (t):
- Move navigation hint to bottom of dialog
- Color 'Enter' green / 'Esc' red via renderModalHintTokens
2026-04-29 16:26:40 +03:00
vrubelroman
92e72bc8c6 feat: theme selector dialog with live preview (t key)
Replace the simple cycleTheme() with a modal dialog that shows all
19 themes with color swatches, live preview on Up/Down navigation,
and commit/revert on Enter/Esc.

Changes:
- Add modalThemeSelect kind to modalKind enum
- Add themeSelectorState struct + field to Model
- Add openThemeSelector() replacing cycleTheme() call
- Add handleModalKey case for modalThemeSelect (Up/Down/Enter/Esc)
- Add applyThemePreview() and finalizeTheme() helper methods
- Add renderThemeSelectModal() with aligned theme names + swatches
- Update renderModal() dispatch and widen modal for theme selector
- Update help text: 't' now shows 'select theme'
2026-04-29 16:13:29 +03:00
vrubelroman
cd877ab584 feat: mirror pane (p), cursor memory, clean up help dialog
- Add Mirror pane keybinding p (for 'Pane'), SSH restored on s
- Add session-scoped cursor memory per directory
- Fix cursor memory bug: DisplayName() adds trailing / for directories
- Fix remote mirror: use active.Path instead of mount.RemotePath
- Remove F-key/Mouse/b/c entries from F1 help dialog
- Remove Mirror from ShortHelp footer (F-keys only)
- Add missing letter-key bindings to help: p, s, a, n, x
2026-04-29 16:03:34 +03:00
vrubelroman
c8d6976030 refactor: remove Edit key binding, rename ExtractArchive -> Unpack
- Remove unused Edit key binding (no keys assigned, duplicated Enter)
- Rename ExtractArchive to Unpack across KeyMap struct, DefaultKeyMap(),
  ShortHelp(), FullHelp(), and Model.Update() handler
- Rename handleExtractArchive() -> handleUnpack()
- Update help text, status messages, and dialog titles to 'unpack'
2026-04-29 15:20:53 +03:00
vrubelroman
3b9eb4afa5 fix: add cancel button support for extraction; feat: delete progress dialog
- ExtractArchiveToDir now accepts context.Context for cancellation
- extractZipArchive/extractTarArchive check ctx.Done() in extraction loops
- startExtractJob creates context with cancel (C/c now works for extraction)
- Added startDeleteJob method with per-file progress reporting
- Local delete (trash/permanent) now shows progress dialog with B/b and C/c
- renderArchiveProgressModal handles 'delete' kind (file-based progress, no speed)
- archiveDoneMsg handles 'delete' completion (reload panes, clear marks)
2026-04-29 14:12:11 +03:00
vrubelroman
42c51f0ef5 feat: add extraction progress dialog (F11/e)
- ExtractArchiveToDir now accepts progress callback for file-by-file reporting
- Added countArchiveEntries/countZipEntries/countTarEntries helpers
- Added startExtractJob method following startArchiveJob pattern
- archiveJobState now has kind field ('archive'/'extract')
- archiveDoneMsg handler reloads only passive pane for extraction
- renderArchiveProgressModal shows file-based progress for extraction (no size/speed)
- Removed old synchronous extractArchiveCmd() and opExtractArchive case in opMsg
2026-04-29 14:01:36 +03:00
vrubelroman
3229d9b263 feat: merge F8/x delete with F11 archive extraction
- Delete mode toggle ('d') inside existing confirm dialog instead of separate modal
- F11/e shows confirm dialog before extracting archive to opposite pane
- deleteKind field toggles between 'permanent' and 'trash'
- Active pane reloads after extraction so files appear immediately
2026-04-29 13:42:59 +03:00
vrubelroman
8589187a10 cursor: move up on delete, hide size/modified columns in SSH host list, parent '..' empty modified, SSH keepalive 30s 2026-04-29 13:04:47 +03:00
vrubelroman
278b90e5bd Fix log.Printf format verbs to match actual types (vet errors) 2026-04-29 11:53:35 +03:00
vrubelroman
7cd7a24642 Show F11 (permanent delete) in footer bar between F10 and F12 2026-04-29 03:16:18 +03:00
vrubelroman
1ed2d3defb SSH connection status indicators
- Add Connected bool field to vfs.Entry and RemoteMount
- Track connection status in sshState.connectedHosts
- Show status icon (connected/disconnected) in pane header when browsing remote host
- Async SSH connection test with cancel support for Add Host dialog
- Colored labels and styled help text in SSH dialogs
- Confirmation dialog when deleting manually-added SSH hosts
2026-04-29 03:11:53 +03:00
vrubelroman
df4df6b8f6 fix: file type handling on Enter - extensions checked before executable bit
- Reorder Category() to check known extensions (text, config, image,
  pdf, audio, video, archive) before the executable bit check.
  Fixes video/audio/image files with executable bit being opened in
  editor instead of system default application.
- Remove 'executable' from isEditableEntry() - executables are now
  launched via handleExecute() instead of opened in Neovim.
- Add handleExecute() method that runs executable files in the
  terminal via tea.ExecProcess.
- Update handleOpenSelected() to route: text/config -> editor,
  executable -> launch, everything else -> system default (xdg-open).
- Bump version to v0.2.1
2026-04-27 23:18:48 +03:00
vrubelroman
c0df75c57e add Cyrillic→Latin keyboard layout translation for Russian users (ЙЦУКЕН→QWERTY) 2026-04-27 20:30:11 +03:00
vrubelroman
c35fbad5e3 chore: bump version to v0.2.0 2026-04-27 19:43:49 +03:00
vrubelroman
a483267bd9 feat: extended preview for PDF, audio, video via external utilities
Add rich preview support for three new file categories by leveraging
external CLI tools with graceful fallback when tools are missing.

- PDF: text extraction via pdftotext, page count via pdfinfo
- Audio: metadata via ffprobe (duration, bitrate, codec, sample rate, channels)
- Video: metadata via ffprobe (duration, bitrate, video/audio codec, resolution)
- New PreviewKind constants: PDF, Audio, Video
- New Metadata fields for extended preview data
- New extension maps and Category() entries for pdf/audio/video
- Icons: PDF (󰷉), audio (󰋋), video (󰋲) in preview header

Closes #5
2026-04-27 19:25:03 +03:00
vrubelroman
813c40a41e fix: cursor position on Enter for '..' now lands on source folder (same as Backspace); feat: permanent delete via F11/d; fix: footer F-key order (F1-F11) 2026-04-27 18:56:20 +03:00
vrubelroman
7a55fb289e feat: directory history (Alt+Left/Alt+Right), filter fixes (sticky per-pane, navigation, Shift+select, offset, Esc clear) 2026-04-27 18:11:19 +03:00
vrubelroman
08c095e74f feat: add interactive file search/filter (feature #1)
Pressing / opens a filter bar at the bottom of the screen. As the user
types, the active pane's entries are filtered in real-time using
case-insensitive substring matching. The .. entry is always preserved.

Key bindings:
  /       - open filter input (re-opens with previous query if active)
  Esc     - clear filter and restore full list
  Enter   - commit filter (keeps filtering active, closes input bar)
  Up/Down - navigate the filtered list while typing
  PgUp/Dn - scroll the filtered list

Filter is automatically cleared when navigating to a different directory
(Enter on a folder, Backspace to parent, opening an archive).

Modified files:
  - internal/ui/keymap.go: added Filter key binding (/)
  - internal/ui/model.go: filterMode, filterQuery, filterInput fields;
    filteredPane() helper for View rendering; filter handling in Update();
    renderFilterBar() for the bottom bar UI; clearFilter() helper;
    adjustCursorForFilter() to keep cursor in bounds

Created files:
  - plans/feature-roadmap.md
2026-04-27 17:14:48 +03:00
vrubelroman
bba8783f10 Fix directory preview layout to exactly match browser pane columns
Root cause: renderPreviewPane() was stuffing directory entries into the
viewport model via SetContent(), then rendering through
renderPreviewContent() which wraps the viewport in an additional
border+padding box. This reduced the effective content width by 4
characters compared to the browser pane's innerWidth (width-2), causing
column misalignment where the date column would wrap to the next line.

Fix: For directory previews, directly render entries using the same
renderPaneRows() and renderColumnsHeader() functions as the browser
pane, at the same innerWidth. A temporary BrowserPane is created with
the directory entries, and renderPaneRows() is called with active=false,
producing pixel-identical output to the main file browser.

Removed renderDirectoryPreviewBody() which is no longer needed.
2026-04-27 16:52:44 +03:00
vrubelroman
db5eaba409 feat: show program version in F1 help dialog footer 2026-04-27 16:26:01 +03:00
vrubelroman
804fa9f83b Add v as F3 alternative, add F6/move and F7/mkdir to footer
- View (F3): add 'v' as alternative key, help shows 'F3/v'
- ShortHelp footer: add Move (F6/m) and Mkdir (F7/n)
- FullHelp: remove Visual ('v visual') from help panels
- Fix: remove 'n' from Cancel keys so it doesn't conflict
  with Mkdir's 'n' binding (Cancel now only uses Esc)
2026-04-27 15:43:45 +03:00
vrubelroman
33974cdcb7 Fix archive cursor, navigation, and format cycling color
- Reset cursor to '..' (position 0) when entering an archive so it
  doesn't stay at the previous directory's cursor position
- Fix archive exit landing in /tmp when pressing Enter on '..' inside
  an archive by delegating to archive-aware goParent() in enterSelected()
- Fix goParent() to handle ALL navigation within archive mounts
  explicitly instead of falling through to filepath.Dir which may
  navigate outside the mount to /tmp
- Fix format cycling text color reset by preserving '(f to change)'
  hint in modal note, ensuring renderModalNoteLine applies proper
  key/action styling via the '(' separator match
2026-04-27 15:30:39 +03:00
vrubelroman
ce2f488c89 fix: preserve panel background in cursor mode (renderTextCursorContent)
Replace full ANSI reset sequences (\x1b[0m) added by lipgloss.Render() for
gutter markers, cursor highlights, and selection highlights with
background-preserving resets (\x1b[39;22;23;24;59;48;2;R;G;Bm) that restore
the panel background color.

Without this fix, every \x1b[0m from lipgloss-styled elements in
renderTextCursorContent resets the panel background (set by the outer
renderPreviewContent wrapper), causing some letters to have incorrect or
missing background color in caret mode.
2026-04-27 14:15:20 +03:00
vrubelroman
e890e1871b feat: add copy path button in info panel 2026-04-27 13:49:45 +03:00
vrubelroman
ea8c596ef6 Polish text caret and selection flow 2026-04-25 02:21:43 +03:00
vrubelroman
641ad17676 Improve text preview keyboard navigation 2026-04-25 00:51:51 +03:00
vrubelroman
cb5c98834e Speed up kitty image previews 2026-04-24 23:42:23 +03:00
vrubelroman
e229cbc6cc Support Ubuntu image preview backend 2026-04-24 22:53:12 +03:00
vrubelroman
f3e3a9b779 Cool down preview header accent 2026-04-24 22:15:54 +03:00
vrubelroman
912de45e19 Refine image preview integration 2026-04-24 22:09:54 +03:00
vrubelroman
9dcef02e0d Improve image preview rendering with kitty overlay 2026-04-24 21:51:56 +03:00
vrubelroman
6b23717572 Add terminal image preview via chafa and release v0.1.3 updates 2026-04-24 15:35:11 +03:00
vrubelroman
6a518896b8 Add archive-as-folder navigation and extraction copy flow 2026-04-24 15:14:05 +03:00
vrubelroman
780150500d Add auto icon mode fallback and Nerd Font docs 2026-04-24 14:44:49 +03:00
vrubelroman
fe2034bb90 Simplify modal hints and remove action buttons 2026-04-24 13:24:57 +03:00
vrubelroman
e7b31a8d5c Add F2 rename flow and improve modal key hints 2026-04-24 13:15:04 +03:00
vrubelroman
124e7ef972 Adjust footer spacing background rendering 2026-04-24 11:47:05 +03:00
vrubelroman
7925a33568 Fix footer background fill rendering 2026-04-24 11:19:02 +03:00
vrubelroman
715cbd6e37 Fix metadata panel background fill alignment 2026-04-24 11:11:03 +03:00
vrubelroman
5a27141298 Fix info pane Esc close and preview background rendering 2026-04-24 11:05:31 +03:00
vrubelroman
a163cc9a2d Fix view mode body height without footer gap 2026-04-24 10:23:16 +03:00