def main(): from ui import Image i = Image.named('test:Lenna') with open('test.png', 'wb') as f: f.write(i.to_png()) contextc = EAGL.EAGLContext(EAGL.RenderingAPI.OpenGLES2) GLKit.setRenderEngine(Renderer()) glviewv.setDelegate(GLKit.GLKViewDelegate()) glviewv.setContext(contextc) glviewv.present("sheet")
def makeicon(c1, c2, name): gradient = makegradient(c1, c2, appsize) # hack to support partial transparency uii = UIImage.named(name) data = io.BytesIO(uii.to_png()) top = PILImage.open(data) icon = composite(top, gradient, offset) data.close() with io.BytesIO() as bIO: icon.save(bIO, 'PNG') img = UIImage.from_data(bIO.getvalue()) return img
bm_view = ui.load_view('bookmark') nav_view = ui.NavigationView(reader_view) tb = bm_view['tableview'] tb.data_source.items = dict_bm['bookmarks'] tb.data_source.edit_action = conf_loader.refresh_file for i in range(18): sc.add_subview(reader_view[f'label{i}']) var = Reader(sc, tb) var_bm_table_viewer = BMTableViewer(var) sc.delegate = var tb.delegate = var_bm_table_viewer reader_view['button_save_bm'].action = var_bm_table_viewer.save_bm nav_view.navigation_bar_hidden = True nav_view.present('fullscreen') return_button_item = ui.ButtonItem( image=Image.named('iob:arrow_return_left_24')) bm_button_items = [return_button_item] nav_view.right_button_items = bm_button_items return_button_item.action = nav_view.pop_view reader_view['button_show_bm'].action = lambda _: nav_view.push_view(bm_view) menu_button_item = ui.ButtonItem(image=Image.named('iob:navicon_round_24')) main_button_items = [menu_button_item] menu_button_item.action = nav_view.pop_view
class Reader: ITEM_H = 70 WIDTH_LINE = 337 LOADING = Image.named('iob:load_d_32') LOADING_HEIGHT = WIDTH_LINE / LOADING.size.x * LOADING.size.y def __init__(self, scrollview, tableview): self.var_ebook_loader = EImgLoader(dict_conf) self.has_sent_req = False self.scrollview = scrollview self.tableview = tableview self.queue = Queue() self.items = deque(self.scrollview.subviews) assert (len(self.items) - 1) * self.ITEM_H > scrollview.height self.init_subviews(url) def load_img(self, init=False): imgs, title, url = self.var_ebook_loader.get_one_img() self.queue.put((imgs, title, url, init)) def check_title(self): off_set = self.cur_offset for item in self.items: if item.y + item.height >= off_set: i = item.i if i is None: continue for l, r, name, url in self.titles: if l <= i < r: nav_view.name = name return def add2contents(self): if not self.queue.empty(): imgs, title, url, init = self.queue.get() if imgs is None: console.hud_alert('已经阅读完毕') return False l = len(self.contents) # 保证进度条不会完全到底 sum_height = -10 if init else 0 for img in imgs: resized_height = self.WIDTH_LINE / img.size.x * img.size.y sum_height += resized_height self.contents.append((img, resized_height)) r = len(self.contents) if self.titles: # merge 当一个页面多个图片 last_title = self.titles[-1] if last_title[3] == url: self.titles[-1] = (last_title[0], r, title, url) else: self.titles.append((l, r, title, url)) else: self.titles.append((l, r, title, url)) self.scrollview.content_size += (0, sum_height) self.has_sent_req = False return True return False def load_img_bg(self): if not self.has_sent_req: self.has_sent_req = True self.t = threading.Thread(target=self.load_img) self.t.start() def init_subviews(self, url, i=0, j=0): if self.has_sent_req: self.t.join() self.has_sent_req = False self.queue = Queue() scrollview = self.scrollview scrollview.content_size = (scrollview.width, 0) self.cur_offset = 0 # [(image, resized_height),] self.contents = [] # (l, r, name) self.titles = [] self.var_ebook_loader.init_url(url) self.load_img(True) self.add2contents() # 条件应该是把一页填充满而且书签模式下尽量加载 while scrollview.content_size.y <= scrollview.height or len( self.contents) <= i: self.load_img() self.add2contents() # print(scrollview.content_size) rows = i len_content = len(self.contents) len_items = len(self.items) y = 0 start = max(0, len_items - len_content) remain = islice(self.items, start, len_items) for i, (item, content) in enumerate(zip(remain, self.contents)): img, resize_height = content item.height = resize_height item.image = img item.i = i item.y = y y += resize_height # 未使用的item往上放 y = 0 if len_content < len_items: end = len_items - len_content - 1 for i in range(end, -1, -1): item = self.items[i] item.i = None item.image = None y -= item.height item.y = y # 书签偏移量 h = 0 for content in self.contents[:rows]: img, resize_height = content h += resize_height # 这个破玩意儿改了之后会自动调用监听函数 scrollview.content_offset = (0, h + j) self.check_title() def reset_scrollbar(self): scrollview = self.scrollview offset_x, offset_y = scrollview.content_offset max_offset = scrollview.content_size.y - scrollview.height cur_offset = offset_y min_offset = min(cur_offset, max_offset) scrollview.content_offset = (offset_x, min_offset) def scrollview_did_scroll(self, scrollview): offset = scrollview.content_offset.y is_scroll_down = True if offset > self.cur_offset else False self.cur_offset = offset reader_h = scrollview.height # print('t') content_size = scrollview.content_size[1] # 预加载 if content_size and content_size - self.cur_offset <= 4 * reader_h: self.load_img_bg() # 滚动条下移 if is_scroll_down: while True: item_end = self.items[-1] item_start = self.items[0] if (item_end.y + item_end.height - reader_h <= offset and item_end.i is not None): # console.hud_alert('应该load') i = item_end.i + 1 if i >= len(self.contents): img = self.LOADING resized_height = self.LOADING_HEIGHT self.load_img_bg() i = None else: img, resized_height = self.contents[i] item_start.image = img item_start.y = item_end.y + item_end.height item_start.height = resized_height item_start.i = i self.items.rotate(-1) elif item_end.i is None and item_end.y <= offset + reader_h: # console.hud_alert(f'应该refresh') if not self.add2contents(): break item = self.items[-2] i = item.i + 1 if i < len(self.contents): img, resized_height = self.contents[i] item_end.image = img item_end.y = item.y + item.height item_end.height = resized_height item_end.i = i # 这个防止空白页吧……会有吗? else: break else: break else: while True: item_end = self.items[-1] item_start = self.items[0] if item_start.y >= offset: # None的时候仅仅是初始化设计导致的 if item_start.i is None or item_start.i <= 0: break i = item_start.i - 1 img, resized_height = self.contents[i] item_end.image = img item_end.height = resized_height item_end.y = item_start.y - resized_height item_end.i = i self.items.rotate(1) else: break self.check_title()
def image(self): # TODO - Find a way how get the right icon, because there's # lot of prefixes like iob:, different sizes, ... image = Image.named('iob:play_32') return image
t = GLKEffectPropertyTexture() print t print t.enabled print t.envMode print t.name print t.target ti = GLKTextureInfo() print ti print ti.name print ti.target print ti.height print ti.containsMipmaps from ui import Image as image i = image.named('test:Lenna') d = i.to_png() with open('test.png', 'wb') as f: f.write(d) t = (ctypes.c_char_p * len(d)) pt = t() pt[:] = d[:] tid = loadTexture('test:Lenna') print tid from OpenGLES.Util.Shader import ShaderProgram from OpenGLES.Util.Shader import ShaderSource with open("../shader.vs", "rb") as f: v = ShaderSource(f.read(), ES3.GL_VERTEX_SHADER) with open("../shader.fs", "rb") as f: f = ShaderSource(f.read(), ES3.GL_FRAGMENT_SHADER)
class EImgBodyViewer: ITEM_H = 70 WIDTH_LINE = 337 LOADING = Image.named('iob:load_d_32') LOADING_HEIGHT = WIDTH_LINE / LOADING.size.x * LOADING.size.y def __init__(self, parent): reader_view = ui.load_view('ebody_viewer/eimg_body') scrollview = reader_view['scrollview'] for i in range(9): # print(reader_view[f'imageview{i}']) scrollview.add_subview(reader_view[f'imageview{i}']) scrollview.delegate = self self.has_sent_req = False self.scrollview = scrollview self.reader_view = reader_view self.items = deque(self.scrollview.subviews) assert (len(self.items) - 1) * self.ITEM_H > scrollview.height self.parent = parent def req_data_bg(self): self.parent.req_data_bg(self) def req_data(self, init=False): self.parent.req_data(self, init) def set_navi_view_name(self, name): self.parent.set_navi_view_name(name) def refresh_title(self): off_set = self.cur_offset for item in self.items: if item.y + item.height >= off_set: i = item.i if i is None: continue for l, r, name, url in self.titles: if l <= i < r: self.set_navi_view_name(name) return def load_data(self): element = self.parent.load_data(self) if element is None: return False if element[0] is None: # 到底之后不再复位self.has_sent_req console.hud_alert('已经阅读完毕') return False l = len(self.contents) imgs, title, url, init = element # 保证进度条不会完全到底 sum_height = -10 if init else 0 for img in imgs: resized_height = self.WIDTH_LINE / img.size.x * img.size.y sum_height += resized_height self.contents.append((img, resized_height)) r = len(self.contents) if self.titles: # merge 当一个页面多个图片 last_title = self.titles[-1] if last_title[3] == url: self.titles[-1] = (last_title[0], r, title, url) else: self.titles.append((l, r, title, url)) else: self.titles.append((l, r, title, url)) self.scrollview.content_size += (0, sum_height) self.has_sent_req = False return True def reset_view(self, i=0, j=0): scrollview = self.scrollview # [(image, resized_height),] self.contents = [] # (l, r, name) self.titles = [] scrollview.content_size = (scrollview.width, 0) self.cur_offset = 0 self.req_data(True) self.load_data() # 条件应该是把一页填充满而且书签模式下尽量加载 while scrollview.content_size.y <= scrollview.height or len( self.contents) <= i: self.req_data() self.load_data() # print(scrollview.content_size) rows = i len_content = len(self.contents) len_items = len(self.items) y = 0 start = max(0, len_items - len_content) remain = islice(self.items, start, len_items) for i, (item, content) in enumerate(zip(remain, self.contents)): img, resize_height = content item.height = resize_height item.image = img item.i = i item.y = y y += resize_height # 未使用的item往上放 y = 0 if len_content < len_items: end = len_items - len_content - 1 for i in range(end, -1, -1): item = self.items[i] item.i = None item.image = None y -= item.height item.y = y # 书签偏移量 h = 0 for content in self.contents[:rows]: img, resize_height = content h += resize_height # 这个破玩意儿改了之后会自动调用监听函数 scrollview.content_offset = (0, h + j) self.refresh_title() def get_offset(self): scrollview = self.scrollview off_set = scrollview.content_offset.y i = None for item in self.items: if item.y + item.height >= off_set: i = item.i j = off_set - item.y break if i is None: return for l, r, name, url in self.titles: if l <= i < r: # 本页的i 相对段落数目 new_bookmark = { 'i': i - l, 'j': int(j), 'url': url, 'title': name } return new_bookmark def reset_scrollbar(self): scrollview = self.scrollview offset_x, offset_y = scrollview.content_offset max_offset = scrollview.content_size.y - scrollview.height cur_offset = offset_y min_offset = min(cur_offset, max_offset) scrollview.content_offset = (offset_x, min_offset) def scrollview_did_scroll(self, scrollview): offset = scrollview.content_offset.y is_scroll_down = True if offset > self.cur_offset else False self.cur_offset = offset reader_h = scrollview.height # print('t') content_size = scrollview.content_size[1] if not content_size: return # 预加载 if content_size - self.cur_offset <= 4 * reader_h: self.req_data_bg() # 滚动条下移 if is_scroll_down: while True: item_end = self.items[-1] item_start = self.items[0] if (item_end.y + item_end.height - reader_h <= offset and item_end.i is not None): # console.hud_alert('应该load') i = item_end.i + 1 if i >= len(self.contents): img = self.LOADING resized_height = self.LOADING_HEIGHT self.req_data_bg() i = None else: img, resized_height = self.contents[i] item_start.image = img item_start.y = item_end.y + item_end.height item_start.height = resized_height item_start.i = i self.items.rotate(-1) elif item_end.i is None and item_end.y <= offset + reader_h: # console.hud_alert(f'应该refresh') if not self.load_data(): break item = self.items[-2] i = item.i + 1 if i < len(self.contents): img, resized_height = self.contents[i] item_end.image = img item_end.y = item.y + item.height item_end.height = resized_height item_end.i = i # 这个防止空白页吧……会有吗? else: break else: break else: while True: item_end = self.items[-1] item_start = self.items[0] if item_start.y >= offset: # None的时候仅仅是初始化设计导致的 if item_start.i is None or item_start.i <= 0: break i = item_start.i - 1 img, resized_height = self.contents[i] item_end.image = img item_end.height = resized_height item_end.y = item_start.y - resized_height item_end.i = i self.items.rotate(1) else: break self.refresh_title()
import base64 from ui import Image import console import sys import io sys.stderr = io.StringIO() console.show_activity('Creating images…') imagefilenames = [os.path.splitext(i)[0] for i in open(os.path.expanduser('~/Pythonista.app/Typicons-M.txt')).readlines()] imagenames = [i.replace('Typicons96_', '') for i in imagefilenames] images = {n: Image.named(imagefilenames[i]) for (i, n) in enumerate(imagenames)} imageurls = {k:'data:image/png;base64,'+base64.b64encode(images[k].to_png()) for k in images} choosecolorpath = os.path.dirname(sys.argv[0].split('/Documents/',1)[1]) + '/choosecolor.py' tagtemplate = '<a href="pythonista://' +choosecolorpath+ '?action=run&argv=%s"><img src="%s"></a>' imagetags = [tagtemplate%(k,imageurls[k]) for k in imagenames] imagesstring = ''.join(imagetags) html = ''' <!DOCTYPE html> <html> <head>