package keepassgo import ( "image" "gioui.org/layout" "gioui.org/op" "gioui.org/unit" ) type dropdownAnchor struct { TriggerRightX int TriggerBottomY int } func (a dropdownAnchor) point() image.Point { return image.Pt(a.TriggerRightX, a.TriggerBottomY) } type dropdownSurface struct { ContainerWidth int LeftInset int TopInset int } func (s dropdownSurface) menuConstraints(gtx layout.Context) layout.Context { menuGTX := gtx menuGTX.Constraints.Min = image.Point{} menuGTX.Constraints.Max.X = max(0, s.ContainerWidth) return menuGTX } func (s dropdownSurface) origin(anchor dropdownAnchor, menuWidth int) image.Point { x := s.LeftInset + anchoredMenuOriginX(s.ContainerWidth, 0, anchor.TriggerRightX, menuWidth) y := s.TopInset + anchor.TriggerBottomY return image.Pt(x, y) } func (s dropdownSurface) draw(gtx layout.Context, anchor dropdownAnchor, menu layout.Widget) layout.Dimensions { menuGTX := s.menuConstraints(gtx) menuOps := op.Record(gtx.Ops) menuDims := layout.Inset{Top: unit.Dp(6)}.Layout(menuGTX, menu) menuCall := menuOps.Stop() menuOrigin := s.origin(anchor, menuDims.Size.X) stack := op.Offset(menuOrigin).Push(gtx.Ops) menuCall.Add(gtx.Ops) stack.Pop() return layout.Dimensions{Size: gtx.Constraints.Max} } type headerActionMetrics struct { RowOriginX int Spacing int RowDims layout.Dimensions SyncDims layout.Dimensions LockDims layout.Dimensions MainDims layout.Dimensions } func (m headerActionMetrics) syncAnchor() dropdownAnchor { return dropdownAnchor{ TriggerRightX: m.RowOriginX + m.SyncDims.Size.X, TriggerBottomY: m.RowDims.Size.Y, } } func (m headerActionMetrics) mainAnchor() dropdownAnchor { triggerRightX := m.SyncDims.Size.X + m.Spacing + m.LockDims.Size.X + m.Spacing + m.MainDims.Size.X return dropdownAnchor{ TriggerRightX: m.RowOriginX + triggerRightX, TriggerBottomY: m.RowDims.Size.Y, } }