From 121331252e7f9e5807b0407188d19f93901e8bcc Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Wed, 25 Mar 2026 18:54:58 +0100 Subject: [PATCH] Change search related callbacks so that they are set on gui rather than each view This makes it possible to have global callbacks that find the view dynamically; useful for clients that reuse their view instances with different controller objects. --- gui.go | 55 ++++++++++++++++++++++++++++++++++++++++--------------- view.go | 12 ++++++------ 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/gui.go b/gui.go index 96c622b..0d97e28 100644 --- a/gui.go +++ b/gui.go @@ -139,21 +139,23 @@ type Gui struct { ReplayedEvents replayedEvents playRecording bool - tabClickBindings []*tabClickBinding - viewMouseBindings []*ViewMouseBinding - lastClick *clickInfo - gEvents chan GocuiEvent - userEvents chan userEvent - views []*View - currentView *View - managers []Manager - keybindings []*keybinding - focusHandler func(bool) error - openHyperlink func(string, string) error - maxX, maxY int - outputMode OutputMode - stop chan struct{} - blacklist []Key + tabClickBindings []*tabClickBinding + viewMouseBindings []*ViewMouseBinding + lastClick *clickInfo + gEvents chan GocuiEvent + userEvents chan userEvent + views []*View + currentView *View + managers []Manager + keybindings []*keybinding + focusHandler func(bool) error + openHyperlink func(string, string) error + onSelectSearchResultFunc func(*View, int) + renderSearchStatusFunc func(*View, int, int) + maxX, maxY int + outputMode OutputMode + stop chan struct{} + blacklist []Key // BgColor and FgColor allow to configure the background and foreground // colors of the GUI. @@ -355,11 +357,26 @@ func (g *Gui) SetView(name string, x0, y0, x1, y1 int, overlaps byte) (*View, er v.Overlaps = overlaps g.views = append(g.views, v) + v.setOnSelectResult(g.onSelectSearchItem) + v.setRenderSearchStatus(g.renderSearchStatus) + g.Mutexes.ViewsMutex.Unlock() return v, errors.Wrap(ErrUnknownView, 0) } +func (g *Gui) onSelectSearchItem(v *View, selectedLineIdx int) { + if g.onSelectSearchResultFunc != nil { + g.onSelectSearchResultFunc(v, selectedLineIdx) + } +} + +func (g *Gui) renderSearchStatus(v *View, selected int, total int) { + if g.renderSearchStatusFunc != nil { + g.renderSearchStatusFunc(v, selected, total) + } +} + // SetViewBeneath sets a view stacked beneath another view func (g *Gui) SetViewBeneath(name string, aboveViewName string, height int) (*View, error) { aboveView, err := g.View(aboveViewName) @@ -643,6 +660,14 @@ func (g *Gui) SetOpenHyperlinkFunc(openHyperlinkFunc func(string, string) error) g.openHyperlink = openHyperlinkFunc } +func (g *Gui) SetOnSelectSearchResultFunc(onSelectSearchResultFunc func(*View, int)) { + g.onSelectSearchResultFunc = onSelectSearchResultFunc +} + +func (g *Gui) SetRenderSearchStatusFunc(renderSearchStatusFunc func(*View, int, int)) { + g.renderSearchStatusFunc = renderSearchStatusFunc +} + // getKey takes an empty interface with a key and returns the corresponding // typed Key or rune. func getKey(key any) (Key, rune, error) { diff --git a/view.go b/view.go index 9ba8b7e..16da0a3 100644 --- a/view.go +++ b/view.go @@ -214,21 +214,21 @@ type searcher struct { searchPositions []SearchPosition modelSearchResults []SearchPosition currentSearchIndex int - onSelectItem func(int) - renderSearchStatus func(int, int) + onSelectItem func(*View, int) + renderSearchStatus func(*View, int, int) } -func (v *View) SetRenderSearchStatus(renderSearchStatus func(int, int)) { +func (v *View) setRenderSearchStatus(renderSearchStatus func(*View, int, int)) { v.searcher.renderSearchStatus = renderSearchStatus } -func (v *View) SetOnSelectItem(onSelectItem func(int)) { +func (v *View) setOnSelectResult(onSelectItem func(*View, int)) { v.searcher.onSelectItem = onSelectItem } func (v *View) renderSearchStatus(index int, itemCount int) { if v.searcher.renderSearchStatus != nil { - v.searcher.renderSearchStatus(index, itemCount) + v.searcher.renderSearchStatus(v, index, itemCount) } } @@ -286,7 +286,7 @@ func (v *View) SelectSearchResult(index int) { v.FocusPoint(v.ox, y, true) v.renderSearchStatus(index, itemCount) if v.searcher.onSelectItem != nil { - v.searcher.onSelectItem(y) + v.searcher.onSelectItem(v, y) } }