1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2025-02-02 22:57:04 -05:00

party panel: "seeing" and "listening" buttons' tooltips; d2ui improvement: added missed methods to switchable button widget

This commit is contained in:
M. Sz 2021-01-18 15:17:07 +01:00
parent 74f7705165
commit 151ed22c7c
2 changed files with 95 additions and 32 deletions

View File

@ -88,6 +88,16 @@ func (sbtn *SwitchableButton) SetState(state bool) {
sbtn.SetVisible(sbtn.GetVisible()) sbtn.SetVisible(sbtn.GetVisible())
} }
// SetActiveTooltip sets tooltip of active button's
func (sbtn *SwitchableButton) SetActiveTooltip(tooltip *Tooltip) {
sbtn.active.SetTooltip(tooltip)
}
// SetInactiveTooltip sets tooltip of inactive button's
func (sbtn *SwitchableButton) SetInactiveTooltip(tooltip *Tooltip) {
sbtn.inactive.SetTooltip(tooltip)
}
// SetPosition sets widget's position // SetPosition sets widget's position
func (sbtn *SwitchableButton) SetPosition(x, y int) { func (sbtn *SwitchableButton) SetPosition(x, y int) {
sbtn.BaseWidget.SetPosition(x, y) sbtn.BaseWidget.SetPosition(x, y)
@ -95,6 +105,17 @@ func (sbtn *SwitchableButton) SetPosition(x, y int) {
sbtn.inactive.SetPosition(x, y) sbtn.inactive.SetPosition(x, y)
} }
// GetSize returns current button's size
func (sbtn *SwitchableButton) GetSize() (x, y int) {
if sbtn.state {
x, y = sbtn.active.GetSize()
} else {
x, y = sbtn.inactive.GetSize()
}
return x, y
}
// Advance advances widget // Advance advances widget
func (sbtn *SwitchableButton) Advance(_ float64) error { func (sbtn *SwitchableButton) Advance(_ float64) error {
// noop // noop

View File

@ -36,21 +36,25 @@ const (
) )
const ( const (
seeingButtonFrame = iota * 4 listeningButtonFrame = iota * 4
relationshipsFrame relationshipsFrame
listeningButtonFrame seeingButtonFrame
// nolint:deadcode,varcheck,unused // will be used // nolint:deadcode,varcheck,unused // will be used
lockButtonFrame lockButtonFrame
nextButtonFrame = 2 nextButtonFrame = 2
) )
const (
buttonSize = 19
)
const ( const (
maxPlayersInGame = 8 maxPlayersInGame = 8
barX = 90 barX = 90
relationshipSwitcherX = 95 relationshipSwitcherX = 95
seeingSwitcherX = 345 listeningSwitcherX = 345
listeningSwitcherX = 365 seeingSwitcherX = 365
nameLabelX = 115 nameLabelX = 115
classLabelX = 115 classLabelX = 115
levelLabelX = 383 levelLabelX = 383
@ -82,14 +86,33 @@ func (s *PartyPanel) newPartyIndex() *partyIndex {
result.relationshipSwitcher = relationships result.relationshipSwitcher = relationships
seeing := s.createSwitcher(seeingButtonFrame) seeing := s.createSwitcher(seeingButtonFrame)
result.seeingActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
result.seeingActiveTooltip.SetText(s.asset.TranslateString("strParty19"))
seeing.SetActiveTooltip(result.seeingActiveTooltip)
result.seeingInactiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
result.seeingInactiveTooltip.SetText(s.asset.TranslateString("strParty22"))
seeing.SetInactiveTooltip(result.seeingInactiveTooltip)
result.seeingSwitcher = seeing result.seeingSwitcher = seeing
listening := s.createSwitcher(listeningButtonFrame) listening := s.createSwitcher(listeningButtonFrame)
result.listeningActiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
result.listeningActiveTooltip.SetText(s.asset.TranslateString("strParty17") + "\n" + s.asset.TranslateString("strParty18"))
listening.SetActiveTooltip(result.listeningActiveTooltip)
result.listeningInactiveTooltip = s.uiManager.NewTooltip(d2resource.Font16, d2resource.PaletteSky, d2ui.TooltipXCenter, d2ui.TooltipYTop)
result.listeningInactiveTooltip.SetText(s.asset.TranslateString("strParty11") + "\n" + s.asset.TranslateString("strParty16"))
listening.SetInactiveTooltip(result.listeningInactiveTooltip)
result.listeningSwitcher = listening result.listeningSwitcher = listening
return result return result
} }
// partyIndex represents a party index
type partyIndex struct { type partyIndex struct {
hero *d2mapentity.Player hero *d2mapentity.Player
name *d2ui.Label name *d2ui.Label
@ -97,10 +120,15 @@ type partyIndex struct {
level *d2ui.Label level *d2ui.Label
relationshipSwitcher *d2ui.SwitchableButton relationshipSwitcher *d2ui.SwitchableButton
seeingSwitcher *d2ui.SwitchableButton seeingSwitcher *d2ui.SwitchableButton
seeingActiveTooltip *d2ui.Tooltip
seeingInactiveTooltip *d2ui.Tooltip
listeningSwitcher *d2ui.SwitchableButton listeningSwitcher *d2ui.SwitchableButton
listeningActiveTooltip *d2ui.Tooltip
listeningInactiveTooltip *d2ui.Tooltip
relationships d2enum.PlayersRelationships relationships d2enum.PlayersRelationships
} }
// setColor sets appropriate labels' colors
func (pi *partyIndex) setColor(relations d2enum.PlayersRelationships) { func (pi *partyIndex) setColor(relations d2enum.PlayersRelationships) {
var color = d2util.Color(white) var color = d2util.Color(white)
@ -118,18 +146,32 @@ func (pi *partyIndex) setColor(relations d2enum.PlayersRelationships) {
pi.level.Color[0] = color pi.level.Color[0] = color
} }
// setPositions sets party-index's position to given
func (pi *partyIndex) setPositions(idx int) { func (pi *partyIndex) setPositions(idx int) {
var h int
pi.name.SetPosition(nameLabelX, baseNameLabelY+nextBar*idx) pi.name.SetPosition(nameLabelX, baseNameLabelY+nextBar*idx)
pi.class.SetPosition(classLabelX, baseClassLabelY+nextBar*idx) pi.class.SetPosition(classLabelX, baseClassLabelY+nextBar*idx)
pi.level.SetPosition(levelLabelX, baseLevelLabelY+nextBar*idx) pi.level.SetPosition(levelLabelX, baseLevelLabelY+nextBar*idx)
pi.relationshipSwitcher.SetPosition(relationshipSwitcherX, baseRelationshipSwitcherY+nextBar*idx) pi.relationshipSwitcher.SetPosition(relationshipSwitcherX, baseRelationshipSwitcherY+nextBar*idx)
pi.seeingSwitcher.SetPosition(seeingSwitcherX, baseSeeingSwitcherY+idx*nextBar) pi.seeingSwitcher.SetPosition(seeingSwitcherX, baseSeeingSwitcherY+idx*nextBar)
_, h = pi.seeingActiveTooltip.GetSize()
pi.seeingActiveTooltip.SetPosition(seeingSwitcherX+buttonSize, baseSeeingSwitcherY+idx*nextBar-h)
_, h = pi.seeingInactiveTooltip.GetSize()
pi.seeingInactiveTooltip.SetPosition(seeingSwitcherX+buttonSize, baseSeeingSwitcherY+idx*nextBar-h)
pi.listeningSwitcher.SetPosition(listeningSwitcherX, baseListeningSwitcherY+idx*nextBar) pi.listeningSwitcher.SetPosition(listeningSwitcherX, baseListeningSwitcherY+idx*nextBar)
_, h = pi.listeningActiveTooltip.GetSize()
pi.listeningActiveTooltip.SetPosition(listeningSwitcherX+buttonSize, baseListeningSwitcherY+idx*nextBar-h)
_, h = pi.listeningInactiveTooltip.GetSize()
pi.listeningInactiveTooltip.SetPosition(listeningSwitcherX+buttonSize, baseListeningSwitcherY+idx*nextBar-h)
} }
// AddPlayer adds a new player to the party panel // AddPlayer adds a new player to the party panel
func (s *PartyPanel) AddPlayer(player *d2mapentity.Player, relations d2enum.PlayersRelationships) { func (s *PartyPanel) AddPlayer(player *d2mapentity.Player, relations d2enum.PlayersRelationships) {
idx := 0 idx := 0
for n, i := range s.partyIndexes { for n, i := range s.partyIndexes {
if i.hero == nil { if i.hero == nil {
idx = n idx = n
@ -221,19 +263,7 @@ func (s *PartyPanel) Sort() {
} }
} }
// UpdatePlayer updates party-index // setBarPosition sets party-panel bar's position
func (s *PartyPanel) UpdatePlayer(oldPlayer, newPlayer *d2mapentity.Player) bool {
for n, i := range s.partyIndexes {
if i.hero == oldPlayer {
s.partyIndexes[n].hero = newPlayer
return true
}
}
return false
}
func (s *PartyPanel) setBarPosition() { func (s *PartyPanel) setBarPosition() {
for n, i := range s.partyIndexes { for n, i := range s.partyIndexes {
currentN := n currentN := n
@ -322,11 +352,15 @@ type PartyPanel struct {
func (s *PartyPanel) Load() { func (s *PartyPanel) Load() {
var err error var err error
var w, h int
// create widgetGroups
s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel) s.panelGroup = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
for i := 0; i < maxPlayersInGame; i++ { for i := 0; i < maxPlayersInGame; i++ {
s.indexes[i] = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel) s.indexes[i] = s.uiManager.NewWidgetGroup(d2ui.RenderPriorityHeroStatsPanel)
} }
// create frame
frame := s.uiManager.NewUIFrame(d2ui.FrameLeft) frame := s.uiManager.NewUIFrame(d2ui.FrameLeft)
s.panelGroup.AddWidget(frame) s.panelGroup.AddWidget(frame)
@ -335,28 +369,26 @@ func (s *PartyPanel) Load() {
s.Error(err.Error()) s.Error(err.Error())
} }
w, h := frame.GetSize() // create panel
w, h = frame.GetSize()
staticPanel := s.uiManager.NewCustomWidgetCached(s.renderStaticPanelFrames, w, h) staticPanel := s.uiManager.NewCustomWidgetCached(s.renderStaticPanelFrames, w, h)
s.panelGroup.AddWidget(staticPanel) s.panelGroup.AddWidget(staticPanel)
// create close button
closeButton := s.uiManager.NewButton(d2ui.ButtonTypeSquareClose, "") closeButton := s.uiManager.NewButton(d2ui.ButtonTypeSquareClose, "")
closeButton.SetVisible(false) closeButton.SetVisible(false)
closeButton.SetPosition(partyPanelCloseButtonX, partyPanelCloseButtonY) closeButton.SetPosition(partyPanelCloseButtonX, partyPanelCloseButtonY)
closeButton.OnActivated(func() { s.Close() }) closeButton.OnActivated(func() { s.Close() })
s.panelGroup.AddWidget(closeButton) s.panelGroup.AddWidget(closeButton)
// our name label
heroName := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky) heroName := s.uiManager.NewLabel(d2resource.Font16, d2resource.PaletteSky)
heroName.SetText(s.heroName) heroName.SetText(s.heroName)
heroName.SetPosition(partyPanelHeroNameX, partyPanelHeroNameY) heroName.SetPosition(partyPanelHeroNameX, partyPanelHeroNameY)
heroName.Alignment = d2ui.HorizontalAlignCenter heroName.Alignment = d2ui.HorizontalAlignCenter
s.panelGroup.AddWidget(heroName) s.panelGroup.AddWidget(heroName)
s.bar, err = s.uiManager.NewSprite(d2resource.PartyBar, d2resource.PaletteSky) // example data - create an example players and add them
if err != nil {
s.Error(err.Error())
}
// example data
p0 := s.testPlayer p0 := s.testPlayer
s.AddPlayer(p0, d2enum.PlayerRelationEnemy) s.AddPlayer(p0, d2enum.PlayerRelationEnemy)
p1 := s.testPlayer p1 := s.testPlayer
@ -365,6 +397,7 @@ func (s *PartyPanel) Load() {
p1.Class = d2enum.HeroNecromancer p1.Class = d2enum.HeroNecromancer
s.AddPlayer(p1, d2enum.PlayerRelationFriend) s.AddPlayer(p1, d2enum.PlayerRelationFriend)
// create WidgetGroups of party indexes
for n, i := range s.partyIndexes { for n, i := range s.partyIndexes {
s.indexes[n].AddWidget(i.name) s.indexes[n].AddWidget(i.name)
s.indexes[n].AddWidget(i.class) s.indexes[n].AddWidget(i.class)
@ -374,12 +407,19 @@ func (s *PartyPanel) Load() {
s.indexes[n].AddWidget(i.level) s.indexes[n].AddWidget(i.level)
} }
// further test data (to check if DeletePlayer works after creating WG's)
if !s.DeletePlayer(p0) { if !s.DeletePlayer(p0) {
s.Warning("cannot remove player: DeletePlayer returned false") s.Warning("cannot remove player: DeletePlayer returned false")
} }
s.AddPlayer(p0, d2enum.PlayerRelationEnemy) s.AddPlayer(p0, d2enum.PlayerRelationEnemy)
// create bar
s.bar, err = s.uiManager.NewSprite(d2resource.PartyBar, d2resource.PaletteSky)
if err != nil {
s.Error(err.Error())
}
w, h = s.bar.GetCurrentFrameSize() w, h = s.bar.GetCurrentFrameSize()
v := s.uiManager.NewCustomWidget(s.renderBar, w, h) v := s.uiManager.NewCustomWidget(s.renderBar, w, h)
s.panelGroup.AddWidget(v) s.panelGroup.AddWidget(v)
@ -389,6 +429,7 @@ func (s *PartyPanel) Load() {
s.panelGroup.SetVisible(false) s.panelGroup.SetVisible(false)
} }
// createSwitcher creates party-panel switcher using frame given
func (s *PartyPanel) createSwitcher(frame int) *d2ui.SwitchableButton { func (s *PartyPanel) createSwitcher(frame int) *d2ui.SwitchableButton {
active := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame) active := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame)
inactive := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame+nextButtonFrame) inactive := s.uiManager.NewCustomButton(d2resource.PartyBoxes, frame+nextButtonFrame)
@ -480,6 +521,7 @@ func (s *PartyPanel) renderStaticPanelFrames(target d2interface.Surface) {
} }
} }
// renderBar renders party panel's bar
func (s *PartyPanel) renderBar(target d2interface.Surface) { func (s *PartyPanel) renderBar(target d2interface.Surface) {
frames := []int{ frames := []int{
partyPanelTopLeft, partyPanelTopLeft,