123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- package UI
- import (
- "strings"
- "github.com/veandco/go-sdl2/sdl"
- "github.com/veandco/go-sdl2/ttf"
- "github.com/cuu/gogame/color"
- "github.com/cuu/gogame/font"
- "github.com/cuu/gogame/rect"
- "github.com/cuu/gogame/surface"
- )
- //MultiLabel is also a LabelInterface
- type MultiLabel struct {
- Widget
- Text string
- FontObj *ttf.Font
- Color *color.Color
- CanvasHWND *sdl.Surface
- //TextSurf *sdl.Surface
- MaxWidth int
- Bold bool
- }
- func NewMultiLabel() *MultiLabel {
- l := &MultiLabel{}
- l.Color = &color.Color{83, 83, 83, 255}
- l.Width = 135
- l.Height = 100
- l.Bold = false
- return l
- }
- func (self *MultiLabel) Init(text string, font_obj *ttf.Font, col *color.Color) {
- if col != nil {
- self.Color = col
- }
- self.Text = text
- self.FontObj = font_obj
- if self.CanvasHWND != nil {
- self.Draw()
- }
- }
- func (self *MultiLabel) SetCanvasHWND(canvas *sdl.Surface) {
- self.CanvasHWND = canvas
- }
- func (self *MultiLabel) SetColor(col *color.Color) {
- if col != nil {
- self.Color = col
- }
- }
- func (self *MultiLabel) GetText() string {
- return self.Text
- }
- func (self *MultiLabel) SetText(text string) {
- self.Text = text
- }
- func (self *MultiLabel) SetBold(b bool) {
- self.Bold = b
- }
- func (self *MultiLabel) DrawCenter(bold bool) {
- }
- func (self *MultiLabel) Draw() {
- font.SetBold(self.FontObj, self.Bold) // avoing same font tangling set_bold to others
- self.blit_text(self.CanvasHWND, self.Text, self.PosX, self.PosY, self.FontObj)
- }
- // difference to Label
- func (self *MultiLabel) blit_text(surf *sdl.Surface, text string, pos_x, pos_y int, fnt *ttf.Font) {
- words := make([][]string, 0)
- temp := strings.Split(text, "\n")
- for _, v := range temp {
- t := strings.Split(v, " ")
- words = append(words, t)
- }
- space, _ := font.Size(fnt, " ")
- max_width := self.Width
- x, y := pos_x, pos_y
- row_total_width := 0
- lines := 0
- tmp := words
- if len(words) > 4 {
- tmp = words[:4]
- }
- for _, line := range tmp {
- word_height := 0
- tmp2 := line
- if len(line) > 12 {
- tmp2 = line[:12]
- }
- for _, word := range tmp2 {
- word_surface := font.Render(fnt, word, true, self.Color, nil)
- word_width := surface.GetWidth(word_surface)
- word_height = surface.GetHeight(word_surface)
- row_total_width += word_width
- if row_total_width+space >= max_width {
- x = pos_x
- y = y + word_height
- row_total_width = word_width
- if lines == 0 {
- lines = lines + word_height
- } else {
- lines = lines + word_height
- }
- }
- rect_ := rect.Rect(x, y, self.Width, self.Height)
- surface.Blit(surf, word_surface, &rect_, nil)
- word_surface.Free()
- x += (word_width + space)
- }
- x = pos_x
- y += word_height
- lines += word_height
- }
- self.Height = lines
- }
|