From 7e47e3a9243e10cb811db9a3522b71167a84a674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Sun, 11 Oct 2026 16:24:50 -0400 Subject: [PATCH] Add hand-placed 12x12 icon set --- icon/actions.go | 412 ++++++++++++++++++++++++++++++++++++++++++++++ icon/icon.go | 39 +++++ icon/icon_test.go | 176 ++++++++++++++++++++ icon/items.go | 267 ++++++++++++++++++++++++++++++ icon/objects.go | 292 ++++++++++++++++++++++++++++++++ icon/status.go | 202 +++++++++++++++++++++++ icon/things.go | 253 ++++++++++++++++++++++++++++ 7 files changed, 1641 insertions(+) create mode 100644 icon/actions.go create mode 100644 icon/icon.go create mode 100644 icon/icon_test.go create mode 100644 icon/items.go create mode 100644 icon/objects.go create mode 100644 icon/status.go create mode 100644 icon/things.go diff --git a/icon/actions.go b/icon/actions.go new file mode 100644 index 0000000..9647147 --- /dev/null +++ b/icon/actions.go @@ -0,0 +1,412 @@ +// Package icon holds hand-placed 12×12 sprites. +package icon + +import "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" + +var ( + Check = pixel.MustSprite(` + ............ + ............ + .........##. + ........###. + .......###.. + .##...###... + .###.###.... + ..#####..... + ...###...... + ....#....... + ............ + ............`) + Close = pixel.MustSprite(` + ............ + .##......##. + .###....###. + ..###..###.. + ...######... + ....####.... + ....####.... + ...######... + ..###..###.. + .###....###. + .##......##. + ............`) + Plus = pixel.MustSprite(` + ............ + ............ + .....##..... + .....##..... + .....##..... + ..########.. + ..########.. + .....##..... + .....##..... + .....##..... + ............ + ............`) + Minus = pixel.MustSprite(` + ............ + ............ + ............ + ............ + ............ + ..########.. + ..########.. + ............ + ............ + ............ + ............ + ............`) + ArrowLeft = pixel.MustSprite(` + ............ + ............ + .....#...... + ....##...... + ...###...... + ..#########. + ..#########. + ...###...... + ....##...... + .....#...... + ............ + ............`) + ArrowRight = ArrowLeft.Mirror() + ArrowUp = pixel.MustSprite(` + ............ + .....##..... + ....####.... + ...######... + ..########.. + .....##..... + .....##..... + .....##..... + .....##..... + .....##..... + .....##..... + ............`) + ArrowDown = pixel.MustSprite(` + ............ + .....##..... + .....##..... + .....##..... + .....##..... + .....##..... + .....##..... + ..########.. + ...######... + ....####.... + .....##..... + ............`) + ChevronLeft = pixel.MustSprite(` + ............ + ............ + ......##.... + .....##..... + ....##...... + ...##....... + ...##....... + ....##...... + .....##..... + ......##.... + ............ + ............`) + ChevronRight = ChevronLeft.Mirror() + ChevronUp = pixel.MustSprite(` + ............ + ............ + ............ + ............ + .....##..... + ....####.... + ...##..##... + ..##....##.. + .##......##. + ............ + ............ + ............`) + ChevronDown = pixel.MustSprite(` + ............ + ............ + ............ + .##......##. + ..##....##.. + ...##..##... + ....####.... + .....##..... + ............ + ............ + ............ + ............`) + TriangleRight = pixel.MustSprite(` + ............ + ...#........ + ...##....... + ...###...... + ...####..... + ...#####.... + ...#####.... + ...####..... + ...###...... + ...##....... + ...#........ + ............`) + TriangleDown = pixel.MustSprite(` + ............ + ............ + ............ + .##########. + ..########.. + ...######... + ....####.... + .....##..... + ............ + ............ + ............ + ............`) + Menu = pixel.MustSprite(` + ............ + ............ + .##########. + .##########. + ............ + .##########. + .##########. + ............ + .##########. + .##########. + ............ + ............`) + More = pixel.MustSprite(` + ............ + ............ + ............ + ............ + ............ + .##..##..##. + .##..##..##. + ............ + ............ + ............ + ............ + ............`) + Search = pixel.MustSprite(` + ............ + ..####...... + .#....#..... + #......#.... + #......#.... + #......#.... + #......#.... + .#....#..... + ..######.... + .......###.. + ........###. + .........##.`) + Settings = pixel.MustSprite(` + ............ + .....##..... + ..#.####.#.. + ..########.. + ...##..##... + .###....###. + .###....###. + ...##..##... + ..########.. + ..#.####.#.. + .....##..... + ............`) + Edit = pixel.MustSprite(` + ............ + ........##.. + .......####. + ......#.###. + .....#.#.#.. + ....#.#.#... + ...#.#.#.... + ..#.#.#..... + .#.#.#...... + .##.#....... + .###........ + ............`) + Trash = pixel.MustSprite(` + ............ + ....####.... + .##########. + .##########. + ..#......#.. + ..#.#..#.#.. + ..#.#..#.#.. + ..#.#..#.#.. + ..#.#..#.#.. + ..#......#.. + ..########.. + ............`) + Copy = pixel.MustSprite(` + ............ + .#######.... + .#.....#.... + .#..#######. + .#..#.....#. + .#..#.....#. + .####.....#. + ....#.....#. + ....#.....#. + ....#######. + ............ + ............`) + Clipboard = pixel.MustSprite(` + ....####.... + .###.##.###. + .#........#. + .#.######.#. + .#........#. + .#.######.#. + .#........#. + .#.####...#. + .#........#. + .#........#. + .##########. + ............`) + Save = pixel.MustSprite(` + ............ + .#########.. + .#..####.##. + .#..####..#. + .#........#. + .##########. + .#........#. + .#.######.#. + .#.######.#. + .#........#. + .##########. + ............`) + Download = pixel.MustSprite(` + ............ + .....##..... + .....##..... + .....##..... + ..########.. + ...######... + ....####.... + .....##..... + ............ + .#........#. + .##########. + ............`) + Upload = pixel.MustSprite(` + ............ + .....##..... + ....####.... + ...######... + ..########.. + .....##..... + .....##..... + .....##..... + ............ + .#........#. + .##########. + ............`) + Refresh = pixel.MustSprite(` + ............ + ...######... + ..##....##.. + .##......#.# + .#........## + .#.......### + .#.......... + .##......... + ..##....##.. + ...######... + ............ + ............`) + Link = pixel.MustSprite(` + ............ + .......###.. + ......#...#. + ......#...#. + ....#..#.#.. + .....#.#.... + ....#.#..... + ..#.#..#.... + .#...#...... + .#...#...... + ..###....... + ............`) + Filter = pixel.MustSprite(` + ............ + .##########. + .##########. + ..########.. + ...######... + ....####.... + ....####.... + ....####.... + ....####.... + ....###..... + ....##...... + ............`) + Sort = pixel.MustSprite(` + ............ + ...#........ + ..###....... + .#####...... + ...#........ + ...#....#... + ...#....#... + ...#....#... + ........#... + ......#####. + .......###.. + ........#...`) + Send = pixel.MustSprite(` + ............ + .##......... + .#.##....... + .#...##..... + .#.....##... + .#.......##. + .#.....##... + .#..###..... + .#.#........ + .##......... + ............ + ............`) + Power = pixel.MustSprite(` + ............ + .....##..... + ..#..##..#.. + .##..##..##. + .#...##...#. + .#........#. + .#........#. + .#........#. + .##......##. + ..########.. + ...######... + ............`) + Grid = pixel.MustSprite(` + ............ + .###.###.### + .###.###.### + .###.###.### + ............ + .###.###.### + .###.###.### + .###.###.### + ............ + .###.###.### + .###.###.### + .###.###.###`) + List = pixel.MustSprite(` + ............ + ............ + .##.#######. + .##.#######. + ............ + .##.#######. + .##.#######. + ............ + .##.#######. + .##.#######. + ............ + ............`) +) diff --git a/icon/icon.go b/icon/icon.go new file mode 100644 index 0000000..c9834fa --- /dev/null +++ b/icon/icon.go @@ -0,0 +1,39 @@ +package icon + +import "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" + +type Named struct { + Name string + Sprite *pixel.Sprite +} + +// All lists every icon by name, for galleries and tests. +var All = []Named{ + {"check", Check}, {"close", Close}, {"plus", Plus}, {"minus", Minus}, + {"arrow-left", ArrowLeft}, {"arrow-right", ArrowRight}, {"arrow-up", ArrowUp}, {"arrow-down", ArrowDown}, + {"chevron-left", ChevronLeft}, {"chevron-right", ChevronRight}, {"chevron-up", ChevronUp}, {"chevron-down", ChevronDown}, + {"triangle-right", TriangleRight}, {"triangle-down", TriangleDown}, {"menu", Menu}, {"more", More}, + {"search", Search}, {"settings", Settings}, {"edit", Edit}, {"trash", Trash}, + {"copy", Copy}, {"clipboard", Clipboard}, {"save", Save}, {"download", Download}, + {"upload", Upload}, {"refresh", Refresh}, {"link", Link}, {"filter", Filter}, + {"sort", Sort}, {"send", Send}, {"power", Power}, {"grid", Grid}, {"list", List}, + {"home", Home}, {"user", User}, {"users", Users}, {"bell", Bell}, + {"mail", Mail}, {"mail-open", MailOpen}, {"chat", Chat}, {"folder", Folder}, + {"folder-open", FolderOpen}, {"file", File}, {"file-text", FileText}, {"image", Image}, + {"music", Music}, {"video", Video}, {"code", Code}, {"terminal", Terminal}, + {"bug", Bug}, {"lock", Lock}, {"unlock", Unlock}, {"key", Key}, + {"eye", Eye}, {"eye-off", EyeOff}, {"calendar", Calendar}, {"clock", Clock}, + {"hourglass", Hourglass}, {"camera", Camera}, {"mic", Mic}, {"phone", Phone}, + {"map", Map}, {"flag", Flag}, {"pin", Pin}, {"globe", Globe}, + {"book", Book}, {"cart", Cart}, {"tag", Tag}, {"gift", Gift}, + {"robot", Robot}, {"branch", Branch}, {"wifi", Wifi}, {"battery", Battery}, {"gamepad", Gamepad}, + {"info", Info}, {"warning", Warning}, {"error", Error}, {"question", Question}, + {"heart", Heart}, {"heart-empty", HeartEmpty}, {"star", Star}, {"star-empty", StarEmpty}, + {"sparkle", Sparkle}, {"volume", Volume}, {"mute", Mute}, {"play", Play}, + {"pause", Pause}, {"stop", Stop}, {"next", Next}, {"prev", Prev}, + {"coin", Coin}, {"gem", Gem}, {"potion", Potion}, {"sword", Sword}, + {"shield", Shield}, {"chest", Chest}, {"crown", Crown}, {"trophy", Trophy}, + {"skull", Skull}, {"scroll", Scroll}, {"flame", Flame}, {"drop", Drop}, + {"leaf", Leaf}, {"flower", Flower}, {"sun", Sun}, {"moon", Moon}, + {"cloud", Cloud}, {"snowflake", Snowflake}, {"bolt", Bolt}, {"palette", Palette}, +} diff --git a/icon/icon_test.go b/icon/icon_test.go new file mode 100644 index 0000000..0a14f90 --- /dev/null +++ b/icon/icon_test.go @@ -0,0 +1,176 @@ +package icon_test + +import ( + "go/ast" + "go/parser" + "go/token" + "path/filepath" + "regexp" + "strconv" + "strings" + "testing" + + "github.com/egoist/mygo/ui" + + "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/icon" + "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" +) + +type decl struct { + file string + expr ast.Expr +} + +var upper = regexp.MustCompile(`([a-z])([A-Z])`) + +func kebab(s string) string { return strings.ToLower(upper.ReplaceAllString(s, "$1-$2")) } + +// decls maps each icon's kebab name to its source. +func decls(t *testing.T) map[string]decl { + files, _ := filepath.Glob("*.go") + out := map[string]decl{} + for _, f := range files { + if strings.HasSuffix(f, "_test.go") || f == "icon.go" { + continue + } + file, err := parser.ParseFile(token.NewFileSet(), f, nil, 0) + if err != nil { + t.Fatal(err) + } + for _, d := range file.Decls { + if g, ok := d.(*ast.GenDecl); ok && g.Tok == token.VAR { + for _, sp := range g.Specs { + v := sp.(*ast.ValueSpec) + for i, n := range v.Names { + out[kebab(n.Name)] = decl{f, v.Values[i]} + } + } + } + } + } + return out +} + +// build rebuilds an icon from its declared art. +func build(t *testing.T, ds map[string]decl, name string) *pixel.Sprite { + call, ok := ds[name].expr.(*ast.CallExpr) + if !ok { + t.Fatalf("%s is not a sprite call", name) + } + sel := call.Fun.(*ast.SelectorExpr) + switch sel.Sel.Name { + case "MustSprite": + art, err := strconv.Unquote(call.Args[0].(*ast.BasicLit).Value) + if err != nil { + t.Fatal(err) + } + return pixel.MustSprite(art) + case "Mirror": + return build(t, ds, kebab(sel.X.(*ast.Ident).Name)).Mirror() + } + t.Fatalf("%s built by %s", name, sel.Sel.Name) + return nil +} + +func render(sp *pixel.Sprite, ink pixel.Slot) []byte { + return ui.Render(func(c *ui.Context) { + pixel.Use(c, pixel.Settings{Palette: pixel.SummerDay, Dot: 1}) + pixel.Icon(c, sp, pixel.IconOptions{Slot: ink}) + }, 12, 12, 1).Pix +} + +func TestEveryIconIsListedWithItsArt(t *testing.T) { + ds := decls(t) + listed := map[string]bool{} + for _, n := range icon.All { + if listed[n.Name] { + t.Errorf("icon %q listed twice", n.Name) + } + listed[n.Name] = true + if _, ok := ds[n.Name]; !ok { + t.Fatalf("listed icon %q has no declaration", n.Name) + } + if string(render(n.Sprite, pixel.Magic)) != string(render(build(t, ds, n.Name), pixel.Magic)) { + t.Errorf("icon %q is bound to another icon's art", n.Name) + } + } + for name := range ds { + if !listed[name] { + t.Errorf("icon %q missing from All", name) + } + } + if len(icon.All) < 100 { + t.Fatalf("%d icons, want at least 100", len(icon.All)) + } +} + +func TestOneBitIconsTakeTheInk(t *testing.T) { + ds := decls(t) + back, ink := pixel.SummerDay.C(pixel.Back), pixel.SummerDay.C(pixel.Magic) + for _, n := range icon.All { + if ds[n.Name].file == "items.go" { + continue + } + pix, drawn := render(n.Sprite, pixel.Magic), 0 + for i := 0; i < len(pix); i += 4 { + switch { + case pix[i] == back.R && pix[i+1] == back.G && pix[i+2] == back.B: + case pix[i] == ink.R && pix[i+1] == ink.G && pix[i+2] == ink.B: + drawn++ + default: + t.Fatalf("%s draws a color other than the ink", n.Name) + } + } + if drawn == 0 { + t.Fatalf("%s draws nothing in the ink", n.Name) + } + } +} + +func TestIconsAreDistinctTwelveByTwelve(t *testing.T) { + seen := map[string]string{} + for _, n := range icon.All { + if n.Sprite.W != 12 || n.Sprite.H != 12 || n.Sprite.Frames() != 1 { + t.Fatalf("%s is %d×%d with %d frames", n.Name, n.Sprite.W, n.Sprite.H, n.Sprite.Frames()) + } + pix, back, drawn := render(n.Sprite, pixel.Ink), pixel.SummerDay.C(pixel.Back), 0 + for i := 0; i < len(pix); i += 4 { + if pix[i] != back.R || pix[i+1] != back.G || pix[i+2] != back.B { + drawn++ + } + } + if drawn == 0 { + t.Fatalf("%s draws nothing", n.Name) + } + key := string(pix) + if other, ok := seen[key]; ok { + t.Fatalf("%s and %s are the same picture", n.Name, other) + } + seen[key] = n.Name + } +} + +func TestItemsAreOutlined(t *testing.T) { + for name, d := range decls(t) { + if d.file != "items.go" { + continue + } + art, _ := strconv.Unquote(d.expr.(*ast.CallExpr).Args[0].(*ast.BasicLit).Value) + var rows []string + for _, r := range strings.Split(strings.TrimSpace(art), "\n") { + rows = append(rows, strings.TrimSpace(r)) + } + for y, row := range rows { + for x := range len(row) { + if strings.IndexByte(".e#", row[x]) >= 0 { + continue + } + for _, n := range [][2]int{{x + 1, y}, {x - 1, y}, {x, y + 1}, {x, y - 1}} { + if n[0] < 0 || n[1] < 0 || n[0] >= len(row) || n[1] >= len(rows) || rows[n[1]][n[0]] == '.' { + t.Fatalf("%s: dot %d,%d touches the outside without an Edge outline", name, x, y) + } + } + } + } + } +} diff --git a/icon/items.go b/icon/items.go new file mode 100644 index 0000000..90949a5 --- /dev/null +++ b/icon/items.go @@ -0,0 +1,267 @@ +package icon + +import "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" + +// Items keep their own colors; '#' still takes the ink. +var ( + Coin = pixel.MustSprite(` + ............ + ...eeeeee... + ..eyyyyyye.. + .eyllyyyyye. + .eylyyeyyye. + .eylyyeyyse. + .eyyyyeyyse. + .eyyyyeyyse. + .eyyyyyyyse. + ..essssssse. + ...eeeeeee.. + ............`) + Gem = pixel.MustSprite(` + ............ + ....eeee.... + ...elllcee.. + ..elcccccse. + .eeeeeeeeee. + .elcccccsse. + ..elcccsse.. + ...elcsse... + ....else.... + .....ee..... + ............ + ............`) + Potion = pixel.MustSprite(` + ....eeee.... + ....eeee.... + ....elne.... + ....elne.... + ...ellnne... + ..elrrrrre.. + .elrrrrrrre. + .elrrrrrrre. + .errrrrrrse. + .errrrrrsse. + ..essssssse. + ...eeeeeee..`) + Sword = pixel.MustSprite(` + .........eee + ........elle + .......elle. + ......elle.. + .....elle... + .ee.elle.... + .eyelle..... + ..eyle...... + ..eyye...... + .eyeeye..... + eye..e...... + ee..........`) + Shield = pixel.MustSprite(` + ............ + .eeeeeeeeee. + .elllaaaase. + .ellaaaaase. + .elaaaaaase. + .elaaaaaase. + .elaaaaaase. + ..elaaaase.. + ..elaaaase.. + ...elaase... + ....esse.... + .....ee.....`) + Chest = pixel.MustSprite(` + ............ + ..eeeeeeee.. + .esslsslsse. + .esssssssse. + .eeeeyyeeee. + .essseyesse. + .essseeesse. + .esssssssse. + .esssssssse. + .eeeeeeeeee. + ............ + ............`) + Crown = pixel.MustSprite(` + ............ + ............ + .e...ee...e. + .ee..ee..ee. + .eye.ee.eye. + .eyyeyyeyye. + .eyyyyyyyye. + .eylyryylye. + .eyyyyyyyye. + .essssssse.e + ..eeeeeeee.. + ............`) + Trophy = pixel.MustSprite(` + ............ + .eeeeeeeeee. + eyelyyyyyeye + eyelyyyyyeee + .eelyyyyyee. + ..elyyyyse.. + ...eyyyse... + ....eyye.... + .....ee..... + ....eyyee... + ..eesssssee. + ..eeeeeeee..`) + Skull = pixel.MustSprite(` + ............ + ...eeeeeee.. + ..ellllllse. + .elllllllse. + .ellkklkkse. + .ellkklkkse. + .elllllllse. + ..elleelse.. + ...elllse... + ...eleeee... + ....eeee.... + ............`) + Scroll = pixel.MustSprite(` + ............ + .eeeeeeeeee. + elllllllllle + .eeeeeeeeeee + .elllllllle. + .elseeeslle. + .elllllllle. + .elseeeelle. + .elllllllle. + .eeeeeeeeeee + elllllllllle + .eeeeeeeeee.`) + Flame = pixel.MustSprite(` + .....e...... + ....ere..... + ....erre.... + ...erryre... + ..erryyyre.. + ..eryyyyre.. + .erryylyyre. + .eryylllyre. + .eryylllyre. + ..eryylyre.. + ...eeeeee... + ............`) + Drop = pixel.MustSprite(` + .....ee..... + .....ee..... + ....ecce.... + ....ecce.... + ...elcccee.. + ..elcccccse. + ..elcccccse. + ..eccccccse. + ..ecccccsse. + ...essssse.. + ....eeeee... + ............`) + Leaf = pixel.MustSprite(` + ............ + .......eeee. + .....eegggge + ....egglggge + ...egglgggse + ..egglgggse. + ..eglgggse.. + .eglgggse... + .eggggsee... + .eeeeee..... + .e.......... + e...........`) + Flower = pixel.MustSprite(` + .....ee..... + ....emme.... + ..eemmmmee.. + .emmeeeemme. + emmmeyyemmme + emmmeyyemmme + .emmeeeemme. + ..eemmmmee.. + ....emme.... + ....ege..... + ....egge.... + ....eee.....`) + Sun = pixel.MustSprite(` + .....ee..... + .e...ee...e. + ..e......e.. + ....eeee.... + ...eyyyye... + eeeyylyyyeee + eeeylyyyyeee + ...eyyyye... + ....eeee.... + ..e......e.. + .e...ee...e. + .....ee.....`) + Moon = pixel.MustSprite(` + ............ + ....eeee.... + ...eyyye.... + ..eyyee..... + .eyye....... + .eyye....... + .eyye....... + .eyyye...... + ..eyyyeeee.. + ...eyyyyye.. + ....eeeee... + ............`) + Cloud = pixel.MustSprite(` + ............ + ............ + ....eeee.... + ...elllle... + .eeellllee.. + ellllllllle. + elllllllllse + ellllllllsse + .esssssssse. + ..eeeeeeee.. + ............ + ............`) + Snowflake = pixel.MustSprite(` + .....ee..... + ..e.ecce.e.. + .eceecceece. + ..ececcece.. + .eeecccceee. + ecccclccccce + eccccclcccce + .eeecccceee. + ..ececcece.. + .eceecceece. + ..e.ecce.e.. + .....ee.....`) + Bolt = pixel.MustSprite(` + ......eeee.. + .....eyyye.. + ....eyyye... + ...eyyye.... + ..eyyyyeeee. + ..eeeyyyyye. + ....eyyyye.. + ...eyyyee... + ..eyyee..... + ..eye....... + .eee........ + ............`) + Palette = pixel.MustSprite(` + ............ + ...eeeeee... + ..elllllle.. + .elreleglle. + .ellllllclle + .elmelleelle + .ellllleeele + .ellyelle.e. + ..elllle.... + ...eeee..... + ............ + ............`) +) diff --git a/icon/objects.go b/icon/objects.go new file mode 100644 index 0000000..31910a4 --- /dev/null +++ b/icon/objects.go @@ -0,0 +1,292 @@ +package icon + +import "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" + +var ( + Home = pixel.MustSprite(` + ............ + .....##..... + ....####.... + ...##..##... + ..##....##.. + .##......##. + ..#......#.. + ..#.###..#.. + ..#.#.#..#.. + ..#.#.#..#.. + ..########.. + ............`) + User = pixel.MustSprite(` + ............ + ....####.... + ...######... + ...######... + ...######... + ....####.... + ............ + ..########.. + .##########. + .##########. + .##########. + ............`) + Users = pixel.MustSprite(` + ............ + .......###.. + ..###.#####. + .#####.###.. + .#####...... + ..###.#####. + .....####### + .#####...... + #######..... + #######..... + ............ + ............`) + Bell = pixel.MustSprite(` + .....##..... + ....####.... + ...#....#... + ..#......#.. + ..#......#.. + ..#......#.. + ..#......#.. + .#........#. + .##########. + ............ + ....####.... + .....##.....`) + Mail = pixel.MustSprite(` + ............ + ............ + .##########. + .##......##. + .#.#....#.#. + .#..#..#..#. + .#...##...#. + .#........#. + .#........#. + .##########. + ............ + ............`) + MailOpen = pixel.MustSprite(` + ............ + .....##..... + ...##..##... + .##......##. + .##......##. + .#.#....#.#. + .#..#..#..#. + .#...##...#. + .#........#. + .##########. + ............ + ............`) + Chat = pixel.MustSprite(` + ............ + .##########. + .#........#. + .#.######.#. + .#........#. + .#.####...#. + .#........#. + .####.#####. + ....###..... + ....##...... + ....#....... + ............`) + Folder = pixel.MustSprite(` + ............ + ............ + .####....... + .#..#######. + .##########. + .#........#. + .#........#. + .#........#. + .#........#. + .##########. + ............ + ............`) + FolderOpen = pixel.MustSprite(` + ............ + ............ + .####....... + .#..#####... + .#......#... + .#.######### + .#.#.......# + .##.......#. + .##......#.. + .#########.. + ............ + ............`) + File = pixel.MustSprite(` + ............ + ..######.... + ..#....##... + ..#....#.#.. + ..#....####. + ..#.......#. + ..#.......#. + ..#.......#. + ..#.......#. + ..#.......#. + ..#########. + ............`) + FileText = pixel.MustSprite(` + ............ + ..######.... + ..#....##... + ..#....#.#.. + ..#....####. + ..#.#####.#. + ..#.......#. + ..#.#####.#. + ..#.......#. + ..#.###...#. + ..#########. + ............`) + Image = pixel.MustSprite(` + ............ + .##########. + .#........#. + .#.##.....#. + .#.##.....#. + .#.....#..#. + .#....###.#. + .#.#.#####.# + .#######.#.# + .#........#. + .##########. + ............`) + Music = pixel.MustSprite(` + ............ + ....#######. + ....#.....#. + ....#######. + ....#.....#. + ....#.....#. + ....#.....#. + ..###...###. + .####..####. + .####..####. + ..##....##.. + ............`) + Video = pixel.MustSprite(` + ............ + ............ + .#######.... + .#.....#..#. + .#.....#.##. + .#.....####. + .#.....####. + .#.....#.##. + .#.....#..#. + .#######.... + ............ + ............`) + Code = pixel.MustSprite(` + ............ + ............ + ...#....#... + ..##....##.. + .##..#...##. + ##...#....## + ##..#.....## + .##.#....##. + ..##....##.. + ...#....#... + ............ + ............`) + Terminal = pixel.MustSprite(` + ............ + .##########. + .#........#. + .#.#......#. + .#..#.....#. + .#...#....#. + .#..#.....#. + .#.#..###.#. + .#........#. + .##########. + ............ + ............`) + Bug = pixel.MustSprite(` + ............ + ..#......#.. + ...#.##.#... + ....####.... + .#.######.#. + ..########.. + .####..####. + ..########.. + .#.######.#. + ...######... + ..#..##..#.. + ............`) + Lock = pixel.MustSprite(` + ............ + ....####.... + ...#....#... + ...#....#... + ...#....#... + ..########.. + ..########.. + ..###..###.. + ..###..###.. + ..########.. + ..########.. + ............`) + Unlock = pixel.MustSprite(` + ............ + ....####.... + ...#....#... + ...#........ + ...#........ + ..########.. + ..########.. + ..###..###.. + ..###..###.. + ..########.. + ..########.. + ............`) + Key = pixel.MustSprite(` + ............ + ..####...... + .#....#..... + .#....#..... + .#....#..... + ..####...... + ...##....... + ...######... + ...##....... + ...####..... + ...##....... + ............`) + Eye = pixel.MustSprite(` + ............ + ............ + ....####.... + ..##....##.. + .#...##...#. + #...####...# + #...####...# + .#...##...#. + ..##....##.. + ....####.... + ............ + ............`) + EyeOff = pixel.MustSprite(` + ............ + .#.......... + ..#.####.... + ..##....##.. + .#..###...#. + #...####...# + #...####...# + .#...###..#. + ..##....##.. + ....####.#.. + ..........#. + ............`) +) diff --git a/icon/status.go b/icon/status.go new file mode 100644 index 0000000..af651ee --- /dev/null +++ b/icon/status.go @@ -0,0 +1,202 @@ +package icon + +import "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" + +var ( + Info = pixel.MustSprite(` + ............ + ...######... + ..#......#.. + .#...##...#. + .#........#. + .#...##...#. + .#...##...#. + .#...##...#. + .#...##...#. + ..#......#.. + ...######... + ............`) + Warning = pixel.MustSprite(` + .....##..... + .....##..... + ....#..#.... + ....####.... + ...#.##.#... + ...#.##.#... + ..#..##..#.. + ..#..##..#.. + .#........#. + .#...##...#. + ############ + ............`) + Error = pixel.MustSprite(` + ............ + ...######... + ..#......#.. + .#.#....#.#. + .#..#..#..#. + .#...##...#. + .#...##...#. + .#..#..#..#. + .#.#....#.#. + ..#......#.. + ...######... + ............`) + Question = pixel.MustSprite(` + ............ + ...######... + ..##....##.. + ..##....##.. + ........##.. + .......##... + .....##..... + .....##..... + ............ + .....##..... + .....##..... + ............`) + Heart = pixel.MustSprite(` + ............ + ............ + ..###..###.. + .#####.####. + .##########. + .##########. + ..########.. + ...######... + ....####.... + .....##..... + ............ + ............`) + HeartEmpty = pixel.MustSprite(` + ............ + ............ + ..###..###.. + .#...#.#..#. + .#........#. + .#........#. + ..#......#.. + ...#....#... + ....#..#.... + .....##..... + ............ + ............`) + Star = pixel.MustSprite(` + ............ + .....##..... + .....##..... + ....####.... + ############ + .##########. + ..########.. + ..########.. + .####..####. + .###....###. + .#........#. + ............`) + StarEmpty = pixel.MustSprite(` + ............ + .....##..... + .....##..... + ....#..#.... + #####..##### + .#........#. + ..#......#.. + ..#......#.. + .#...##...#. + .#.##..##.#. + .##......##. + ............`) + Sparkle = pixel.MustSprite(` + ............ + .....#...... + .....#...... + ....###..... + .##########. + ....###..... + .....#...#.. + .....#..###. + .........#.. + .#.......... + ###......... + .#..........`) + Volume = pixel.MustSprite(` + ............ + .....#...... + ....##...#.. + .####..#..#. + .###....#.#. + .###..#.#.#. + .###..#.#.#. + .###....#.#. + .####..#..#. + ....##...#.. + .....#...... + ............`) + Mute = pixel.MustSprite(` + ............ + .....#...... + ....##...... + .####....... + .###...#...# + .###....#.#. + .###.....#.. + .###....#.#. + .####..#...# + ....##...... + .....#...... + ............`) + Play = pixel.MustSprite(` + ............ + ..#......... + ..###....... + ..#####..... + ..#######... + ..#########. + ..#########. + ..#######... + ..#####..... + ..###....... + ..#......... + ............`) + Pause = pixel.MustSprite(` + ............ + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ..###..###.. + ............`) + Stop = pixel.MustSprite(` + ............ + ............ + ..########.. + ..########.. + ..########.. + ..########.. + ..########.. + ..########.. + ..########.. + ..########.. + ............ + ............`) + Next = pixel.MustSprite(` + ............ + ............ + .#...#....## + .##..##...## + .###.###..## + .########.## + .########.## + .###.###..## + .##..##...## + .#...#....## + ............ + ............`) + Prev = Next.Mirror() +) diff --git a/icon/things.go b/icon/things.go new file mode 100644 index 0000000..b87656b --- /dev/null +++ b/icon/things.go @@ -0,0 +1,253 @@ +package icon + +import "git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel" + +var ( + Calendar = pixel.MustSprite(` + ............ + ..#.....#... + .##########. + .##########. + .#........#. + .#.#.#.#..#. + .#........#. + .#.#.#.#..#. + .#........#. + .##########. + ............ + ............`) + Clock = pixel.MustSprite(` + ............ + ...######... + ..#......#.. + .#...#....#. + .#...#....#. + .#...#....#. + .#...####.#. + .#........#. + .#........#. + ..#......#.. + ...######... + ............`) + Hourglass = pixel.MustSprite(` + ............ + .##########. + ..#......#.. + ..#.####.#.. + ...#.##.#... + ....#..#.... + ....#..#.... + ...#....#... + ..#..##..#.. + ..#.####.#.. + .##########. + ............`) + Camera = pixel.MustSprite(` + ............ + ............ + ....###..... + .##########. + .#........#. + .#...##...#. + .#..#..#..#. + .#..#..#..#. + .#...##...#. + .##########. + ............ + ............`) + Mic = pixel.MustSprite(` + ............ + ....####.... + ....####.... + ....####.... + ....####.... + .#..####..#. + .#..####..#. + ..#......#.. + ...######... + .....##..... + ...######... + ............`) + Phone = pixel.MustSprite(` + ............ + ..##........ + .####....... + .###........ + .##......... + .##......... + .##......... + ..##........ + ...##..###.. + ....######.. + ......###... + ............`) + Map = pixel.MustSprite(` + ............ + .##..##..##. + .#.##..##.#. + .#..#..#..#. + .#..#..#..#. + .#..#..#..#. + .#..#..#..#. + .#..#..#..#. + .#.##..##.#. + .##..##..##. + ............ + ............`) + Flag = pixel.MustSprite(` + ............ + .#.......... + .#######.... + .########... + .#########.. + .########... + .#######.... + .#.......... + .#.......... + .#.......... + .#.......... + ............`) + Pin = pixel.MustSprite(` + ............ + ....####.... + ...######... + ..###..###.. + ..###..###.. + ..########.. + ...######... + ...######... + ....####.... + ....####.... + .....##..... + ............`) + Globe = pixel.MustSprite(` + ............ + ...######... + ..#..#.#.#.. + .#..#...#.#. + .##########. + .#..#...#.#. + .#..#...#.#. + .##########. + .#..#...#.#. + ..#..#.#.#.. + ...######... + ............`) + Book = pixel.MustSprite(` + ............ + .####..####. + .#...##...#. + .#...##...#. + .#...##...#. + .#...##...#. + .#...##...#. + .#...##...#. + .####..####. + .....##..... + ............ + ............`) + Cart = pixel.MustSprite(` + ............ + ##.......... + .#.......... + .##########. + ..#.......#. + ..#......#.. + ..########.. + ..#......... + ..#########. + ...##...##.. + ...##...##.. + ............`) + Tag = pixel.MustSprite(` + ............ + .#####...... + .#...##..... + .#.#..##.... + .#.....##... + .##.....##.. + ..##.....##. + ...##...##.. + ....##.##... + .....###.... + ......#..... + ............`) + Gift = pixel.MustSprite(` + ............ + ...##..##... + ..#..##..#.. + .##########. + .#....#...#. + .##########. + ..#...#..#.. + ..#...#..#.. + ..#...#..#.. + ..#...#..#.. + ..########.. + ............`) + Robot = pixel.MustSprite(` + .....#...... + .....#...... + ..########.. + .#........#. + .#.##..##.#. + .#.##..##.#. + .#........#. + .#..####..#. + ..########.. + ...#....#... + ..###..###.. + ............`) + Branch = pixel.MustSprite(` + ............ + .###....###. + .#.#....#.#. + .###....###. + ..#......#.. + ..#.....#... + ..#...##.... + ..#.##...... + ..##........ + .###........ + .#.#........ + .###........`) + Wifi = pixel.MustSprite(` + ............ + ............ + ..########.. + .#........#. + #..######..# + ..#......#.. + .#..####..#. + ...#....#... + .....##..... + .....##..... + ............ + ............`) + Battery = pixel.MustSprite(` + ............ + ............ + ............ + .#########.. + .#.......##. + .#.###...##. + .#.###...##. + .#.......##. + .#########.. + ............ + ............ + ............`) + Gamepad = pixel.MustSprite(` + ............ + ............ + ..########.. + .#........#. + #..#....#..# + #.###..#.#.# + #..#....#..# + #....##....# + #...#..#...# + .###....###. + ............ + ............`) +)