You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.5 KiB
139 lines
4.5 KiB
package main |
|
|
|
import ( |
|
"math" |
|
"strconv" |
|
|
|
"github.com/gdamore/tcell/v2" |
|
"gitlab.com/tslocum/cview" |
|
"gitlab.com/tslocum/joker" |
|
) |
|
|
|
type cardWidget struct { |
|
*cview.Box |
|
|
|
joker.Card |
|
selected bool |
|
selectedFunc func(joker.Card) |
|
} |
|
|
|
func newCardWidget(card joker.Card, selectedFunc func(joker.Card)) *cardWidget { |
|
c := cardWidget{Box: cview.NewBox().ShowFocus(false), Card: card, selectedFunc: selectedFunc} |
|
|
|
c.Box.SetBorder(true) |
|
return &c |
|
} |
|
|
|
func (c *cardWidget) Select() { |
|
c.selected = !c.selected |
|
|
|
if c.selectedFunc != nil { |
|
c.selectedFunc(c.Card) |
|
} |
|
|
|
app.Draw() |
|
} |
|
|
|
func (c *cardWidget) Draw(screen tcell.Screen) { |
|
c.Box.Draw(screen) |
|
|
|
color := tcell.ColorDefault |
|
if c.Card.Suit == joker.SuitHearts || c.Card.Suit == joker.SuitDiamonds { |
|
color = tcell.NewHexColor(0xFF3232) |
|
} |
|
|
|
x, y, w, h := c.GetInnerRect() |
|
|
|
cview.Print(screen, cardFaceShort(c.Card), x, y, math.MaxInt64, cview.AlignLeft, tcell.ColorDefault) |
|
|
|
cview.Print(screen, c.Suit.Name()[0:1], x, y+1, math.MaxInt64, cview.AlignLeft, color) |
|
|
|
// Center |
|
if c.Face == joker.FaceAce || c.Face == joker.Face3 || c.Face == joker.Face5 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2), y+(h/2), math.MaxInt64, cview.AlignLeft, color) |
|
} else if c.Face == joker.FaceJack || c.Face == joker.FaceQueen || c.Face == joker.FaceKing { |
|
cview.Print(screen, c.Face.Name()[0:1], x+(w/2), y+(h/2), math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Top/bottom 2/3 |
|
if c.Face == joker.Face2 || c.Face == joker.Face3 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2), y+2, math.MaxInt64, cview.AlignLeft, color) |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2), (y+h)-3, math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Top/bottom all others |
|
if c.Face == joker.Face4 || c.Face == joker.Face5 || c.Face == joker.Face6 || c.Face == joker.Face7 || c.Face == joker.Face8 || c.Face == joker.Face9 || c.Face == joker.Face10 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/4), y+2, math.MaxInt64, cview.AlignLeft, color) |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2)+(w/4), y+2, math.MaxInt64, cview.AlignLeft, color) |
|
|
|
cview.Print(screen, c.Suit.Symbol(), x+(w/4), (y+h)-3, math.MaxInt64, cview.AlignLeft, color) |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2)+(w/4), (y+h)-3, math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Left/right |
|
if c.Face == joker.Face6 || c.Face == joker.Face7 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/4), y+(h/2), math.MaxInt64, cview.AlignLeft, color) |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2)+(w/4), y+(h/2), math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Center 7 |
|
if c.Face == joker.Face7 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2), y+(h/2)-1, math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Secondary top/bottom |
|
if c.Face == joker.Face8 || c.Face == joker.Face9 || c.Face == joker.Face10 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/4), y+4, math.MaxInt64, cview.AlignLeft, color) |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2)+(w/4), y+4, math.MaxInt64, cview.AlignLeft, color) |
|
|
|
cview.Print(screen, c.Suit.Symbol(), x+(w/4), (y+h)-5, math.MaxInt64, cview.AlignLeft, color) |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2)+(w/4), (y+h)-5, math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Center 9/10 |
|
if c.Face == joker.Face9 || c.Face == joker.Face10 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2), y+(h/2)-2, math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
// Center 10 |
|
if c.Face == joker.Face10 { |
|
cview.Print(screen, c.Suit.Symbol(), x+(w/2), y+(h/2)+2, math.MaxInt64, cview.AlignLeft, color) |
|
} |
|
|
|
cview.Print(screen, c.Suit.Name()[0:1], (x+w)-1, (y+h)-2, math.MaxInt64, cview.AlignLeft, color) |
|
|
|
bottomFaceOffset := 0 |
|
if c.Card.Face == joker.Face10 { |
|
bottomFaceOffset = 1 |
|
} |
|
cview.Print(screen, cardFaceShort(c.Card), ((x+w)-1)-bottomFaceOffset, (y+h)-1, math.MaxInt64, cview.AlignLeft, tcell.ColorDefault) |
|
|
|
_ = w |
|
_ = h |
|
} |
|
|
|
func cardFaceShort(card joker.Card) string { |
|
switch card.Face { |
|
case joker.FaceAce, joker.FaceJack, joker.FaceQueen, joker.FaceKing: |
|
return card.Face.Name()[0:1] |
|
default: |
|
return strconv.Itoa(int(card.Face)) |
|
} |
|
} |
|
|
|
// MouseHandler returns the mouse handler for this primitive. |
|
func (c *cardWidget) MouseHandler() func(action cview.MouseAction, event *tcell.EventMouse, setFocus func(p cview.Primitive)) (consumed bool, capture cview.Primitive) { |
|
return c.WrapMouseHandler(func(action cview.MouseAction, event *tcell.EventMouse, setFocus func(p cview.Primitive)) (consumed bool, capture cview.Primitive) { |
|
if !c.InRect(event.Position()) { |
|
return false, nil |
|
} |
|
|
|
// Process mouse event. |
|
if action == cview.MouseLeftClick { |
|
consumed = true |
|
c.Select() |
|
} |
|
|
|
return |
|
}) |
|
}
|
|
|