summaryrefslogtreecommitdiff
path: root/gui.js
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 /gui.js
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
Diffstat (limited to 'gui.js')
-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();
}