Version 4.6.0
This commit is contained in:
1 parent
f79dcf067a
commit
517a5e1f70
2036 files changed
+110041
-26162
No files matched your search
@@ -58,6 +58,10 @@ class _icons extends \IPS\Dispatcher\Controller
|
||||
$homeScreen = json_decode( \IPS\Settings::i()->icons_homescreen, TRUE ) ?? array();
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'icons_homescreen', ( isset( $homeScreen['original'] ) ) ? \IPS\File::get( 'core_Icons', $homeScreen['original'] ) : NULL, FALSE, array( 'image' => true, 'storageExtension' => 'core_Icons' ) ) );
|
||||
|
||||
/* Apple startup screen logo - we accept one upload and create the images we need */
|
||||
$apple = json_decode( \IPS\Settings::i()->icons_apple_startup, TRUE ) ?? array();
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'icons_apple_startup', ( isset( $apple['original'] ) ) ? \IPS\File::get( 'core_Icons', $apple['original'] ) : NULL, FALSE, array( 'image' => true, 'storageExtension' => 'core_Icons' ) ) );
|
||||
|
||||
/* Safari pinned tabs icon and highlight color */
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'icons_mask_icon', \IPS\Settings::i()->icons_mask_icon ? \IPS\File::get( 'core_Icons', \IPS\Settings::i()->icons_mask_icon ) : NULL, FALSE, array( 'allowedFileTypes' => array( 'svg' ), 'storageExtension' => 'core_Icons', 'obscure' => FALSE ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Color( 'icons_mask_color', \IPS\Settings::i()->icons_mask_color, FALSE ) );
|
||||
@@ -129,9 +133,34 @@ class _icons extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
}
|
||||
|
||||
/* Homescreen icons are the hardest part, as we need to generate different sizes.. */
|
||||
/* Homescreen icon is the hardest part, as we need to generate different sizes.. */
|
||||
$values = static::processApplicationIcon( $values, $homeScreen );
|
||||
|
||||
/* The start screen requires more different sizes so we'll rebuild that after submit */
|
||||
$rebuildStartScreen = FALSE;
|
||||
|
||||
if( $values['icons_apple_startup'] AND ( !isset( $apple['original'] ) OR !$apple['original'] OR (string) $values['icons_apple_startup'] != $apple['original'] ) )
|
||||
{
|
||||
$rebuildStartScreen = TRUE;
|
||||
}
|
||||
|
||||
if( ( !isset( $manifestDetails['background_color'] ) AND $values['manifest_bgcolor'] ) OR ( isset( $manifestDetails['background_color'] ) AND !$values['manifest_bgcolor'] ) OR ( isset( $manifestDetails['background_color'] ) AND $values['manifest_bgcolor'] != $manifestDetails['background_color'] ) )
|
||||
{
|
||||
if( $values['icons_apple_startup'] )
|
||||
{
|
||||
$rebuildStartScreen = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if( $rebuildStartScreen )
|
||||
{
|
||||
$values = static::processAppleStartupScreen( $values, $apple );
|
||||
}
|
||||
else
|
||||
{
|
||||
$values['icons_apple_startup'] = json_encode( $apple );
|
||||
}
|
||||
|
||||
/* We need the string value of this uploaded file as well */
|
||||
$values['icons_mask_icon'] = (string) $values['icons_mask_icon'];
|
||||
|
||||
@@ -166,7 +195,14 @@ class _icons extends \IPS\Dispatcher\Controller
|
||||
\IPS\Session::i()->log( 'acplogs__icons_and_logos' );
|
||||
|
||||
/* And Redirect */
|
||||
\IPS\Output::i()->redirect( $this->url , 'saved' );
|
||||
if( $rebuildStartScreen === TRUE )
|
||||
{
|
||||
\IPS\Output::i()->redirect( $this->url->setQueryString( 'do', 'buildStartupScreenImages' ), 'saved' );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( $this->url, 'saved' );
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('menu__core_customization_icons');
|
||||
@@ -253,4 +289,182 @@ class _icons extends \IPS\Dispatcher\Controller
|
||||
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Minimum padding on either side of startup image (in px)
|
||||
*/
|
||||
const MINIMUM_STARTUP_IMAGE_PADDING = 50;
|
||||
|
||||
/**
|
||||
* Process Apple startup screen images
|
||||
*
|
||||
* @param array $values Values from form submission
|
||||
* @param array $apple Existing values, if any
|
||||
* @return array
|
||||
*/
|
||||
public static function processAppleStartupScreen( $values, $apple = array() )
|
||||
{
|
||||
if( $values['icons_apple_startup'] )
|
||||
{
|
||||
$values['icons_apple_startup'] = json_encode( array( 'original' => (string) $values['icons_apple_startup'] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Delete any images that may already exist */
|
||||
foreach( $apple as $key => $image )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\File::get( 'core_Icons', ( $key == 'original' ) ? $image : $image['url'] )->delete();
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
}
|
||||
|
||||
$values['icons_apple_startup'] = '';
|
||||
}
|
||||
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process Apple startup screen images
|
||||
*
|
||||
* @param array $values Values from form submission
|
||||
* @param array $apple Existing values, if any
|
||||
* @return array
|
||||
*/
|
||||
public function buildStartupScreenImages()
|
||||
{
|
||||
$self = $this;
|
||||
|
||||
$multiRedirect = new \IPS\Helpers\MultipleRedirect(
|
||||
$this->url->setQueryString('do', 'buildStartupScreenImages'),
|
||||
function( $data )
|
||||
{
|
||||
/* Get the necessary data */
|
||||
$manifestDetails = json_decode( \IPS\Settings::i()->manifest_details, TRUE );
|
||||
$setting = json_decode( \IPS\Settings::i()->icons_apple_startup, TRUE ) ?? array();
|
||||
|
||||
if( isset( $setting['original'] ) )
|
||||
{
|
||||
$sizes = array(
|
||||
'apple-startup-1136x640' => array( 320, 568, 2, 'landscape' ),
|
||||
'apple-startup-2436x1125' => array( 375, 812, 3, 'landscape' ),
|
||||
'apple-startup-1792x828' => array( 414, 896, 2, 'landscape' ),
|
||||
'apple-startup-828x1792' => array( 414, 896, 2, 'portrait' ),
|
||||
'apple-startup-1334x750' => array( 375, 667, 2, 'landscape' ),
|
||||
'apple-startup-1242x2688' => array( 414, 896, 3, 'portrait' ),
|
||||
'apple-startup-2208x1242' => array( 414, 736, 3, 'landscape' ),
|
||||
'apple-startup-1125x2436' => array( 375, 812, 3, 'portrait' ),
|
||||
'apple-startup-1242x2208' => array( 414, 736, 3, 'portrait' ),
|
||||
'apple-startup-2732x2048' => array( 1024, 1366, 2, 'landscape' ),
|
||||
'apple-startup-2688x1242' => array( 414, 896, 3, 'landscape' ),
|
||||
'apple-startup-2224x1668' => array( 834, 1112, 2, 'landscape' ),
|
||||
'apple-startup-750x1334' => array( 375, 667, 2, 'portrait' ),
|
||||
'apple-startup-2048x2732' => array( 1024, 1366, 2, 'portrait' ),
|
||||
'apple-startup-2388x1668' => array( 834, 1194, 2, 'landscape' ),
|
||||
'apple-startup-1668x2224' => array( 834, 1112, 2, 'portrait' ),
|
||||
'apple-startup-640x1136' => array( 320, 568, 2, 'portrait' ),
|
||||
'apple-startup-1668x2388' => array( 834, 1194, 2, 'portrait' ),
|
||||
'apple-startup-2048x1536' => array( 768, 1024, 2, 'landscape' ),
|
||||
'apple-startup-1536x2048' => array( 768, 1024, 2, 'portrait' ),
|
||||
'apple-startup-2360x1640' => array( 1180, 820, 2, 'landscape' ),
|
||||
'apple-startup-1640x2360' => array( 1180, 820, 2, 'portrait' ),
|
||||
'apple-startup-2160x1620' => array( 1080, 810, 2, 'landscape' ),
|
||||
'apple-startup-1620x2160' => array( 1080, 810, 2, 'portrait' ),
|
||||
'apple-startup-2778x1284' => array( 428, 926, 3, 'landscape' ),
|
||||
'apple-startup-1284x2778' => array( 428, 926, 3, 'portrait' ),
|
||||
'apple-startup-2532x1170' => array( 390, 844, 3, 'landscape' ),
|
||||
'apple-startup-1170x2532' => array( 390, 844, 3, 'portrait' ),
|
||||
'apple-startup-2340x1080' => array( 360, 780, 3, 'landscape' ),
|
||||
'apple-startup-1080x2340' => array( 360, 780, 3, 'portrait' ),
|
||||
);
|
||||
|
||||
$file = \IPS\File::get( 'core_Icons', $setting['original'] );
|
||||
$originalContents = $file->contents();
|
||||
|
||||
$backgroundColor = ( isset( $manifestDetails['background_color'] ) ) ? str_replace( '#', '', $manifestDetails['background_color'] ) : 'FFFFFF';
|
||||
|
||||
$rgb = array();
|
||||
|
||||
if ( \strlen( $backgroundColor ) == 3 )
|
||||
{
|
||||
$rgb[] = hexdec( \substr( $backgroundColor, 0, 1 ) . \substr( $backgroundColor, 0, 1 ) ); // R
|
||||
$rgb[] = hexdec( \substr( $backgroundColor, 1, 1 ) . \substr( $backgroundColor, 1, 1 ) ); // G
|
||||
$rgb[] = hexdec( \substr( $backgroundColor, 2, 1 ) . \substr( $backgroundColor, 2, 1 ) ); // B
|
||||
}
|
||||
else
|
||||
{
|
||||
$rgb[] = hexdec( \substr( $backgroundColor, 0, 2 ) ); // R
|
||||
$rgb[] = hexdec( \substr( $backgroundColor, 2, 2 ) ); // G
|
||||
$rgb[] = hexdec( \substr( $backgroundColor, 4, 2 ) ); // B
|
||||
}
|
||||
|
||||
$did = 0;
|
||||
|
||||
foreach( $sizes as $filename => $_sizes )
|
||||
{
|
||||
$did++;
|
||||
|
||||
if( isset( $setting[ $filename ] ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$width = ( $_sizes[3] == 'landscape' ) ? $_sizes[1] * $_sizes[2] : $_sizes[0] * $_sizes[2];
|
||||
$height = ( $_sizes[3] == 'portrait' ) ? $_sizes[1] * $_sizes[2] : $_sizes[0] * $_sizes[2];
|
||||
|
||||
$logoImage = \IPS\Image::create( $originalContents );
|
||||
$canvas = \IPS\Image::newImageCanvas( $width, $height, $rgb );
|
||||
|
||||
$logoImage->resizeToMax( $width - static::MINIMUM_STARTUP_IMAGE_PADDING, $height - static::MINIMUM_STARTUP_IMAGE_PADDING );
|
||||
|
||||
$xPos = ( $width - $logoImage->width ) / 2;
|
||||
$yPos = ( $height - $logoImage->height ) / 2;
|
||||
|
||||
$canvas->impose( $logoImage, $xPos, $yPos );
|
||||
|
||||
if( $canvas::exifSupported() )
|
||||
{
|
||||
$canvas->setExifData( $originalContents );
|
||||
}
|
||||
|
||||
$setting[ $filename ] = array(
|
||||
'url' => (string) \IPS\File::create( 'core_Icons', $filename . '.png', (string) $canvas, NULL, TRUE, NULL, FALSE ),
|
||||
'width' => $canvas->width,
|
||||
'height' => $canvas->height,
|
||||
'density' => $_sizes[2],
|
||||
'orientation' => $_sizes[3],
|
||||
);
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
\IPS\Log::log( $e, 'apple-startup-image' );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Are we done? */
|
||||
if( $did == \count( $sizes ) )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
\IPS\Settings::i()->changeValues( array( 'icons_apple_startup' => json_encode( $setting ) ) );
|
||||
}
|
||||
|
||||
return array( $data, \IPS\Member::loggedIn()->language()->addToStack('build_start_images_title'), ( $did ) ? round( ( 100 / \count( $sizes ) * $did ), 2 ) : 0 );
|
||||
},
|
||||
function() use( $self )
|
||||
{
|
||||
\IPS\Output::i()->redirect( $self->url, 'completed' );
|
||||
}
|
||||
);
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('build_start_images_title');
|
||||
\IPS\Output::i()->output = $multiRedirect;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user