Created
November 8, 2012 16:31
-
-
Save PKHG/4039885 to your computer and use it in GitHub Desktop.
a way to explore your Ipad internal storage
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from scene import * | |
#from random import random | |
from time import ctime | |
from os import listdir, path, stat | |
from os.path import isdir, isfile, sep, abspath | |
interesting_dirs = {0:'.', 1:'/',2:'/Applications',3: '/Applications/Maps.app'} | |
#t= '/Applications/Maps.app/Japanese.lproj/Localizable.strings' | |
def dir_contents(path): | |
"""get all dirs and files from path""" | |
try: | |
contents = listdir(path) | |
except: | |
print '***ERROR with ', path | |
sys.exit() | |
# print(contents) | |
# tmp = [isfile(path + "\\" + el) for el in contents] | |
# print(tmp) | |
files = [] | |
folders = [] | |
for i, item in enumerate(contents): | |
if isfile(path+sep+contents[i]): | |
files += [item] | |
elif isdir(path+sep+contents[i]): | |
folders += [item] | |
return files, folders | |
def prepare_all_data(dir_path, st): | |
""" returns a dictionary with (img,size), nr of dirs, nr of files, """ | |
files, folders = dir_contents(dir_path) | |
info = {} | |
counter = 0 | |
all_names = {} | |
if folders: | |
#directories get Dir: prefixed ;-) | |
for el in folders: | |
img, size = render_text('Dir:' + el, font_size = 30) | |
info[counter] = (img, size) | |
all_names[img] = dir_path + sep + el | |
counter += 1 | |
nr_dirs = counter | |
if files: | |
for el in files: | |
img, size = render_text(el, font_size = 30) | |
info[counter] = (img, size) | |
all_names[img]= dir_path + sep + el | |
counter += 1 | |
nr_files = counter - nr_dirs | |
dir_name_layers = [] | |
for i in range(counter): | |
take = i % st | |
lay = new_txt_layer(i, info, take * 35) | |
lay.stroke_weight = 1 | |
if i < nr_dirs: | |
#lay.stroke_weight = 1 | |
lay.stroke = Color(1,0,0) | |
dir_name_layers.append(lay) | |
return dir_name_layers, nr_dirs, nr_files, all_names | |
def range_split(total, st): | |
nst = total / st | |
nst_rest = total % st | |
result = [range(i * st,i * st + st) for i in range(nst)] | |
if nst_rest: | |
result.append(range(st * nst, total)) | |
return result | |
def new_txt_layer(nr, alldata, where): | |
img, size = alldata[nr] | |
lay = Layer(Rect(10, where, size.w, size.h + 5)) | |
lay.image = img | |
return lay | |
def m_one_txt_layer(txt,x,y, col= Color(1,0,0), extra = 0):#strw = 0): | |
img, size = render_text(txt, font_size = 30) | |
lay = Layer(Rect(x, y, size.w, size.h + extra)) | |
lay.image = img | |
lay.background = col | |
#if strw > 0 : | |
#lay.stroke_width = strw | |
return lay | |
class MyScene (Scene): | |
def change_dir_to(self,td): | |
self.dir_name_layers, self.nr_dirs, self.nr_files, self.all_names = prepare_all_data(td, self.st) | |
#print self.nr_dirs, self.nr_files | |
self.total = len(self.dir_name_layers) | |
if not self.total: | |
print '***IMPOSSIBLE TD =', td | |
sys.exit(1) | |
print '***DBG CHANGE_DIR_TO TOTAL = ', self.total | |
#list of ranges to do | |
self.my_ranges = range_split(self.total, 18) | |
#print self.my_ranges | |
self.nr_ranges = len(self.my_ranges) | |
#if something went wrong, an error is printed in the console | |
#otherwise take the firs possibility of items: | |
for el in self.my_ranges[0]: | |
self.root.add_layer(self.dir_name_layers[el]) | |
#used_range is a counter used to implement | |
#the NEXT button action | |
self.used_range = 0 | |
self.is_DIR = False | |
self.nr_menus = 7 | |
def make_menu(self): | |
#a menu always to be printed at lower left of the screen | |
self.Next = m_one_txt_layer('Next ', 750,10) | |
self.Next.stroke = Color(0,0,1) | |
self.root.add_layer(self.Next) | |
self.zero = m_one_txt_layer(' 0 ' + interesting_dirs[0] + ' start pythonista',750, 50\ | |
,Color(0,0,1)) | |
self.root.add_layer(self.zero) | |
self.one = m_one_txt_layer(' 1 ' + interesting_dirs[1] + ' start Ipad', 750, 100, Color(0,1,0)) | |
self.root.add_layer(self.one) | |
self.two = m_one_txt_layer(' 2 ' + interesting_dirs[2], 750 ,150, Color(0,1,1)) | |
self.root.add_layer(self.two) | |
self.rotate = m_one_txt_layer(' ROTATE down', 750, 200, Color(.5, .5, 0), 20) | |
self.root.add_layer(self.rotate) | |
self.new_dir = m_one_txt_layer(' this DIR ', 750, 260, Color(.5,.5,.5),10) | |
self.root.add_layer(self.new_dir) | |
self.txt_file = m_one_txt_layer(' text to console', 750, 320, Color(0,0.5,1),10) | |
self.root.add_layer(self.txt_file) | |
self.nr_menus = 7 | |
def setup(self): | |
self.all_names = [] | |
# This will be called before the first frame is drawn. | |
# Set up the root layer and one other layer: | |
self.root = Layer(self.bounds) | |
td = interesting_dirs[1] | |
#some possibilities for direct change: | |
#td = '/Applications/Maps.app' | |
#td = '/Applicatios/Utilities' | |
#td = '/Applications/Maps.app/Japanese.lproj' | |
self.st = 18 #number of max antal names in root | |
self.change_dir_to(td) | |
self.nr_menus = 5 #will be overwritten by make_menu | |
self.make_menu() | |
self.is_DIR = False | |
def draw(self): | |
# Update and draw our root layer. For a layer-based scene, this | |
# is usually all you have to do in the draw method. | |
background(0, 0, 0) | |
self.root.update(self.dt) | |
self.root.draw() | |
def add_menu(self): | |
#because of deleting evt. all layers this is easily painted again | |
self.root.add_layer(self.Next) | |
self.root.add_layer(self.zero) | |
self.root.add_layer(self.one) | |
self.root.add_layer(self.two) | |
self.root.add_layer(self.rotate) | |
self.root.add_layer(self.new_dir) | |
self.root.add_layer(self.txt_file) | |
def touch_began(self, touch): | |
def which_item(): | |
result = None | |
self.is_DIR = '' | |
#PKHG.dbg print len(self.root.sublayers),self.my_ranges[self.used_range] | |
for el in self.my_ranges[self.used_range]: | |
el = el % self.st | |
if touch.location in self.root.sublayers[el].frame: | |
self.is_DIR = self.root.sublayers[el] | |
self.is_DIR.stroke == Color(1,0,0) | |
#self.new_dir.stroke = Color(0,1,0) | |
print 'I am ', self.is_DIR | |
self.root.sublayers[el].stroke = Color(1,1,1) | |
#print 'found ',el | |
result = self.all_names[self.root.sublayers[el].image] | |
self.is_DIR = result | |
return result | |
def show_next(): | |
if self.nr_ranges > 0: | |
self.root.sublayers = [] | |
self.used_range = (self.used_range + 1) % self.nr_ranges | |
for el in self.my_ranges[self.used_range]: | |
self.root.add_layer(self.dir_name_layers[el]) | |
def rotate_down(): | |
#the relvant frames are moved below | |
#the lowest on goes to the top | |
nsublayers = [] | |
el0 = self.root.sublayers.pop(0) #this is the lowest one | |
for lay in self.root.sublayers[:(- self.nr_menus)]: | |
#lay's frame has to be adjusted, not chaning the img! | |
r,img,stcol,str= lay.frame,lay.image,lay.stroke,lay.stroke_weight | |
nr = Rect(r.x, r.y -35, r.w, r.h) | |
nl = Layer(nr) | |
nl.stroke_weight = str | |
nl.stroke = stcol | |
nl.image = img | |
nsublayers.append(nl) | |
r = el0.frame | |
img = el0.image | |
strcol= el0.stroke | |
strw = el0.stroke_weight | |
nr = Rect(r.x, 35 *(1 + len(nsublayers)),r.w,r.h) | |
nl = Layer(nr) | |
nl.image = img | |
nl.stroke = strcol | |
nl.stroke_weight = strw | |
nsublayers.append(nl) | |
self.root.sublayers = nsublayers | |
#print touch.location | |
go_on = True | |
#Check where a touch is done! | |
if touch.location in self.Next.frame: | |
#self.root.sublayers = [] | |
show_next() | |
elif touch.location in self.zero.frame: | |
self.root.sublayers = [] | |
self.td = 0 | |
#ok print 'td now', self.td | |
dir_ch = interesting_dirs[self.td] | |
self.change_dir_to(dir_ch) | |
elif touch.location in self.one.frame: | |
self.root.sublayers = [] | |
self.td = 1 | |
dir_ch = interesting_dirs[self.td] | |
self.change_dir_to(dir_ch) | |
elif touch.location in self.two.frame: | |
self.root.sublayers = [] | |
self.td = 2 | |
dir_ch = interesting_dirs[self.td] | |
self.change_dir_to(dir_ch) | |
elif touch.location in self.rotate.frame: | |
rotate_down() | |
elif touch.location in self.new_dir.frame: | |
if self.is_DIR: | |
if path.isdir(self.is_DIR): | |
print 'new_dir ==>', self.is_DIR | |
self.root.sublayers = [] | |
self.change_dir_to(self.is_DIR) | |
else: | |
print '***INFO ', self.is_DIR, ' is not a directory!' | |
else: | |
print '***ERROR no dir chosen' | |
elif touch.location in self.txt_file.frame: | |
if self.is_DIR: | |
if path.isfile(self.is_DIR): | |
fd = open(self.is_DIR) | |
try: | |
for line in fd: | |
print line | |
finally: | |
fd.close() | |
elif touch.location.x < 600: | |
#print 'item at' , touch.location | |
res = which_item() | |
print res | |
if res: | |
stat_info = stat(res) | |
print 'ctime= ', ctime(stat_info.st_ctime) | |
#print 'atime= ', ctime(stat_info.st_atime) | |
print 'size =', int(stat_info.st_size), ' bytes' | |
else: | |
go_on = False | |
if go_on: | |
self.add_menu() | |
else: | |
pass | |
#sys.exit() | |
def touch_moved(self, touch): | |
pass | |
def touch_ended(self, touch): | |
#self.root.sublayers=[] | |
#self.root.remove_layer(self.my_Layers[1]) | |
pass | |
run(MyScene()) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment