123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 |
- package UI
- import (
- "fmt"
- "strings"
- "github.com/cuu/gogame/color"
- "github.com/cuu/gogame/draw"
- "github.com/cuu/gogame/event"
- "github.com/cuu/gogame/font"
- "github.com/cuu/gogame/surface"
- "github.com/clockworkpi/LauncherGoDev/sysgo/easings"
- )
- //sysgo/UI/keyboard_keys.layout
- type KeyboardIcon struct {
- TextItem // IconItem->TextItem->KeyboardIcon
- }
- func NewKeyboardIcon() *KeyboardIcon {
- p := &KeyboardIcon{}
- p.Color = &color.Color{83, 83, 83, 255} //SkinManager().GiveColor('Text')
- p.MyType = ICON_TYPES["NAV"]
- return p
- }
- func (self *KeyboardIcon) Draw() {
- rect_ := draw.MidRect(self.PosX, self.PosY, self.Width, self.Height, Width, Height)
- surface.Blit(self.Parent.GetCanvasHWND(), self.ImgSurf, rect_, nil)
- }
- type KeyboardSelector struct {
- PageSelector
- Parent *Keyboard
- }
- func NewKeyboardSelector() *KeyboardSelector {
- p := &KeyboardSelector{}
- return p
- }
- func (self *KeyboardSelector) Draw() {
- sec_idx := self.Parent.SectionIndex
- row_idx := self.Parent.RowIndex
- idx := self.Parent.PsIndex
- x, y := self.Parent.SecsKeys[sec_idx][row_idx][idx].Coord()
- w, h := self.Parent.SecsKeys[sec_idx][row_idx][idx].Size()
- rect_ := draw.MidRect(x, y, w+6, h+1, self.Parent.Width, self.Parent.Height)
- if rect_.W <= 0 || rect_.H <= 0 {
- return
- }
- color_ := &color.Color{126, 206, 244, 255}
- draw.AARoundRect(self.Parent.CanvasHWND, rect_, color_, 3, 0, color_)
- }
- type Keyboard struct {
- Page
- Secs map[int][][]string
- SecsKeys map[int][][]TextItemInterface
- SectionNumbers int
- SectionIndex int
- Icons map[string]IconItemInterface
- KeyboardLayoutFile string ///sysgo/UI/keyboard_keys.layout
- LeftOrRight int
- RowIndex int
- Textarea *Textarea
- Selector *KeyboardSelector
- Caller PageInterface
- }
- func NewKeyboard() *Keyboard {
- p := &Keyboard{}
- p.PageIconMargin = 20
- p.SelectedIconTopOffset = 20
- p.Align = ALIGN["SLeft"]
- p.EasingDur = 10
- p.SectionNumbers = 3
- p.SectionIndex = 1
- p.Icons = make(map[string]IconItemInterface)
- p.LeftOrRight = 1
- p.RowIndex = 0
- p.FootMsg = [5]string{"Nav.", "ABC", "Done", "Backspace", "Enter"}
- p.Secs = make(map[int][][]string)
- p.SecsKeys = make(map[int][][]TextItemInterface)
- p.KeyboardLayoutFile = "sysgo/UI/keyboard_keys.layout"
- return p
- }
- func (self *Keyboard) ReadLayoutFile(fname string) {
- LayoutIndex := 0
- content, err := ReadLines(fname)
- Assert(err)
- var tmp [][]string
- for i, v := range content {
- content[i] = strings.TrimSpace(v)
- stmp := strings.Split(content[i], " ")
- for j, u := range stmp {
- stmp[j] = strings.TrimSpace(u)
- }
- tmp = append(tmp, stmp)
- }
- for _, v := range tmp {
- if len(v) > 2 {
- if _, ok := self.Secs[LayoutIndex]; ok {
- self.Secs[LayoutIndex] = append(self.Secs[LayoutIndex], v)
- } else {
- self.Secs[LayoutIndex] = [][]string{}
- self.Secs[LayoutIndex] = append(self.Secs[LayoutIndex], v)
- }
- } else { //empty []
- LayoutIndex += 1
- }
- }
- }
- func (self *Keyboard) SetPassword(pwd string) {
- pwd_seq_list := strings.SplitAfter(pwd, "")
- self.Textarea.ResetMyWords()
- for _, v := range pwd_seq_list {
- self.Textarea.AppendText(v)
- }
- }
- func (self *Keyboard) Init() {
- self.CanvasHWND = self.Screen.CanvasHWND
- self.ReadLayoutFile(self.KeyboardLayoutFile) //assign to self.Secs
- self.SectionNumbers = len(self.Secs)
- self.PosX = self.Index * self.Screen.Width
- self.Width = self.Screen.Width
- self.Height = self.Screen.Height
- fontobj := Fonts["veramono24"]
- word_margin := 15
- secs_zero := strings.Join(self.Secs[0][0], "")
- fw, _ := font.Size(fontobj, secs_zero)
- start_x := (self.Width-fw-len(self.Secs[0][0])*word_margin)/2 + word_margin/2
- start_y := 0
- // cnt := 0
- for i := 0; i < self.SectionNumbers; i++ {
- self.SecsKeys[i] = [][]TextItemInterface{}
- for j := 0; j < len(self.Secs[i]); j++ {
- self.SecsKeys[i] = append(self.SecsKeys[i], []TextItemInterface{})
- secs_ij := strings.Join(self.Secs[i][j], "")
- fw, _ := font.Size(fontobj, secs_ij)
- start_x = (self.Width-fw-len(self.Secs[i][j])*word_margin)/2 + word_margin/2
- start_x = start_x + i*self.Width
- start_y = 84 + j*(word_margin+14)
- for _, val := range self.Secs[i][j] {
- ti := NewTextItem()
- ti.FontObj = fontobj
- ti.Parent = self
- if val == "_L" || val == "_R" {
- it := NewKeyboardIcon()
- it.ImgSurf = MyIconPool.GetImgSurf(val)
- it.Parent = self
- it.Str = val
- it.Init(start_x+surface.GetWidth(it.ImgSurf)/2, start_y, surface.GetWidth(it.ImgSurf), surface.GetHeight(it.ImgSurf), 0)
- self.SecsKeys[i][j] = append(self.SecsKeys[i][j], it)
- self.IconNumbers += 1
- start_x = start_x + surface.GetWidth(it.ImgSurf) + word_margin
- } else {
- if val == "_S" {
- val = "Space"
- ti.FontObj = Fonts["veramono15"]
- ti.Bold = true
- }
- cur_alpha_w, cur_alpha_h := font.Size(ti.FontObj, val)
- ti.Init(start_x+cur_alpha_w/2, start_y, cur_alpha_w, cur_alpha_h, 0)
- ti.Str = val
- start_x = start_x + cur_alpha_w + word_margin // prepare for next alphabet
- self.SecsKeys[i][j] = append(self.SecsKeys[i][j], ti)
- }
- }
- }
- }
- self.SectionIndex = 0
- self.Textarea = NewTextarea()
- self.Textarea.PosX = 4
- self.Textarea.PosY = 4
- self.Textarea.Width = self.Width - 4*2
- self.Textarea.Height = 60
- self.Textarea.CanvasHWND = self.CanvasHWND
- self.Textarea.Init()
- ps := NewKeyboardSelector()
- ps.Parent = self
- ps.Init(start_x, start_y, 25, 25, 128)
- ps.OnShow = true
- self.Ps = ps
- self.PsIndex = 0
- }
- func (self *Keyboard) SelectUpChar() {
- sec_idx := self.SectionIndex
- self.RowIndex -= 1
- if self.RowIndex < 0 {
- self.RowIndex = len(self.SecsKeys[sec_idx]) - 1
- }
- if self.PsIndex >= len(self.SecsKeys[sec_idx][self.RowIndex]) {
- self.PsIndex = len(self.SecsKeys[sec_idx][self.RowIndex]) - 1
- }
- self.ClearCanvas()
- self.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *Keyboard) SelectDownChar() {
- sec_idx := self.SectionIndex
- self.RowIndex += 1
- if self.RowIndex >= len(self.SecsKeys[sec_idx]) {
- self.RowIndex = 0
- }
- if self.PsIndex >= len(self.SecsKeys[sec_idx][self.RowIndex]) {
- self.PsIndex = len(self.SecsKeys[sec_idx][self.RowIndex]) - 1
- }
- self.ClearCanvas()
- self.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *Keyboard) SelectNextChar() {
- sec_idx := self.SectionIndex
- row_idx := self.RowIndex
- self.PsIndex += 1
- if self.PsIndex >= len(self.SecsKeys[sec_idx][row_idx]) {
- self.PsIndex = 0
- self.RowIndex += 1
- if self.RowIndex >= len(self.SecsKeys[sec_idx]) {
- self.RowIndex = 0
- }
- }
- self.ClearCanvas()
- self.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *Keyboard) SelectPrevChar() {
- sec_idx := self.SectionIndex
- self.PsIndex -= 1
- if self.PsIndex < 0 {
- self.RowIndex -= 1
- if self.RowIndex <= 0 {
- self.RowIndex = len(self.SecsKeys[sec_idx]) - 1
- }
- self.PsIndex = len(self.SecsKeys[sec_idx][self.RowIndex]) - 1
- }
- self.ClearCanvas()
- self.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *Keyboard) ClickOnChar() {
- sec_idx := self.SectionIndex
- alphabet := self.SecsKeys[sec_idx][self.RowIndex][self.PsIndex].GetStr()
- if alphabet == "Space" {
- alphabet = " "
- }
- if alphabet == "_L" || alphabet == "_R" {
- if alphabet == "_L" {
- self.Textarea.SubTextIndex()
- } else if alphabet == "_R" {
- self.Textarea.AddTextIndex()
- }
- } else {
- self.Textarea.AppendText(alphabet)
- }
- self.Textarea.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *Keyboard) KeyboardShift() {
- distance := self.Width //320
- current_time := float32(0.0)
- start_posx := float32(0.0)
- current_posx := start_posx
- final_posx := float32(distance)
- // posx_init := start
- dur := self.EasingDur
- last_posx := float32(0.0)
- var all_last_posx []int
- for i := 0; i < distance*dur; i++ {
- current_posx = float32(easings.SineIn(float32(current_time), float32(start_posx), float32(final_posx-start_posx), float32(dur)))
- if current_posx >= final_posx {
- current_posx = final_posx
- }
- dx := current_posx - last_posx
- all_last_posx = append(all_last_posx, int(dx))
- current_time += 1.0
- last_posx = current_posx
- if current_posx >= final_posx {
- break
- }
- }
- c := 0
- for _, v := range all_last_posx {
- c += v
- }
- if c < int(final_posx-start_posx) {
- all_last_posx = append(all_last_posx, int(int(final_posx)-c))
- }
- for _, v := range all_last_posx {
- for j := 0; j < self.SectionNumbers; j++ {
- for _, u := range self.SecsKeys[j] {
- for _, x := range u {
- x_, y_ := x.Coord()
- x.NewCoord(x_+self.LeftOrRight*v, y_)
- }
- }
- }
- self.ResetPageSelector()
- self.ClearCanvas()
- self.Draw()
- self.Screen.SwapAndShow()
- }
- }
- func (self *Keyboard) ShiftKeyboardPage() {
- self.KeyboardShift()
- self.SectionIndex -= self.LeftOrRight
- self.Draw()
- self.Screen.SwapAndShow()
- }
- func (self *Keyboard) KeyDown(ev *event.Event) {
- if ev.Data["Key"] == CurKeys["Up"] {
- self.SelectUpChar()
- return
- }
- if ev.Data["Key"] == CurKeys["Down"] {
- self.SelectDownChar()
- return
- }
- if ev.Data["Key"] == CurKeys["Right"] {
- self.SelectNextChar()
- return
- }
- if ev.Data["Key"] == CurKeys["Left"] {
- self.SelectPrevChar()
- return
- }
- if ev.Data["Key"] == CurKeys["B"] || ev.Data["Key"] == CurKeys["Enter"] {
- self.ClickOnChar()
- return
- }
- if ev.Data["Key"] == CurKeys["X"] {
- if self.SectionIndex <= 0 {
- self.LeftOrRight = -1
- }
- if self.SectionIndex >= (self.SectionNumbers - 1) {
- self.LeftOrRight = 1
- }
- self.ShiftKeyboardPage()
- }
- if ev.Data["Key"] == CurKeys["Menu"] {
- self.ReturnToUpLevelPage()
- self.Screen.Draw()
- self.Screen.SwapAndShow()
- }
- if ev.Data["Key"] == CurKeys["Y"] { // done
- fmt.Println(strings.Join(self.Textarea.MyWords, ""))
- self.ReturnToUpLevelPage()
- self.Screen.SwapAndShow()
- if self.Caller != nil {
- self.Caller.OnKbdReturnBackCb()
- }
- //Uplevel/Parent page invoke OnReturnBackCb,eg: ConfigWireless
- }
- if ev.Data["Key"] == CurKeys["A"] {
- self.Textarea.RemoveFromLastText()
- self.Textarea.Draw()
- self.Screen.SwapAndShow()
- }
- if ev.Data["Key"] == CurKeys["LK1"] {
- if self.SectionIndex < self.SectionNumbers-1 {
- self.LeftOrRight = -1
- self.ShiftKeyboardPage()
- }
- }
- if ev.Data["Key"] == CurKeys["LK5"] {
- if self.SectionIndex > 0 {
- self.LeftOrRight = 1
- self.ShiftKeyboardPage()
- }
- }
- }
- func (self *Keyboard) Draw() {
- self.ClearCanvas()
- self.Ps.Draw()
- for i := 0; i < self.SectionNumbers; i++ {
- for _, j := range self.SecsKeys[i] {
- for _, u := range j {
- u.Draw()
- }
- }
- }
- self.Textarea.Draw()
- }
|