summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmoenig <jens@moenig.org>2013-09-16 12:17:44 +0200
committerjmoenig <jens@moenig.org>2013-09-16 12:17:44 +0200
commit71fef298b67c3b6d5a857139b769ace226e14690 (patch)
tree01c6d340ca392885f61a3d04f5430d308d25a389
parent4fdc678ccf088958d95f9d69f3261d5869b4d0f8 (diff)
downloadsnap-byow-71fef298b67c3b6d5a857139b769ace226e14690.tar.gz
snap-byow-71fef298b67c3b6d5a857139b769ace226e14690.zip
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 projects
-rw-r--r--gui.js170
1 files changed, 108 insertions, 62 deletions
diff --git a/gui.js b/gui.js
index c3790cc..23b0c63 100644
--- a/gui.js
+++ b/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();
}