From 5396ce964ff84c96c5a5e563b21cdfcfa12241d5 Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Fri, 31 Jan 2025 00:42:45 +0100 Subject: [PATCH] Improve asset and jump clones spacing --- internal/app/ui/assets.go | 50 +++++++++---------- internal/app/ui/jumpclones.go | 26 +++++++--- internal/app/ui/mobile/mobile.go | 5 +- internal/app/ui/wealth.go | 6 +-- internal/app/widgets/assetbadge.go | 3 +- internal/app/widgets/assetlabel.go | 2 +- .../app/widgets/assetlabel_internal_test.go | 1 + internal/app/widgets/navlist.go | 3 +- internal/app/widgets/resource.go | 5 ++ internal/app/widgets/widgets.go | 3 +- resources/widgets/blank.svg | 41 +++++++++++++++ 11 files changed, 103 insertions(+), 42 deletions(-) create mode 100644 resources/widgets/blank.svg diff --git a/internal/app/ui/assets.go b/internal/app/ui/assets.go index 6cfbaede..f6651a8c 100644 --- a/internal/app/ui/assets.go +++ b/internal/app/ui/assets.go @@ -4,6 +4,7 @@ import ( "cmp" "context" "fmt" + "image/color" "log/slog" "slices" "strings" @@ -11,7 +12,6 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/dustin/go-humanize" @@ -72,7 +72,6 @@ type AssetsArea struct { assetCollection assetcollection.AssetCollection assetGrid *widget.GridWrap assets []*app.CharacterAsset - locationIcon *kxwidget.TappableIcon assetsBottom *widget.Label locationPath *widget.Label locationsData *fynetree.FyneTree[locationDataNode] @@ -103,21 +102,7 @@ func (u *BaseUI) NewAssetsArea() *AssetsArea { ) a.assetGrid = a.makeAssetGrid() - a.locationIcon = kxwidget.NewTappableIcon(theme.InfoIcon(), func() { - if a.selectedLocation.IsEmpty() { - return - } - p := a.locationsData.Path(a.selectedLocation.MustValue().UID()) - if len(p) == 0 { - return - } - root, ok := a.locationsData.Value(p[0]) - if !ok { - return - } - u.ShowLocationInfoWindow(root.ContainerID) - }) - gridTop := container.NewBorder(nil, nil, nil, a.locationIcon, a.locationPath) + gridTop := a.locationPath a.LocationAssets = container.NewBorder( container.NewVBox(gridTop, widget.NewSeparator()), container.NewVBox(widget.NewSeparator(), a.assetsBottom), @@ -146,19 +131,29 @@ func (a *AssetsArea) makeLocationsTree() *widget.Tree { return a.locationsData.IsBranch(uid) }, func(branch bool) fyne.CanvasObject { - return container.New(layout.NewCustomPaddedHBoxLayout(-5), - widget.NewLabel("1.0"), - widget.NewLabel("Location"), + iconInfo := kxwidget.NewTappableIcon(theme.InfoIcon(), nil) + main := widget.NewLabel("Location") + main.Truncation = fyne.TextTruncateEllipsis + spacer := canvas.NewRectangle(color.Transparent) + spacer.SetMinSize(fyne.NewSize(40, 10)) + return container.NewBorder( + nil, + nil, + container.NewStack(spacer, widget.NewLabel("-9.9")), + iconInfo, + main, ) }, func(uid widget.TreeNodeID, b bool, co fyne.CanvasObject) { - row := co.(*fyne.Container).Objects - prefix := row[0].(*widget.Label) - label := row[1].(*widget.Label) n, ok := a.locationsData.Value(uid) if !ok { return } + row := co.(*fyne.Container).Objects + label := row[0].(*widget.Label) + spacer := row[1].(*fyne.Container).Objects[0] + prefix := row[1].(*fyne.Container).Objects[1].(*widget.Label) + infoIcon := row[2].(*kxwidget.TappableIcon) label.SetText(makeNameWithCount(n.Name, n.Count)) if n.IsRoot() { if !n.IsUnknown { @@ -170,8 +165,15 @@ func (a *AssetsArea) makeLocationsTree() *widget.Tree { } prefix.Refresh() prefix.Show() + infoIcon.OnTapped = func() { + a.u.ShowLocationInfoWindow(n.ContainerID) + } + infoIcon.Show() + spacer.Show() } else { prefix.Hide() + infoIcon.Hide() + spacer.Hide() } }, ) @@ -201,7 +203,6 @@ func (a *AssetsArea) clearAssets() error { a.assetGrid.Refresh() a.locationPath.SetText("") a.selectedLocation.Clear() - a.locationIcon.Hide() return nil } @@ -510,7 +511,6 @@ func (a *AssetsArea) selectLocation(location locationDataNode) error { } a.updateLocationPath(location) a.assetsBottom.SetText(fmt.Sprintf("%d Items - %s ISK Est. Price", len(assets), ihumanize.Number(total, 1))) - a.locationIcon.Show() return nil } diff --git a/internal/app/ui/jumpclones.go b/internal/app/ui/jumpclones.go index 4f11158e..72a24384 100644 --- a/internal/app/ui/jumpclones.go +++ b/internal/app/ui/jumpclones.go @@ -3,6 +3,7 @@ package ui import ( "context" "fmt" + "image/color" "log/slog" "fyne.io/fyne/v2" @@ -78,20 +79,29 @@ func (a *JumpClonesArea) makeTree() *widget.Tree { main := widget.NewLabel("Template") main.Truncation = fyne.TextTruncateEllipsis iconInfo := kxwidget.NewTappableIcon(theme.InfoIcon(), nil) - prefix := widget.NewLabel("1.0") - return container.NewBorder(nil, nil, container.NewHBox(iconMain, prefix), iconInfo, main) + spacer := canvas.NewRectangle(color.Transparent) + spacer.SetMinSize(fyne.NewSize(40, 10)) + prefix := widget.NewLabel("-9.9") + return container.NewBorder( + nil, + nil, + container.NewHBox(iconMain, container.NewStack(spacer, prefix)), + iconInfo, + main, + ) }, func(uid widget.TreeNodeID, b bool, co fyne.CanvasObject) { + n, ok := a.treeData.Value(uid) + if !ok { + return + } border := co.(*fyne.Container).Objects main := border[0].(*widget.Label) hbox := border[1].(*fyne.Container).Objects iconMain := hbox[0].(*canvas.Image) - prefix := hbox[1].(*widget.Label) + spacer := hbox[1].(*fyne.Container).Objects[0] + prefix := hbox[1].(*fyne.Container).Objects[1].(*widget.Label) iconInfo := border[2].(*kxwidget.TappableIcon) - n, ok := a.treeData.Value(uid) - if !ok { - return - } if n.IsRoot() { iconMain.Resource = eveicon.GetResourceByName(eveicon.CloningCenter) iconMain.Refresh() @@ -112,6 +122,7 @@ func (a *JumpClonesArea) makeTree() *widget.Tree { prefix.Importance = widget.LowImportance } prefix.Show() + spacer.Show() } else { RefreshImageResourceAsync(iconMain, func() (fyne.Resource, error) { return a.u.EveImageService.InventoryTypeIcon(n.ImplantTypeID, DefaultIconPixelSize) @@ -121,6 +132,7 @@ func (a *JumpClonesArea) makeTree() *widget.Tree { a.u.ShowTypeInfoWindow(n.ImplantTypeID, a.u.CharacterID(), DescriptionTab) } prefix.Hide() + spacer.Hide() } }, ) diff --git a/internal/app/ui/mobile/mobile.go b/internal/app/ui/mobile/mobile.go index 7bebc6b5..794a1df2 100644 --- a/internal/app/ui/mobile/mobile.go +++ b/internal/app/ui/mobile/mobile.go @@ -385,7 +385,10 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI { moreNav.Push(widgets.NewAppBar( "Manage characters", u.AccountArea.Content, - widget.NewToolbarAction(theme.ContentAddIcon(), u.AccountArea.ShowAddCharacterDialog), + widget.NewToolbarAction( + theme.NewPrimaryThemedResource(theme.ContentAddIcon()), + u.AccountArea.ShowAddCharacterDialog, + ), )) }, ), diff --git a/internal/app/ui/wealth.go b/internal/app/ui/wealth.go index b5032299..d6ff7d5a 100644 --- a/internal/app/ui/wealth.go +++ b/internal/app/ui/wealth.go @@ -19,9 +19,9 @@ import ( ) const ( - chartBaseSize = 300 - chartWidth = chartBaseSize * 1.618 - chartHeight = chartBaseSize + chartBaseSize = 440 + chartWidth = chartBaseSize + chartHeight = chartBaseSize / 1.618 ) type WealthArea struct { diff --git a/internal/app/widgets/assetbadge.go b/internal/app/widgets/assetbadge.go index 7a9b9968..d2d2b0dc 100644 --- a/internal/app/widgets/assetbadge.go +++ b/internal/app/widgets/assetbadge.go @@ -23,7 +23,7 @@ type assetQuantityBadge struct { func NewAssetQuantityBadge() *assetQuantityBadge { q := canvas.NewText("", theme.Color(theme.ColorNameForeground)) - q.TextSize = theme.CaptionTextSize() + q.TextSize = sizeLabelText w := &assetQuantityBadge{ quantity: q, bg: canvas.NewRectangle(theme.Color(colorAssetQuantityBadgeBackground)), @@ -51,7 +51,6 @@ func (w *assetQuantityBadge) CreateRenderer() fyne.WidgetRenderer { p := theme.Padding() bgPadding := layout.NewCustomPaddedLayout(0, 0, p, p) customPadding := layout.NewCustomPaddedLayout(p/2, p/2, p/2, p/2) - c := container.New(customPadding, container.NewStack( w.bg, container.New(bgPadding, w.quantity), diff --git a/internal/app/widgets/assetlabel.go b/internal/app/widgets/assetlabel.go index feb25f9c..74a9c11e 100644 --- a/internal/app/widgets/assetlabel.go +++ b/internal/app/widgets/assetlabel.go @@ -26,7 +26,7 @@ func NewAssetLabel() *assetLabel { l1 := canvas.NewText("", theme.Color(theme.ColorNameForeground)) l1.TextSize = theme.CaptionTextSize() l2 := canvas.NewText("", theme.Color(theme.ColorNameForeground)) - l2.TextSize = theme.CaptionTextSize() + l2.TextSize = l1.TextSize w := &assetLabel{label1: l1, label2: l2} w.ExtendBaseWidget(w) return w diff --git a/internal/app/widgets/assetlabel_internal_test.go b/internal/app/widgets/assetlabel_internal_test.go index d48f040d..64f2c4ea 100644 --- a/internal/app/widgets/assetlabel_internal_test.go +++ b/internal/app/widgets/assetlabel_internal_test.go @@ -22,6 +22,7 @@ func TestSplitLines(t *testing.T) { {"two lines with truncation", "first second third", "first", "second thi"}, {"one long word", "firstSecondThirdForth", "firstSecon", "dThirdFort"}, {"special 1", "Erik Kalkoken's Cald", "Erik", "Kalkoken's"}, + // {"two lines two words", "Contaminated Nanite", "Contaminat", "ed Nanite"}, FIXME! } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { diff --git a/internal/app/widgets/navlist.go b/internal/app/widgets/navlist.go index 31a1b914..18a5c7bf 100644 --- a/internal/app/widgets/navlist.go +++ b/internal/app/widgets/navlist.go @@ -3,7 +3,6 @@ package widgets import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" ) @@ -26,7 +25,7 @@ func (w *NavList) CreateRenderer() fyne.WidgetRenderer { return len(w.items) }, func() fyne.CanvasObject { - return newNavListItem(theme.BrokenImageIcon(), "", "") + return newNavListItem(iconBlankSvg, "", "") }, func(id widget.ListItemID, co fyne.CanvasObject) { item := w.items[id] diff --git a/internal/app/widgets/resource.go b/internal/app/widgets/resource.go index a93db088..57d67dc1 100644 --- a/internal/app/widgets/resource.go +++ b/internal/app/widgets/resource.go @@ -5,6 +5,11 @@ package widgets import "fyne.io/fyne/v2" +var iconBlankSvg = &fyne.StaticResource{ + StaticName: "blank.svg", + StaticContent: []byte( + "\n\n\n\n \n \n \n\n"), +} var iconChevronLeftSvg = &fyne.StaticResource{ StaticName: "chevron-left.svg", StaticContent: []byte( diff --git a/internal/app/widgets/widgets.go b/internal/app/widgets/widgets.go index c279741f..3e336d66 100644 --- a/internal/app/widgets/widgets.go +++ b/internal/app/widgets/widgets.go @@ -2,5 +2,6 @@ package widgets const ( - sizeIcon = 32 + sizeIcon = 32 + sizeLabelText = 12 ) diff --git a/resources/widgets/blank.svg b/resources/widgets/blank.svg new file mode 100644 index 00000000..c6054fcb --- /dev/null +++ b/resources/widgets/blank.svg @@ -0,0 +1,41 @@ + + + + + + + +