Skip to content

Commit cb55ee9

Browse files
committed
feat: add search bar on training screen (#300)
1 parent 0c20ffc commit cb55ee9

File tree

5 files changed

+45
-18
lines changed

5 files changed

+45
-18
lines changed

internal/app/ui/assets.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,10 @@ type assets struct {
113113

114114
body fyne.CanvasObject
115115
columnSorter *iwidget.ColumnSorter
116-
entry *widget.Entry
117116
found *widget.Label
118117
rows []assetRow
119118
rowsFiltered []assetRow
119+
search *widget.Entry
120120
selectCategory *kxwidget.FilterChipSelect
121121
selectGroup *kxwidget.FilterChipSelect
122122
selectLocation *kxwidget.FilterChipSelect
@@ -166,20 +166,21 @@ func newAssets(u *baseUI) *assets {
166166
}})
167167
a := &assets{
168168
columnSorter: headers.NewColumnSorter(assetsColItem, iwidget.SortAsc),
169-
entry: widget.NewEntry(),
169+
search: widget.NewEntry(),
170170
found: widget.NewLabel(""),
171171
rowsFiltered: make([]assetRow, 0),
172172
total: makeTopLabel(),
173173
u: u,
174174
}
175175
a.ExtendBaseWidget(a)
176-
a.entry.ActionItem = kxwidget.NewIconButton(theme.CancelIcon(), func() {
177-
a.resetSearch()
176+
a.search.ActionItem = kxwidget.NewIconButton(theme.CancelIcon(), func() {
177+
a.search.SetText("")
178+
a.filterRows(-1)
178179
})
179-
a.entry.OnChanged = func(s string) {
180+
a.search.OnChanged = func(s string) {
180181
a.filterRows(-1)
181182
}
182-
a.entry.PlaceHolder = "Search items"
183+
a.search.PlaceHolder = "Search items"
183184
a.found.Hide()
184185

185186
if !a.u.isDesktop {
@@ -272,7 +273,7 @@ func (a *assets) CreateRenderer() fyne.WidgetRenderer {
272273
}
273274
topBox := container.NewVBox(
274275
container.NewBorder(nil, nil, nil, a.found, a.total),
275-
a.entry,
276+
a.search,
276277
container.NewHScroll(filters),
277278
)
278279
c := container.NewBorder(topBox, nil, nil, nil, a.body)
@@ -327,7 +328,7 @@ func (a *assets) makeDataList() *iwidget.StripedList {
327328
}
328329

329330
func (a *assets) focus() {
330-
a.u.MainWindow().Canvas().Focus(a.entry)
331+
a.u.MainWindow().Canvas().Focus(a.search)
331332
}
332333

333334
func (a *assets) filterRows(sortCol int) {
@@ -375,7 +376,7 @@ func (a *assets) filterRows(sortCol int) {
375376
})
376377
}
377378
// search filter
378-
if search := strings.ToLower(a.entry.Text); search != "" {
379+
if search := strings.ToLower(a.search.Text); search != "" {
379380
rows2 := make([]assetRow, 0)
380381
for _, r := range rows {
381382
var matches bool
@@ -443,11 +444,6 @@ func (a *assets) filterRows(sortCol int) {
443444
}
444445
}
445446

446-
func (a *assets) resetSearch() {
447-
a.entry.SetText("")
448-
a.filterRows(-1)
449-
}
450-
451447
func (a *assets) update() {
452448
var t string
453449
var i widget.Importance
2.09 KB
Loading
2.11 KB
Loading
2.38 KB
Loading

internal/app/ui/training.go

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
9495
type 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

Comments
 (0)