diff --git a/internal/ui/render.go b/internal/ui/render.go index f5cc2cc..993ee3a 100644 --- a/internal/ui/render.go +++ b/internal/ui/render.go @@ -46,34 +46,30 @@ func (r *Renderer) Draw(gtx layout.Context, elems []Element) { func (r *Renderer) drawLabel(gtx layout.Context, l Label) { reg := l.Region() - c := clip.Rect{ - Min: image.Point{X: int(reg.X), Y: int(reg.Y)}, - Max: image.Point{X: int(reg.X + reg.W), Y: int(reg.Y + reg.H)}, - }.Push(gtx.Ops) - th := material.NewTheme() th.Shaper = r.shp size := l.FontSize if size == 0 { size = r.theme.FontSize } + + // Position label at region origin + gtx.Constraints.Min.X = int(reg.X) + gtx.Constraints.Min.Y = int(reg.Y) material.Label(th, size, l.Text).Layout(gtx) - c.Pop() } func (r *Renderer) drawListView(gtx layout.Context, lv ListView) { reg := lv.Region() - c := clip.Rect{ - Min: image.Point{X: int(reg.X), Y: int(reg.Y)}, - Max: image.Point{X: int(reg.X + reg.W), Y: int(reg.Y + reg.H)}, - }.Push(gtx.Ops) - th := material.NewTheme() th.Shaper = r.shp + + // Position list view at region origin + gtx.Constraints.Min.X = int(reg.X) + gtx.Constraints.Min.Y = int(reg.Y) for _, item := range lv.Items { material.Label(th, r.theme.FontSize, item.Text).Layout(gtx) } - c.Pop() } func (r *Renderer) drawStatusBar(gtx layout.Context, sb StatusBar) { @@ -81,10 +77,15 @@ func (r *Renderer) drawStatusBar(gtx layout.Context, sb StatusBar) { th := material.NewTheme() th.Shaper = r.shp + // Clip to status bar region + c := clip.Rect{ + Min: image.Point{X: int(reg.X), Y: int(reg.Y)}, + Max: image.Point{X: int(reg.X + reg.W), Y: int(reg.Y + reg.H)}, + }.Push(gtx.Ops) + // Line 1: Filename (truncated with ellipsis if needed) filenameLineY := reg.Y filenameLineH := unit.Dp(24) - filenameW := reg.W - unit.Dp(16) // 8 DP padding on each side // Truncate filename if needed displayFilename := sb.Filename @@ -93,12 +94,10 @@ func (r *Renderer) drawStatusBar(gtx layout.Context, sb StatusBar) { displayFilename = displayFilename[:27] + "..." } - clipFilename := clip.Rect{ - Min: image.Point{X: int(reg.X + unit.Dp(8)), Y: int(filenameLineY)}, - Max: image.Point{X: int(reg.X + filenameW), Y: int(filenameLineY + filenameLineH)}, - }.Push(gtx.Ops) + // Position filename at (reg.X + 8, filenameLineY) + gtx.Constraints.Min.X = int(reg.X + unit.Dp(8)) + gtx.Constraints.Min.Y = int(filenameLineY) material.Label(th, r.theme.FontSize, displayFilename).Layout(gtx) - clipFilename.Pop() // Line 2: Icons iconsLineY := filenameLineY + filenameLineH @@ -130,6 +129,8 @@ func (r *Renderer) drawStatusBar(gtx layout.Context, sb StatusBar) { rightX -= unit.Dp(36) r.drawIconButton(gtx, th, "⚠", rightX, iconY) } + + c.Pop() } func (r *Renderer) drawBottomBar(gtx layout.Context, bb BottomBar) { @@ -146,38 +147,40 @@ func (r *Renderer) drawBottomBar(gtx layout.Context, bb BottomBar) { // Left: Cursor position cursorX := reg.X + unit.Dp(8) gtx.Constraints.Min.X = int(cursorX) + gtx.Constraints.Min.Y = int(reg.Y) material.Label(th, r.theme.FontSize, bb.CursorPos).Layout(gtx) // Center: Byte position byteX := reg.X + reg.W/2 - unit.Dp(60) // approximate center gtx.Constraints.Min.X = int(byteX) + gtx.Constraints.Min.Y = int(reg.Y) material.Label(th, r.theme.FontSize, bb.BytePos).Layout(gtx) // Right: Word wrap button wordWrapX := reg.X + reg.W - unit.Dp(120) gtx.Constraints.Min.X = int(wordWrapX) + gtx.Constraints.Min.Y = int(reg.Y) material.Label(th, r.theme.FontSize, "[Word Wrap: "+boolToString(bb.WordWrap)+"]").Layout(gtx) c.Pop() } func (r *Renderer) drawButton(gtx layout.Context, btn Button) { + reg := btn.Region() th := material.NewTheme() th.Shaper = r.shp - // Draw button text + // Position button at region origin + gtx.Constraints.Min.X = int(reg.X) + gtx.Constraints.Min.Y = int(reg.Y) material.Label(th, r.theme.FontSize, btn.Text).Layout(gtx) } func (r *Renderer) drawIconButton(gtx layout.Context, th *material.Theme, icon string, x, y unit.Dp) { - // Draw icon button - iconRegion := Region{X: x, Y: y, W: unit.Dp(24), H: unit.Dp(24)} - c := clip.Rect{ - Min: image.Point{X: int(iconRegion.X), Y: int(iconRegion.Y)}, - Max: image.Point{X: int(iconRegion.X + iconRegion.W), Y: int(iconRegion.Y + iconRegion.H)}, - }.Push(gtx.Ops) + // Position icon button at (x, y) + gtx.Constraints.Min.X = int(x) + gtx.Constraints.Min.Y = int(y) material.Label(th, r.theme.FontSize, icon).Layout(gtx) - c.Pop() } func boolToString(b bool) string { diff --git a/pad b/pad index b142832..c106930 100755 Binary files a/pad and b/pad differ