View this PageEdit this PageUploads to this PageHistory of this PageTop of the SwikiRecent ChangesSearch the SwikiHelp Guide

RedFolderGUI

Home   How To   Code Pool   Public Library   Theory   Events
this utility class keeps track of documents in a folder. i use it like a 'quicklauncher' for patches and synthdefs.



// 050125-26, 050427 /f0
// bugfixes: 061206 asArray, 071216 guified, 080907 reveal was broken, 080909 listView height fix
// 081025 replaced Font with GUI.font, clear up colours
// 090705 using view redirect classes (sc3.3.1)
// based on two old classes called RedPatchListGUI and RedSynthDefsGUI

/* -keyboard shortcuts:

	'ctrl+u' = update list
*/

/*
	quickstart:
		RedFolderGUI.new

	and put some documents in a folder called 'patches' in your main sc folder.
	with the GUI in focus, press 'ctrl+u' to scan the directory again.  your files should show.
	select and press 'enter' to open.
	
	you can set path, recursiveness and bounds...
		RedFolderGUI("Help", true, Rect(100, 200, 300, 400));
	
	
	warning... 'reveal' button only works on os x
*/

RedFolderGUI {
	
	var <window, <path, <>recursive, <allPaths, <listView;
	
	*new {|path= "patches/", recursive= false, bounds|
		^super.new.recursive_(recursive).initRedFolderGUI(path, bounds);
	}
	
	initRedFolderGUI {|argPath, bounds|
		var fnt= Font("Monaco", 9);
		var col= Color.black;
		var colBack= Color.grey(0.5, 0.8);
		path= PathName(argPath).asAbsolutePath;
		bounds= bounds ? Rect(1280-160, 41, 159, 769);//default bounds
		window= Window(path.basename, bounds, false).alpha_(0.9).front;
		window.view.background= colBack;
		Button(window, Rect(1, 1, bounds.width-2/3, 17))
			.font_(fnt)
			.states_([["loadThis", col, Color.clear]])
			.action_{if(allPaths.notEmpty, {allPaths[listView.value].load}); listView.focus};
		Button(window, Rect(bounds.width-2/3+1, 1, bounds.width-2/3, 17))
			.font_(fnt)
			.states_([["loadAll", col, Color.clear]])
			.action_{allPaths.do{|x| x.load}; listView.focus};
		Button(window, Rect((bounds.width-2/3*2)+1, 1, bounds.width-2/3, 17))
			.font_(fnt)
			.states_([["reveal", col, Color.clear]])
			.action_{
				Platform.case(
					\osx, {
						//fails if there is a ' in the filename
						var p= allPaths[listView.value];
						("osascript -e 'tell application \"Finder\" to (reveal item \""
						++p.tr($/, $:)++"\" of startup disk) activate'").unixCmd;
						//("open"+PathName(p).pathOnly).unixCmd;
					},
					{"RedFolderGUI: reveal for osx only".postln}
				);
			};
		listView= ListView(window, Rect(0, 20, bounds.width, bounds.height-24))
			.font_(fnt)
			.focus
			.background_(colBack)
			.keyDownAction_{|view, char, mod, unicode|
				//added ctrl+u for updating list
				if((mod&262144==262144)&&(unicode==21), {this.update});
				view.defaultKeyDownAction(char, mod, unicode);
			}
			.enterKeyAction_{|view|
				if(allPaths.notEmpty, {Document.open(allPaths[view.value])})
			};
		this.update;
	}
	
	update {
		var func;
		allPaths= List.new;
		if(recursive, {
			func= {|x|
				x.do{|y|
					if(PathName(y).isFolder, {
						func.value((y++"*").pathMatch);
					}, {
						allPaths.add(y);
					});
				};
			};
			func.value((path++"/*").pathMatch);
		}, {
			(path++"/*").pathMatch.do{|y|
				if(PathName(y).isFile, {
					allPaths.add(y);
				});
			};
		});
		defer{listView.items= allPaths.asArray.collect{|x| x.asString.basename}};
	}
	
	font_ {|font|
		window.view.children.do{|view| view.font= font};
		window.refresh;
	}
	
	front {
		window.front;
	}
}




helpfile

RedFolderGUI.html

Link to this Page