kopia lustrzana https://github.com/backface/turtlestitch
Example projects in project dialog
thanks, Brian. Also, this changeset contains improvements and simplifications for synchronous HTTP calls which are used for fetching libraries and example projectspull/3/merge
rodzic
4fdc678ccf
commit
71fef298b6
170
gui.js
170
gui.js
|
@ -68,7 +68,7 @@ sb, CommentMorph, CommandBlockMorph*/
|
|||
|
||||
// Global stuff ////////////////////////////////////////////////////////
|
||||
|
||||
modules.gui = '2013-August-17';
|
||||
modules.gui = '2013-September-16';
|
||||
|
||||
// Declarations
|
||||
|
||||
|
@ -1965,7 +1965,7 @@ IDE_Morph.prototype.cloudMenu = function () {
|
|||
myself.prompt('Author name…', function (usr) {
|
||||
myself.prompt('Project name...', function (prj) {
|
||||
var id = 'Username=' +
|
||||
encodeURIComponent(usr) +
|
||||
encodeURIComponent(usr.toLowerCase()) +
|
||||
'&ProjectName=' +
|
||||
encodeURIComponent(prj);
|
||||
myself.showMessage(
|
||||
|
@ -1999,8 +1999,8 @@ IDE_Morph.prototype.cloudMenu = function () {
|
|||
myself.cloudError()
|
||||
);
|
||||
|
||||
}, 'project');
|
||||
}, 'project');
|
||||
}, null, 'project');
|
||||
}, null, 'project');
|
||||
},
|
||||
null,
|
||||
new Color(100, 0, 0)
|
||||
|
@ -2222,6 +2222,9 @@ IDE_Morph.prototype.projectMenu = function () {
|
|||
menu.addItem(
|
||||
'Save',
|
||||
function () {
|
||||
if (myself.source === 'examples') {
|
||||
myself.source = 'local'; // cannot save to examples
|
||||
}
|
||||
if (myself.projectName) {
|
||||
if (myself.source === 'local') { // as well as 'examples'
|
||||
myself.saveProject(myself.projectName);
|
||||
|
@ -2303,16 +2306,12 @@ IDE_Morph.prototype.projectMenu = function () {
|
|||
menu.addItem(
|
||||
'Import tools',
|
||||
function () {
|
||||
|
||||
var url = 'http://snap.berkeley.edu/snapsource/tools.xml',
|
||||
request = new XMLHttpRequest();
|
||||
request.open('GET', url, false);
|
||||
request.send();
|
||||
if (request.status === 200) {
|
||||
return myself.droppedText(request.responseText, 'tools');
|
||||
}
|
||||
throw new Error('unable to retrieve ' + url);
|
||||
|
||||
myself.droppedText(
|
||||
myself.getURL(
|
||||
'http://snap.berkeley.edu/snapsource/tools.xml'
|
||||
),
|
||||
'tools'
|
||||
);
|
||||
},
|
||||
'load the official library of\npowerful blocks'
|
||||
);
|
||||
|
@ -2320,45 +2319,30 @@ IDE_Morph.prototype.projectMenu = function () {
|
|||
'Libraries...',
|
||||
function () {
|
||||
// read a list of libraries from an external file,
|
||||
// this has turned out to be profoundly ugly
|
||||
// we should pull it all apart into meaningful selectors
|
||||
// at some time
|
||||
var libMenu = new MenuMorph(this, 'Import library'),
|
||||
libUrl = 'http://snap.berkeley.edu/snapsource/libraries/' +
|
||||
'LIBRARIES',
|
||||
lRequest = new XMLHttpRequest();
|
||||
'LIBRARIES';
|
||||
|
||||
function loadLib(name) {
|
||||
var url = 'http://snap.berkeley.edu/snapsource/libraries/'
|
||||
+ name
|
||||
+ '.xml',
|
||||
request = new XMLHttpRequest();
|
||||
request.open('GET', url, false);
|
||||
request.send();
|
||||
if (request.status === 200) {
|
||||
return myself.droppedText(request.responseText, name);
|
||||
}
|
||||
throw new Error('unable to retrieve ' + url);
|
||||
+ '.xml';
|
||||
myself.droppedText(myself.getURL(url), name);
|
||||
}
|
||||
|
||||
lRequest.open('GET', libUrl, false);
|
||||
lRequest.send();
|
||||
if (lRequest.status === 200) {
|
||||
lRequest.responseText.split('\n').forEach(function (line) {
|
||||
if (line.length > 0) {
|
||||
libMenu.addItem(
|
||||
line.substring(line.indexOf('\t') + 1),
|
||||
function () {
|
||||
loadLib(
|
||||
line.substring(0, line.indexOf('\t'))
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
throw new Error('unable to retrieve ' + libUrl);
|
||||
}
|
||||
myself.getURL(libUrl).split('\n').forEach(function (line) {
|
||||
if (line.length > 0) {
|
||||
libMenu.addItem(
|
||||
line.substring(line.indexOf('\t') + 1),
|
||||
function () {
|
||||
loadLib(
|
||||
line.substring(0, line.indexOf('\t'))
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
libMenu.popup(world, pos);
|
||||
},
|
||||
'Select categories of additional blocks to add to this project.'
|
||||
|
@ -2888,7 +2872,6 @@ IDE_Morph.prototype.openProject = function (name) {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
IDE_Morph.prototype.switchToUserMode = function () {
|
||||
var world = this.world();
|
||||
|
||||
|
@ -3164,6 +3147,9 @@ IDE_Morph.prototype.openProjectsBrowser = function () {
|
|||
};
|
||||
|
||||
IDE_Morph.prototype.saveProjectsBrowser = function () {
|
||||
if (this.source === 'examples') {
|
||||
this.source = 'local'; // cannot save to examples
|
||||
}
|
||||
new ProjectDialogMorph(this, 'save').popUp();
|
||||
};
|
||||
|
||||
|
@ -3757,6 +3743,24 @@ IDE_Morph.prototype.setCloudURL = function () {
|
|||
);
|
||||
};
|
||||
|
||||
// IDE_Morph synchronous Http data fetching
|
||||
|
||||
IDE_Morph.prototype.getURL = function (url) {
|
||||
var request = new XMLHttpRequest(),
|
||||
myself = this;
|
||||
try {
|
||||
request.open('GET', url, false);
|
||||
request.send();
|
||||
if (request.status === 200) {
|
||||
return request.responseText;
|
||||
}
|
||||
throw new Error('unable to retrieve ' + url);
|
||||
} catch (err) {
|
||||
myself.showMessage(err);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
// IDE_Morph user dialog shortcuts
|
||||
|
||||
IDE_Morph.prototype.showMessage = function (message, secs) {
|
||||
|
@ -4126,12 +4130,12 @@ ProjectDialogMorph.prototype.setSource = function (source) {
|
|||
}
|
||||
);
|
||||
return;
|
||||
case 'examples':
|
||||
this.projectList = this.getExamplesProjectList();
|
||||
break;
|
||||
case 'local':
|
||||
this.projectList = this.getLocalProjectList();
|
||||
break;
|
||||
case 'examples':
|
||||
this.projectList = [];
|
||||
break;
|
||||
}
|
||||
|
||||
this.listField.destroy();
|
||||
|
@ -4180,23 +4184,29 @@ ProjectDialogMorph.prototype.setSource = function (source) {
|
|||
};
|
||||
} else { // 'examples', 'cloud' is initialized elsewhere
|
||||
this.listField.action = function (item) {
|
||||
var src, xml;
|
||||
if (item === undefined) {return; }
|
||||
if (myself.nameField) {
|
||||
myself.nameField.setContents(item.name || '');
|
||||
}
|
||||
if (myself.task === 'open') {
|
||||
myself.notesText.text = item.notes || '';
|
||||
myself.notesText.drawNew();
|
||||
myself.notesField.contents.adjustBounds();
|
||||
myself.preview.texture = item.thumb || null;
|
||||
myself.preview.cachedTexture = null;
|
||||
myself.preview.drawNew();
|
||||
}
|
||||
src = myself.ide.getURL(
|
||||
'http://snap.berkeley.edu/snapsource/Examples/' +
|
||||
item.name + '.xml'
|
||||
);
|
||||
|
||||
xml = myself.ide.serializer.parse(src);
|
||||
myself.notesText.text = xml.childNamed('notes').contents
|
||||
|| '';
|
||||
myself.notesText.drawNew();
|
||||
myself.notesField.contents.adjustBounds();
|
||||
myself.preview.texture = xml.childNamed('thumbnail').contents
|
||||
|| null;
|
||||
myself.preview.cachedTexture = null;
|
||||
myself.preview.drawNew();
|
||||
myself.edit();
|
||||
};
|
||||
}
|
||||
this.body.add(this.listField);
|
||||
|
||||
this.shareButton.hide();
|
||||
this.unshareButton.hide();
|
||||
if (this.source === 'local') {
|
||||
|
@ -4232,6 +4242,35 @@ ProjectDialogMorph.prototype.getLocalProjectList = function () {
|
|||
return projects;
|
||||
};
|
||||
|
||||
ProjectDialogMorph.prototype.getExamplesProjectList = function () {
|
||||
var dir,
|
||||
projects = [];
|
||||
|
||||
dir = this.ide.getURL('http://snap.berkeley.edu/snapsource/Examples/');
|
||||
dir.split('\n').forEach(
|
||||
function (line) {
|
||||
var startIdx = line.search(new RegExp('href=".*xml"')),
|
||||
endIdx,
|
||||
name,
|
||||
dta;
|
||||
if (startIdx > 0) {
|
||||
endIdx = line.search(new RegExp('.xml'));
|
||||
name = line.substring(startIdx + 6, endIdx);
|
||||
dta = {
|
||||
name: name,
|
||||
thumb: null,
|
||||
notes: null
|
||||
};
|
||||
projects.push(dta);
|
||||
}
|
||||
}
|
||||
);
|
||||
projects.sort(function (x, y) {
|
||||
return x.name < y.name ? -1 : 1;
|
||||
});
|
||||
return projects;
|
||||
};
|
||||
|
||||
ProjectDialogMorph.prototype.installCloudProjectList = function (pl) {
|
||||
var myself = this;
|
||||
this.projectList = pl || [];
|
||||
|
@ -4308,13 +4347,20 @@ ProjectDialogMorph.prototype.clearDetails = function () {
|
|||
};
|
||||
|
||||
ProjectDialogMorph.prototype.openProject = function () {
|
||||
var myself = this,
|
||||
proj = this.listField.selected;
|
||||
var proj = this.listField.selected,
|
||||
src;
|
||||
if (!proj) {return; }
|
||||
this.ide.source = this.source;
|
||||
if (this.source === 'cloud') {
|
||||
this.openCloudProject(proj);
|
||||
} else { // 'local, examples'
|
||||
myself.ide.source = 'local';
|
||||
} else if (this.source === 'examples') {
|
||||
src = this.ide.getURL(
|
||||
'http://snap.berkeley.edu/snapsource/Examples/' +
|
||||
proj.name + '.xml'
|
||||
);
|
||||
this.ide.openProjectString(src);
|
||||
this.destroy();
|
||||
} else { // 'local'
|
||||
this.ide.openProject(proj.name);
|
||||
this.destroy();
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue