shithub: wildlife

Download patch

ref: eca59fe0c9f2e78eca5246e626950ee5b408ca12
parent: 7084ab4489ce1ddb6595a8f2624e8fdf23a73d8f
author: Philip Silva <philip.silva@protonmail.com>
date: Tue Mar 29 11:10:08 EDT 2022

More items, fix data structures, rect. mouse targets

--- a/README
+++ b/README
@@ -4,7 +4,7 @@
 
 Compile:
 
-go build .
+go build '-buildvcs=false' .
 
 Usage:
 
--- a/main.go
+++ b/main.go
@@ -26,63 +26,91 @@
 )
 
 type Folder struct {
-	*duit.Image
-
 	Pre string
 	Suf string
 	Name string
-	Items map[string]string
-	Targets []Target
+	Items map[string]*Item
 }
 
 func getFolder(root, pre string) (ff *Folder) {
-	//log.Printf("getFolder(%v, %v)", root, pre)
-	var rf *Folder
-	if root != "" {
-		for _, f := range folders {
-			if f.Pre == root {
-				rf = f
-			}
-		}
-	}
 	for _, f := range folders {
 		if f.Pre == pre {
 			ff = f
 		}
 	}
-	var fn string
-	if ff != nil {
-		fn = ff.Main()
-	} else {
-		ff = rf
-		fn = ff.getItem(pre)
-	}
-	ff.Image = &duit.Image{
-		Image: readImagePath(fn),
-	}
 	return
 }
 
-func (f Folder) Main() string {
+func (f Folder) Main() *Item {
 	fnSuf := f.Suf
 	if _, ok := f.Items[f.Suf]; !ok {
 		fnSuf = "0001"
 	}
-	return fmt.Sprintf("./data/about/%v%v/%v%v.dib", f.Pre, f.Suf, f.Pre, fnSuf)
+	return f.getItem(fnSuf)
 }
 
-func (f Folder) getItem(k string) string {
+func (f *Folder) Decode(k string) (fName, itName string) {
+	if _, ok := f.Items[k]; ok {
+		return f.Pre, k
+	}
+	var ff *Folder
+	fName = k
+	for _, fff := range folders {
+		if fff.Pre == k {
+			ff = fff
+		}
+	}
+	if ff == nil {
+		return f.Pre, k
+	}
+	itName = ff.Suf
+	if _, ok := ff.Items[itName]; !ok {
+		itName = "0001"
+	}
+	return
+}
+
+func (f Folder) getItem(k string) *Item {
+	for key, it := range f.Items {
+		if key == k {
+			if it.Image == nil {
+				fn := fmt.Sprintf("./data/about/%v%v/%v%v.dib", f.Pre, f.Suf, f.Pre, k)
+				it.Image = &duit.Image{
+					Image: readImagePath(fn),
+				}
+			}
+			return it
+		}
+	}
+	return nil
+}
+
+/*func (f Folder) getItem(k string) string {
 	fnSuf := k
 	return fmt.Sprintf("./data/about/%v%v/%v%v.dib", f.Pre, f.Suf, f.Pre, fnSuf)
+}*/
+
+type Item struct {
+	*duit.Image
+
+	f *Folder
+	name string
+	Targets map[string]Target
 }
 
-func (f *Folder) Mouse(dui *duit.DUI, self *duit.Kid, m draw.Mouse, origM draw.Mouse, orig image.Point) (r duit.Result) {
+func (it *Item) Mouse(dui *duit.DUI, self *duit.Kid, m draw.Mouse, origM draw.Mouse, orig image.Point) (r duit.Result) {
 	if m.Buttons&1 == 1 {
 		//log.Printf("m=%+v, origM=%+v", m, origM)
-		for _, t := range f.Targets {
+		for k, t := range it.Targets {
 			if t.has(m.Point) {
-				tf := getFolder(f.Pre, t.key)
-				dui.Top.UI = tf
+				fName, itName := it.f.Decode(k)
+				_=fName
+				tf := getFolder(it.f.Pre, k)
+				if tf == nil {
+					tf = it.f
+				}
+				it := tf.getItem(itName)
+				dui.Top.UI = it
 				dui.MarkLayout(dui.Top.UI)
 				dui.MarkDraw(dui.Top.UI)
 				dui.Render()
@@ -93,34 +121,64 @@
 		}
 	} else if m.Buttons&4 == 4 {
 		tf := getFolder("", "cont")
-		dui.Top.UI = tf
+		it := tf.Main()
+		dui.Top.UI = it
 		dui.MarkLayout(dui.Top.UI)
 		dui.MarkDraw(dui.Top.UI)
 		dui.Render()
 	}
-	return f.Image.Mouse(dui, self, m, origM, orig)
+	return it.Image.Mouse(dui, self, m, origM, orig)
 }
 
-type Target struct {
-	key string
-	xy draw.Point
+type Target interface {
+	has(draw.Point) bool
+}
+
+type Circle struct {
+	x int
+	y int
 	r int
 }
 
-func (t Target) has(p draw.Point) bool {
+func C(x, y, r int) Circle {
+	return Circle{x: x, y: y, r: r}
+}
+
+func (c Circle) has(p draw.Point) bool {
 	x := p.X * 2 / scale
 	y := p.Y * 2 / scale
-	return math.Abs(float64(x)-float64(t.xy.X)) < float64(t.r) && math.Abs(float64(y)-float64(t.xy.Y)) < float64(t.r)
+	return math.Abs(float64(x)-float64(c.x)) < float64(c.r) && math.Abs(float64(y)-float64(c.y)) < float64(c.r)
 }
 
+type Rectangle struct {
+	x int
+	y int
+	x2 int
+	y2 int
+}
+
+func R(x, y, x2, y2 int) Rectangle {
+	return Rectangle{x: x, y: y, x2: x2, y2: y2}
+}
+
+func (r Rectangle) has(p draw.Point) bool {
+	x := p.X * 2 / scale
+	y := p.Y * 2 / scale
+	return r.x <= x && x <= r.x2 && r.y <= y && y <= r.y2
+}
+
 var folders = []*Folder{
 	&Folder{
 		Pre: "afri",
 		Suf: "00aa",
 		Name: "Africa",
-		Items: map[string]string{
-			"00aa": "Waterhole",
-			"00fb": "Art",
+		Items: map[string]*Item{
+			"00aa": &Item{
+				name: "Waterhole",
+			},
+			"00fb": &Item{
+				name: "Art",
+			},
 		},
 	},
 	&Folder{
@@ -127,66 +185,42 @@
 		Pre: "atls",
 		Suf: "00nv",
 		Name: "Atlas",
-		Items: map[string]string{
-			"00nv": "Continents",
-			"01p1": "African reptiles",
-			"01p2": "African herbivores",
-			"01pu": "Africa",
-			"02pu": "Asia",
-			"03pu": "Australia",
-			"04pu": "Europe",
-			"05pu": "North America",
-			"06pu": "South America",
-		},
-		Targets: []Target{
-			Target{
-				key: "01pu",
-				xy: draw.Point{
-					X: 659,
-					Y: 461,
+		Items: map[string]*Item{
+			"00nv": &Item{
+				name: "Continents",
+				Targets: map[string]Target{
+					"01pu": C(659, 461, 100),
+					"02pu": C(931, 275, 200),
+					"03pu": C(1117, 603, 50),
+					"04pu": C(600, 262, 50),
+					"05pu": C(222, 270, 140),
+					"06pu": C(350, 552, 120),
 				},
-				r: 100,
 			},
-			Target{
-				key: "02pu",
-				xy: draw.Point{
-					X: 931,
-					Y: 275,
-				},
-				r: 200,
+			"01p1": &Item{
+				name: "African reptiles",
 			},
-			Target{
-				key: "03pu",
-				xy: draw.Point{
-					X: 1117,
-					Y: 603,
-				},
-				r: 50,
+			"01p2": &Item{
+				name: "African herbivores",
 			},
-			Target{
-				key: "04pu",
-				xy: draw.Point{
-					X: 600,
-					Y: 262,
-				},
-				r: 50,
+			"01pu": &Item{
+				name: "Africa",
 			},
-			Target{
-				key: "05pu",
-				xy: draw.Point{
-					X: 222,
-					Y: 270,
-				},
-				r: 140,
+			"02pu": &Item{
+				name: "Asia",
 			},
-			Target{
-				key: "06pu",
-				xy: draw.Point{
-					X: 350,
-					Y: 552,
-				},
-				r: 120,
+			"03pu": &Item{
+				name: "Australia",
 			},
+			"04pu": &Item{
+				name: "Europe",
+			},
+			"05pu": &Item{
+				name: "North America",
+			},
+			"06pu": &Item{
+				name: "South America",
+			},
 		},
 	},
 	&Folder{
@@ -193,8 +227,10 @@
 		Pre: "aust",
 		Suf: "00aa",
 		Name: "Australia",
-		Items: map[string]string{
-			"00aa": "Oddities",
+		Items: map[string]*Item{
+			"00aa": &Item{
+				name: "Oddities",
+			},
 		},
 	},
 	&Folder{
@@ -201,8 +237,10 @@
 		Pre: "beet",
 		Suf: "00aa",
 		Name: "Beetles",
-		Items: map[string]string{
-			"00aa": "Beetles",
+		Items: map[string]*Item{
+			"00aa": &Item{
+				name: "Beetles",
+			},
 		},
 	},
 	&Folder{
@@ -209,8 +247,10 @@
 		Pre: "frst",
 		Suf: "00aa",
 		Name: "Forest",
-		Items: map[string]string{
-			"00aa": "Forest Environments",
+		Items: map[string]*Item{
+			"00aa": &Item{
+				name: "Forest Environments",
+			},
 		},
 	},
 	&Folder{
@@ -217,42 +257,17 @@
 		Pre: "cont",
 		Suf: "00nv",
 		Name: "Contents",
-		Items: map[string]string{
-			"00nv": "Contents",
-		},
-		Targets: []Target{
-			Target{
-				key: "atls",
-				xy: draw.Point{
-					X: 242,
-					Y: 190,
+		Items: map[string]*Item{
+			"00nv": &Item{
+				name: "Contents",
+				Targets: map[string]Target{
+					"atls": C(242, 190, 150),
+					"habt": C(256, 588, 200),
+					"indx": C(920, 614, 200),
+					"weap": C(997, 200, 200),
+					"wwfd": C(604, 384, 200),
 				},
-				r: 150,
 			},
-			Target{
-				key: "habt",
-				xy: draw.Point{
-					X: 256,
-					Y: 588,
-				},
-				r: 200,
-			},
-			Target{
-				key: "indx",
-				xy: draw.Point{
-					X: 920,
-					Y: 614,
-				},
-				r: 200,
-			},
-			Target{
-				key: "weap",
-				xy: draw.Point{
-					X: 997,
-					Y: 200,
-				},
-				r: 200,
-			},
 		},
 	},
 	&Folder{
@@ -259,8 +274,10 @@
 		Pre: "guid",
 		Suf: "00nv",
 		Name: "Guides",
-		Items: map[string]string{
-			"00nv": "Guides",
+		Items: map[string]*Item{
+			"00nv": &Item{
+				name: "Guides",
+			},
 		},
 	},
 	&Folder{
@@ -267,8 +284,10 @@
 		Pre: "habt",
 		Suf: "00nv",
 		Name: "Habitats",
-		Items: map[string]string{
-			"00nv": "Habitats",
+		Items: map[string]*Item{
+			"00nv": &Item{
+				name: "Habitats",
+			},
 		},
 	},
 	&Folder{
@@ -275,8 +294,10 @@
 		Pre: "help",
 		Suf: "00nv",
 		Name: "Help",
-		Items: map[string]string{
-			"00nv": "Help",
+		Items: map[string]*Item{
+			"00nv": &Item{
+				name: "Help",
+			},
 		},
 	},
 	&Folder{
@@ -283,106 +304,33 @@
 		Pre: "indx",
 		Suf: "00nv",
 		Name: "Index",
-		Items: map[string]string{
-			"0001": "Index",
-		},
-		Targets: []Target{
-			Target{
-				key: "0001",
-				xy: draw.Point{
-					X: 48,
-					Y: 90,
+		Items: map[string]*Item{
+			"0001": &Item{
+				name: "Index",
+				Targets: map[string]Target{
+					"0001": R(25,66, 72,114),
+					"0002": R(75,70, 119,115),
+					"0003": R(122,68, 163,114),
+					"0004": R(166,69, 295,115),
+					"0005": R(297,66, 389,115),
+					"0006": R(394,69, 502,117),
+					"0007": R(504,66, 703,115),
+					"0008": R(702,66, 791,116),
+					"0009": R(794,67, 880,117),
+					"0010": R(879,68, 1018,114),
+					"0011": R(1013,66, 1210,116),
 				},
-				r: 25,
 			},
-			Target{
-				key: "0002",
-				xy: draw.Point{
-					X: 97,
-					Y: 90,
-				},
-				r: 25,
-			},
-			Target{
-				key: "0003",
-				xy: draw.Point{
-					X: 144,
-					Y: 90,
-				},
-				r: 25,
-			},
-			Target{
-				key: "0003",
-				xy: draw.Point{
-					X: 186,
-					Y: 90,
-				},
-				r: 25,
-			},
-			Target{
-				key: "0004",
-				xy: draw.Point{
-					X: 236,
-					Y: 90,
-				},
-				r: 25,
-			},
-			Target{
-				key: "0005",
-				xy: draw.Point{
-					X: 340,
-					Y: 90,
-				},
-				r: 40,
-			},
-			Target{
-				key: "0006",
-				xy: draw.Point{
-					X: 440,
-					Y: 90,
-				},
-				r: 40,
-			},
-			Target{
-				key: "0007",
-				xy: draw.Point{
-					X: 600,
-					Y: 90,
-				},
-				r: 90,
-			},
-			Target{
-				key: "0008",
-				xy: draw.Point{
-					X: 748,
-					Y: 90,
-				},
-				r: 40,
-			},
-			Target{
-				key: "0009",
-				xy: draw.Point{
-					X: 843,
-					Y: 90,
-				},
-				r: 38,
-			},
-			Target{
-				key: "0010",
-				xy: draw.Point{
-					X: 947,
-					Y: 90,
-				},
-				r: 60,
-			},
-			Target{
-				key: "0011",
-				xy: draw.Point{
-					X: 1112,
-					Y: 90,
-				},
-				r: 85,
-			},
+			"0002": &Item{},
+			"0003": &Item{},
+			"0004": &Item{},
+			"0005": &Item{},
+			"0006": &Item{},
+			"0007": &Item{},
+			"0008": &Item{},
+			"0009": &Item{},
+			"0010": &Item{},
+			"0011": &Item{},
 		},
 	},
 	/*Folder{
@@ -389,7 +337,7 @@
 		Pre: "titl",
 		Suf: "00nv",
 		Name: "Title",
-		Items: map[string]string{
+		Items: map[string]*Item{
 			"00nv": "Title",
 		},
 	},*/
@@ -397,38 +345,63 @@
 		Pre: "weap",
 		Suf: "00nv",
 		Name: "Index",
-		Items: map[string]string{
-			"00nv": "Index",
-		},
-		Targets: []Target{
-			Target{
-				key: "01pu",
-				xy: draw.Point{
-					X: 250,
-					Y: 400,
+		Items: map[string]*Item{
+			"00nv": &Item{
+				name: "Index",
+				Targets: map[string]Target{
+					"01pu": C(250, 400, 150),
+					"03pu": C(654, 375, 150),
+					"02pu": C(1047, 400, 150),
 				},
-				r: 150,
 			},
-			Target{
-				key: "03pu",
-				xy: draw.Point{
-					X: 654,
-					Y: 375,
+			"01pu": &Item{},
+			"03pu": &Item{},
+			"02pu": &Item{},
+		},
+	},
+	&Folder{
+		Pre: "wwfd",
+		Suf: "00aa",
+		Name: "WWF",
+		Items: map[string]*Item{
+			"00aa": &Item{
+				name: "WWF",
+				Targets: map[string]Target{
+					"03pu": C(302, 176, 80),
+					"04pu": C(518, 255, 80),
+					"02pu": C(685, 415, 80),
+					"06pu": C(952, 147, 80),
+					"05pu": C(917, 324, 80),
+					"01pu": C(1102, 313, 80),
+					"07tv": C(202, 465, 80),
+					"00fb": C(89, 55, 80),
+					"01fb": C(1208, 69, 80),
 				},
-				r: 150,
 			},
-			Target{
-				key: "02pu",
-				xy: draw.Point{
-					X: 1047,
-					Y: 400,
-				},
-				r: 150,
-			},
+			"03pu": &Item{},
+			"04pu": &Item{},
+			"02pu": &Item{},
+			"06pu": &Item{},
+			"05pu": &Item{},
+			"01pu": &Item{},
+			"07tv": &Item{},
+			"00fb": &Item{},
+			"01fb": &Item{},
 		},
 	},
 }
 
+func init() {
+	for _, f := range folders {
+		for _, it := range f.Items {
+			it.f = f
+			if f.Pre == "indx" {
+				it.Targets = f.Items["0001"].Targets
+			}
+		}
+	}
+}
+
 func check(err error, msg string) {
 	if err != nil {
 		log.Fatalf("%s: %s\n", msg, err)
@@ -437,8 +410,8 @@
 
 func resize(img image.Image, scale int) image.Image {
 	bounds := img.Bounds()
-	newX := bounds.Dx() * 2
-	newY:= bounds.Dy() * 2
+	newX := bounds.Dx() * scale
+	newY:= bounds.Dy() * scale
 	dst := image.NewRGBA(image.Rect(0, 0, newX, newY))
 	xdraw.NearestNeighbor.Scale(dst, dst.Rect, img, img.Bounds(), xdraw.Over, nil)
 	return dst
@@ -488,11 +461,9 @@
 		}
 	}
 
-	_=readImagePath
-
 	f := getFolder("", "cont")
 
-	dui.Top.UI = f
+	dui.Top.UI = f.Main()
 	dui.Render()
 
 	for {