X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=manga%2Freader.py;h=1a8aa05051bb53edc7761b3d82f59ee792e05808;hb=012c4cae7ca181ac6a6fbb85c8f808cc1259470c;hp=d5dc286db6cf40ecb02d57a64d8687ee858b2f06;hpb=304250ffbb12fb20108c4a22e294a0595a364b44;p=automanga.git diff --git a/manga/reader.py b/manga/reader.py index d5dc286..1a8aa05 100644 --- a/manga/reader.py +++ b/manga/reader.py @@ -23,17 +23,18 @@ class future(threading.Thread): try: val = self.value() except Exception as e: - with gtk.gdk.lock: - self._exc = e - for cb in self._notlist: - cb() - self._notlist = [] + self._exc = e + gobject.idle_add(self._callcbs, True) else: - with gtk.gdk.lock: - self._val = [val] - for cb in self._notlist: - cb() - self._notlist = [] + self._val = [val] + gobject.idle_add(self._callcbs, True) + + def _callcbs(self, final): + nls = [] + for cb in self._notlist: + if cb(): + nls.append(cb) + self._notlist = [] if final else nls # Caller must hold GDK lock def notify(self, cb): @@ -44,12 +45,7 @@ class future(threading.Thread): cb() def progcb(self): - with gtk.gdk.lock: - nls = [] - for cb in self._notlist: - if cb(): - nls.append(cb) - self._notlist = nls + gobject.idle_add(self._callcbs, False) @property def val(self): @@ -91,7 +87,11 @@ class imgload(future): buf.extend(read) self.progcb() self.st = None - return gtk.gdk.pixbuf_new_from_stream(gio.memory_input_stream_new_from_data(str(buf))) + with gtk.gdk.lock: + try: + return gtk.gdk.pixbuf_new_from_stream(gio.memory_input_stream_new_from_data(str(buf))) + finally: + gtk.gdk.flush() @property def prog(self): @@ -112,7 +112,7 @@ class pagecache(object): f = imgload(page) self.bk.append((idl, f)) if len(self.bk) > self.sz: - self.bk = self.bk[-sz:] + self.bk = self.bk[-self.sz:] return f class relpageget(future): @@ -136,6 +136,15 @@ class relpageget(future): self.cache[page] return page +class idpageget(future): + def __init__(self, base, idlist): + super(idpageget, self).__init__() + self.bnode = base + self.idlist = idlist + + def value(self): + return lib.cursor(self.bnode.byidlist(self.idlist)).cur + class pageget(future): def __init__(self, fnode): super(pageget, self).__init__() @@ -185,7 +194,8 @@ class pageview(gtk.Widget): self.window.set_user_data(None) def do_size_request(self, req): - req.width, req.height = self.get_osize() + w, h = self.get_osize() + req.width, req.height = max(min(w, 4096), 0), max(min(h, 4096), 0) def fitzoom(self): w, h = self.get_osize() @@ -391,8 +401,61 @@ class procslot(object): self.cur = None raise +class plistget(future): + def __init__(self, node): + super(plistget, self).__init__() + self.node = node + + def value(self): + return list(self.node) + +class loadplist(object): + def __init__(self, pnode): + self.pnode = pnode + self.flist = plistget(self.pnode) + + def attach(self, sbox): + self.sbox = sbox + self.flist.notify(self.haslist) + + def haslist(self): + if self.sbox.loadlist.cur != self: return False + if not self.flist.done: return True + self.sbox.setlist(self.flist.val) + +class sbox(gtk.ComboBox): + def __init__(self, reader, ptnode): + super(sbox, self).__init__() + self.rd = reader + self.node = ptnode + self.pnode, self.pidx = self.node.stack[-1] + + self.bk = gtk.ListStore(str) + self.set_model(self.bk) + cell = gtk.CellRendererText() + self.pack_start(cell, True) + self.add_attribute(cell, "text", 0) + self.set_active(0) + + self.set_sensitive(False) + self.set_focus_on_click(False) + self.bk.append([ptnode.name]) + self.loadlist = procslot(self) + self.loadlist.set(loadplist(self.pnode)) + + def setlist(self, ls): + self.bk.clear() + for i, ch in enumerate(ls): + self.bk.append(["%i/%i: %s" % (i + 1, len(ls), ch.name)]) + self.set_active(self.pidx) + self.set_sensitive(True) + self.connect("changed", self.changed_cb) + + def changed_cb(self, wdg, data=None): + self.rd.fetchpage(pageget(self.pnode[self.get_active()])) + class reader(gtk.Window): - def __init__(self, manga): + def __init__(self, manga, profile=None): super(reader, self).__init__(gtk.WINDOW_TOPLEVEL) self.connect("delete_event", lambda wdg, ev, data=None: False) self.connect("destroy", lambda wdg, data=None: self.quit()) @@ -401,12 +464,27 @@ class reader(gtk.Window): self.pagefetch = procslot(self) self.imgfetch = procslot(self) self.preload = procslot(self) + self.profile = profile + + self.manga = manga + self.page = None + self.sboxes = [] + self.point = None vlay = gtk.VBox() self.pfr = gtk.Frame(None) self.pfr.set_shadow_type(gtk.SHADOW_NONE) vlay.pack_start(self.pfr) self.pfr.show() + self.sboxbar = gtk.HBox() + algn = gtk.Alignment(0, 0.5, 0, 0) + sboxlbl = gtk.Label(self.manga.name + u": ") + algn.add(sboxlbl) + sboxlbl.show() + self.sboxbar.pack_start(algn, False) + algn.show() + vlay.pack_start(self.sboxbar, False) + self.sboxbar.show() self.sbar = gtk.HBox() self.pagelbl = gtk.Label("") algn = gtk.Alignment(0, 0.5, 0, 0) @@ -419,11 +497,11 @@ class reader(gtk.Window): self.add(vlay) vlay.show() - self.manga = manga - self.page = None - self.fetchpage(pageget(self.manga)) + if self.profile and "curpage" in self.profile: + self.fetchpage(idpageget(self.manga, self.profile["curpage"])) + else: + self.fetchpage(pageget(self.manga)) self.updtitle() - self.point = None def updpagelbl(self): if self.page is None: @@ -432,6 +510,22 @@ class reader(gtk.Window): w, h = self.page.get_osize() self.pagelbl.set_text(u"%s\u00d7%s (%d%%)" % (w, h, int(self.page.zoom * 100))) + def updsboxes(self, page): + nodes = [node for node, idx in page.stack[1:]] + [page] + l = min(len(self.sboxes), len(nodes)) + for i, (pbox, node) in enumerate(zip(self.sboxes, nodes)): + if pbox.node != node: + l = i + break + for i in xrange(l, len(self.sboxes)): + self.sboxbar.remove(self.sboxes[i]) + self.sboxes = self.sboxes[:l] + for i in xrange(l, len(nodes)): + new = sbox(self, nodes[i]) + self.sboxbar.pack_start(new, False, padding=5) + self.sboxes.append(new) + new.show() + def setimg(self, img): if self.page is not None: self.pfr.remove(self.page) @@ -446,10 +540,14 @@ class reader(gtk.Window): if self.point is not None: self.point = None if page is not None: + if self.profile: + self.profile.setprop("curpage", page.idlist()) + self.profile.saveprops() self.point = ccursor(page, self.cache) self.imgfetch.set(imgfetch(self.cache[page])) else: self.setimg(None) + self.updsboxes(page) def fetchpage(self, fpage, setcb=None): self.imgfetch.set(None)