Ejemplo n.º 1
1
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")
Ejemplo n.º 2
0
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")
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
 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>
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
-1
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