home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_1161 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  7.4 KB  |  159 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
  6. __docformat__ = 'restructuredtext en'
  7. import os
  8. from functools import partial
  9. from threading import Thread
  10. from PyQt4.Qt import QMenu, QToolButton
  11. from calibre.gui2.actions import InterfaceAction
  12. from calibre.gui2 import error_dialog, Dispatcher
  13. from calibre.gui2.dialogs.progress import ProgressDialog
  14. from calibre.utils.config import prefs, tweaks
  15.  
  16. class Worker(Thread):
  17.     
  18.     def __init__(self, ids, db, loc, progress, done, delete_after):
  19.         Thread.__init__(self)
  20.         self.ids = ids
  21.         self.processed = set([])
  22.         self.db = db
  23.         self.loc = loc
  24.         self.error = None
  25.         self.progress = progress
  26.         self.done = done
  27.         self.delete_after = delete_after
  28.  
  29.     
  30.     def run(self):
  31.         
  32.         try:
  33.             self.doit()
  34.         except Exception:
  35.             err = None
  36.             import traceback
  37.             
  38.             try:
  39.                 err = unicode(err)
  40.             except:
  41.                 err = repr(err)
  42.  
  43.             self.error = (err, traceback.format_exc())
  44.  
  45.         self.done()
  46.  
  47.     
  48.     def add_formats(self, id, paths, newdb, replace = True):
  49.         for path in paths:
  50.             fmt = os.path.splitext(path)[-1].replace('.', '').upper()
  51.             
  52.             try:
  53.                 f = _[1]
  54.                 newdb.add_format(id, fmt, f, index_is_id = True, notify = False, replace = replace)
  55.             finally:
  56.                 pass
  57.  
  58.         
  59.  
  60.     
  61.     def doit(self):
  62.         LibraryDatabase2 = LibraryDatabase2
  63.         import calibre.library.database2
  64.         newdb = LibraryDatabase2(self.loc)
  65.         for i, x in enumerate(self.ids):
  66.             mi = self.db.get_metadata(x, index_is_id = True, get_cover = True)
  67.             self.progress(i, mi.title)
  68.             fmts = self.db.formats(x, index_is_id = True)
  69.             if not fmts:
  70.                 fmts = []
  71.             else:
  72.                 fmts = fmts.split(',')
  73.             paths = [ self.db.format_abspath(x, fmt, index_is_id = True) for fmt in fmts ]
  74.             added = False
  75.             if prefs['add_formats_to_existing']:
  76.                 identical_book_list = newdb.find_identical_books(mi)
  77.                 if identical_book_list:
  78.                     added = True
  79.                     for identical_book in identical_book_list:
  80.                         self.add_formats(identical_book, paths, newdb, replace = False)
  81.                     
  82.                 
  83.             
  84.             if not added:
  85.                 newdb.import_book(mi, paths, notify = False, import_hooks = False, apply_import_tags = tweaks['add_new_book_tags_when_importing_books'], preserve_uuid = self.delete_after)
  86.                 co = self.db.conversion_options(x, 'PIPE')
  87.                 if co is not None:
  88.                     newdb.set_conversion_options(x, 'PIPE', co)
  89.                 
  90.             
  91.             self.processed.add(x)
  92.         
  93.  
  94.  
  95.  
  96. class CopyToLibraryAction(InterfaceAction):
  97.     name = 'Copy To Library'
  98.     action_spec = (_('Copy to library'), 'lt.png', _('Copy selected books to the specified library'), None)
  99.     popup_type = QToolButton.InstantPopup
  100.     dont_add_to = frozenset([
  101.         'toolbar-device',
  102.         'context-menu-device'])
  103.     action_type = 'current'
  104.     
  105.     def genesis(self):
  106.         self.menu = QMenu(self.gui)
  107.         self.qaction.setMenu(self.menu)
  108.  
  109.     
  110.     def stats(self):
  111.         return self.gui.iactions['Choose Library'].stats
  112.  
  113.     stats = property(stats)
  114.     
  115.     def library_changed(self, db):
  116.         self.build_menus()
  117.  
  118.     
  119.     def initialization_complete(self):
  120.         self.library_changed(self.gui.library_view.model().db)
  121.  
  122.     
  123.     def location_selected(self, loc):
  124.         enabled = loc == 'library'
  125.         self.qaction.setEnabled(enabled)
  126.  
  127.     
  128.     def build_menus(self):
  129.         self.menu.clear()
  130.         db = self.gui.library_view.model().db
  131.         locations = list(self.stats.locations(db))
  132.         for name, loc in locations:
  133.             self.menu.addAction(name, partial(self.copy_to_library, loc))
  134.             self.menu.addAction(name + ' ' + _('(delete after copy)'), partial(self.copy_to_library, loc, delete_after = True))
  135.             self.menu.addSeparator()
  136.         
  137.         self.qaction.setVisible(bool(locations))
  138.  
  139.     
  140.     def copy_to_library(self, loc, delete_after = False):
  141.         rows = self.gui.library_view.selectionModel().selectedRows()
  142.         if not rows or len(rows) == 0:
  143.             return error_dialog(self.gui, _('Cannot copy'), _('No books selected'), show = True)
  144.         ids = list(map(self.gui.library_view.model().id, rows))
  145.         db = self.gui.library_view.model().db
  146.         if not db.exists_at(loc):
  147.             return error_dialog(self.gui, _('No library'), _('No library found at %s') % loc, show = True)
  148.         self.pd = ProgressDialog(_('Copying'), min = 0, max = len(ids) - 1, parent = self.gui, cancelable = False)
  149.         
  150.         def progress(idx, title):
  151.             self.pd.set_msg(_('Copying') + ' ' + title)
  152.             self.pd.set_value(idx)
  153.  
  154.         self.worker = Worker(ids, db, loc, Dispatcher(progress), Dispatcher(self.pd.accept), delete_after)
  155.         self.worker.start()
  156.         self.pd.exec_()
  157.  
  158.  
  159.