cytoscape
Version:
Graph theory (a.k.a. network) library for analysis and visualisation
174 lines (132 loc) • 4.75 kB
JavaScript
import * as is from '../is';
import * as util from '../util';
let styfn = {};
// bypasses are applied to an existing style on an element, and just tacked on temporarily
// returns true iff application was successful for at least 1 specified property
styfn.applyBypass = function( eles, name, value, updateTransitions ){
let self = this;
let props = [];
let isBypass = true;
// put all the properties (can specify one or many) in an array after parsing them
if( name === '*' || name === '**' ){ // apply to all property names
if( value !== undefined ){
for( let i = 0; i < self.properties.length; i++ ){
let prop = self.properties[ i ];
let name = prop.name;
let parsedProp = this.parse( name, value, true );
if( parsedProp ){
props.push( parsedProp );
}
}
}
} else if( is.string( name ) ){ // then parse the single property
let parsedProp = this.parse( name, value, true );
if( parsedProp ){
props.push( parsedProp );
}
} else if( is.plainObject( name ) ){ // then parse each property
let specifiedProps = name;
updateTransitions = value;
let names = Object.keys( specifiedProps );
for( let i = 0; i < names.length; i++ ){
let name = names[i];
let value = specifiedProps[ name ];
if( value === undefined ){ // try camel case name too
value = specifiedProps[ util.dash2camel( name ) ];
}
if( value !== undefined ){
let parsedProp = this.parse( name, value, true );
if( parsedProp ){
props.push( parsedProp );
}
}
}
} else { // can't do anything without well defined properties
return false;
}
// we've failed if there are no valid properties
if( props.length === 0 ){ return false; }
// now, apply the bypass properties on the elements
let ret = false; // return true if at least one succesful bypass applied
for( let i = 0; i < eles.length; i++ ){ // for each ele
let ele = eles[ i ];
let diffProps = {};
let diffProp;
for( let j = 0; j < props.length; j++ ){ // for each prop
let prop = props[ j ];
if( updateTransitions ){
let prevProp = ele.pstyle( prop.name );
diffProp = diffProps[ prop.name ] = { prev: prevProp };
}
ret = this.applyParsedProperty( ele, util.copy(prop) ) || ret;
if( updateTransitions ){
diffProp.next = ele.pstyle( prop.name );
}
} // for props
if( ret ){
this.updateStyleHints( ele );
}
if( updateTransitions ){
this.updateTransitions( ele, diffProps, isBypass );
}
} // for eles
return ret;
};
// only useful in specific cases like animation
styfn.overrideBypass = function( eles, name, value ){
name = util.camel2dash( name );
for( let i = 0; i < eles.length; i++ ){
let ele = eles[ i ];
let prop = ele._private.style[ name ];
let type = this.properties[ name ].type;
let isColor = type.color;
let isMulti = type.mutiple;
let oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value;
if( !prop || !prop.bypass ){ // need a bypass if one doesn't exist
this.applyBypass( ele, name, value );
} else {
prop.value = value;
if( prop.pfValue != null ){
prop.pfValue = value;
}
if( isColor ){
prop.strValue = 'rgb(' + value.join( ',' ) + ')';
} else if( isMulti ){
prop.strValue = value.join( ' ' );
} else {
prop.strValue = '' + value;
}
this.updateStyleHints( ele );
}
this.checkTriggers( ele, name, oldValue, value );
}
};
styfn.removeAllBypasses = function( eles, updateTransitions ){
return this.removeBypasses( eles, this.propertyNames, updateTransitions );
};
styfn.removeBypasses = function( eles, props, updateTransitions ){
let isBypass = true;
for( let j = 0; j < eles.length; j++ ){
let ele = eles[ j ];
let diffProps = {};
for( let i = 0; i < props.length; i++ ){
let name = props[ i ];
let prop = this.properties[ name ];
let prevProp = ele.pstyle( prop.name );
if( !prevProp || !prevProp.bypass ){
// if a bypass doesn't exist for the prop, nothing needs to be removed
continue;
}
let value = ''; // empty => remove bypass
let parsedProp = this.parse( name, value, true );
let diffProp = diffProps[ prop.name ] = { prev: prevProp };
this.applyParsedProperty( ele, parsedProp );
diffProp.next = ele.pstyle( prop.name );
} // for props
this.updateStyleHints( ele );
if( updateTransitions ){
this.updateTransitions( ele, diffProps, isBypass );
}
} // for eles
};
export default styfn;