Skip to content

Commit

Permalink
Add character context menu
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikKalkoken committed Jan 23, 2025
1 parent 5ebc58a commit f47c162
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 37 deletions.
1 change: 1 addition & 0 deletions internal/app/statuscache/statuscache.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ func (sc *StatusCacheService) updateCharacters(ctx context.Context, r app.Status
return cc, nil
}

// ListCharacters returns the list of the users characters in alphabetical order.
func (sc *StatusCacheService) ListCharacters() []*app.CharacterShort {
x, ok := sc.cache.Get(keyCharacters)
if !ok {
Expand Down
4 changes: 2 additions & 2 deletions internal/app/ui/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func (a *AccountArea) makeCharacterList() *widget.List {
portrait.FillMode = canvas.ImageFillContain
portrait.SetMinSize(fyne.Size{Width: accountIconSize, Height: accountIconSize})
name := widget.NewLabel("Template")
button := widget.NewButtonWithIcon("Delete", theme.DeleteIcon(), func() {})
button := widget.NewButtonWithIcon("", theme.DeleteIcon(), func() {})
button.Importance = widget.DangerImportance
issue := widget.NewLabel("Scope issue - please re-add!")
issue.Importance = widget.WarningImportance
Expand Down Expand Up @@ -118,7 +118,7 @@ func (a *AccountArea) makeCharacterList() *widget.List {
return
}
c := a.characters[id]
if err := a.u.LoadCharacter(context.TODO(), c.id); err != nil {
if err := a.u.LoadCharacter(c.id); err != nil {
slog.Error("load current character", "char", c, "err", err)
return
}
Expand Down
5 changes: 2 additions & 3 deletions internal/app/ui/desktop/toolbar.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,8 @@ func (a *toolbarArea) refresh() {
}

func (a *toolbarArea) makeMenuItems(c *app.Character) ([]*fyne.MenuItem, error) {
ctx := context.TODO()
menuItems := make([]*fyne.MenuItem, 0)
cc, err := a.u.CharacterService.ListCharactersShort(ctx)
cc, err := a.u.CharacterService.ListCharactersShort(context.Background())
if err != nil {
return menuItems, err
}
Expand All @@ -93,7 +92,7 @@ func (a *toolbarArea) makeMenuItems(c *app.Character) ([]*fyne.MenuItem, error)
continue
}
item := fyne.NewMenuItem(myC.Name, func() {
err := a.u.LoadCharacter(ctx, myC.ID)
err := a.u.LoadCharacter(myC.ID)
if err != nil {
msg := "Failed to switch to new character"
slog.Error(msg, "err", err)
Expand Down
4 changes: 2 additions & 2 deletions internal/app/ui/mobile/appbarwidget.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func (w *AppBar) CreateRenderer() fyne.WidgetRenderer {
container.NewHBox(layout.NewSpacer(), title, layout.NewSpacer()),
)
if len(w.items) > 0 {
row.Add(container.NewHBox(layout.NewSpacer(), widget.NewToolbar(w.items...)))
row.Add(container.NewHBox(layout.NewSpacer(), container.NewVBox(widget.NewToolbar(w.items...))))
}
top.Add(row)
} else {
Expand All @@ -58,7 +58,7 @@ func (w *AppBar) CreateRenderer() fyne.WidgetRenderer {
)
if len(w.items) > 0 {
row.Add(layout.NewSpacer())
row.Add(widget.NewToolbar(w.items...))
row.Add(container.NewVBox(widget.NewToolbar(w.items...)))
}
top.Add(row)
top.Add(title)
Expand Down
85 changes: 59 additions & 26 deletions internal/app/ui/mobile/mobile.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,31 +20,65 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
u := &MobileUI{}
u.BaseUI = ui.NewBaseUI(fyneApp)

characterSelector := widget.NewToolbarAction(ui.IconCharacterplaceholder32Jpeg, nil)
characterSelector.OnActivated = func() {
o := characterSelector.ToolbarObject()
characterID := u.CharacterID()
cc := u.StatusCacheService.ListCharacters()
items := make([]*fyne.MenuItem, 0)
if len(cc) == 0 {
it := fyne.NewMenuItem("No characters", nil)
it.Disabled = true
items = append(items, it)
} else {
for _, c := range cc {
it := fyne.NewMenuItem(c.Name, func() {
u.LoadCharacter(c.ID)
})
if c.ID == characterID {
it.Disabled = true
}
items = append(items, it)
}
}
widget.ShowPopUpMenuAtRelativePosition(
fyne.NewMenu("", items...),
fyne.CurrentApp().Driver().CanvasForObject(o),
fyne.Position{},
o,
)
}

newCharacterAppBar := func(title string, body fyne.CanvasObject, items ...widget.ToolbarItem) *AppBar {
items = append(items, characterSelector)
return NewAppBar(title, body, items...)
}

var characterNav *Navigator
homeList := NewNavList(
NewNavListItemWithIcon(
theme.AccountIcon(),
"Character Sheet",
func() {
characterNav.Push(
NewAppBar(
newCharacterAppBar(
"Character Sheet",
NewNavList(
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Augmentations", u.ImplantsArea.Content),
newCharacterAppBar("Augmentations", u.ImplantsArea.Content),
),
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Jump Clones", container.NewScroll(u.JumpClonesArea.Content)),
newCharacterAppBar("Jump Clones", container.NewScroll(u.JumpClonesArea.Content)),
),
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Attributes", u.AttributesArea.Content),
newCharacterAppBar("Attributes", u.AttributesArea.Content),
),
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Bio", container.NewScroll(u.BiographyArea.Content)),
newCharacterAppBar("Bio", container.NewScroll(u.BiographyArea.Content)),
),
),
))
Expand All @@ -54,56 +88,56 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
theme.NewThemedResource(ui.IconInventory2Svg),
"Assets",
func() {
characterNav.Push(NewAppBar("Bio", container.NewScroll(u.AssetsArea.Content)))
characterNav.Push(newCharacterAppBar("Assets", container.NewScroll(u.AssetsArea.Content)))
},
),
NewNavListItemWithIcon(
theme.NewThemedResource(ui.IconEarthSvg),
"Colonies",
func() {
characterNav.Push(NewAppBar("Colonies", u.PlanetArea.Content))
characterNav.Push(newCharacterAppBar("Colonies", u.PlanetArea.Content))
},
),
NewNavListItemWithIcon(
theme.MailComposeIcon(),
"Mail",
func() {
characterNav.Push(NewAppBar("Mail", widget.NewLabel("PLACEHOLDER")))
characterNav.Push(newCharacterAppBar("Mail", widget.NewLabel("PLACEHOLDER")))
},
),
NewNavListItemWithIcon(
theme.MailComposeIcon(),
"Communications",
func() {
characterNav.Push(NewAppBar("Communications", widget.NewLabel("PLACEHOLDER")))
characterNav.Push(newCharacterAppBar("Communications", widget.NewLabel("PLACEHOLDER")))
},
),
NewNavListItemWithIcon(
theme.NewThemedResource(ui.IconFileSignSvg),
"Contracts",
func() {
characterNav.Push(NewAppBar("Contracts", u.ContractsArea.Content))
characterNav.Push(newCharacterAppBar("Contracts", u.ContractsArea.Content))
},
),
NewNavListItemWithIcon(
theme.NewThemedResource(ui.IconSchoolSvg),
"Skills",
func() {
characterNav.Push(
NewAppBar(
newCharacterAppBar(
"Skills",
NewNavList(
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Training Queue", u.SkillqueueArea.Content),
newCharacterAppBar("Training Queue", u.SkillqueueArea.Content),
),
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Skill Catalogue", u.SkillCatalogueArea.Content),
newCharacterAppBar("Skill Catalogue", u.SkillCatalogueArea.Content),
),
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Ships", u.ShipsArea.Content),
newCharacterAppBar("Ships", u.ShipsArea.Content),
),
),
))
Expand All @@ -114,23 +148,25 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
"Wallet",
func() {
characterNav.Push(
NewAppBar(
newCharacterAppBar(
"Wallet",
NewNavList(
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Transactions", u.WalletJournalArea.Content),
newCharacterAppBar("Transactions", u.WalletJournalArea.Content),
),
NewNavListItemWithNavigator(
characterNav,
NewAppBar("Market Transactions", u.WalletTransactionArea.Content),
newCharacterAppBar("Market Transactions", u.WalletTransactionArea.Content),
),
),
))
},
),
)
characterNav = NewNavigator(NewAppBar("Character", homeList))

characterPage := newCharacterAppBar("Character", homeList)
characterNav = NewNavigator(characterPage)

var crossNav *Navigator
crossList := NewNavList(
Expand Down Expand Up @@ -191,7 +227,7 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
func() {
c, f := u.MakeGeneralSettingsPage(nil)
toolsNav.Push(
NewAppBar("General", makePage(c), NewMenuToolbarAction(
NewAppBar("General", makePage(c), NewToolbarActionMenu(
fyne.NewMenuItem(
"Reset", f,
))))
Expand All @@ -202,7 +238,7 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
func() {
c, f := u.MakeEVEOnlinePage()
toolsNav.Push(
NewAppBar("Eve Online", makePage(c), NewMenuToolbarAction(
NewAppBar("Eve Online", makePage(c), NewToolbarActionMenu(
fyne.NewMenuItem(
"Reset", f,
))))
Expand All @@ -213,7 +249,7 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
func() {
c, f := u.MakeNotificationPage(nil)
toolsNav.Push(
NewAppBar("Notifications", makePage(c), NewMenuToolbarAction(
NewAppBar("Notifications", makePage(c), NewToolbarActionMenu(
fyne.NewMenuItem(
"Reset", f,
),
Expand All @@ -234,9 +270,8 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
),
)
toolsNav = NewNavigator(NewAppBar("Tools", toolsList))
characterTab := container.NewTabItemWithIcon("", ui.IconCharacterplaceholder32Jpeg, characterNav)
navBar := container.NewAppTabs(
characterTab,
container.NewTabItemWithIcon("", theme.AccountIcon(), characterNav),
container.NewTabItemWithIcon("", theme.NewThemedResource(ui.IconGroupSvg), crossNav),
container.NewTabItemWithIcon("", theme.NewThemedResource(ui.IconToolsSvg), toolsNav),
)
Expand All @@ -247,10 +282,8 @@ func NewMobileUI(fyneApp fyne.App) *MobileUI {
slog.Error("Failed to fetch character portrait", "characterID", id, "err", err)
r = ui.IconCharacterplaceholder32Jpeg
}
characterTab.Icon = r
navBar.Refresh()
characterSelector.SetIcon(r)
}()

}
navBar.SetTabLocation(container.TabLocationBottom)
u.Window.SetContent(navBar)
Expand Down
4 changes: 2 additions & 2 deletions internal/app/ui/mobile/toolbaraction.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import (
"fyne.io/fyne/v2/widget"
)

// NewMenuToolbarAction returns a ToolBarAction with a context menu.
func NewMenuToolbarAction(items ...*fyne.MenuItem) *widget.ToolbarAction {
// NewToolbarActionMenu returns a ToolBarAction with a context menu.
func NewToolbarActionMenu(items ...*fyne.MenuItem) *widget.ToolbarAction {
if len(items) == 0 {
panic("Need to define at least one item")
}
Expand Down
4 changes: 2 additions & 2 deletions internal/app/ui/ui.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,8 +213,8 @@ func (u *BaseUI) HasCharacter() bool {
return u.character != nil
}

func (u *BaseUI) LoadCharacter(ctx context.Context, characterID int32) error {
c, err := u.CharacterService.GetCharacter(ctx, characterID)
func (u *BaseUI) LoadCharacter(characterID int32) error {
c, err := u.CharacterService.GetCharacter(context.Background(), characterID)
if err != nil {
return err
}
Expand Down

0 comments on commit f47c162

Please sign in to comment.