Commit graph

54 commits

Author SHA1 Message Date
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
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
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
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
vrubelroman
d22a40e987 Adjust view/info keybindings and improve read-only view mode 2026-04-24 10:08:33 +03:00
vrubelroman
3c2016eaf0 Align progress action layout with confirm dialog logic 2026-04-24 09:45:27 +03:00
vrubelroman
6787a7a363 Refine transfer progress and cancellation flow 2026-04-23 22:46:08 +03:00
vrubelroman
95847ad231 Polish transfer progress dialog controls 2026-04-23 21:46:55 +03:00
vrubelroman
ce84789edb Deepen theme semantic color coverage 2026-04-23 21:18:15 +03:00
vrubelroman
60e3a9c0f8 Tighten confirmation dialog button alignment 2026-04-23 21:10:15 +03:00
vrubelroman
b5cdb77415 Refine confirmation dialog actions 2026-04-23 20:37:54 +03:00
vrubelroman
3d1c572e16 Add keyboard multi-select workflow and project description doc 2026-04-23 19:57:06 +03:00
vrubelroman
deeb261b89 Polish panel headers and preview pane chrome 2026-04-23 14:41:17 +03:00
vrubelroman
544511f00e Add help modal and refine modal close behavior 2026-04-23 14:22:16 +03:00
vrubelroman
874a5ed678 Refine transfer UX and active-pane selection rendering 2026-04-23 13:45:46 +03:00
vrubelroman
5a5923099b Add transfer progress workflow for move and polish labels 2026-04-23 12:38:19 +03:00
vrubelroman
a196a16c6f Add copy confirmation and background progress modal 2026-04-23 12:30:10 +03:00
vrubelroman
2a3b58c44e Stabilize panel layout and background fill 2026-04-23 00:10:41 +03:00
vrubelroman
bd67696fb0 Add syntax highlighting to text previews 2026-04-22 23:35:42 +03:00
vrubelroman
35a14b09ee Improve text selection preview mode 2026-04-22 23:26:45 +03:00