X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=manga%2Freader.py;h=6f98beee3a9c5932f6c2d840aba7de0d992d141a;hb=d9163efe24c7d8653fa1880612ab8e0864d5ae9d;hp=ed58ff7b998f95916e2f7f55e7decd206bb519ae;hpb=95213fa6b373916e7aefef1284aaa5619a8419b7;p=automanga.git diff --git a/manga/reader.py b/manga/reader.py index ed58ff7..6f98bee 100644 --- a/manga/reader.py +++ b/manga/reader.py @@ -24,16 +24,22 @@ class future(threading.Thread): val = self.value() except Exception as e: with gtk.gdk.lock: - self._exc = e - for cb in self._notlist: - cb() - self._notlist = [] + try: + self._exc = e + for cb in self._notlist: + cb() + self._notlist = [] + finally: + gtk.gdk.flush() else: with gtk.gdk.lock: - self._val = [val] - for cb in self._notlist: - cb() - self._notlist = [] + try: + self._val = [val] + for cb in self._notlist: + cb() + self._notlist = [] + finally: + gtk.gdk.flush() # Caller must hold GDK lock def notify(self, cb): @@ -45,11 +51,14 @@ class future(threading.Thread): def progcb(self): with gtk.gdk.lock: - nls = [] - for cb in self._notlist: - if cb(): - nls.append(cb) - self._notlist = nls + try: + nls = [] + for cb in self._notlist: + if cb(): + nls.append(cb) + self._notlist = nls + finally: + gtk.gdk.flush() @property def val(self): @@ -112,7 +121,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): @@ -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() @@ -263,23 +273,41 @@ class pageview(gtk.Widget): self.set_off((ox, oy)) gobject.type_register(pageview) -class pagefetch(object): - def __init__(self, fpage, setcb=None): - self.pg = fpage - self.setcb = setcb - +class msgproc(object): def attach(self, reader): self.rd = reader self.msg = gtk.Alignment(0, 0.5, 0, 0) self.hlay = gtk.HBox() - self.lbl = gtk.Label("Fetching page...") + self.lbl = gtk.Label("") self.hlay.pack_start(self.lbl) self.lbl.show() self.msg.add(self.hlay) self.hlay.show() self.rd.sbar.pack_start(self.msg) self.msg.show() + self._prog = None + + def prog(self, p): + if p is not None and self._prog is None: + self._prog = gtk.ProgressBar() + self._prog.set_fraction(p) + self.hlay.pack_start(self._prog, padding=5) + self._prog.show() + elif p is None and self._prog is not None: + self.hlay.remove(self._prog) + self._prog = None + + def abort(self): + self.rd.sbar.remove(self.msg) +class pagefetch(msgproc): + def __init__(self, fpage, setcb=None): + self.pg = fpage + self.setcb = setcb + + def attach(self, reader): + super(pagefetch, self).attach(reader) + self.lbl.set_text("Fetching page...") self.pg.notify(self.haspage) def haspage(self): @@ -292,31 +320,15 @@ class pagefetch(object): self.setcb(self.pg.val) self.rd.pagefetch.set(None) - def abort(self): - self.rd.sbar.remove(self.msg) - -class imgfetch(object): +class imgfetch(msgproc): def __init__(self, fimage): self.img = fimage self.upd = False self.error = None def attach(self, reader): - self.rd = reader - self.msg = gtk.Alignment(0, 0.5, 0, 0) - self.hlay = gtk.HBox() - self.lbl = gtk.Label("Fetching image...") - self.hlay.pack_start(self.lbl) - self.lbl.show() - self.prog = gtk.ProgressBar() - self.prog.set_fraction(0.0) - self.hlay.pack_start(self.prog, padding=5) - self.prog.show() - self.msg.add(self.hlay) - self.hlay.show() - self.rd.sbar.pack_start(self.msg) - self.msg.show() - + super(imgfetch, self).attach(reader) + self.lbl.set_text("Fetching image...") self.img.notify(self.imgprog) def imgprog(self): @@ -331,8 +343,7 @@ class imgfetch(object): self.upd = True self.rd.imgfetch.set(None) else: - p = self.img.prog - if p: self.prog.set_fraction(p) + self.prog(self.img.prog) return True def abort(self): @@ -342,22 +353,13 @@ class imgfetch(object): if self.error is not None: self.rd.pagelbl.set_text("Error fetching image: " + self.error) -class preload(object): +class preload(msgproc): def __init__(self, fpage): self.pg = fpage def attach(self, reader): - self.rd = reader - self.msg = gtk.Alignment(0, 0.5, 0, 0) - self.hlay = gtk.HBox() - self.lbl = gtk.Label("Fetching next page...") - self.hlay.pack_start(self.lbl) - self.lbl.show() - self.msg.add(self.hlay) - self.hlay.show() - self.rd.sbar.pack_start(self.msg) - self.msg.show() - + super(preload, self).attach(reader) + self.lbl.set_text("Fetching next page...") self.pg.notify(self.haspage) def haspage(self): @@ -365,10 +367,6 @@ class preload(object): if not self.pg.done: return True if self.pg.val is not None: self.img = self.rd.cache[self.pg.val] - self.prog = gtk.ProgressBar() - self.prog.set_fraction(0.0) - self.hlay.pack_start(self.prog, padding=5) - self.prog.show() self.lbl.set_text("Loading next page...") self.img.notify(self.imgprog) else: @@ -379,8 +377,7 @@ class preload(object): if self.img.done: self.rd.preload.set(None) else: - p = self.img.prog - if p: self.prog.set_fraction(p) + self.prog(self.img.prog) return True def abort(self): @@ -404,6 +401,59 @@ 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): super(reader, self).__init__(gtk.WINDOW_TOPLEVEL) @@ -415,11 +465,25 @@ class reader(gtk.Window): self.imgfetch = procslot(self) self.preload = procslot(self) + 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) @@ -432,11 +496,8 @@ class reader(gtk.Window): self.add(vlay) vlay.show() - self.manga = manga - self.page = None self.fetchpage(pageget(self.manga)) self.updtitle() - self.point = None def updpagelbl(self): if self.page is None: @@ -445,6 +506,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) @@ -463,6 +540,7 @@ class reader(gtk.Window): self.imgfetch.set(imgfetch(self.cache[page])) else: self.setimg(None) + self.updsboxes(page) def fetchpage(self, fpage, setcb=None): self.imgfetch.set(None)