mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
E-book viewer: Fix a bug that could cause the back button in the viewer to skip a location
This commit is contained in:
parent
08bf64d679
commit
d0e143fdd8
@ -1,7 +1,7 @@
|
|||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
import traceback, os, sys, functools, collections, textwrap
|
import traceback, os, sys, functools, textwrap
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
@ -48,39 +48,57 @@ class Worker(Thread):
|
|||||||
self.exception = err
|
self.exception = err
|
||||||
self.traceback = traceback.format_exc()
|
self.traceback = traceback.format_exc()
|
||||||
|
|
||||||
class History(collections.deque):
|
class History(list):
|
||||||
|
|
||||||
def __init__(self, action_back, action_forward):
|
def __init__(self, action_back, action_forward):
|
||||||
self.action_back = action_back
|
self.action_back = action_back
|
||||||
self.action_forward = action_forward
|
self.action_forward = action_forward
|
||||||
collections.deque.__init__(self)
|
super(History, self).__init__(self)
|
||||||
self.pos = 0
|
self.insert_pos = 0
|
||||||
|
self.back_pos = None
|
||||||
|
self.forward_pos = None
|
||||||
self.set_actions()
|
self.set_actions()
|
||||||
|
|
||||||
def set_actions(self):
|
def set_actions(self):
|
||||||
self.action_back.setDisabled(self.pos < 1)
|
self.action_back.setDisabled(self.back_pos is None)
|
||||||
self.action_forward.setDisabled(self.pos + 1 >= len(self))
|
self.action_forward.setDisabled(self.forward_pos is None)
|
||||||
|
|
||||||
def back(self, from_pos):
|
def back(self, from_pos):
|
||||||
if self.pos - 1 < 0: return None
|
# Back clicked
|
||||||
if self.pos == len(self):
|
if self.back_pos is None:
|
||||||
self.append([])
|
return None
|
||||||
self[self.pos] = from_pos
|
item = self[self.back_pos]
|
||||||
self.pos -= 1
|
# The next forward must go to from_pos
|
||||||
|
self.forward_pos = self.back_pos+1
|
||||||
|
if self.forward_pos >= len(self) or self[self.forward_pos] != from_pos:
|
||||||
|
self.insert(self.forward_pos, from_pos)
|
||||||
|
self.insert_pos = self.forward_pos
|
||||||
|
self.back_pos = None if self.back_pos == 0 else self.back_pos - 1
|
||||||
self.set_actions()
|
self.set_actions()
|
||||||
return self[self.pos]
|
return item
|
||||||
|
|
||||||
def forward(self):
|
def forward(self, from_pos):
|
||||||
if self.pos + 1 >= len(self): return None
|
if self.forward_pos is None:
|
||||||
self.pos += 1
|
return None
|
||||||
|
item = self[self.forward_pos]
|
||||||
|
self.back_pos = self.forward_pos - 1
|
||||||
|
if self.back_pos < 0: self.back_pos = None
|
||||||
|
self.insert_pos = self.back_pos or 0
|
||||||
|
self.forward_pos = None if self.forward_pos > len(self) - 2 else self.forward_pos + 1
|
||||||
self.set_actions()
|
self.set_actions()
|
||||||
return self[self.pos]
|
return item
|
||||||
|
|
||||||
def add(self, item):
|
def add(self, item):
|
||||||
while len(self) > self.pos+1:
|
self[self.insert_pos:] = []
|
||||||
self.pop()
|
while self.insert_pos > 0 and self[self.insert_pos-1] == item:
|
||||||
self.append(item)
|
self.insert_pos -= 1
|
||||||
self.pos += 1
|
self[self.insert_pos:] = []
|
||||||
|
self.insert(self.insert_pos, item)
|
||||||
|
# The next back must go to item
|
||||||
|
self.back_pos = self.insert_pos
|
||||||
|
self.insert_pos += 1
|
||||||
|
# There can be no forward
|
||||||
|
self.forward_pos = None
|
||||||
self.set_actions()
|
self.set_actions()
|
||||||
|
|
||||||
class Metadata(QLabel):
|
class Metadata(QLabel):
|
||||||
@ -665,7 +683,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
self.goto_page(num)
|
self.goto_page(num)
|
||||||
|
|
||||||
def forward(self, x):
|
def forward(self, x):
|
||||||
pos = self.history.forward()
|
pos = self.history.forward(self.pos.value())
|
||||||
if pos is not None:
|
if pos is not None:
|
||||||
self.goto_page(pos)
|
self.goto_page(pos)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user