/** | |
* Elements are drawn in a specific order based on compound depth (low to high), the element type (nodes above edges), | |
* and z-index (low to high). These styles affect how this applies: | |
* | |
* z-compound-depth: May be `bottom | orphan | auto | top`. The first drawn is `bottom`, then `orphan` which is the | |
* same depth as the root of the compound graph, followed by the default value `auto` which draws in order from | |
* root to leaves of the compound graph. The last drawn is `top`. | |
* z-index-compare: May be `auto | manual`. The default value is `auto` which always draws edges under nodes. | |
* `manual` ignores this convention and draws based on the `z-index` value setting. | |
* z-index: An integer value that affects the relative draw order of elements. In general, an element with a higher | |
* `z-index` will be drawn on top of an element with a lower `z-index`. | |
*/ | |
import * as util from '../util'; | |
let zIndexSort = function( a, b ){ | |
let cy = a.cy(); | |
let hasCompoundNodes = cy.hasCompoundNodes(); | |
function getDepth(ele){ | |
let style = ele.pstyle( 'z-compound-depth' ); | |
if ( style.value === 'auto' ){ | |
return hasCompoundNodes ? ele.zDepth() : 0; | |
} else if ( style.value === 'bottom' ){ | |
return -1; | |
} else if ( style.value === 'top' ){ | |
return util.MAX_INT; | |
} | |
// 'orphan' | |
return 0; | |
} | |
let depthDiff = getDepth(a) - getDepth(b); | |
if ( depthDiff !== 0 ){ | |
return depthDiff; | |
} | |
function getEleDepth(ele){ | |
let style = ele.pstyle( 'z-index-compare' ); | |
if ( style.value === 'auto' ){ | |
return ele.isNode() ? 1 : 0; | |
} | |
// 'manual' | |
return 0; | |
} | |
let eleDiff = getEleDepth(a) - getEleDepth(b); | |
if ( eleDiff !== 0 ){ | |
return eleDiff; | |
} | |
let zDiff = a.pstyle( 'z-index' ).value - b.pstyle( 'z-index' ).value; | |
if ( zDiff !== 0 ){ | |
return zDiff; | |
} | |
// compare indices in the core (order added to graph w/ last on top) | |
return a.poolIndex() - b.poolIndex(); | |
}; | |
export default zIndexSort; | |