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 }