You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

370 lines
8.6 KiB
PHP

<?php
/**
* Motion Helper class.
*
* @package Divi
* @subpackage Builder
*/
/**
* Motion Helpers.
*/
class ET_Builder_Module_Helper_Motion_Motions {
private $START_LIMIT = 0;
private $START_MIDDLE = 1;
private $END_MIDDLE = 2;
private $END_LIMIT = 3;
private $START_VALUE = 4;
private $MIDDLE_VALUE = 5;
private $END_VALUE = 6;
private $LENGTH = 7;
private static $instance;
public static function instance() {
return self::$instance ? self::$instance : ( self::$instance = new self() );
}
/**
* Returns the Motion Effect value. Which is the merge of Saved and Default values.
*
* @param string $value, $default_value
*
* @return string
*/
public function getValue( $saved_value, $default_value ) {
if ( $saved_value === $default_value ) {
return $saved_value;
}
$saved_array = explode( '|', $saved_value );
$default_array = explode( '|', $default_value );
if ( sizeof( $saved_array ) !== sizeof( $default_array ) ) {
return $saved_value;
}
return implode( '|', array_map( array( 'ET_Builder_Module_Helper_Motion_Motions', 'getNonEmpty' ), $saved_array, $default_array ) );
}
/**
* Returns the non-empty value or default.
*
* @param string $value, $default
*
* @return string
*/
public static function getNonEmpty( $value, $default ) {
if ( '' === $value ) {
return $default;
}
return $value;
}
/**
* Returns start limit.
*
* @param string $value
*
* @return int
*/
public function getStartLimit( $value ) {
return $this->get( $this->START_LIMIT, $value );
}
/**
* Set start limit.
*
* If limit:
* - is not a numeric value, return original motionValue
* - is lower then 0, set limit to 0
* - is higher then start middle, set limit equal to start middle
*
* @param int $value
* @param string $multi_value
*
* @return string
*/
public function setStartLimit( $value, $multi_value ) {
$value = $this->to_int( $value, $this->getStartLimit( $multi_value ) );
$ranged = $this->range( 0, $this->getStartMiddle( $multi_value ), $value );
return $this->set( $this->START_LIMIT, $ranged, $multi_value );
}
/**
* Returns start limit.
*
* @param string $value
*
* @return int
*/
public function getEndLimit( $value ) {
return $this->get( $this->END_LIMIT, $value );
}
/**
* Set end limit.
*
* If limit:
* - is not a numeric value, return original motionValue
* - is lower then end middle, set limit equal to end middle
* - is higher then 100, set limit equal to 100
*
* @param int $value
* @param string $multi_value
*
* @return string
*/
public function setEndLimit( $value, $multi_value ) {
$value = $this->to_int( $value, $this->getEndLimit( $multi_value ) );
$ranged = $this->range( $this->getEndMiddle( $multi_value ), 100, $value );
return $this->set( $this->END_LIMIT, $ranged, $multi_value );
}
/**
* Get start middle.
*
* @param $value
*
* @return int
*/
public function getStartMiddle( $value ) {
return $this->get( $this->START_MIDDLE, $value );
}
/**
* Set start middle limit.
*
* If limit:
* - is not a numeric value, return original motionValue
* - is lower then start limit, set limit equal to start limit
* - is higher then end middle, set limit equal to end middle
*
* @param int $value
* @param string $multi_value
*
* @return string
*/
public function setStartMiddle( $value, $multi_value ) {
$value = $this->to_int( $value, $this->getStartMiddle( $multi_value ) );
$ranged = $this->range( $this->getStartLimit( $value ), $this->getEndMiddle( $value ), $value );
return $this->set( $this->START_MIDDLE, $ranged, $multi_value );
}
/**
* Get end middle.
*
* @param $value
*
* @return int
*/
public function getEndMiddle( $value ) {
return $this->get( $this->END_MIDDLE, $value );
}
/**
* Set end middle limit.
*
* If limit:
* - is not a numeric value, return original motionValue
* - is lower then start middle limit, set limit equal to start middle limit
* - is higher then end limit, set limit equal to end limit
*
* @param int $value
* @param string $multi_value
*
* @return string
*/
public function setEndMiddle( $value, $multi_value ) {
$value = $this->to_int( $value, $this->getEndMiddle( $multi_value ) );
$ranged = $this->range( $this->getStartMiddle( $value ), $this->getEndLimit( $value ), $value );
return $this->set( $this->END_MIDDLE, $ranged, $multi_value );
}
/**
* Returns option value for start.
*
* @param string $value
*
* @return string
*/
public function getStartValue( $value ) {
return $this->get( $this->START_VALUE, $value );
}
/**
* Sets option value for start.
*
* @param string $value
* @param string $multi_value
*
* @return string
*/
public function setStartValue( $value, $multi_value ) {
return $this->set( $this->START_VALUE, $value, $multi_value );
}
/**
* Returns option value for middle.
*
* @param string $value
*
* @return string
*/
public function getMiddleValue( $value ) {
return $this->get( $this->MIDDLE_VALUE, $value );
}
/**
* Sets option value for middle.
*
* @param string $value
* @param string $multi_value
*
* @return string
*/
public function setMiddleValue( $value, $multi_value ) {
return $this->set( $this->MIDDLE_VALUE, $value, $multi_value );
}
/**
* Returns option value for end.
*
* @param string $value
*
* @return string
*/
public function getEndValue( $value ) {
return $this->get( $this->END_VALUE, $value );
}
/**
* Sets option value for end.
*
* @param string $value
* @param string $multi_value
*
* @return string
*/
public function setEndValue( $value, $multi_value ) {
return $this->set( $this->END_VALUE, $value, $multi_value );
}
/**
* Same as Multi.merge, but applies the elements parameter
*
* @param string $value_1
* @param string $value_2
*
* @return string
*/
public function merge( $value_1, $value_2 ) {
return $this->to_value( $this->split( $this->multi()->merge( $value_1, $value_2, $this->LENGTH ) ) );
}
/**
* Parses array value and converts it to a valid motion array
* - array length should be 7
* - first 4 values should be numeric values
* - first 4 values should respect 0-100 boundaries
* - first 4 values should be ordered in ascending order
* - last 3 values should be string values
*
* @param array $value
*
* @return array
*/
protected function parse( array $value ) {
$arr = $this->multi()->parse( $value, $this->LENGTH );
$range = array();
$range[ $this->START_LIMIT ] = $this->to_int( array_shift( $arr ), 0 );
$range[ $this->START_MIDDLE ] = $this->to_int( array_shift( $arr ), 50 );
$range[ $this->END_MIDDLE ] = $this->to_int( array_shift( $arr ), 50 );
$range[ $this->END_LIMIT ] = $this->to_int( array_shift( $arr ), 100 );
sort( $range, SORT_NUMERIC );
$range[ $this->START_LIMIT ] = max( $range[ $this->START_LIMIT ], 0 );
$range[ $this->END_LIMIT ] = min( $range[ $this->END_LIMIT ], 100 );
$range[ $this->START_MIDDLE ] = max( $range[ $this->START_MIDDLE ], $range[ $this->START_LIMIT ] );
$range[ $this->END_MIDDLE ] = min( $range[ $this->END_LIMIT ], $range[ $this->END_MIDDLE ] );
return array_merge( $range, $arr );
}
/**
* Converts a value to a valid motion array value.
*
* @param string $value
*
* @return array
*/
protected function split( $value ) {
return $this->parse( $this->multi()->split( $value, $this->LENGTH ) );
}
/**
* Converts a value to a valid motion string value.
*
* @param array $value
*
* @return string
*/
protected function to_value( array $value ) {
return $this->multi()->to_value( $this->parse( $value ), $this->LENGTH );
}
/**
* @return ET_Builder_Module_Helper_Multi_Value
*/
protected function multi() {
return ET_Builder_Module_Helper_Multi_Value::instance();
}
/**
* Returns specific key value
*
* @param int $key
* @param string $value
*
* @return mixed
*/
protected function get( $key, $value ) {
$arr = $this->parse( $this->multi()->split( $value, $this->LENGTH ) );
return $arr[ $key ];
}
/**
* @param int $key
* @param $value
* @param string $multi_value
*
* @return string
*/
protected function set( $key, $value, $multi_value ) {
return $this->multi()->set( $key, $value, $multi_value, $this->LENGTH );
}
private function to_int( $value, $default ) {
return is_numeric( $value ) ? (int) $value : $default;
}
/**
* @param int $min
* @param int $max
* @param int $value
*
* @return int
*/
private function range( $min, $max, $value ) {
return min( $max, max( $min, $value ) );
}
}