try to copy whole design from python gameshell launcher

This commit is contained in:
cuu 2018-06-12 16:59:43 +08:00
parent 7b0b08324c
commit cd4c65ec8a
15 changed files with 629 additions and 0 deletions

1
sysgo/UI/.#main_screen.go Symbolic link
View File

@ -0,0 +1 @@
guu@guu-desktop.31499:1528607783

0
sysgo/UI/confirm_page.go Normal file
View File

16
sysgo/UI/constants.go Normal file
View File

@ -0,0 +1,16 @@
package UI
var (
Width = 320
Height = 240
IconWidth = 80
IconHeight = 80
IconExt = ".sh"
ICON_TYPES = map[string]int{"Emulator":7,"FILE":6,"STAT":5,"NAV":4,"LETTER":3,"FUNC":2,"DIR":1,"EXE":0,"None":-1 }
ALIGN = map[string]int{ "HLeft":0,"HCenter":1,"HRight":2,"VMiddle":3,"SLeft":4,"VCenter":5,"SCenter":6}
DT = 50
)

0
sysgo/UI/foot_bar.go Normal file
View File

125
sysgo/UI/icon_item.go Normal file
View File

@ -0,0 +1,125 @@
package UI
import (
"github.com/veandco/go-sdl2/sdl"
"github.com/veandco/go-sdl2/ttf"
"github.com/cuu/gogame/transform"
"github.com/cuu/gogame/utils"
)
type IconItem struct {
PosX int
PosY int
Width int
Height int
ImageName string
ImgSurf *sdl.Surface
Parent PageInterface
Index int
MyType int
CmdPath interface{}
LinkPage PageInterface
Label LabelInterface
Align int
AnimationTime int
}
func NewIconItem() *IconItem {
i := &IconItem{}
i.MyType = ICON_TYPES["EXE"]
i.Align = ALIGN["VCenter"]
l := NewLabel()
i.Label = l
return i
}
func (self *IconItem) Init(x,y,w,h,at) {
self.PosX = x
self.PosY = y
self.Width = w
self.Height = h
self.AnimationTime = at
}
func (self *IconItem) SetLabelColor(col *color.Color) {
self.Label.SetColor(col)
}
func (self *IconItem) NewCoord(x,y int) {
self.PosX = x
self.PosY = y
}
func (self *IconItem) AddLabel(text string, fontobj *ttf.Font) {
if self.Label == nil {
l:= NewLabel()
self.Label = l
}else {
self.Label.Init(text,fontobj)
}
}
func (self *IconItem) AdjustLinkPage() {
if self.MyType == ICON_TYPES["DIR"] && self.LinkPage != nil {
self.LinkPage.SetIndex(0)
self.LinkPage.SetAlign(ALIGN["SLeft"])
self.LinkPage.SetIconNumbers( len(self.LinkPage.GetIcons()) )
self.LinkPage.SetScreen(self.Parent.GetScreen())
self.LinkPage.SetCanvasHWND( (self.Parent.GetScreen()).CanvasHWND )
self.LinkPage.SetFootMsg([5]string{ "Nav.","","","Back","Enter" } )
if self.LinkPage.GetAlign() == ALIGN["HLeft"] {
self.LinkPage.AdjustHLeftAlign()
}else if self.LinkPage.GetAlign() == ALIGN["SLeft"] {
self.LinkPage.AdjustSAutoLeftAlign()
if self.LinkPage.GetIconNumbers() > 1 {
self.LinkPage.SetPsIndex(1)
self.LinkPage.SetIconIndex ( 1 )
}
}
}
}
func (self *IconItem) CreateImageSurf() {
if self.ImgSurf == nil && self.ImageName != "" {
self.ImgSurf = image.Load(self.ImageName)
if self.ImgSurf.W > IconWidth || self.ImgSurf.H > IconHeight {
self.ImgSurf = transform.Scale(self.ImgSurf,IconWidth,IconHeight)
}
}
}
func (self *IconItem) ChangeImgSurfColor(col *color.Color) {
utils.ColorSurface(self.ImgSurf,col)
}
func (self *IconItem) Draw() {
parent_x,parent_y := self.Parent.Coord()
if self.Label != nil {
lab_x,lab_y := self.Label.Coord()
lab_w,lab_h:= self.Label.Size()
if self.Align == ALIGN["VCenter"] {
self.Label.NewCoord( self.PosX - lab_w/2 + parent_x, self.PosY + lab_h/2+6+parent_y)
}else if self.Align == ALIGN["HLeft"] {
self.Label.NewCoord( self.PosX + self.Width/2+3+parent_x, self.PosY - lab_h/2 + parent_y)
}
self.Label.Draw()
}
if self.ImgSurf != nil {
surface.Blit(self.Parent.GetCanvasHWND(), self.ImgSurf,draw.MidRect(self.PosX + parent_x, self.PosY + parent_y,
self.Width,self.Height, Width, Height),nil)
}
}

0
sysgo/UI/icon_pool.go Normal file
View File

91
sysgo/UI/label.go Normal file
View File

@ -0,0 +1,91 @@
package UI
import (
"github.com/veandco/go-sdl2/ttf"
"github.com/cuu/gogame/color"
"github.com/cuu/gogame/font"
)
type LabelInterface interface {
Init( text string, font_obj *ttf.Font,col *color.Color )
Coord() (int,int)
Size() (int,int)
NewCoord(x,y int)
SetColor(col *color.Color )
GetText() string
SetText(text string)
Draw()
}
type Label struct {
PosX int
PosY int
Width int
Height int
Text string
FontObj *ttf.Font
Color *color.Color
CanvasHWND *sdl.Surface
// TextSurf *sdl.Surface
}
func NewLabel() *Label() {
l := &Label{}
l.Color = &color.Color{83,83,83,255}
return l
}
func (self *Label) Init(text string, font_obj *ttf.Font,col *color.Color ) {
if col != nil {
self.Color = col
}
self.Text = text
self.FontObj = font_obj
self.Width,self.Height = font.Size(self.FontObj, self.Text)
}
func (self *Label) Coord() (int,int) {
return self.PosX,self.PosY
}
func (self *Label) Size() (int,int) {
return self.Width,self.Height
}
func (self *Label) NewCoord(x,y int) {
self.PosX = x
self.PosY = y
}
func (self *Label) SetColor(col *color.Color){
if col != nil {
self.Color = col
}
}
func (self *Label) GetText() string {
return self.Text
}
func (self *Label) SetText(text string) {
self.Text = text
self.Width,self.Height = font.Size(self.FontObj, self.Text)
}
func (self *Label) Draw() {
font.SetBold(self.FontObj,false) // avoing same font tangling set_bold to others
my_text := font.Render(self.FontObj,self.Text, true, self.Color, nil)
rect_ := &rect.Rect{self.PosX,self.PosY,self.Width,self.Height}
surface.Blit(self.CanvasHWND,my_text,rect_,nil)
}

20
sysgo/UI/main_screen.go Normal file
View File

@ -0,0 +1,20 @@
package UI
import (
)
type MainScreen struct {
Pages []interface{}
PageMax int
PageIndex int
PosX int
PosY int
}
func NewMainScreen() *MainScreen {
m := &MainScreen{}
}

View File

@ -0,0 +1,35 @@
package UI
import (
"github.com/cuu/gogame/image"
)
type MultiIconItem struct {
IconItem
IconWidth int
IconHeight int
IconIndex int
}
func NewMultiIconItem() *MultiIconItem {
m := &MultiIconItem{}
m.IconIndex = 0
m.IconWidth = 18
m.IconHeight = 18
return m
}
func (m * MultiIconItem) CreateImageSurf() {
if m.ImgSurf == nil and m.ImageName != "" {
m.ImgSurf = image.Load(m.ImageName)
}
}
func (m *MultiIconItem) Draw() {
}

149
sysgo/UI/page.go Normal file
View File

@ -0,0 +1,149 @@
package UI
import (
"sync"
"github.com/veandco/go-sdl2/sdl"
)
type element struct {
data interface{}
next *element
}
type PageStack struct {
lock *sync.Mutex
head *element
Size int
}
func (stk *PageStack) Push(data interface{}) {
stk.lock.Lock()
element := new(element)
element.data = data
temp := stk.head
element.next = temp
stk.head = element
stk.Size++
stk.lock.Unlock()
}
func (stk *PageStack) Pop() interface{} {
if stk.head == nil {
return nil
}
stk.lock.Lock()
r := stk.head.data
stk.head = stk.head.next
stk.Size--
stk.lock.Unlock()
return r
}
func NewPageStack() *PageStack {
stk := new(PageStack)
stk.lock = &sync.Mutex{}
return stk
}
type PageSelector struct {
PosX int
PosY int
Width int
Height int
Parent interface{} //
Alpha int
OnShow bool
IconSurf *sdl.Surface
}
func (p *PageSelector) Adjust(x,y,w,h,alpha int) {
p.PosX = x
p.PosY = y
p.Width = w
p.Height = h
p.Alpha = alpha
}
func (p *PageSelector) Draw() {
}
type PageInterface interface {
// shared functions
// GetScreen
// GetIcons
// SetScreen
// SetFootMsg
// SetCanvasHWND
// GetCanvasHWND
// GetHWND
// SetHWND
// AdjustHLeftAlign
// AdjustSAutoLeftAlign
// SetPsIndex
// SetIconIndex
// GetPsIndex
// GetIconIndex
// Coord
// Size
}
type Page struct {
PosX int
PosY int
Width int
Height int
Icons []interface{} // make first
IconNumbers int
IconIndex int
PrevIconIndex int
Ps interface{}
PsIndex int
Index int
Align string
CanvasHWND *sdl.Surface
HWND *sdl.Surface
OnShow bool
Name string
Screen *MainScreen
PageIconMargin int // default 20
FootMsg [5]string
SelectedIconTopOffset int
EasingDur int
}
func NewPage() *Page {
p := &Page{}
p.PageIconMargin = 20
p.SelectedIconTopOffset = 20
p.EasingDur = 30
p.FootMsg = [5]string{"Nav.","","","","Enter"}
return p
}

0
sysgo/UI/scroller.go Normal file
View File

180
sysgo/UI/title_bar.go Normal file
View File

@ -0,0 +1,180 @@
package UI
import (
"log"
"strconv"
"bufio"
"strings"
"github.com/veandco/go-sdl2/sdl"
"github.com/cuu/gogame/surface"
"github.com/itchyny/volume-go"
"../sysgo"
)
var TitleBar_BarHeight = 24
type TitleBar struct {
PosX int
PosY int
Width int
Height int
BarHeight int
LOffset int
ROffset int
Icons map[string]interface{}
IconWidth
IconHeight
BorderWidth
CanvasHWND *sdl.Surface
HWND interface{}
Title string
InLowBackLight int
SkinManager interface{}
icon_base_path string /// SkinMap("gameshell/titlebar_icons/")
}
func NewTitleBar() *TitleBar {
t := &TitleBar{}
t.BorderWidth = 1
t.BarHeight = TitleBar_BarHeight
t.Height = t.BarHeight + t.BorderWidth
t.Width = Width
t.Icons = make(map[string]interface{})
//t.icon_base_path = SkinMap("gameshell/titlebar_icons/")
}
func (t *TitleBar) RoundRobinCheck {
}
func (t *TitleBar) UpdateWifiStrength() {
}
func (t *TitleBar) GetWifiStrength(stren string) int {
segs := [][]int{ []int{-2,-1}, []int{0,25}, []int{25,50}, []int{50,75},int{75,100}}
stren_number,_ := strconv.Atoi( stren )
ge := 0
if stren_number == 0 {
return ge
}
for i,v in range segs {
if stren_number >= v[0] && stren_number <= v[1] {
ge = i
break
}
}
return ge
}
func (t *TitleBar) SyncSoundVolume() {
vol, err := volume.GetVolume()
if err != nil {
log.Fatalf("get volume failed: %+v", err)
vol = 0
}
fmt.Printf("current volume: %d\n", vol)
snd_segs := [][]int{ []int{0,10}, []int{10,30}, []int{30,70},[]int{70,100} }
ge := 0
for i,v in range snd_segs {
if vol >= v[0] && vol <= v[1] {
ge = i
break
}
}
//
}
func (t *TitleBar) SetSoundVolume(vol int) {
//pass
}
func (t *TitleBar) CheckBatteryStat() {
bat_segs:= [][]int{[]int{0,6},[]int{7,15},[]int{16,20},[]int{21,30},[]int{31,50},[]int{51,60},[]int{61,80},[]int{81,90},[]int{91,100}}
file, err := os.Open( sysgo.Battery )
if err != nil {
fmt.Println("Could not open file ", sysgo.Battery)
t.Icons["battery"] = t.Icons["battery_unknown"]
return
}
defer file.Close()
bat_uevent := make([string]string)
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
line := scanner.Text()
line = strings.Trim(line," ")
pis := strings.Split(line,"=")
if len(pis) > 1 {
bat_uevent[ pis[0] ] = pis[1]
}
}
cur_cap := 0
if val, ok := bat_uevent["POWER_SUPPLY_CAPACITY"]; ok {
cur_cap = strings.Atoi(val)
}else {
cur_cap = 0
}
cap_ge := 0
for i,v in range bat_segs {
if cur_cap >= v[0] && cur_cap <= v[1] {
cap_ge = i
break
}
}
if val, ok := bat_uevent["POWER_SUPPLY_STATUS"]; ok {
if val == "Charging" {
t.Icons["battery_charging"].IconIndex = cap_ge
t.Icons["battery"] = t.Icons["battery_charging"]
}else {
t.Icons["battery_charging"].IconIndex = cap_ge
t.Icons["battery"] = t.Icons["battery_discharging"]
}
}
}
func (t *TitleBar) SetBatteryStat( bat int) {
}
func (t *TitleBar) Init(screen *MainScreen) {
start_x := 0
t.CanvasHWND = surface.Surface(t.Width,t.Height)
t.HWND = screen
icon_wifi_statu := NewMultiIconItem()
}

10
sysgo/config.go Normal file
View File

@ -0,0 +1,10 @@
package sysgo
var (
CurKeySet = "GameShell"
DontLeave = false
BackLight = "/proc/driver/backlight"
Battery = "/sys/class/power_supply/axp20x-battery/uevent"
SKIN="default"
)

0
sysgo/main.go Normal file
View File

View File

@ -108,6 +108,8 @@ func run() int {
func main() { func main() {
var exitcode int var exitcode int
os.Setenv("SDL_VIDEO_CENTERED","1")
sdl.Main(func() { sdl.Main(func() {
exitcode = run() exitcode = run()
}) })