wagoodman/dive · error

unable to toggle filter view: %w

Error message

unable to toggle filter view: %w

What it means

Filter.ToggleVisible unhides the filter input pane and immediately focuses it via Gui.SetCurrentView(v.Name()); gocui returns an error if the filter view does not exist (never created by Layout) or was deleted, and dive wraps it here. The filter view is created lazily by layout, so toggling before the view exists is the classic trigger.

Source

Thrown at cmd/dive/cli/internal/ui/v1/view/filter.go:89

	v.header.Editable = false
	v.header.Wrap = false
	v.header.Frame = false

	return v.Render()
}

// ToggleFilterView shows/hides the file tree filter pane.
func (v *Filter) ToggleVisible() error {
	// delete all user input from the tree view
	v.view.Clear()

	// toggle hiding
	v.hidden = !v.hidden

	if !v.hidden {
		_, err := v.gui.SetCurrentView(v.Name())
		if err != nil {
			return fmt.Errorf("unable to toggle filter view: %w", err)
		}
		return nil
	}

	// reset the cursor for the next time it is visible
	// Note: there is a subtle gocui behavior here where this cannot be called when the view
	// is newly visible. Is this a problem with dive or gocui?
	return v.view.SetCursor(0, 0)
}

// IsVisible indicates if the filter view pane is currently initialized
func (v *Filter) IsVisible() bool {
	if v == nil {
		return false
	}
	return !v.hidden
}

View on GitHub (pinned to d6c691947f)

Solutions

  1. Wait for the UI to fully render (first layout pass) before toggling the filter
  2. If embedding, ensure Filter.Layout has run (view created) before calling ToggleVisible
  3. Check for code that deletes the filter view and remove/defer it
  4. Retry the toggle after one redraw — the layout will have created the view

Example fix

// guard before focusing: only toggle when the view exists
if _, err := v.gui.View(v.Name()); err == nil {
    if _, err := v.gui.SetCurrentView(v.Name()); err != nil {
        return fmt.Errorf("unable to toggle filter view: %w", err)
    }
}
Defensive patterns

Strategy: validation

Validate before calling

// only toggle when the view has been created by layout
if _, err := v.gui.View(v.Name()); err != nil {
    return nil // view not laid out yet
}

Try / catch

if _, err := v.gui.SetCurrentView(v.Name()); err != nil {
    if errors.Is(err, gocui.ErrUnknownView) {
        // wait for next layout pass; not fatal
        return nil
    }
    return fmt.Errorf("unable to toggle filter view: %w", err)
}

Prevention

When it happens

Trigger: Pressing the filter key (Ctrl+/ etc.) to show the filter pane when the 'filter' view has not been created via its Layout/SetView yet (e.g. toggled before the first layout pass, right at startup), or after the view was deleted; also possible when the gui is shutting down.

Common situations: Rapid keypresses immediately after dive starts, before the first layout; embedding dive's UI and calling ToggleVisible programmatically before running layout; shutdown races where the view was already destroyed.

Related errors


AI-assisted analysis of wagoodman/dive@d6c691947f (2026-08-15). Data as JSON: /api/errors/08cece716af5dc31. Report an issue: GitHub.