2019-07-18 00:02:07 +08:00
const StartScreen = { } ;
2019-12-16 03:04:31 +08:00
var ColorPanel ;
2019-07-18 00:02:07 +08:00
//Panels
2020-07-16 15:32:59 +08:00
2019-07-18 00:02:07 +08:00
class ResizeLine {
constructor ( data ) {
var scope = this ;
this . id = data . id
this . horizontal = data . horizontal === true
this . position = data . position
this . condition = data . condition
this . width = 0 ;
var jq = $ ( '<div class="resizer ' + ( data . horizontal ? 'horizontal' : 'vertical' ) + '"></div>' )
this . node = jq . get ( 0 )
jq . draggable ( {
2020-04-26 02:25:07 +08:00
axis : this . horizontal ? 'y' : 'x' ,
2019-09-06 06:16:54 +08:00
containment : '#page_wrapper' ,
2019-07-18 00:02:07 +08:00
revert : true ,
2020-04-26 02:25:07 +08:00
revertDuration : 0 ,
2019-07-18 00:02:07 +08:00
start : function ( e , u ) {
scope . before = data . get ( )
} ,
drag : function ( e , u ) {
if ( scope . horizontal ) {
data . set ( scope . before , u . position . top - u . originalPosition . top )
} else {
2020-04-26 02:25:07 +08:00
data . set ( scope . before , ( u . position . left - u . originalPosition . left ) )
2019-07-18 00:02:07 +08:00
}
updateInterface ( )
} ,
stop : function ( e , u ) {
updateInterface ( )
}
} )
}
update ( ) {
if ( BARS . condition ( this . condition ) ) {
$ ( this . node ) . show ( )
if ( this . position ) {
this . position ( this )
}
} else {
$ ( this . node ) . hide ( )
}
}
setPosition ( data ) {
var jq = $ ( this . node )
jq . css ( 'top' , data . top !== undefined ? data . top + 'px' : '' )
jq . css ( 'bottom' , data . bottom !== undefined ? data . bottom + 'px' : '' )
jq . css ( 'left' , data . left !== undefined ? data . left + 'px' : '' )
jq . css ( 'right' , data . right !== undefined ? data . right + 'px' : '' )
if ( data . top !== undefined ) {
jq . css ( 'top' , data . top + 'px' )
}
if ( data . bottom !== undefined && ( ! data . horizontal || data . top === undefined ) ) {
jq . css ( 'bottom' , data . bottom + 'px' )
}
if ( data . left !== undefined ) {
jq . css ( 'left' , data . left + 'px' )
}
if ( data . right !== undefined && ( data . horizontal || data . left === undefined ) ) {
jq . css ( 'right' , data . right + 'px' )
}
}
}
2020-07-16 15:32:59 +08:00
const Interface = {
2019-07-18 00:02:07 +08:00
default _data : {
left _bar _width : 332 ,
2019-07-26 19:33:29 +08:00
right _bar _width : 314 ,
2019-07-18 00:02:07 +08:00
quad _view _x : 50 ,
quad _view _y : 50 ,
2019-08-18 00:26:14 +08:00
timeline _height : 260 ,
2019-07-18 00:02:07 +08:00
left _bar : [ 'uv' , 'textures' , 'display' , 'animations' , 'keyframe' , 'variable_placeholders' ] ,
2020-09-16 17:11:29 +08:00
right _bar : [ 'element' , 'bone' , 'color' , 'outliner' , 'chat' ]
2019-07-18 00:02:07 +08:00
} ,
Resizers : {
left : new ResizeLine ( {
id : 'left' ,
condition : function ( ) {
2020-07-16 15:32:59 +08:00
for ( let p of Interface . data . left _bar ) {
if ( Interface . Panels [ p ] && BARS . condition ( Interface . Panels [ p ] . condition ) ) {
return true ;
}
}
2019-07-18 00:02:07 +08:00
} ,
get : function ( ) { return Interface . data . left _bar _width } ,
set : function ( o , diff ) {
2020-04-26 02:25:07 +08:00
let calculated = limitNumber ( o + diff , 128 , $ ( window ) . width ( ) - 120 - Interface . data . right _bar _width )
Interface . data . left _bar _width = Math . snapToValues ( calculated , [ Interface . default _data . left _bar _width ] , 16 ) ;
2019-07-18 00:02:07 +08:00
} ,
position : function ( line ) {
line . setPosition ( {
2020-04-26 02:25:07 +08:00
top : 26 ,
2019-07-18 00:02:07 +08:00
bottom : 0 ,
2020-04-26 02:25:07 +08:00
left : Interface . data . left _bar _width + 2
2019-07-18 00:02:07 +08:00
} )
}
} ) ,
right : new ResizeLine ( {
id : 'right' ,
condition : function ( ) {
2020-07-16 15:32:59 +08:00
for ( let p of Interface . data . right _bar ) {
if ( Interface . Panels [ p ] && BARS . condition ( Interface . Panels [ p ] . condition ) ) {
return true ;
}
}
2019-07-18 00:02:07 +08:00
} ,
get : function ( ) { return Interface . data . right _bar _width } ,
set : function ( o , diff ) {
2020-04-26 02:25:07 +08:00
let calculated = limitNumber ( o - diff , 128 , $ ( window ) . width ( ) - 120 - Interface . data . left _bar _width ) ;
Interface . data . right _bar _width = Math . snapToValues ( calculated , [ Interface . default _data . right _bar _width ] , 12 ) ;
2019-07-18 00:02:07 +08:00
} ,
position : function ( line ) {
line . setPosition ( {
2020-04-26 02:25:07 +08:00
top : 56 ,
2019-07-18 00:02:07 +08:00
bottom : 0 ,
2020-04-26 02:25:07 +08:00
right : Interface . data . right _bar _width - 2
2019-07-18 00:02:07 +08:00
} )
}
} ) ,
quad _view _x : new ResizeLine ( {
id : 'quad_view_x' ,
condition : function ( ) { return quad _previews . enabled } ,
get : function ( ) { return Interface . data . quad _view _x } ,
set : function ( o , diff ) { Interface . data . quad _view _x = limitNumber ( o + diff / $ ( '#preview' ) . width ( ) * 100 , 5 , 95 ) } ,
2019-08-18 00:26:14 +08:00
position : function ( line ) {
var p = document . getElementById ( 'preview' )
line . setPosition ( {
top : 32 ,
bottom : p ? window . innerHeight - ( p . clientHeight + p . offsetTop ) : 0 ,
left : Interface . data . left _bar _width + $ ( '#preview' ) . width ( ) * Interface . data . quad _view _x / 100
}
) }
2019-07-18 00:02:07 +08:00
} ) ,
quad _view _y : new ResizeLine ( {
id : 'quad_view_y' ,
horizontal : true ,
condition : function ( ) { return quad _previews . enabled } ,
get : function ( ) { return Interface . data . quad _view _y } ,
set : function ( o , diff ) {
Interface . data . quad _view _y = limitNumber ( o + diff / $ ( '#preview' ) . height ( ) * 100 , 5 , 95 )
} ,
position : function ( line ) { line . setPosition ( {
left : Interface . data . left _bar _width + 2 ,
right : Interface . data . right _bar _width + 2 ,
top : $ ( '#preview' ) . offset ( ) . top + $ ( '#preview' ) . height ( ) * Interface . data . quad _view _y / 100
} ) }
2019-08-18 00:26:14 +08:00
} ) ,
timeline : new ResizeLine ( {
id : 'timeline' ,
horizontal : true ,
condition : function ( ) { return Modes . animate } ,
get : function ( ) { return Interface . data . timeline _height } ,
set : function ( o , diff ) {
Interface . data . timeline _height = limitNumber ( o - diff , 150 , document . body . clientHeight - 120 )
} ,
position : function ( line ) { line . setPosition ( {
left : Interface . data . left _bar _width + 2 ,
right : Interface . data . right _bar _width + 2 ,
top : $ ( '#timeline' ) . offset ( ) . top
} ) }
2019-07-18 00:02:07 +08:00
} )
} ,
status _bar : { } ,
Panels : { }
}
2020-09-22 05:23:42 +08:00
Interface . panel _definers = [ ]
Interface . definePanels = function ( callback ) {
Interface . panel _definers . push ( callback ) ;
}
2019-07-18 00:02:07 +08:00
//Misc
function unselectInterface ( event ) {
if ( open _menu && $ ( '.contextMenu' ) . find ( event . target ) . length === 0 && $ ( '.menu_bar_point.opened:hover' ) . length === 0 ) {
open _menu . hide ( ) ;
}
if ( ActionControl . open && $ ( '#action_selector' ) . find ( event . target ) . length === 0 ) {
ActionControl . hide ( ) ;
}
if ( $ ( event . target ) . is ( 'input.cube_name:not([disabled])' ) === false && Blockbench . hasFlag ( 'renaming' ) ) {
stopRenameOutliner ( )
}
}
function setupInterface ( ) {
Interface . data = $ . extend ( true , { } , Interface . default _data )
var interface _data = localStorage . getItem ( 'interface_data' )
try {
interface _data = JSON . parse ( interface _data )
var old _data = Interface . data
2019-08-01 06:01:47 +08:00
if ( interface _data . left _bar ) Interface . data . left _bar = interface _data . left _bar ;
if ( interface _data . right _bar ) Interface . data . right _bar = interface _data . right _bar ;
2019-07-18 00:02:07 +08:00
$ . extend ( true , Interface . data , interface _data )
} catch ( err ) { }
if ( ! Language . loading _steps ) {
Language . loading _steps = true ;
} else {
translateUI ( )
}
$ ( '.edit_session_active' ) . hide ( )
2020-03-05 03:56:17 +08:00
$ ( '#center' ) . toggleClass ( 'checkerboard' , settings . preview _checkerboard . value ) ;
2020-07-16 15:32:59 +08:00
setupPanels ( )
2020-10-11 22:54:52 +08:00
2020-10-22 00:31:26 +08:00
if ( Blockbench . isMobile && window . setupMobilePanelSelector ) {
2020-10-11 22:54:52 +08:00
setupMobilePanelSelector ( )
}
2019-07-18 00:02:07 +08:00
for ( var key in Interface . Resizers ) {
var resizer = Interface . Resizers [ key ]
$ ( '#page_wrapper' ) . append ( resizer . node )
}
//$(document).contextmenu()
//Tooltip Fix
2019-08-18 00:26:14 +08:00
$ ( document ) . on ( 'mouseenter' , '.tool' , function ( ) {
2019-07-18 00:02:07 +08:00
var tooltip = $ ( this ) . find ( 'div.tooltip' )
if ( ! tooltip || typeof tooltip . offset ( ) !== 'object' ) return ;
//Left
if ( tooltip . css ( 'left' ) === '-4px' ) {
tooltip . css ( 'left' , 'auto' )
}
if ( - tooltip . offset ( ) . left > 4 ) {
tooltip . css ( 'left' , '-4px' )
}
//Right
if ( tooltip . css ( 'right' ) === '-4px' ) {
tooltip . css ( 'right' , 'auto' )
}
2019-08-18 00:26:14 +08:00
2019-07-18 00:02:07 +08:00
if ( ( tooltip . offset ( ) . left + tooltip . width ( ) ) - $ ( window ) . width ( ) > 4 ) {
tooltip . css ( 'right' , '-4px' )
2019-08-18 00:26:14 +08:00
} else if ( $ ( this ) . parent ( ) . css ( 'position' ) == 'relative' ) {
tooltip . css ( 'right' , '0' )
2019-07-18 00:02:07 +08:00
}
} )
var stats _bar _vue = new Vue ( {
el : '#status_bar' ,
data : { Prop }
} )
//Clickbinds
$ ( 'header' ) . click ( function ( ) { setActivePanel ( 'header' ) } )
$ ( '#preview' ) . click ( function ( ) { setActivePanel ( 'preview' ) } )
$ ( 'ul#cubes_list' ) . click ( function ( event ) {
if ( event . target === document . getElementById ( 'cubes_list' ) ) {
unselectAll ( )
}
} )
$ ( '#texture_list' ) . click ( function ( ) {
unselectTextures ( )
} )
$ ( '#timeline' ) . mousedown ( ( event ) => {
setActivePanel ( 'timeline' ) ;
} )
2019-12-16 03:04:31 +08:00
$ ( document ) . on ( 'mousedown touchstart' , unselectInterface )
2019-07-18 00:02:07 +08:00
$ ( '.context_handler' ) . on ( 'click' , function ( ) {
$ ( this ) . addClass ( 'ctx' )
} )
$ ( document ) . contextmenu ( function ( event ) {
if ( ! $ ( event . target ) . hasClass ( 'allow_default_menu' ) ) {
/ * i f ( e v e n t . t a r g e t . n o d e N a m e = = = ' I N P U T ' & & $ ( e v e n t . t a r g e t ) . i s ( ' : f o c u s ' ) ) {
Interface . text _edit _menu . open ( event , event . target )
} * /
return false ;
}
} )
//Scrolling
$ ( 'input[type="range"]' ) . on ( 'mousewheel' , function ( ) {
var obj = $ ( event . target )
var factor = event . deltaY > 0 ? - 1 : 1
var val = parseFloat ( obj . val ( ) ) + parseFloat ( obj . attr ( 'step' ) ) * factor
val = limitNumber ( val , obj . attr ( 'min' ) , obj . attr ( 'max' ) )
if ( obj . attr ( 'trigger_type' ) ) {
DisplayMode . scrollSlider ( obj . attr ( 'trigger_type' ) , val , obj )
return ;
}
obj . val ( val )
eval ( obj . attr ( 'oninput' ) )
eval ( obj . attr ( 'onmouseup' ) )
} )
//Mousemove
$ ( document ) . mousemove ( function ( event ) {
mouse _pos . x = event . clientX
mouse _pos . y = event . clientY
} )
updateInterface ( )
}
function updateInterface ( ) {
BARS . updateConditions ( )
MenuBar . update ( )
resizeWindow ( )
localStorage . setItem ( 'interface_data' , JSON . stringify ( Interface . data ) )
}
function updateInterfacePanels ( ) {
$ ( '#page_wrapper' ) . css (
'grid-template-columns' ,
Interface . data . left _bar _width + 'px auto ' + Interface . data . right _bar _width + 'px'
)
for ( var key in Interface . Panels ) {
var panel = Interface . Panels [ key ]
panel . update ( )
}
var left _width = $ ( '.sidebar#left_bar > .panel:visible' ) . length ? Interface . data . left _bar _width : 0
var right _width = $ ( '.sidebar#right_bar > .panel:visible' ) . length ? Interface . data . right _bar _width : 0
if ( ! left _width || ! right _width ) {
$ ( '#page_wrapper' ) . css (
'grid-template-columns' ,
left _width + 'px auto ' + right _width + 'px'
)
}
$ ( '.quad_canvas_wrapper.qcw_x' ) . css ( 'width' , Interface . data . quad _view _x + '%' )
$ ( '.quad_canvas_wrapper.qcw_y' ) . css ( 'height' , Interface . data . quad _view _y + '%' )
$ ( '.quad_canvas_wrapper:not(.qcw_x)' ) . css ( 'width' , ( 100 - Interface . data . quad _view _x ) + '%' )
$ ( '.quad_canvas_wrapper:not(.qcw_y)' ) . css ( 'height' , ( 100 - Interface . data . quad _view _y ) + '%' )
2019-08-18 00:26:14 +08:00
$ ( '#timeline' ) . css ( 'height' , Interface . data . timeline _height + 'px' )
2019-07-18 00:02:07 +08:00
for ( var key in Interface . Resizers ) {
var resizer = Interface . Resizers [ key ]
resizer . update ( )
}
}
function resizeWindow ( event ) {
2020-07-16 15:32:59 +08:00
if ( ! Preview . all || ( event && event . target && event . target !== window ) ) {
2019-07-18 00:02:07 +08:00
return ;
}
if ( Animator . open ) {
Timeline . updateSize ( )
}
if ( Interface . data ) {
updateInterfacePanels ( )
}
2020-07-16 15:32:59 +08:00
Preview . all . forEach ( function ( prev ) {
2019-07-18 00:02:07 +08:00
if ( prev . canvas . isConnected ) {
prev . resize ( )
}
} )
var dialog = $ ( 'dialog#' + open _dialog )
if ( dialog . length ) {
if ( dialog . outerWidth ( ) + dialog . offset ( ) . left > window . innerWidth ) {
dialog . css ( 'left' , limitNumber ( window . innerWidth - dialog . outerWidth ( ) , 0 , 4e3 ) + 'px' )
}
if ( dialog . outerHeight ( ) + dialog . offset ( ) . top > window . innerHeight ) {
dialog . css ( 'top' , limitNumber ( window . innerHeight - dialog . outerHeight ( ) , 0 , 4e3 ) + 'px' )
}
}
2020-10-22 00:31:26 +08:00
BARS . updateToolToolbar ( ) ;
Blockbench . dispatchEvent ( 'resize_window' , event ) ;
2019-07-18 00:02:07 +08:00
}
2019-12-16 03:04:31 +08:00
$ ( window ) . on ( 'resize orientationchange' , resizeWindow )
2019-07-18 00:02:07 +08:00
function setProjectTitle ( title ) {
if ( Format . bone _rig && Project . geometry _name ) {
title = Project . geometry _name
}
if ( title ) {
Prop . file _name = Prop . file _name _alt = title
if ( ! Project . name ) {
Project . name = title
}
if ( Format . bone _rig ) {
title = title . replace ( /^geometry\./ , '' ) . replace ( /:[a-z0-9.]+/ , '' )
}
$ ( 'title' ) . text ( title + ' - Blockbench' )
} else {
Prop . file _name = Prop . file _name _alt = ''
$ ( 'title' ) . text ( 'Blockbench' )
}
}
//Zoom
function setZoomLevel ( mode ) {
if ( Prop . active _panel === 'uv' ) {
var zoom = main _uv . zoom
switch ( mode ) {
case 'in' : zoom *= 1.5 ; break ;
case 'out' : zoom *= 0.66 ; break ;
case 'reset' : zoom = 1 ; break ;
}
zoom = limitNumber ( zoom , 1 , 4 )
main _uv . setZoom ( zoom )
} else if ( isApp ) {
switch ( mode ) {
case 'in' : Prop . zoom += 5 ; break ;
case 'out' : Prop . zoom -= 5 ; break ;
case 'reset' : Prop . zoom = 100 ; break ;
}
var level = ( Prop . zoom - 100 ) / 12
currentwindow . webContents . setZoomLevel ( level )
resizeWindow ( )
}
}
//Dialogs
function showDialog ( dialog ) {
var obj = $ ( '.dialog#' + dialog )
$ ( '.dialog' ) . hide ( 0 )
if ( open _menu ) {
open _menu . hide ( )
}
$ ( '#blackout' ) . fadeIn ( 0 )
obj . fadeIn ( 0 )
open _dialog = dialog
open _interface = dialog
Prop . active _panel = 'dialog'
//Draggable
if ( obj . hasClass ( 'draggable' ) ) {
obj . draggable ( {
handle : ".dialog_handle" ,
2019-09-06 06:16:54 +08:00
containment : '#page_wrapper'
2019-07-18 00:02:07 +08:00
} )
2019-07-19 23:31:22 +08:00
var x = ( $ ( window ) . width ( ) - obj . outerWidth ( ) ) / 2 ;
var top = ( $ ( window ) . height ( ) - obj . outerHeight ( ) ) / 2 ;
2019-07-18 00:02:07 +08:00
obj . css ( 'left' , x + 'px' )
obj . css ( 'top' , 'px' )
obj . css ( 'max-height' , ( $ ( window ) . height ( ) - 128 ) + 'px' )
}
}
function hideDialog ( ) {
$ ( '#blackout' ) . fadeOut ( 0 )
$ ( '.dialog' ) . fadeOut ( 0 )
open _dialog = false ;
open _interface = false ;
Prop . active _panel = undefined
}
function setSettingsTab ( tab ) {
$ ( '#settings .tab.open' ) . removeClass ( 'open' )
$ ( '#settings .tab#' + tab ) . addClass ( 'open' )
$ ( '#settings .tab_content' ) . addClass ( 'hidden' )
$ ( '#settings .tab_content#' + tab ) . removeClass ( 'hidden' )
if ( tab === 'keybindings' ) {
//Keybinds
$ ( '#keybindlist' ) . css ( 'max-height' , ( $ ( window ) . height ( ) - 420 ) + 'px' )
2019-12-16 03:04:31 +08:00
$ ( '#keybind_search_bar' ) . focus ( )
2019-07-18 00:02:07 +08:00
} else if ( tab === 'setting' ) {
//Settings
$ ( '#settingslist' ) . css ( 'max-height' , ( $ ( window ) . height ( ) - 420 ) + 'px' )
2019-12-16 03:04:31 +08:00
$ ( '#settings_search_bar' ) . focus ( )
2019-07-18 00:02:07 +08:00
2019-12-16 03:04:31 +08:00
} else if ( tab === 'layout_settings' ) {
//Layout
2019-07-18 00:02:07 +08:00
2019-12-16 03:04:31 +08:00
$ ( '#theme_editor' ) . css ( 'max-height' , ( $ ( window ) . height ( ) - 420 ) + 'px' )
2020-07-16 15:32:59 +08:00
} else if ( tab == 'credits' ) {
// About
$ ( '#version_tag' ) . text ( appVersion )
if ( isApp ) {
jQuery . ajax ( {
url : 'https://api.github.com/repos/JannisX11/blockbench/releases/latest' ,
cache : false ,
type : 'GET' ,
success ( release ) {
let v = release . tag _name . replace ( /^v/ , '' ) ;
if ( compareVersions ( v , appVersion ) ) {
$ ( '#version_tag' ) . text ( ` ${ appVersion } ( ${ tl ( 'about.version.update_available' , [ v ] ) } ) ` )
} else if ( compareVersions ( appVersion , v ) ) {
$ ( '#version_tag' ) . text ( ` ${ appVersion } (Pre-release) ` )
} else {
$ ( '#version_tag' ) . text ( ` ${ appVersion } ( ${ tl ( 'about.version.up_to_date' ) } 😄) ` )
}
} ,
error ( err ) {
}
} )
}
2019-07-18 00:02:07 +08:00
}
}
//UI Edit
function setProgressBar ( id , val , time ) {
if ( ! id || id === 'main' ) {
Prop . progress = val
} else {
$ ( '#' + id + ' > .progress_bar_inner' ) . animate ( { width : val * 488 } , time - 1 )
}
if ( isApp ) {
currentwindow . setProgressBar ( val )
}
}
//Tooltip
function showShiftTooltip ( ) {
$ ( ':hover' ) . find ( '.tooltip_shift' ) . css ( 'display' , 'inline' )
}
$ ( document ) . keyup ( function ( event ) {
if ( event . which === 16 ) {
$ ( '.tooltip_shift' ) . hide ( )
}
} )
//Start Screen
2020-07-16 15:32:59 +08:00
function addStartScreenSection ( id , data ) {
if ( typeof id == 'object' ) {
data = id ;
id = '' ;
}
var obj = $ ( ` <section id=" ${ id } "></section> ` )
2019-07-18 00:02:07 +08:00
if ( typeof data . graphic === 'object' ) {
var left = $ ( '<left class="graphic"></left>' )
obj . append ( left )
if ( data . graphic . type === 'icon' ) {
var icon = Blockbench . getIconNode ( data . graphic . icon )
$ ( icon ) . addClass ( 'graphic_icon' )
left . append ( icon )
} else {
left . css ( 'background-image' , ` url(' ${ data . graphic . source } ') ` )
}
if ( data . graphic . width ) {
left . css ( 'width' , data . graphic . width + 'px' ) . css ( 'flex-shrink' , '0' ) ;
}
if ( data . graphic . width && data . graphic . height && Blockbench . isMobile ) {
left . css ( 'height' , '0' )
. css ( 'padding-top' , '0' )
. css ( 'padding-bottom' , ( data . graphic . height / data . graphic . width * 100 ) + '%' )
} else {
if ( data . graphic . height ) left . css ( 'height' , data . graphic . height + 'px' ) ;
if ( data . graphic . width && ! data . graphic . height ) left . css ( 'height' , data . graphic . width + 'px' ) ;
}
}
if ( data . text instanceof Array ) {
var right = $ ( '<right></right>' )
obj . append ( right )
data . text . forEach ( line => {
var content = line . text ? marked ( tl ( line . text ) ) : '' ;
switch ( line . type ) {
case 'h1' : var tag = 'h3' ; break ;
case 'h2' : var tag = 'h4' ; break ;
case 'list' :
var tag = 'ul class="list_style"' ;
line . list . forEach ( string => {
content += ` <li> ${ marked ( tl ( string ) ) } </li> ` ;
} )
break ;
case 'button' : var tag = 'button' ; break ;
default : var tag = 'p' ; break ;
}
var l = $ ( ` < ${ tag } > ${ content } </ ${ tag . split ( ' ' ) [ 0 ] } > ` ) ;
if ( typeof line . click == 'function' ) {
l . click ( line . click ) ;
}
right . append ( l ) ;
} )
}
if ( data . closable !== false ) {
obj . append ( ` <i class="material-icons start_screen_close_button">clear</i> ` ) ;
obj . find ( 'i.start_screen_close_button' ) . click ( ( e ) => {
obj . detach ( )
} ) ;
}
if ( data . color ) {
obj . css ( 'background-color' , data . color ) ;
2019-12-16 03:04:31 +08:00
if ( data . color == 'var(--color-bright_ui)' ) {
obj . addClass ( 'bright_ui' )
}
2019-07-18 00:02:07 +08:00
}
if ( data . text _color ) {
obj . css ( 'color' , data . text _color ) ;
}
if ( data . last ) {
$ ( '#start_screen content' ) . append ( obj ) ;
} else {
$ ( '#start_screen content' ) . prepend ( obj ) ;
}
}
( function ( ) {
var news _call = $ . getJSON ( 'https://blockbench.net/api/news/news.json' )
Promise . all ( [ news _call , documentReady ] ) . then ( ( data ) => {
if ( ! data || ! data [ 0 ] ) return ;
data = data [ 0 ] ;
//Update Screen
if ( Blockbench . hasFlag ( 'after_update' ) && data . new _version ) {
addStartScreenSection ( data . new _version )
}
if ( data . psa ) {
2020-07-27 00:03:16 +08:00
( function ( ) {
if ( typeof data . psa . version == 'string' ) {
if ( data . psa . version . includes ( '-' ) ) {
limits = data . psa . version . split ( '-' ) ;
if ( limits [ 0 ] && compareVersions ( limits [ 0 ] , Blockbench . version ) ) return ;
if ( limits [ 1 ] && compareVersions ( Blockbench . version , limits [ 1 ] ) ) return ;
} else {
if ( data . psa . version != Blockbench . version ) return ;
}
}
addStartScreenSection ( data . psa )
} ) ( )
2019-07-18 00:02:07 +08:00
}
} )
documentReady . then ( ( ) => {
2019-12-16 03:04:31 +08:00
Blockbench . startup _count = parseInt ( localStorage . getItem ( 'startups' ) || 0 )
2019-07-18 00:02:07 +08:00
//Backup Model
if ( localStorage . getItem ( 'backup_model' ) && ( ! isApp || ! currentwindow . webContents . second _instance ) ) {
var backup _model = localStorage . getItem ( 'backup_model' )
localStorage . removeItem ( 'backup_model' )
addStartScreenSection ( {
color : 'var(--color-back)' ,
graphic : { type : 'icon' , icon : 'fa-archive' } ,
text : [
{ type : 'h1' , text : tl ( 'message.recover_backup.title' ) } ,
{ text : tl ( 'message.recover_backup.message' ) } ,
{ type : 'button' , text : tl ( 'dialog.ok' ) , click : ( e ) => {
loadModelFile ( { content : backup _model , path : 'backup.bbmodel' , no _file : true } )
} }
]
} )
}
2020-07-16 15:32:59 +08:00
if ( settings . streamer _mode . value ) {
updateStreamerModeNotification ( )
}
2019-07-18 00:02:07 +08:00
2019-07-19 23:31:22 +08:00
//Electron
2020-04-26 02:25:07 +08:00
if ( isApp && ! compareVersions ( process . versions . electron , '6.0.0' ) ) {
2019-07-19 23:31:22 +08:00
addStartScreenSection ( {
graphic : { type : 'icon' , icon : 'fas.fa-atom' } ,
text : [
{ type : 'h1' , text : 'Electron Update Recommended' } ,
{ text : 'Your Blockbench is using an old version of Electron. Install the latest version to get the best performance and newest features. Just run the latest Blockbench installer. This only takes a minute and will not affect your custom settings.' } ,
{ text : '[Blockbench Downloads](https://blockbench.net/downloads/)' }
]
} )
}
2020-07-25 03:13:25 +08:00
//Twitter
let twitter _ad ;
if ( Blockbench . startup _count < 20 && Blockbench . startup _count % 5 === 4 ) {
twitter _ad = true ;
2019-07-18 00:02:07 +08:00
addStartScreenSection ( {
2020-07-25 03:13:25 +08:00
color : '#1da1f2' ,
2019-07-18 00:02:07 +08:00
text _color : '#ffffff' ,
2020-07-25 03:13:25 +08:00
graphic : { type : 'icon' , icon : 'fab.fa-twitter' } ,
2019-07-18 00:02:07 +08:00
text : [
2020-07-25 03:13:25 +08:00
{ type : 'h1' , text : 'Blockbench on Twitter' } ,
{ text : 'Follow Blockbench on Twitter for the latest news as well as cool models from the community! [twitter.com/blockbench](https://twitter.com/blockbench/)' }
2019-07-18 00:02:07 +08:00
] ,
last : true
} )
}
2020-07-25 03:13:25 +08:00
//Discord
if ( Blockbench . startup _count < 6 && ! twitter _ad ) {
2020-04-26 02:25:07 +08:00
addStartScreenSection ( {
2020-07-25 03:13:25 +08:00
color : '#7289da' ,
2020-04-26 02:25:07 +08:00
text _color : '#ffffff' ,
2020-07-25 03:13:25 +08:00
graphic : { type : 'icon' , icon : 'fab.fa-discord' } ,
2020-04-26 02:25:07 +08:00
text : [
2020-07-25 03:13:25 +08:00
{ type : 'h1' , text : 'Discord Server' } ,
{ text : 'You need help with modeling or you want to chat about Blockbench? Join the [Modeling Discord](https://discord.gg/WVHg5kH)!' }
2020-04-26 02:25:07 +08:00
] ,
last : true
} )
}
2019-07-18 00:02:07 +08:00
} )
} ) ( )
onVueSetup ( function ( ) {
2020-07-16 15:32:59 +08:00
StateMemory . init ( 'start_screen_list_type' , 'string' )
2019-07-18 00:02:07 +08:00
StartScreen . vue = new Vue ( {
el : '#start_screen' ,
data : {
formats : Formats ,
2020-07-16 15:32:59 +08:00
recent : isApp ? recent _projects : [ ] ,
list _type : StateMemory . start _screen _list _type || 'list' ,
redact _names : settings . streamer _mode . value ,
isApp
2019-07-18 00:02:07 +08:00
} ,
methods : {
getDate ( p ) {
if ( p . day ) {
2020-01-24 01:53:36 +08:00
var diff = ( 365e10 + Blockbench . openTime . dayOfYear ( ) - p . day ) % 365 ;
2019-07-18 00:02:07 +08:00
if ( diff <= 0 ) {
return tl ( 'dates.today' ) ;
} else if ( diff == 1 ) {
return tl ( 'dates.yesterday' ) ;
} else if ( diff <= 7 ) {
return tl ( 'dates.this_week' ) ;
} else {
return tl ( 'dates.weeks_ago' , [ Math . ceil ( diff / 7 ) ] ) ;
}
} else {
return '-'
}
} ,
openProject : function ( p , event ) {
Blockbench . read ( [ p . path ] , { } , files => {
loadModelFile ( files [ 0 ] ) ;
} )
2020-07-16 15:32:59 +08:00
} ,
getThumbnail ( model _path ) {
let hash = model _path . hashCode ( ) . toString ( ) . replace ( /^-/ , '0' ) ;
let path = PathModule . join ( app . getPath ( 'userData' ) , 'thumbnails' , ` ${ hash } .png ` ) ;
if ( ! fs . existsSync ( path ) ) return 'none'
path = ` url(' ${ path . replace ( /\\/g , '/' ) } ? ${ Math . round ( Math . random ( ) * 255 ) } ') ` ;
return path ;
} ,
setListType ( type ) {
this . list _type = type ;
StateMemory . start _screen _list _type = type ;
StateMemory . save ( 'start_screen_list_type' )
2019-07-18 00:02:07 +08:00
}
}
} )
} )