mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-07 09:01:38 -04:00
When switching libraries, if the library no longer exists, give the user a chance to specify a new location for the library, in case it was moved, before forgetting it. Fixes #822018 (request lookup library)
This commit is contained in:
parent
07a9042312
commit
226f444274
@ -8,13 +8,14 @@ __docformat__ = 'restructuredtext en'
|
|||||||
import os
|
import os
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from PyQt4.Qt import QMenu, Qt, QInputDialog, QToolButton
|
from PyQt4.Qt import (QMenu, Qt, QInputDialog, QToolButton, QDialog,
|
||||||
|
QDialogButtonBox, QGridLayout, QLabel, QLineEdit, QIcon, QSize)
|
||||||
|
|
||||||
from calibre import isbytestring
|
from calibre import isbytestring
|
||||||
from calibre.constants import filesystem_encoding, iswindows
|
from calibre.constants import filesystem_encoding, iswindows
|
||||||
from calibre.utils.config import prefs
|
from calibre.utils.config import prefs
|
||||||
from calibre.gui2 import (gprefs, warning_dialog, Dispatcher, error_dialog,
|
from calibre.gui2 import (gprefs, warning_dialog, Dispatcher, error_dialog,
|
||||||
question_dialog, info_dialog, open_local_file)
|
question_dialog, info_dialog, open_local_file, choose_dir)
|
||||||
from calibre.library.database2 import LibraryDatabase2
|
from calibre.library.database2 import LibraryDatabase2
|
||||||
from calibre.gui2.actions import InterfaceAction
|
from calibre.gui2.actions import InterfaceAction
|
||||||
|
|
||||||
@ -76,6 +77,62 @@ class LibraryUsageStats(object): # {{{
|
|||||||
self.write_stats()
|
self.write_stats()
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
class MovedDialog(QDialog): # {{{
|
||||||
|
|
||||||
|
def __init__(self, stats, location, parent=None):
|
||||||
|
QDialog.__init__(self, parent)
|
||||||
|
self.setWindowTitle(_('No library found'))
|
||||||
|
self._l = l = QGridLayout(self)
|
||||||
|
self.setLayout(l)
|
||||||
|
self.stats, self.location = stats, location
|
||||||
|
|
||||||
|
loc = self.oldloc = location.replace('/', os.sep)
|
||||||
|
self.header = QLabel(_('No existing calibre library was found at %s. '
|
||||||
|
'If the library was moved, select its new location below. '
|
||||||
|
'Otherwise calibre will forget this library.')%loc)
|
||||||
|
self.header.setWordWrap(True)
|
||||||
|
ncols = 2
|
||||||
|
l.addWidget(self.header, 0, 0, 1, ncols)
|
||||||
|
self.cl = QLabel('<br><b>'+_('New location of this library:'))
|
||||||
|
l.addWidget(self.cl, 1, 0, 1, ncols)
|
||||||
|
self.loc = QLineEdit(loc, self)
|
||||||
|
l.addWidget(self.loc, 2, 0, 1, 1)
|
||||||
|
self.cd = QToolButton(self)
|
||||||
|
self.cd.setIcon(QIcon(I('document_open.png')))
|
||||||
|
self.cd.clicked.connect(self.choose_dir)
|
||||||
|
l.addWidget(self.cd, 2, 1, 1, 1)
|
||||||
|
self.bb = QDialogButtonBox(self)
|
||||||
|
b = self.bb.addButton(_('Library moved'), self.bb.AcceptRole)
|
||||||
|
b.setIcon(QIcon(I('ok.png')))
|
||||||
|
b = self.bb.addButton(_('Forget library'), self.bb.RejectRole)
|
||||||
|
b.setIcon(QIcon(I('edit-clear.png')))
|
||||||
|
self.bb.accepted.connect(self.accept)
|
||||||
|
self.bb.rejected.connect(self.reject)
|
||||||
|
l.addWidget(self.bb, 3, 0, 1, ncols)
|
||||||
|
self.resize(self.sizeHint() + QSize(100, 50))
|
||||||
|
|
||||||
|
def choose_dir(self):
|
||||||
|
d = choose_dir(self, 'library moved choose new loc',
|
||||||
|
_('New library location'), default_dir=self.oldloc)
|
||||||
|
if d is not None:
|
||||||
|
self.loc.setText(d)
|
||||||
|
|
||||||
|
def reject(self):
|
||||||
|
self.stats.remove(self.location)
|
||||||
|
QDialog.reject(self)
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
newloc = unicode(self.loc.text())
|
||||||
|
if not LibraryDatabase2.exists_at(newloc):
|
||||||
|
error_dialog(self, _('No library found'),
|
||||||
|
_('No existing calibre library found at %s')%newloc,
|
||||||
|
show=True)
|
||||||
|
return
|
||||||
|
self.stats.rename(self.location, newloc)
|
||||||
|
self.newloc = newloc
|
||||||
|
QDialog.accept(self)
|
||||||
|
# }}}
|
||||||
|
|
||||||
class ChooseLibraryAction(InterfaceAction):
|
class ChooseLibraryAction(InterfaceAction):
|
||||||
|
|
||||||
name = 'Choose Library'
|
name = 'Choose Library'
|
||||||
@ -339,13 +396,13 @@ class ChooseLibraryAction(InterfaceAction):
|
|||||||
loc = location.replace('/', os.sep)
|
loc = location.replace('/', os.sep)
|
||||||
exists = self.gui.library_view.model().db.exists_at(loc)
|
exists = self.gui.library_view.model().db.exists_at(loc)
|
||||||
if not exists:
|
if not exists:
|
||||||
warning_dialog(self.gui, _('No library found'),
|
d = MovedDialog(self.stats, location, self.gui)
|
||||||
_('No existing calibre library was found at %s.'
|
ret = d.exec_()
|
||||||
' It will be removed from the list of known'
|
|
||||||
' libraries.')%loc, show=True)
|
|
||||||
self.stats.remove(location)
|
|
||||||
self.build_menus()
|
self.build_menus()
|
||||||
self.gui.iactions['Copy To Library'].build_menus()
|
self.gui.iactions['Copy To Library'].build_menus()
|
||||||
|
if ret == d.Accepted:
|
||||||
|
loc = d.newloc.replace('/', os.sep)
|
||||||
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
prefs['library_path'] = loc
|
prefs['library_path'] = loc
|
||||||
|
Loading…
x
Reference in New Issue
Block a user