mirror of
https://github.com/processing/processing4.git
synced 2026-06-16 04:26:26 +02:00
initial support for reading sketches from a zipped file
This commit is contained in:
@@ -46,7 +46,7 @@ import processing.data.StringList;
|
||||
* The base class for the main processing application.
|
||||
* Primary role of this class is for platform identification and
|
||||
* general interaction with the system (launching URLs, loading
|
||||
* files and images, etc) that comes from that.
|
||||
* files and images, etc.) that comes from that.
|
||||
*/
|
||||
public class Base {
|
||||
// Added accessors for 0218 because the UpdateCheck class was not properly
|
||||
@@ -55,6 +55,9 @@ public class Base {
|
||||
/** This might be replaced by main() if there's a lib/version.txt file. */
|
||||
static private String VERSION_NAME = "1276"; //$NON-NLS-1$
|
||||
|
||||
static final String SKETCH_BUNDLE_EXT = ".pskz";
|
||||
static final String CONTRIB_BUNDLE_EXT = ".pcbz";
|
||||
|
||||
/**
|
||||
* True if heavy debugging error/log messages are enabled. Set to true
|
||||
* if an empty file named 'debug' is found in the settings folder.
|
||||
@@ -168,7 +171,7 @@ public class Base {
|
||||
DEBUG = true;
|
||||
}
|
||||
|
||||
// Use native popups so they don't look so crappy on OS X
|
||||
// Use native popups so they don't look crappy on macOS
|
||||
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
|
||||
|
||||
// Don't put anything above this line that might make GUI,
|
||||
@@ -285,7 +288,7 @@ public class Base {
|
||||
}
|
||||
|
||||
|
||||
// Remove this code in a couple months [fry 170211]
|
||||
// Remove this code in a couple of months [fry 170211]
|
||||
// https://github.com/processing/processing/issues/4853
|
||||
// Or maybe not, if NVIDIA keeps doing this [fry 170423]
|
||||
// https://github.com/processing/processing/issues/4997
|
||||
@@ -1302,6 +1305,41 @@ public class Base {
|
||||
* Open a sketch from the path specified. Do not use for untitled sketches.
|
||||
*/
|
||||
public Editor handleOpen(String path) {
|
||||
if (path.endsWith(SKETCH_BUNDLE_EXT)) {
|
||||
File zipFile = new File(path);
|
||||
try {
|
||||
File destFolder = File.createTempFile("zip", "tmp", untitledFolder);
|
||||
if (!destFolder.delete() || !destFolder.mkdirs()) {
|
||||
// Hard to imagine why this would happen, but...
|
||||
System.err.println("Could not create temporary folder " + destFolder);
|
||||
return null;
|
||||
}
|
||||
Util.unzip(zipFile, destFolder);
|
||||
File[] fileList = destFolder.listFiles(File::isDirectory);
|
||||
if (fileList != null) {
|
||||
if (fileList.length == 1) {
|
||||
File sketchFile = checkSketchFolder(fileList[0]);
|
||||
if (sketchFile != null) {
|
||||
return handleOpen(sketchFile.getAbsolutePath(), true);
|
||||
}
|
||||
} else {
|
||||
System.err.println("Expecting one folder inside " +
|
||||
SKETCH_BUNDLE_EXT + " file, found " + fileList.length + ".");
|
||||
}
|
||||
} else {
|
||||
System.err.println("Could not read " + destFolder);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null; // no luck
|
||||
|
||||
} else if (path.endsWith(CONTRIB_BUNDLE_EXT)) {
|
||||
// TODO Install a contrib here
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
return handleOpen(path, false);
|
||||
}
|
||||
|
||||
@@ -1645,35 +1683,6 @@ public class Base {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
public JMenu getRecentMenu() {
|
||||
return recent.getMenu();
|
||||
}
|
||||
|
||||
|
||||
public JMenu getToolbarRecentMenu() {
|
||||
return recent.getToolbarMenu();
|
||||
}
|
||||
|
||||
|
||||
public void handleRecent(Editor editor) {
|
||||
recent.handle(editor);
|
||||
}
|
||||
|
||||
|
||||
public void handleRecentRename(Editor editor, String oldPath) {
|
||||
recent.handleRename(editor, oldPath);
|
||||
}
|
||||
|
||||
|
||||
// Called before a sketch is renamed so that its old name is
|
||||
// no longer in the menu.
|
||||
public void removeRecent(Editor editor) {
|
||||
recent.remove(editor);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Scan a folder recursively, and add any sketches found to the menu
|
||||
* specified. Set the openReplaces parameter to true when opening the sketch
|
||||
@@ -1711,12 +1720,6 @@ public class Base {
|
||||
ActionListener listener = e -> {
|
||||
String path = e.getActionCommand();
|
||||
if (new File(path).exists()) {
|
||||
/*
|
||||
boolean replace = replaceExisting;
|
||||
if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) {
|
||||
replace = !replace;
|
||||
}
|
||||
*/
|
||||
handleOpen(path);
|
||||
} else {
|
||||
Messages.showWarning("Sketch Disappeared",
|
||||
@@ -1730,34 +1733,40 @@ public class Base {
|
||||
|
||||
boolean found = false;
|
||||
|
||||
// for (int i = 0; i < list.length; i++) {
|
||||
// if ((list[i].charAt(0) == '.') ||
|
||||
// list[i].equals("CVS")) continue;
|
||||
for (String name : list) {
|
||||
if (name.charAt(0) == '.') {
|
||||
continue;
|
||||
}
|
||||
|
||||
File subfolder = new File(folder, name);
|
||||
if (subfolder.isDirectory()) {
|
||||
File entry = checkSketchFolder(subfolder, name);
|
||||
if (entry != null) {
|
||||
// TODO Is this necessary any longer? This seems gross [fry 210804]
|
||||
if (name.equals("old")) { // Don't add old contributions
|
||||
continue;
|
||||
}
|
||||
|
||||
JMenuItem item = new JMenuItem(name);
|
||||
item.addActionListener(listener);
|
||||
item.setActionCommand(entry.getAbsolutePath());
|
||||
menu.add(item);
|
||||
File entry = new File(folder, name);
|
||||
File sketchFile = null;
|
||||
if (entry.isDirectory()) {
|
||||
sketchFile = checkSketchFolder(entry);
|
||||
} else if (name.toLowerCase().endsWith(SKETCH_BUNDLE_EXT)) {
|
||||
name = name.substring(0, name.length() - SKETCH_BUNDLE_EXT.length());
|
||||
sketchFile = entry;
|
||||
}
|
||||
|
||||
if (sketchFile != null) {
|
||||
JMenuItem item = new JMenuItem(name);
|
||||
item.addActionListener(listener);
|
||||
item.setActionCommand(sketchFile.getAbsolutePath());
|
||||
menu.add(item);
|
||||
found = true;
|
||||
|
||||
} else if (entry.isDirectory()) {
|
||||
// not a sketch folder, but may be a subfolder containing sketches
|
||||
JMenu submenu = new JMenu(name);
|
||||
// needs to be separate var otherwise would set found to false
|
||||
boolean anything = addSketches(submenu, entry);
|
||||
if (anything) {
|
||||
menu.add(submenu);
|
||||
found = true;
|
||||
|
||||
} else {
|
||||
// not a sketch folder, but maybe a subfolder containing sketches
|
||||
JMenu submenu = new JMenu(name);
|
||||
// needs to be separate var otherwise would set found to false
|
||||
boolean anything = addSketches(submenu, subfolder);
|
||||
if (anything && !name.equals("old")) { //Don't add old contributions
|
||||
menu.add(submenu);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1765,6 +1774,10 @@ public class Base {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mostly identical to the JMenu version above, however the rules are
|
||||
* slightly different for how examples are handled, etc.
|
||||
*/
|
||||
public boolean addSketches(DefaultMutableTreeNode node, File folder,
|
||||
boolean examples) throws IOException {
|
||||
// skip .DS_Store files, etc (this shouldn't actually be necessary)
|
||||
@@ -1809,25 +1822,30 @@ public class Base {
|
||||
continue;
|
||||
}
|
||||
|
||||
File subfolder = new File(folder, name);
|
||||
if (subfolder.isDirectory()) {
|
||||
File entry = checkSketchFolder(subfolder, name);
|
||||
if (entry != null) {
|
||||
DefaultMutableTreeNode item =
|
||||
new DefaultMutableTreeNode(new SketchReference(name, entry));
|
||||
File entry = new File(folder, name);
|
||||
File sketchFile = null;
|
||||
if (entry.isDirectory()) {
|
||||
sketchFile = checkSketchFolder(entry);
|
||||
} else if (name.toLowerCase().endsWith(SKETCH_BUNDLE_EXT)) {
|
||||
name = name.substring(0, name.length() - SKETCH_BUNDLE_EXT.length());
|
||||
sketchFile = entry;
|
||||
}
|
||||
|
||||
node.add(item);
|
||||
if (sketchFile != null) {
|
||||
DefaultMutableTreeNode item =
|
||||
new DefaultMutableTreeNode(new SketchReference(name, sketchFile));
|
||||
|
||||
node.add(item);
|
||||
found = true;
|
||||
|
||||
} else if (entry.isDirectory()) {
|
||||
// not a sketch folder, but maybe a subfolder containing sketches
|
||||
DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(name);
|
||||
// needs to be separate var otherwise would set found to false
|
||||
boolean anything = addSketches(subNode, entry, examples);
|
||||
if (anything) {
|
||||
node.add(subNode);
|
||||
found = true;
|
||||
|
||||
} else {
|
||||
// not a sketch folder, but maybe a subfolder containing sketches
|
||||
DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(name);
|
||||
// needs to be separate var otherwise would set found to false
|
||||
boolean anything = addSketches(subNode, subfolder, examples);
|
||||
if (anything) {
|
||||
node.add(subNode);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1840,10 +1858,10 @@ public class Base {
|
||||
* Because the default mode will be the first in the list, this will always
|
||||
* prefer that one over the others.
|
||||
*/
|
||||
File checkSketchFolder(File subfolder, String item) {
|
||||
private File checkSketchFolder(File folder) {
|
||||
for (Mode mode : getModeList()) {
|
||||
File entry = new File(subfolder, item + "." + mode.getDefaultExtension()); //$NON-NLS-1$
|
||||
// if a .pde file of the same prefix as the folder exists..
|
||||
// Test whether a .pde file of the same name as its parent folder exists.
|
||||
File entry = new File(folder, folder.getName() + "." + mode.getDefaultExtension()); //$NON-NLS-1$
|
||||
if (entry.exists()) {
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -548,6 +548,18 @@
|
||||
role="Editor">
|
||||
</bundledocument>
|
||||
|
||||
<bundledocument extensions="pskz"
|
||||
icon="macosx/document.icns"
|
||||
name="Processing Sketch Bundle"
|
||||
role="Editor">
|
||||
</bundledocument>
|
||||
|
||||
<bundledocument extensions="pcbz"
|
||||
icon="macosx/document.icns"
|
||||
name="Processing Contribution Bundle"
|
||||
role="None">
|
||||
</bundledocument>
|
||||
|
||||
<!-- !@#*&$ the @2x splash screen implementation was removed by Oracle -->
|
||||
<!-- tiffutil -cathidpicheck about.png about\@2x.png -out about.tiff -->
|
||||
<!--<option value="-splash:$APP_ROOT/Contents/Java/lib/about.png" />-->
|
||||
|
||||
@@ -20,16 +20,57 @@ X change Messages.loge() to Messages.err()
|
||||
X only call errorTable.updateTheme() if it's not null
|
||||
X update EditorFooter.updateMode() to EditorFooter.updateTheme()
|
||||
X add it to the code called by Editor.updateTheme()
|
||||
_ update to latest JDK 11
|
||||
|
||||
Sam updates
|
||||
X can we get rid of pdexEnabled? does the current code work w/ java tabs?
|
||||
X https://github.com/processing/processing4/issues/157
|
||||
X https://github.com/processing/processing4/pull/230
|
||||
|
||||
cleaning
|
||||
o look into LCD rendering problems w/ Java (see if Lion still a problem)
|
||||
o fonts were showing up with very different fatness
|
||||
o put stdout/stderr into ~/Library/Logs
|
||||
o and have a .log extension so it can be browsed properly
|
||||
o need to make sure that it's ok to write to logs dir..
|
||||
o probably being removed from future OS X versions
|
||||
|
||||
before release
|
||||
_ update the README for alpha 6 (and this release too, when ready)
|
||||
|
||||
|
||||
_ don't allow "Show Sketch Folder" for untitled sketches
|
||||
|
||||
sketch/launching
|
||||
_ should it be pskz, pcbz? psk for the sketch file to double-click?
|
||||
_ pdez as a sketch bundle?
|
||||
_ launch/psk files/import from web editor (more details below)
|
||||
_ cleaning up the temp file handling
|
||||
_ 'show sketch folder' weird when in temp folder
|
||||
_ ask to save first (sketch has not been saved yet)
|
||||
_ or make the temp folder part of the sketchbook
|
||||
_ same with adding files to an unsaved sketch, do we block that?
|
||||
_ what to double-click when opening p5 projects
|
||||
_ lack of a project file makes this a little bit of a headache
|
||||
_ dropping a sketch folder onto the PDE should also be implemented
|
||||
_ some type of sketch archive format for posting examples (.psk?)
|
||||
_ would be nice to open a sketch directly from a zip file
|
||||
_ https://github.com/processing/processing/issues/73
|
||||
_ maybe just open from a zip file, since psk doesn't help anything
|
||||
_ also have a means of importing sketches
|
||||
_ https://github.com/processing/processing/issues/3987
|
||||
_ also see several notes below re: examples
|
||||
_ add means to import .zip files from file/url into sketchbook, library, etc.
|
||||
_ super easy given current code implementation, might help usability
|
||||
_ put the reference (and examples?) into .zip files
|
||||
_ unzipping the app takes forever
|
||||
_ see the 'examples' section below
|
||||
_ how are file associations handled in Linux? (for .pde, .psk)
|
||||
_ when adding a new library, its examples aren't added to the list until restart
|
||||
_ refresh option for sketchbook (bottom of window)
|
||||
_ import option for sketchbook (button to select files/folders/etc)
|
||||
|
||||
|
||||
_ dealing with reference.zip and web server
|
||||
_ web server confirmed to be working, but should check w/ new docs
|
||||
_ psk files, doing that for examples
|
||||
@@ -165,20 +206,8 @@ _ detach sketch name and folder name (use sketch.properties)
|
||||
_ better for git, etc
|
||||
_ single file thing is long gone
|
||||
_ introduce the idea of 'scraps' (ala gist) that are just single page blobs
|
||||
_ launch/psk files/import from web editor (more details below)
|
||||
_ cleaning up the temp file handling
|
||||
_ 'show sketch folder' weird when in temp folder
|
||||
_ ask to save first (sketch has not been saved yet)
|
||||
_ or make the temp folder part of the sketchbook
|
||||
_ same with adding files to an unsaved sketch, do we block that?
|
||||
|
||||
|
||||
macos
|
||||
_ disable "notifications" prompt on startup for macOS
|
||||
_ we're not posting any, can we suppress the "allow notifications" message?
|
||||
_ https://developer.apple.com/documentation/usernotifications
|
||||
_ https://developer.apple.com/documentation/usernotifications/asking_permission_to_use_notifications
|
||||
|
||||
|
||||
windows
|
||||
_ go back to including a .bat file?
|
||||
@@ -201,28 +230,6 @@ _ sign releases on Windows to avoid SmartScreen warnings/errors
|
||||
_ https://github.com/processing/processing4/issues/25
|
||||
|
||||
|
||||
sketch/launching
|
||||
_ what to double-click when opening p5 projects
|
||||
_ lack of a project file makes this a little bit of a headache
|
||||
_ dropping a sketch folder onto the PDE should also be implemented
|
||||
_ some type of sketch archive format for posting examples (.psk?)
|
||||
_ would be nice to open a sketch directly from a zip file
|
||||
_ https://github.com/processing/processing/issues/73
|
||||
_ maybe just open from a zip file, since psk doesn't help anything
|
||||
_ also have a means of importing sketches
|
||||
_ https://github.com/processing/processing/issues/3987
|
||||
_ also see several notes below re: examples
|
||||
_ add means to import .zip files from file/url into sketchbook, library, etc.
|
||||
_ super easy given current code implementation, might help usability
|
||||
_ put the reference (and examples?) into .zip files
|
||||
_ unzipping the app takes forever
|
||||
_ see the 'examples' section below
|
||||
_ how are file associations handled in Linux? (for .pde, .psk)
|
||||
_ when adding a new library, its examples aren't added to the list until restart
|
||||
_ refresh option for sketchbook (bottom of window)
|
||||
_ import option for sketchbook
|
||||
|
||||
|
||||
web/docs
|
||||
_ create a processing4-docs repo
|
||||
_ check with Casey re: shallow clone or approach
|
||||
@@ -1092,11 +1099,24 @@ _ this may already work with SingleInstance stuff
|
||||
|
||||
DIST / macOS
|
||||
|
||||
appbundler
|
||||
_ update appbundler? https://github.com/TheInfiniteKind/appbundler
|
||||
_ might be broken though https://github.com/TheInfiniteKind/appbundler/issues/70
|
||||
_ symlink https://github.com/TheInfiniteKind/appbundler/issues/1
|
||||
_ startup chatter (from appbundler?)
|
||||
_ Processing[25059:13082813] int launch(char *, int, char **) Launchpath
|
||||
_ Find a long-term solution for OS X bundler to address signing/symlink issues
|
||||
_ https://github.com/processing/processing/issues/2967
|
||||
_ appbundler improvements
|
||||
_ don't re-copy JRE into work folder if already exists
|
||||
_ implement a splash screen
|
||||
|
||||
others
|
||||
_ disable "notifications" prompt on startup for macOS
|
||||
_ https://github.com/processing/processing4/issues/234
|
||||
_ we're not posting any, can we suppress the "allow notifications" message?
|
||||
_ https://developer.apple.com/documentation/usernotifications
|
||||
_ https://developer.apple.com/documentation/usernotifications/asking_permission_to_use_notifications
|
||||
_ Help Menu disabled on OS X (looks like a JVM bug)
|
||||
_ https://github.com/processing/processing/issues/4353#issuecomment-237715947
|
||||
_ still broken in 11.0.8
|
||||
@@ -1107,11 +1127,6 @@ _ https://developer.apple.com/library/mac/technotes/tn2007/tn2196.html
|
||||
_ built-in images: http://nadeausoftware.com/articles/2008/12/mac_java_tip_how_access_mac_specific_nsimage_icons
|
||||
_ Update QuickLook plugin for Processing 3
|
||||
_ https://github.com/processing/processing/issues/3261
|
||||
_ Find a long-term solution for OS X bundler to address signing/symlink issues
|
||||
_ https://github.com/processing/processing/issues/2967
|
||||
_ appbundler improvements
|
||||
_ don't re-copy JRE into work folder if already exists
|
||||
_ implement a splash screen
|
||||
_ more OS X-specific hackery for improved appearance
|
||||
_ https://developer.apple.com/library/mac/technotes/tn2007/tn2196.html
|
||||
_ possible better option for doing retina?
|
||||
@@ -1121,17 +1136,11 @@ _ http://lwjgl.org/forum/index.php/topic,4711.225.html
|
||||
_ change cmd line for OS X to use symlink?
|
||||
_ otherwise updates are going to require reinstall..
|
||||
_ or that it's gonna need to parse and say "update command line?"
|
||||
_ look into LCD rendering problems w/ Java (see if Lion still a problem)
|
||||
_ fonts were showing up with very different fatness
|
||||
_ we're breaking some mac human interface guidelines
|
||||
_ should be using a menu factory to create menubar for all sub-windows
|
||||
_ http://developer.apple.com/technotes/tn/tn2042.html
|
||||
_ and the general warning dialogs are just ass ugly
|
||||
_ (i.e. we really need those replacements for JOptionPane)
|
||||
_ put stdout/stderr into ~/Library/Logs
|
||||
_ and have a .log extension so it can be browsed properly
|
||||
_ need to make sure that it's ok to write to logs dir..
|
||||
_ probably being removed from future OS X versions
|
||||
_ Exiting a sketch with Command-Q or File > Quit doesn't call stop() on OS X
|
||||
_ https://github.com/processing/processing/issues/186
|
||||
|
||||
|
||||
Reference in New Issue
Block a user