kopia lustrzana https://github.com/backface/turtlestitch
				
				
				
			Merge branch 'master' of https://github.com/jmoenig/Snap--Build-Your-Own-Blocks into newer-cloud
						commit
						f5c2a334be
					
				
							
								
								
									
										185
									
								
								cloud.js
								
								
								
								
							
							
						
						
									
										185
									
								
								cloud.js
								
								
								
								
							|  | @ -5,9 +5,9 @@ | |||
|     a backend API for SNAP! | ||||
| 
 | ||||
|     written by Bernat Romagosa | ||||
|     inspired in the old cloud API by Jens Mönig | ||||
|     inspired by the original cloud API by Jens Mönig | ||||
| 
 | ||||
|     Copyright (C) 2017 by Bernat Romagosa | ||||
|     Copyright (C) 2018 by Bernat Romagosa | ||||
|     Copyright (C) 2015 by Jens Mönig | ||||
| 
 | ||||
|     This file is part of Snap!. | ||||
|  | @ -29,25 +29,27 @@ | |||
| 
 | ||||
| // Global settings /////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| /*global modules, IDE_Morph, SnapSerializer, nop, localize*/ | ||||
| /*global modules, SnapSerializer, nop, hex_sha512, DialogBoxMorph, Color*/ | ||||
| 
 | ||||
| modules.cloud = '2015-December-15'; | ||||
| modules.cloud = '2018-February-08'; | ||||
| 
 | ||||
| // Global stuff
 | ||||
| 
 | ||||
| var Cloud; | ||||
| var SnapCloud; | ||||
| 
 | ||||
| // Cloud /////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| function Cloud(url) { | ||||
|     this.init(url); | ||||
| }; | ||||
| } | ||||
| 
 | ||||
| Cloud.prototype.init = function (url) { | ||||
|     this.url = url; | ||||
|     this.username = null; | ||||
| }; | ||||
| 
 | ||||
| SnapCloud = new Cloud('https://snap-cloud.cs10.org'); | ||||
| 
 | ||||
| // Dictionary handling
 | ||||
| 
 | ||||
|  | @ -92,7 +94,6 @@ Cloud.prototype.genericError = function () { | |||
|     throw new Error(Cloud.genericErrorMessage); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // Low level functionality
 | ||||
| 
 | ||||
| Cloud.prototype.request = function ( | ||||
|  | @ -186,7 +187,6 @@ Cloud.prototype.withCredentialsRequest = function ( | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // Credentials management
 | ||||
| 
 | ||||
| Cloud.prototype.initSession = function (onSuccess) { | ||||
|  | @ -208,18 +208,32 @@ Cloud.prototype.checkCredentials = function (onSuccess, onError) { | |||
|             if (user.username) { | ||||
|                 myself.username = user.username; | ||||
|             } | ||||
|             if (onSuccess) { onSuccess.call(null, user.username, user.isadmin); } | ||||
|             if (onSuccess) { | ||||
|             	onSuccess.call(null, user.username, user.isadmin); | ||||
|             } | ||||
|         }, | ||||
|         onError | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.getCurrentUser = function (onSuccess, onError) { | ||||
|     this.request('GET', '/users/c', onSuccess, onError, 'Could not retrieve current user'); | ||||
|     this.request( | ||||
|     	'GET', | ||||
|         '/users/c', | ||||
|         onSuccess, | ||||
|         onError, | ||||
|         'Could not retrieve current user' | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.getUser = function (username, onSuccess, onError) { | ||||
|     this.request('GET', '/users/' + username, onSuccess, onError, 'Could not retrieve user'); | ||||
|     this.request( | ||||
|     	'GET', | ||||
|         '/users/' + username, | ||||
|         onSuccess, | ||||
|         onError, | ||||
|         'Could not retrieve user' | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.logout = function (onSuccess, onError) { | ||||
|  | @ -233,7 +247,13 @@ Cloud.prototype.logout = function (onSuccess, onError) { | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.login = function (username, password, persist, onSuccess, onError) { | ||||
| Cloud.prototype.login = function ( | ||||
| 	username, | ||||
|     password, | ||||
|     persist, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     var myself = this; | ||||
|     this.request( | ||||
|         'POST', | ||||
|  | @ -251,7 +271,14 @@ Cloud.prototype.login = function (username, password, persist, onSuccess, onErro | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.signup = function (username, password, passwordRepeat, email, onSuccess, onError) { | ||||
| Cloud.prototype.signup = function ( | ||||
| 	username, | ||||
|     password, | ||||
|     passwordRepeat, | ||||
|     email, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this.request( | ||||
|         'POST', | ||||
|         '/users/' + username + '?' + this.encodeDict({ | ||||
|  | @ -264,7 +291,13 @@ Cloud.prototype.signup = function (username, password, passwordRepeat, email, on | |||
|         'signup failed'); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.changePassword = function (password, newPassword, passwordRepeat, onSuccess, onError) { | ||||
| Cloud.prototype.changePassword = function ( | ||||
| 	password, | ||||
|     newPassword, | ||||
|     passwordRepeat, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this.withCredentialsRequest( | ||||
|         'POST', | ||||
|         '/users/%username/newpassword?' + this.encodeDict({ | ||||
|  | @ -319,21 +352,31 @@ Cloud.prototype.saveProject = function (ide, onSuccess, onError) { | |||
|                 try { | ||||
|                     ide.serializer.parse(body.xml); | ||||
|                 } catch (err) { | ||||
|                     ide.showMessage('Serialization of program data failed:\n' + err); | ||||
|                     throw new Error('Serialization of program data failed:\n' + err); | ||||
|                     ide.showMessage( | ||||
|                     	'Serialization of program data failed:\n' + err | ||||
|                     ); | ||||
|                     throw new Error( | ||||
|                     	'Serialization of program data failed:\n' + err | ||||
|                     ); | ||||
|                 } | ||||
|                 if (body.media !== null) { | ||||
|                     try { | ||||
|                         ide.serializer.parse(body.media); | ||||
|                     } catch (err) { | ||||
|                         ide.showMessage('Serialization of media failed:\n' + err); | ||||
|                         throw new Error('Serialization of media failed:\n' + err); | ||||
|                         ide.showMessage( | ||||
|                         	'Serialization of media failed:\n' + err | ||||
|                         ); | ||||
|                         throw new Error( | ||||
|                         	'Serialization of media failed:\n' + err | ||||
|                         ); | ||||
|                     } | ||||
|                 } | ||||
|                 ide.serializer.isCollectingMedia = false; | ||||
|                 ide.serializer.flushMedia(); | ||||
| 
 | ||||
|                 ide.showMessage('Uploading ' + Math.round(size / 1024) + ' KB...'); | ||||
|                 ide.showMessage( | ||||
|                 	'Uploading ' + Math.round(size / 1024) + ' KB...' | ||||
|                 ); | ||||
| 
 | ||||
|                 myself.request( | ||||
|                     'POST', | ||||
|  | @ -342,7 +385,7 @@ Cloud.prototype.saveProject = function (ide, onSuccess, onError) { | |||
|                     onError, | ||||
|                     'Project could not be saved', | ||||
|                     false, | ||||
|                     JSON.stringify(body), // POST body
 | ||||
|                     JSON.stringify(body) // POST body
 | ||||
|                 ); | ||||
|             } else { | ||||
|                 onError.call(this, 'You are not logged in', 'Snap!Cloud'); | ||||
|  | @ -367,8 +410,18 @@ Cloud.prototype.getProjectList = function (onSuccess, onError, withThumbnail) { | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.getPublishedProjectList = function (username, page, pageSize, searchTerm, onSuccess, onError, withThumbnail) { | ||||
|     var path = '/projects' + (username ? '/' + username : '') + '?ispublished=true'; | ||||
| Cloud.prototype.getPublishedProjectList = function ( | ||||
| 	username, | ||||
|     page, | ||||
|     pageSize, | ||||
|     searchTerm, | ||||
|     onSuccess, | ||||
|     onError, | ||||
|     withThumbnail | ||||
| ) { | ||||
|     var path = '/projects' + | ||||
|     		(username ? '/' + username : '') + | ||||
| 	        '?ispublished=true'; | ||||
| 
 | ||||
|     if (withThumbnail) { | ||||
|         path += '&withthumbnail=true'; | ||||
|  | @ -391,7 +444,12 @@ Cloud.prototype.getPublishedProjectList = function (username, page, pageSize, se | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.getThumbnail = function (username, projectName, onSuccess, onError) { | ||||
| Cloud.prototype.getThumbnail = function ( | ||||
| 	username, | ||||
|     projectName, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this[username ? 'request' : 'withCredentialsRequest']( | ||||
|         'GET', | ||||
|         '/projects/' + (username || '%username') + '/' | ||||
|  | @ -414,7 +472,12 @@ Cloud.prototype.getProject = function (projectName, onSuccess, onError) { | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.getPublicProject = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.getPublicProject = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this.request( | ||||
|         'GET', | ||||
|         '/projects/' + username + '/' + projectName, | ||||
|  | @ -425,7 +488,12 @@ Cloud.prototype.getPublicProject = function (projectName, username, onSuccess, o | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.getProjectMetadata = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.getProjectMetadata = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this.request( | ||||
|         'GET', | ||||
|         '/projects/' + username + '/' + projectName + '/metadata', | ||||
|  | @ -435,7 +503,12 @@ Cloud.prototype.getProjectMetadata = function (projectName, username, onSuccess, | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.deleteProject = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.deleteProject = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this[username ? 'request' : 'withCredentialsRequest']( | ||||
|         'DELETE', | ||||
|         '/projects/' + (username || '%username') + '/' + projectName, | ||||
|  | @ -445,51 +518,86 @@ Cloud.prototype.deleteProject = function (projectName, username, onSuccess, onEr | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.shareProject = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.shareProject = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this[username ? 'request' : 'withCredentialsRequest']( | ||||
|         'POST', | ||||
|         '/projects/' + (username || '%username') + '/' | ||||
|             + projectName + '/metadata?ispublic=true', | ||||
|         '/projects/' + | ||||
|         	(username || '%username') + | ||||
|             '/' + projectName + | ||||
|             '/metadata?ispublic=true', | ||||
|         onSuccess, | ||||
|         onError, | ||||
|         'Could not share project' | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.unshareProject = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.unshareProject = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this[username ? 'request' : 'withCredentialsRequest']( | ||||
|         'POST', | ||||
|         '/projects/' + (username || '%username') + '/' | ||||
|             + projectName + '/metadata?ispublic=false&ispublished=false', | ||||
|         '/projects/' + | ||||
|         	(username || '%username') + '/' + | ||||
|             projectName + | ||||
|             '/metadata?ispublic=false&ispublished=false', | ||||
|         onSuccess, | ||||
|         onError, | ||||
|         'Could not unshare project' | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.publishProject = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.publishProject = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this[username ? 'request' : 'withCredentialsRequest']( | ||||
|         'POST', | ||||
|         '/projects/' + (username || '%username') + '/' | ||||
|             + projectName + '/metadata?ispublished=true', | ||||
|         '/projects/' + | ||||
|         	(username || '%username') + | ||||
|             '/' + | ||||
|             projectName + | ||||
|             '/metadata?ispublished=true', | ||||
|         onSuccess, | ||||
|         onError, | ||||
|         'Could not publish project' | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.unpublishProject = function (projectName, username, onSuccess, onError) { | ||||
| Cloud.prototype.unpublishProject = function ( | ||||
| 	projectName, | ||||
|     username, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this[username ? 'request' : 'withCredentialsRequest']( | ||||
|         'POST', | ||||
|         '/projects/' + (username || '%username') + '/' | ||||
|             + projectName + '/metadata?ispublished=false', | ||||
|         '/projects/' + | ||||
|         	(username || '%username') + | ||||
|             '/' + | ||||
|             projectName + | ||||
|             '/metadata?ispublished=false', | ||||
|         onSuccess, | ||||
|         onError, | ||||
|         'Could not unpublish project' | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| Cloud.prototype.updateNotes = function (projectName, notes, onSuccess, onError) { | ||||
| Cloud.prototype.updateNotes = function ( | ||||
| 	projectName, | ||||
|     notes, | ||||
|     onSuccess, | ||||
|     onError | ||||
| ) { | ||||
|     this.withCredentialsRequest( | ||||
|         'POST', | ||||
|         '/projects/%username/' + projectName + '/metadata', | ||||
|  | @ -501,4 +609,3 @@ Cloud.prototype.updateNotes = function (projectName, notes, onSuccess, onError) | |||
|     ); | ||||
| }; | ||||
| 
 | ||||
| var SnapCloud = new Cloud('https://snap-cloud.cs10.org'); | ||||
|  |  | |||
							
								
								
									
										22
									
								
								gui.js
								
								
								
								
							
							
						
						
									
										22
									
								
								gui.js
								
								
								
								
							|  | @ -67,7 +67,7 @@ AlignmentMorph, TabMorph, Costume, MorphicPreferences, Sound, BlockMorph, | |||
| ToggleMorph, InputSlotDialogMorph, ScriptsMorph, isNil, SymbolMorph, | ||||
| BlockExportDialogMorph, BlockImportDialogMorph, SnapTranslator, localize, | ||||
| List, ArgMorph, SnapCloud, Uint8Array, HandleMorph, SVG_Costume, | ||||
| fontHeight, hex_sha512, sb, CommentMorph, CommandBlockMorph, BooleanSlotMorph, | ||||
| fontHeight, sb, CommentMorph, CommandBlockMorph, BooleanSlotMorph, | ||||
| BlockLabelPlaceHolderMorph, Audio, SpeechBubbleMorph, ScriptFocusMorph, | ||||
| XML_Element, WatcherMorph, BlockRemovalDialogMorph, saveAs, TableMorph, | ||||
| isSnapObject, isRetinaEnabled, disableRetinaSupport, enableRetinaSupport, | ||||
|  | @ -75,7 +75,7 @@ isRetinaSupported, SliderMorph, Animation, BoxMorph, MediaRecorder*/ | |||
| 
 | ||||
| // Global stuff ////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| modules.gui = '2018-February-06'; | ||||
| modules.gui = '2018-February-08'; | ||||
| 
 | ||||
| // Declarations
 | ||||
| 
 | ||||
|  | @ -270,7 +270,7 @@ IDE_Morph.prototype.init = function (isAutoFill) { | |||
| }; | ||||
| 
 | ||||
| IDE_Morph.prototype.openIn = function (world) { | ||||
|     var hash, usr, myself = this, urlLanguage = null; | ||||
|     var hash, myself = this, urlLanguage = null; | ||||
| 
 | ||||
|     SnapCloud.initSession( | ||||
|         function (username) { | ||||
|  | @ -1567,7 +1567,8 @@ IDE_Morph.prototype.createCorralBar = function () { | |||
|         cambutton.labelColor = this.buttonLabelColor; | ||||
|         cambutton.contrast = this.buttonContrast; | ||||
|         cambutton.drawNew(); | ||||
|         cambutton.hint = "take a camera snapshot and\nimport it as a new sprite"; | ||||
|         cambutton.hint = "take a camera snapshot and\n" + | ||||
|         	"import it as a new sprite"; | ||||
|         cambutton.fixLayout(); | ||||
|         cambutton.setCenter(this.corralBar.center()); | ||||
|         cambutton.setLeft( | ||||
|  | @ -5484,8 +5485,9 @@ IDE_Morph.prototype.setCloudURL = function () { | |||
|         this.world(), | ||||
|         null, | ||||
|         { | ||||
|             'Snap!Cloud' : | ||||
|                 'https://snap.apps.miosoft.com/SnapCloud' | ||||
|             'Snap!Cloud' : 'https://snap-cloud.cs10.org', | ||||
|             'localhost' : 'http://localhost:8080', | ||||
|             'localhost (secure)' : 'https://localhost:8080' | ||||
|         } | ||||
|     ); | ||||
| }; | ||||
|  | @ -6125,7 +6127,7 @@ ProjectDialogMorph.prototype.installCloudProjectList = function (pl) { | |||
|             // we ask for the thumbnail when selecting a project
 | ||||
|             SnapCloud.getThumbnail( | ||||
|                 null, // username is implicit
 | ||||
|                 item.projectname,  | ||||
|                 item.projectname, | ||||
|                 function (thumbnail) { | ||||
|                     myself.preview.texture = thumbnail; | ||||
|                     myself.preview.cachedTexture = null; | ||||
|  | @ -6333,7 +6335,7 @@ ProjectDialogMorph.prototype.deleteProject = function () { | |||
|                             myself.installCloudProjectList( | ||||
|                                 myself.projectList | ||||
|                             ); // refresh list
 | ||||
|                         },  | ||||
|                         }, | ||||
|                         myself.ide.cloudError() | ||||
|                     ); | ||||
|                 } | ||||
|  | @ -6497,7 +6499,6 @@ ProjectDialogMorph.prototype.publishProject = function () { | |||
| 
 | ||||
| ProjectDialogMorph.prototype.unpublishProject = function () { | ||||
|     var myself = this, | ||||
|         ide = this.ide, | ||||
|         proj = this.listField.selected, | ||||
|         entry = this.listField.active; | ||||
| 
 | ||||
|  | @ -7945,7 +7946,8 @@ WardrobeMorph.prototype.updateList = function () { | |||
| 
 | ||||
|         if (!CamSnapshotDialogMorph.prototype.enabled) { | ||||
|             cambutton.disable(); | ||||
|             cambutton.hint = CamSnapshotDialogMorph.prototype.notSupportedMessage; | ||||
|             cambutton.hint = | ||||
|             	CamSnapshotDialogMorph.prototype.notSupportedMessage; | ||||
|         } | ||||
| 
 | ||||
|         document.addEventListener( | ||||
|  |  | |||
|  | @ -3925,10 +3925,6 @@ Translation Updates: | |||
| * Turkish | ||||
| * Chinese | ||||
| * Spanish | ||||
| 
 | ||||
| 
 | ||||
| === development === | ||||
| * New cloud API | ||||
| * Russian | ||||
| 
 | ||||
| *** in development *** | ||||
|  | @ -3938,6 +3934,10 @@ Translation Updates: | |||
| * GUI: start developing v4.1.2 | ||||
| * Morphic: roll back temporary rectangle filling workaround for a bug in Chrome v57 | ||||
| 
 | ||||
| 180208 | ||||
| ------ | ||||
| * Cloud, GUI, Widgets: New Cloud API, thanks, Bernat! | ||||
| 
 | ||||
| 
 | ||||
| === v4.1.2 features === | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										36
									
								
								snap.html
								
								
								
								
							
							
						
						
									
										36
									
								
								snap.html
								
								
								
								
							|  | @ -2,25 +2,25 @@ | |||
| <html> | ||||
| 	<head> | ||||
| 		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | ||||
| 		<title>Snap! Build Your Own Blocks 4.1.1</title> | ||||
| 		<title>Snap! Build Your Own Blocks 4.1.2 - dev -</title> | ||||
| 		<link rel="shortcut icon" href="favicon.ico"> | ||||
| 		<script type="text/javascript" src="morphic.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="widgets.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="blocks.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="threads.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="objects.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="gui.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="paint.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="lists.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="byob.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="tables.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="symbols.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="xml.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="store.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="locale.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="cloud.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="sha512.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="FileSaver.min.js?version=2018-02-05"></script> | ||||
| 		<script type="text/javascript" src="morphic.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="widgets.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="blocks.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="threads.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="objects.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="gui.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="paint.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="lists.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="byob.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="tables.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="symbols.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="xml.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="store.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="locale.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="cloud.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="sha512.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript" src="FileSaver.min.js?version=2018-02-08"></script> | ||||
| 		<script type="text/javascript"> | ||||
| 			var world; | ||||
| 			window.onload = function () { | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|     written by Jens Mönig | ||||
|     jens@moenig.org | ||||
| 
 | ||||
|     Copyright (C) 2017 by Jens Mönig | ||||
|     Copyright (C) 2018 by Jens Mönig | ||||
| 
 | ||||
|     This file is part of Snap!. | ||||
| 
 | ||||
|  | @ -85,7 +85,7 @@ HTMLCanvasElement, fontHeight, SymbolMorph, localize, SpeechBubbleMorph, | |||
| ArrowMorph, MenuMorph, isString, isNil, SliderMorph, MorphicPreferences, | ||||
| ScrollFrameMorph, MenuItemMorph, Note*/ | ||||
| 
 | ||||
| modules.widgets = '2017-September-25'; | ||||
| modules.widgets = '2018-February-08'; | ||||
| 
 | ||||
| var PushButtonMorph; | ||||
| var ToggleButtonMorph; | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Bernat Romagosa
						Bernat Romagosa