Add: pages, text component
This commit is contained in:
		| @@ -1,7 +1,10 @@ | ||||
| package components | ||||
|  | ||||
| import "io" | ||||
|  | ||||
| // Some general types | ||||
|  | ||||
| // Rectangle and its' suplements | ||||
| type rect struct { | ||||
| 	x int | ||||
| 	y int | ||||
| @@ -18,3 +21,37 @@ type RectSetter interface { | ||||
| 	SetPos(x, y int) | ||||
| 	SetSize(w, h int) | ||||
| } | ||||
|  | ||||
| // Mask | ||||
|  | ||||
| // Implementation dependent !!! | ||||
| // Now for mt12232 | ||||
| type mask struct { | ||||
| 	bits uint32 | ||||
| } | ||||
|  | ||||
| func (m *mask) Update(r rect) { | ||||
| 	m.bits = 0 | ||||
| 	y0 := min(3, max(0, int(r.y/8))) | ||||
| 	y1 := min(3, max(0, int((r.y+r.h-1)/8))) | ||||
|  | ||||
| 	x0 := min(1, max(0, int(r.x/61))) | ||||
| 	x1 := min(1, max(0, int((r.x+r.w-1)/61))) | ||||
|  | ||||
| 	//log.Println(x0, y0, x1, y1) | ||||
| 	for y := y0; y <= y1; y++ { | ||||
| 		for x := x0; x <= x1; x++ { | ||||
| 			m.bits |= (1 << (x*4 + y)) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Component - all components should implement this interface | ||||
|  | ||||
| type Component interface { | ||||
| 	RectGetter | ||||
|  | ||||
| 	Draw() // Draw and flush | ||||
|  | ||||
| 	io.Closer | ||||
| } | ||||
|   | ||||
| @@ -2,28 +2,23 @@ package components | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
|  | ||||
| 	"gitea.unprism.ru/yotia/display-test/drawer" | ||||
| ) | ||||
|  | ||||
| type progressBar struct { | ||||
| 	drawer   drawer.Drawer // Drawer with dysplay | ||||
| 	mask     uint32        // Flush mask | ||||
| 	mask     mask          // Flush mask | ||||
| 	progress float64 | ||||
|  | ||||
| 	rect rect // Rect | ||||
| } | ||||
|  | ||||
| type ProgressBar interface { | ||||
| 	RectGetter | ||||
| 	Component | ||||
|  | ||||
| 	SetProgress(coef float64) // Value from 0 to 1 | ||||
| 	Draw()                    // For any cases | ||||
| 	Clear()                   // Clear space of bar | ||||
| 	Flush()                   // For those times like after SetPos | ||||
|  | ||||
| 	io.Closer | ||||
| } | ||||
|  | ||||
| // Creation function | ||||
| @@ -45,34 +40,14 @@ func NewProgressBar(drawer drawer.Drawer, x, y, w, h int) (ProgressBar, error) { | ||||
| 		rect:   rect{x, y, w, h}, | ||||
| 	} | ||||
|  | ||||
| 	pb.updateMask() | ||||
| 	pb.Draw() | ||||
| 	pb.Flush() | ||||
| 	pb.mask.Update(pb.rect) | ||||
| 	// pb.Draw() | ||||
|  | ||||
| 	return &pb, nil | ||||
| } | ||||
|  | ||||
| func (pb *progressBar) Flush() { | ||||
| 	pb.drawer.GetDisplay().FlushByMask(pb.mask) | ||||
| } | ||||
|  | ||||
| func (pb *progressBar) updateMask() { | ||||
| 	pb.mask = 0 | ||||
|  | ||||
| 	// Implementation dependent !!! | ||||
| 	// Now for mt12232 | ||||
| 	y0 := min(3, max(0, int(pb.rect.y/8))) | ||||
| 	y1 := min(3, max(0, int((pb.rect.y+pb.rect.h-1)/8))) | ||||
|  | ||||
| 	x0 := min(1, max(0, int(pb.rect.x/61))) | ||||
| 	x1 := min(1, max(0, int((pb.rect.x+pb.rect.w-1)/61))) | ||||
|  | ||||
| 	//log.Println(x0, y0, x1, y1) | ||||
| 	for y := y0; y <= y1; y++ { | ||||
| 		for x := x0; x <= x1; x++ { | ||||
| 			pb.mask |= (1 << (x*4 + y)) | ||||
| 		} | ||||
| 	} | ||||
| func (pb *progressBar) flush() { | ||||
| 	pb.drawer.GetDisplay().FlushByMask(pb.mask.bits) | ||||
| } | ||||
|  | ||||
| func (pb *progressBar) Close() error { | ||||
| @@ -92,6 +67,7 @@ func (pb *progressBar) Draw() { | ||||
| 	pb.Clear() | ||||
| 	pb.drawer.PutBar(pb.rect.x, pb.rect.y, pb.rect.x+pb.rect.w, pb.rect.y+pb.rect.h, 0xFF) | ||||
| 	pb.drawBar() | ||||
| 	pb.flush() | ||||
| } | ||||
|  | ||||
| // Draw only bar(without frames) | ||||
| @@ -105,7 +81,7 @@ func (pb *progressBar) SetProgress(coef float64) { | ||||
| 	pb.progress = max(0, min(1, coef)) | ||||
|  | ||||
| 	pb.drawBar() | ||||
| 	pb.Flush() | ||||
| 	pb.flush() | ||||
| } | ||||
|  | ||||
| func (pb *progressBar) GetPos() (int, int) { | ||||
|   | ||||
							
								
								
									
										85
									
								
								components/text.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								components/text.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| package components | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"gitea.unprism.ru/yotia/display-test/drawer" | ||||
| ) | ||||
|  | ||||
| type text struct { | ||||
| 	drawer drawer.Drawer // Drawer with dysplay | ||||
| 	mask   mask          // Flush mask | ||||
|  | ||||
| 	str string | ||||
|  | ||||
| 	rect rect // Rect | ||||
| } | ||||
|  | ||||
| type Text interface { | ||||
| 	Component | ||||
| 	RectSetter | ||||
|  | ||||
| 	SetStr(newStr string) // Update string and redraw | ||||
| 	Clear()               // Clear space of bar | ||||
| } | ||||
|  | ||||
| // Creation function | ||||
| // Now the only way to chage shape is to recreate component | ||||
| func NewText(d drawer.Drawer, x, y int) (Text, error) { | ||||
| 	if err := d.GetDisplay().IsReady(); err != nil { | ||||
| 		return nil, fmt.Errorf("display is ready: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	t := text{ | ||||
| 		drawer: d, | ||||
| 		rect:   rect{x, y, 0, drawer.FontCharH}, | ||||
| 	} | ||||
|  | ||||
| 	t.mask.Update(t.rect) | ||||
| 	//t.Draw() | ||||
|  | ||||
| 	return &t, nil | ||||
| } | ||||
|  | ||||
| func (t *text) Close() error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (t *text) Clear() { | ||||
| 	t.drawer.FillBar(t.rect.x, t.rect.y, t.rect.x+t.rect.w, t.rect.y+t.rect.h, 0x00) | ||||
| } | ||||
|  | ||||
| func (t *text) Draw() { | ||||
| 	t.Clear() // Assume that is draw is invoked string has been changed | ||||
| 	t.drawer.PutText(t.rect.x, t.rect.y, t.str) | ||||
| 	t.drawer.GetDisplay().FlushByMask(t.mask.bits) | ||||
| } | ||||
|  | ||||
| func (t *text) updateW() { | ||||
| 	t.rect.w = len(t.str)*(drawer.FontCharW+drawer.CharGap) - drawer.CharGap | ||||
| } | ||||
|  | ||||
| func (t *text) SetStr(str string) { | ||||
| 	t.str = str | ||||
| 	t.updateW() | ||||
| 	t.mask.Update(t.rect) | ||||
| 	t.Draw() | ||||
| } | ||||
|  | ||||
| func (t *text) GetPos() (int, int) { | ||||
| 	return t.rect.x, t.rect.y | ||||
| } | ||||
|  | ||||
| func (t *text) GetSize() (int, int) { | ||||
| 	return t.rect.w, t.rect.h | ||||
| } | ||||
|  | ||||
| func (t *text) SetPos(x, y int) { | ||||
| 	t.rect.x = x | ||||
| 	t.rect.y = y | ||||
| 	t.mask.Update(t.rect) | ||||
| } | ||||
|  | ||||
| func (t *text) SetSize(w, h int) { | ||||
| 	// Empty | ||||
| } | ||||
		Reference in New Issue
	
	Block a user