Skip to content

Instantly share code, notes, and snippets.

@PKHG
Created November 8, 2012 16:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save PKHG/4039885 to your computer and use it in GitHub Desktop.
Save PKHG/4039885 to your computer and use it in GitHub Desktop.
a way to explore your Ipad internal storage
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