package placement
import (
"fmt"
"github.com/pancsta/d2/d2layouts/d2talalayout/internal/layoutgraph"
"github.com/pancsta/d2/d2layouts/d2talalayout/internal/limits"
)
type optimizerCandidateMovement struct {
positions []nodePositionSnapshot
descendantWork uint64
}
func captureOptimizerCandidateMovement(node *layoutgraph .Node , guard *limits .OptimizationWorkGuard ) (optimizerCandidateMovement , error ) {
before := guard .Used ()
positions , err := captureOptimizerNodePositions ([]*layoutgraph .Node {node }, guard )
if err != nil {
return optimizerCandidateMovement {}, err
}
return optimizerCandidateMovement {
positions : positions ,
descendantWork : guard .Used () - before - uint64 (len (positions )),
}, nil
}
func (movement optimizerCandidateMovement ) moveAbs (x , y float64 , guard *limits .OptimizationWorkGuard ) error {
node := movement .positions [0 ].node
if node .TopLeft == nil {
return fmt .Errorf ("TALA %s cannot move an unpositioned node" , guard .Location ())
}
if node .TopLeft .X == x && node .TopLeft .Y == y {
return guard .Step ()
}
for range movement .descendantWork {
if err := guard .Step (); err != nil {
return err
}
}
descendants := movement .positions [1 :]
for _ , position := range descendants {
if err := guard .Step (); err != nil {
return err
}
if position .node .TopLeft == nil {
return fmt .Errorf ("TALA %s cannot move an unpositioned descendant" , guard .Location ())
}
}
dx , dy := x -node .TopLeft .X , y -node .TopLeft .Y
node .Translate (dx , dy )
for _ , position := range descendants {
if err := guard .Step (); err != nil {
return err
}
position .node .Translate (dx , dy )
}
return nil
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .