diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py index 1b369a2f0b..acf935d329 100644 --- a/src/calibre/gui2/actions/choose_library.py +++ b/src/calibre/gui2/actions/choose_library.py @@ -8,13 +8,14 @@ __docformat__ = 'restructuredtext en' import os 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.constants import filesystem_encoding, iswindows from calibre.utils.config import prefs 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.gui2.actions import InterfaceAction @@ -76,6 +77,62 @@ class LibraryUsageStats(object): # {{{ 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('
'+_('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): name = 'Choose Library' @@ -339,14 +396,14 @@ class ChooseLibraryAction(InterfaceAction): loc = location.replace('/', os.sep) exists = self.gui.library_view.model().db.exists_at(loc) if not exists: - warning_dialog(self.gui, _('No library found'), - _('No existing calibre library was found at %s.' - ' It will be removed from the list of known' - ' libraries.')%loc, show=True) - self.stats.remove(location) + d = MovedDialog(self.stats, location, self.gui) + ret = d.exec_() self.build_menus() self.gui.iactions['Copy To Library'].build_menus() - return + if ret == d.Accepted: + loc = d.newloc.replace('/', os.sep) + else: + return prefs['library_path'] = loc #from calibre.utils.mem import memory