feat: auto-refresh directory listing, enabled by default every 5s
This commit is contained in:
parent
a9ccff8635
commit
f3b2fe59c4
3 changed files with 53 additions and 0 deletions
|
|
@ -167,6 +167,7 @@ type copyDoneMsg struct {
|
|||
|
||||
type dismissNoticeMsg struct{}
|
||||
type dismissYankFlashMsg struct{}
|
||||
type tickMsg struct{}
|
||||
type externalOpenMsg struct {
|
||||
path string
|
||||
err error
|
||||
|
|
@ -333,6 +334,9 @@ func NewModel(cfg config.Config, configPath string) (Model, error) {
|
|||
}
|
||||
|
||||
func (m Model) Init() tea.Cmd {
|
||||
if m.cfg.Behavior.AutoRefresh {
|
||||
return tea.Batch(m.loadPreviewCmd(), autoRefreshTickCmd(m.cfg.Behavior.AutoRefreshInterval))
|
||||
}
|
||||
return m.loadPreviewCmd()
|
||||
}
|
||||
|
||||
|
|
@ -919,6 +923,20 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||
m.syncPreviewContent()
|
||||
return m, nil
|
||||
|
||||
case tickMsg:
|
||||
if !m.cfg.Behavior.AutoRefresh ||
|
||||
m.busy ||
|
||||
m.copyJob != nil ||
|
||||
m.archiveJob != nil ||
|
||||
m.modal.kind != modalNone ||
|
||||
m.filterMode ||
|
||||
m.cursorMode || m.visualMode ||
|
||||
m.viewMode {
|
||||
return m, autoRefreshTickCmd(m.cfg.Behavior.AutoRefreshInterval)
|
||||
}
|
||||
m.autoRefreshPanes()
|
||||
return m, tea.Batch(autoRefreshTickCmd(m.cfg.Behavior.AutoRefreshInterval), m.loadPreviewCmd())
|
||||
|
||||
case externalOpenMsg:
|
||||
if msg.err != nil {
|
||||
m.status = fmt.Sprintf("Open failed: %v", msg.err)
|
||||
|
|
@ -1768,6 +1786,21 @@ func (m *Model) refreshAllPanes(status string) (tea.Model, tea.Cmd) {
|
|||
return m, m.loadPreviewCmd()
|
||||
}
|
||||
|
||||
func (m *Model) autoRefreshPanes() {
|
||||
for _, id := range []PaneID{PaneLeft, PaneRight} {
|
||||
pane := m.paneByID(id)
|
||||
if pane.InRemote() || pane.InArchive() {
|
||||
continue
|
||||
}
|
||||
if name := selectedName(pane); name != "" {
|
||||
pane.SaveCursor(pane.Path, name)
|
||||
}
|
||||
if err := m.reloadPane(id, pane.LoadCursor(pane.Path)); err != nil {
|
||||
log.Printf("[REFRESH] pane=%s path=%s err=%v", id, pane.Path, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Model) moveCursor(delta int) {
|
||||
// When a filter query is active on this pane, move through filtered entries
|
||||
// only, so the cursor always lands on a matching item.
|
||||
|
|
@ -4867,6 +4900,12 @@ func dismissYankFlashCmd(delay time.Duration) tea.Cmd {
|
|||
})
|
||||
}
|
||||
|
||||
func autoRefreshTickCmd(seconds int) tea.Cmd {
|
||||
return tea.Tick(time.Duration(seconds)*time.Second, func(time.Time) tea.Msg {
|
||||
return tickMsg{}
|
||||
})
|
||||
}
|
||||
|
||||
func (m *Model) startCopyJob(kind fileOpKind, sourcePaths []string, targetDir string, overwrite bool, stats vfs.TransferStats) tea.Cmd {
|
||||
m.nextCopyJob++
|
||||
jobID := m.nextCopyJob
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue