update cloud shape innerBox selection according to content dimensions
This commit is contained in:
parent
cea219a7bd
commit
ade01c8c54
3 changed files with 14 additions and 5 deletions
|
|
@ -124,8 +124,7 @@ func Layout(ctx context.Context, g *d2graph.Graph) error {
|
||||||
innerTL := s.GetInsidePlacement(totalWidth, totalHeight, 0, 0)
|
innerTL := s.GetInsidePlacement(totalWidth, totalHeight, 0, 0)
|
||||||
// depending on the shape innerBox may be larger than totalWidth, totalHeight
|
// depending on the shape innerBox may be larger than totalWidth, totalHeight
|
||||||
// if this is the case, we want to center the cells within the larger innerBox
|
// if this is the case, we want to center the cells within the larger innerBox
|
||||||
innerBox := s.GetInnerBox()
|
innerBox := s.GetInnerBoxForContent(totalWidth, totalHeight)
|
||||||
|
|
||||||
var resizeDx, resizeDy float64
|
var resizeDx, resizeDy float64
|
||||||
if innerBox.Width > totalWidth {
|
if innerBox.Width > totalWidth {
|
||||||
resizeDx = (innerBox.Width - totalWidth) / 2
|
resizeDx = (innerBox.Width - totalWidth) / 2
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ type Shape interface {
|
||||||
|
|
||||||
GetBox() *geo.Box
|
GetBox() *geo.Box
|
||||||
GetInnerBox() *geo.Box
|
GetInnerBox() *geo.Box
|
||||||
|
GetInnerBoxForContent(width, height float64) *geo.Box
|
||||||
|
|
||||||
// placing a rectangle of the given size and padding inside the shape, return the position relative to the shape's TopLeft
|
// placing a rectangle of the given size and padding inside the shape, return the position relative to the shape's TopLeft
|
||||||
GetInsidePlacement(width, height, paddingX, paddingY float64) geo.Point
|
GetInsidePlacement(width, height, paddingX, paddingY float64) geo.Point
|
||||||
|
|
@ -88,6 +89,11 @@ func (s baseShape) GetInnerBox() *geo.Box {
|
||||||
return s.Box
|
return s.Box
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// only cloud shape needs this right now
|
||||||
|
func (s baseShape) GetInnerBoxForContent(width, height float64) *geo.Box {
|
||||||
|
return (*s.FullShape).GetInnerBox()
|
||||||
|
}
|
||||||
|
|
||||||
func (s baseShape) GetInsidePlacement(_, _, paddingX, paddingY float64) geo.Point {
|
func (s baseShape) GetInsidePlacement(_, _, paddingX, paddingY float64) geo.Point {
|
||||||
innerTL := (*s.FullShape).GetInnerBox().TopLeft
|
innerTL := (*s.FullShape).GetInnerBox().TopLeft
|
||||||
return *geo.NewPoint(innerTL.X+paddingX/2, innerTL.Y+paddingY/2)
|
return *geo.NewPoint(innerTL.X+paddingX/2, innerTL.Y+paddingY/2)
|
||||||
|
|
|
||||||
|
|
@ -43,12 +43,16 @@ func NewCloud(box *geo.Box) Shape {
|
||||||
return shape
|
return shape
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO this isn't always accurate since the content aspect ratio might be different from the final shape's https://github.com/terrastruct/d2/issues/1735
|
|
||||||
func (s shapeCloud) GetInnerBox() *geo.Box {
|
func (s shapeCloud) GetInnerBox() *geo.Box {
|
||||||
width := s.Box.Width
|
return s.GetInnerBoxForContent(s.Box.Width, s.Box.Height)
|
||||||
height := s.Box.Height
|
}
|
||||||
|
|
||||||
|
// we need this since the content's aspect ratio determines which placement is used
|
||||||
|
func (s shapeCloud) GetInnerBoxForContent(width, height float64) *geo.Box {
|
||||||
insideTL := s.GetInsidePlacement(width, height, 0, 0)
|
insideTL := s.GetInsidePlacement(width, height, 0, 0)
|
||||||
aspectRatio := width / height
|
aspectRatio := width / height
|
||||||
|
// aspect ratio and position are computed with given dimensions, but final box size is determined by shape size
|
||||||
|
width, height = s.Box.Width, s.Box.Height
|
||||||
if aspectRatio > CLOUD_WIDE_ASPECT_BOUNDARY {
|
if aspectRatio > CLOUD_WIDE_ASPECT_BOUNDARY {
|
||||||
width *= CLOUD_WIDE_INNER_WIDTH
|
width *= CLOUD_WIDE_INNER_WIDTH
|
||||||
height *= CLOUD_WIDE_INNER_HEIGHT
|
height *= CLOUD_WIDE_INNER_HEIGHT
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue