@@ -37,6 +37,7 @@ type trainingRow struct {
3737 characterID int32
3838 characterName string
3939 isActive bool
40+ searchTarget string
4041 skill * app.CharacterSkillqueueItem
4142 skillDisplay []widget.RichTextSegment
4243 skillFinishDate optional.Optional [time.Time ]
@@ -94,14 +95,15 @@ func (r trainingRow) remainingTimeString(d optional.Optional[time.Duration]) str
9495type training struct {
9596 widget.BaseWidget
9697
97- main fyne. CanvasObject
98+ bottom * widget. Label
9899 columnSorter * iwidget.ColumnSorter
100+ main fyne.CanvasObject
99101 rows []trainingRow
100102 rowsFiltered []trainingRow
103+ search * widget.Entry
101104 selectStatus * kxwidget.FilterChipSelect
102105 selectTag * kxwidget.FilterChipSelect
103106 sortButton * iwidget.SortButton
104- bottom * widget.Label
105107 u * baseUI
106108}
107109
@@ -149,13 +151,22 @@ func newTraining(u *baseUI) *training {
149151 Width : 100 ,
150152 }})
151153 a := & training {
154+ bottom : widget .NewLabel ("" ),
152155 columnSorter : headers .NewColumnSorter (trainingColName , iwidget .SortAsc ),
153156 rows : make ([]trainingRow , 0 ),
154157 rowsFiltered : make ([]trainingRow , 0 ),
155- bottom : widget .NewLabel ( "" ),
158+ search : widget .NewEntry ( ),
156159 u : u ,
157160 }
158161 a .ExtendBaseWidget (a )
162+ a .search .ActionItem = kxwidget .NewIconButton (theme .CancelIcon (), func () {
163+ a .search .SetText ("" )
164+ a .filterRows (- 1 )
165+ })
166+ a .search .OnChanged = func (s string ) {
167+ a .filterRows (- 1 )
168+ }
169+ a .search .PlaceHolder = "Search characters"
159170 makeCell := func (col int , r trainingRow ) []widget.RichTextSegment {
160171 switch col {
161172 case trainingColName :
@@ -238,7 +249,10 @@ func (a *training) CreateRenderer() fyne.WidgetRenderer {
238249 filter .Add (a .sortButton )
239250 }
240251 c := container .NewBorder (
241- container .NewHScroll (filter ),
252+ container .NewVBox (
253+ a .search ,
254+ container .NewHScroll (filter ),
255+ ),
242256 nil ,
243257 nil ,
244258 nil ,
@@ -353,6 +367,22 @@ func (a *training) filterRows(sortCol int) {
353367 return r .tags .Contains (x )
354368 })
355369 }
370+ // search filter
371+ if search := strings .ToLower (a .search .Text ); search != "" {
372+ rows2 := make ([]trainingRow , 0 )
373+ for _ , r := range rows {
374+ var matches bool
375+ if search == "" {
376+ matches = true
377+ } else {
378+ matches = strings .Contains (r .searchTarget , search )
379+ }
380+ if matches {
381+ rows2 = append (rows2 , r )
382+ }
383+ }
384+ rows = rows2
385+ }
356386 // sort
357387 a .columnSorter .Sort (sortCol , func (sortCol int , dir iwidget.SortDir ) {
358388 slices .SortFunc (rows , func (a , b trainingRow ) int {
@@ -436,6 +466,7 @@ func (*training) fetchRows(s services) ([]trainingRow, error) {
436466 r := trainingRow {
437467 characterID : c .ID ,
438468 characterName : c .EveCharacter .Name ,
469+ searchTarget : strings .ToLower (c .EveCharacter .Name ),
439470 totalSP : c .TotalSP ,
440471 totalSPDisplay : c .TotalSP .StringFunc ("?" , func (v int ) string {
441472 return humanize .Comma (int64 (v ))
0 commit comments