You might think I made it worse.
The new layout makes it easier to tell which files are folders.
The new spk is at http://hudl.sgarman.net/public/spk/SJGexplorer_002.spk
The code looks like this:
//Simple file explorer by Steve Garman var basePath = "/mnt" //Called when application is started. function OnStart() { //Make sure our path is valid if( ! app.FolderExists( basePath ) ) basePath = "/sdcard" //Probably works best in portrait //but don't force the issue if( app.GetOrientation() == "Landscape" ){ //var goPortrait = app.CreateYesNoDialog( "Change to portrait?" ); //goPortrait.SetOnTouch( goPortrait_OnTouch ) if (confirm("Set to Portrait") == true) { app.SetOrientation("Portrait"); } } //Create a layout with objects vertically centered. lay = app.CreateLayout( "linear", "Vertical,FillXY" ); //Create a text label and add it to layout. currPath = app.CreateText( basePath ); lay.AddChild( currPath ); //create a list view for folders (directories) folds = app.CreateList( "abc,zxc,qwe,sdf,ghj,nbv,zzz", 1.0, 0.4 ); folds.SetBackGradient( "#222222", "#444444", "#888888" ); folds.SetOnTouch( foldsTouch); lay.AddChild( folds ); //create detail list view for files detail = app.CreateList( "", 1.0, 0.6 ); detail.SetOnTouch( detailTouch); populate_detail(); lay.AddChild( detail ); //Add layout to app. app.AddLayout( lay ); //make back key available for use app.EnableBackKey( false ); } function populate_detail(){ //called whenever current path changed filelist = app.ListFolder( currPath.GetText() ).split(",") ; filelist.sort(); //my array handling is a mess but I cant get filelist.Unshift to work filelist.reverse(); var ths = filelist.pop(); var pth; var dirs = []; var fils = []; while( undefined != ths ){ pth = currPath.GetText() + "/" + ths; if( testFolder( pth ) ) dirs.push(ths); else fils.push( ths ); ths = filelist.pop(); } folds.SetList(dirs.join(","),","); detail.SetList(fils.join(","),","); } function detailTouch(name){ //user has touched a name in detail list var fullPath = currPath.GetText() + "/" + name if( app.FileExists(fullPath) ){ deal_with_file( fullPath ); } } function foldsTouch(name){ //user has touched a name in folders list var fullPath = currPath.GetText() + "/" + name if( app.FolderExists(fullPath) ){ //show it currPath.SetText( fullPath ); populate_detail(); } } function testFolder( fullPath ){ //no proper test for folders //in this app, it's safe to treat an empty folder like a file //if we need to create folders later, //this will need fixing var tst = app.ListFolder( fullPath ); if( tst.length > 0 ) return true; else return false; }; function deal_with_file( fullpath ){ //still very basic if( fullpath.indexOf(".js" ) >= 0 || fullpath.indexOf(".txt" ) >= 0 ) app.OpenFile( fullpath,"text/plain", "Choose Editor" ); else app.ShowPopup("No action defined for " + fullpath); } function OnBack(){ //user pressed back key var tmp = currPath.GetText(); if( tmp == basePath ) app.Exit(); else { //not yet back at beginning //move up one level var tst = currPath.GetText().split("/"); tmp = tst.pop(); currPath.SetText( tst.join("/") ); populate_detail(); } } function goPortrait_OnTouch( result ){ if( result=="Yes" ) app.SetOrientation( "Portrait" ); }
No comments:
Post a Comment