mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Make preserving of library view when device is connected/books are sent to device more robust
This commit is contained in:
parent
f86b414c47
commit
27e73d54f3
@ -855,7 +855,7 @@ class DeviceMixin(object): # {{{
|
|||||||
Force the library view to refresh, taking into consideration new
|
Force the library view to refresh, taking into consideration new
|
||||||
device books information
|
device books information
|
||||||
'''
|
'''
|
||||||
with self.library_view.preserve_selected_books:
|
with self.library_view.preserve_state():
|
||||||
self.book_on_device(None, reset=True)
|
self.book_on_device(None, reset=True)
|
||||||
if reset_only:
|
if reset_only:
|
||||||
return
|
return
|
||||||
@ -1320,7 +1320,7 @@ class DeviceMixin(object): # {{{
|
|||||||
# If it does not, then do it here.
|
# If it does not, then do it here.
|
||||||
if not self.set_books_in_library(self.booklists(), reset=True, add_as_step_to_job=job):
|
if not self.set_books_in_library(self.booklists(), reset=True, add_as_step_to_job=job):
|
||||||
self.upload_booklists(job)
|
self.upload_booklists(job)
|
||||||
with self.library_view.preserve_selected_books:
|
with self.library_view.preserve_state():
|
||||||
self.book_on_device(None, reset=True)
|
self.book_on_device(None, reset=True)
|
||||||
self.refresh_ondevice()
|
self.refresh_ondevice()
|
||||||
|
|
||||||
|
@ -40,7 +40,42 @@ class PreserveSelection(object): # {{{
|
|||||||
def __exit__(self, *args):
|
def __exit__(self, *args):
|
||||||
current = self.view.get_selected_ids()
|
current = self.view.get_selected_ids()
|
||||||
if not current:
|
if not current:
|
||||||
self.view.select_rows(self.selected_ids, using_ids=True)
|
self.view.select_rows(self.selected_ids, using_ids=True,
|
||||||
|
change_current=False, scroll=False)
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
class PreserveViewState(object): # {{{
|
||||||
|
|
||||||
|
'''
|
||||||
|
Save the set of selected books at enter time. If at exit time there are no
|
||||||
|
selected books, restore the previous selection, the previous current index
|
||||||
|
and dont affect the scroll position.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self, view, preserve_hpos=True, preserve_vpos=True):
|
||||||
|
self.view = view
|
||||||
|
self.selected_ids = set()
|
||||||
|
self.current_id = None
|
||||||
|
self.preserve_hpos = preserve_hpos
|
||||||
|
self.preserve_vpos = preserve_vpos
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
self.selected_ids = self.view.get_selected_ids()
|
||||||
|
self.current_id = self.view.current_id
|
||||||
|
self.vscroll = self.verticalScrollBar().value()
|
||||||
|
self.hscroll = self.horizontalScrollBar().value()
|
||||||
|
|
||||||
|
def __exit__(self, *args):
|
||||||
|
current = self.view.get_selected_ids()
|
||||||
|
if not current and self.selected_ids:
|
||||||
|
if self.current_id is not None:
|
||||||
|
self.view.current_id = self.current_id
|
||||||
|
self.view.select_rows(self.selected_ids, using_ids=True,
|
||||||
|
scroll=False, change_current=self.current_id is None)
|
||||||
|
if self.preserve_vpos:
|
||||||
|
self.verticalScrollBar().setValue(self.vscroll)
|
||||||
|
if self.preserve_hpos:
|
||||||
|
self.horizontalScrollBar().setValue(self.hscroll)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
class BooksView(QTableView): # {{{
|
class BooksView(QTableView): # {{{
|
||||||
@ -105,6 +140,7 @@ class BooksView(QTableView): # {{{
|
|||||||
self.setSortingEnabled(True)
|
self.setSortingEnabled(True)
|
||||||
self.selectionModel().currentRowChanged.connect(self._model.current_changed)
|
self.selectionModel().currentRowChanged.connect(self._model.current_changed)
|
||||||
self.preserve_selected_books = PreserveSelection(self)
|
self.preserve_selected_books = PreserveSelection(self)
|
||||||
|
self.preserve_state = partial(PreserveViewState, self)
|
||||||
|
|
||||||
# {{{ Column Header setup
|
# {{{ Column Header setup
|
||||||
self.can_add_columns = True
|
self.can_add_columns = True
|
||||||
@ -788,6 +824,23 @@ class BooksView(QTableView): # {{{
|
|||||||
ans.append(i)
|
ans.append(i)
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
@dynamic_property
|
||||||
|
def current_id(self):
|
||||||
|
def fget(self):
|
||||||
|
try:
|
||||||
|
return self.model().id(self.currentIndex())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return None
|
||||||
|
def fset(self, val):
|
||||||
|
if val is None: return
|
||||||
|
m = self.model()
|
||||||
|
for row in xrange(m.rowCount(QModelIndex())):
|
||||||
|
if m.id(row) == val:
|
||||||
|
self.set_current_row(row, select=False)
|
||||||
|
break
|
||||||
|
return property(fget=fget, fset=fset)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self._model.close()
|
self._model.close()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user