home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_1162 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  7.9 KB  |  184 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. from PyQt4.Qt import QMenu
  8. from calibre.gui2 import error_dialog
  9. from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog
  10. from calibre.gui2.dialogs.confirm_delete import confirm
  11. from calibre.gui2.actions import InterfaceAction
  12.  
  13. class DeleteAction(InterfaceAction):
  14.     name = 'Remove Books'
  15.     action_spec = (_('Remove books'), 'trash.png', None, _('Del'))
  16.     action_type = 'current'
  17.     
  18.     def genesis(self):
  19.         self.qaction.triggered.connect(self.delete_books)
  20.         self.delete_menu = QMenu()
  21.         self.delete_menu.addAction(_('Remove selected books'), self.delete_books)
  22.         self.delete_menu.addAction(_('Remove files of a specific format from selected books..'), self.delete_selected_formats)
  23.         self.delete_menu.addAction(_('Remove all formats from selected books, except...'), self.delete_all_but_selected_formats)
  24.         self.delete_menu.addAction(_('Remove covers from selected books'), self.delete_covers)
  25.         self.delete_menu.addSeparator()
  26.         self.delete_menu.addAction(_('Remove matching books from device'), self.remove_matching_books_from_device)
  27.         self.qaction.setMenu(self.delete_menu)
  28.         self.delete_memory = { }
  29.  
  30.     
  31.     def location_selected(self, loc):
  32.         enabled = loc == 'library'
  33.         for action in list(self.delete_menu.actions())[1:]:
  34.             action.setEnabled(enabled)
  35.         
  36.  
  37.     
  38.     def _get_selected_formats(self, msg):
  39.         SelectFormats = SelectFormats
  40.         import calibre.gui2.dialogs.select_formats
  41.         fmts = self.gui.library_view.model().db.all_formats()
  42.         d = []([ x.lower() for x in fmts ], msg, parent = self.gui)
  43.         if d.exec_() != d.Accepted:
  44.             return None
  45.         return d.selected_formats
  46.  
  47.     
  48.     def _get_selected_ids(self, err_title = _('Cannot delete')):
  49.         rows = self.gui.library_view.selectionModel().selectedRows()
  50.         if not rows or len(rows) == 0:
  51.             d = error_dialog(self.gui, err_title, _('No book selected'))
  52.             d.exec_()
  53.             return set([])
  54.         return set(map(self.gui.library_view.model().id, rows))
  55.  
  56.     
  57.     def delete_selected_formats(self, *args):
  58.         ids = self._get_selected_ids()
  59.         if not ids:
  60.             return None
  61.         fmts = self._get_selected_formats(_('Choose formats to be deleted'))
  62.         if not fmts:
  63.             return None
  64.         for id in ids:
  65.             for fmt in fmts:
  66.                 self.gui.library_view.model().db.remove_format(id, fmt, index_is_id = True, notify = False)
  67.             
  68.         
  69.         self.gui.library_view.model().refresh_ids(ids)
  70.         self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(), self.gui.library_view.currentIndex())
  71.  
  72.     
  73.     def delete_all_but_selected_formats(self, *args):
  74.         ids = self._get_selected_ids()
  75.         if not ids:
  76.             return None
  77.         fmts = self._get_selected_formats('<p>' + _('Choose formats <b>not</b> to be deleted'))
  78.         if fmts is None:
  79.             return None
  80.         for id in ids:
  81.             bfmts = self.gui.library_view.model().db.formats(id, index_is_id = True)
  82.             bfmts = []([ x.lower() for x in bfmts.split(',') ])
  83.             rfmts = bfmts - set(fmts)
  84.             for fmt in rfmts:
  85.                 self.gui.library_view.model().db.remove_format(id, fmt, index_is_id = True, notify = False)
  86.             
  87.         
  88.         self.gui.library_view.model().refresh_ids(ids)
  89.         self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(), self.gui.library_view.currentIndex())
  90.  
  91.     
  92.     def remove_matching_books_from_device(self, *args):
  93.         if not self.gui.device_manager.is_device_connected:
  94.             d = error_dialog(self.gui, _('Cannot delete books'), _('No device is connected'))
  95.             d.exec_()
  96.             return None
  97.         ids = self._get_selected_ids()
  98.         if not ids:
  99.             return None
  100.         to_delete = { }
  101.         some_to_delete = False
  102.         for model, name in ((self.gui.memory_view.model(), _('Main memory')), (self.gui.card_a_view.model(), _('Storage Card A')), (self.gui.card_b_view.model(), _('Storage Card B'))):
  103.             to_delete[name] = (model, model.paths_for_db_ids(ids))
  104.             if len(to_delete[name][1]) > 0:
  105.                 some_to_delete = True
  106.                 continue
  107.             ids
  108.         
  109.         if not some_to_delete:
  110.             d = error_dialog(self.gui, _('No books to delete'), _('None of the selected books are on the device'))
  111.             d.exec_()
  112.             return None
  113.         d = DeleteMatchingFromDeviceDialog(self.gui, to_delete)
  114.         if d.exec_():
  115.             paths = { }
  116.             ids = { }
  117.             for model, id, path in d.result:
  118.                 paths[model].append(path)
  119.                 ids[model].append(id)
  120.             
  121.             for model in paths:
  122.                 job = self.gui.remove_paths(paths[model])
  123.                 self.delete_memory[job] = (paths[model], model)
  124.                 model.mark_for_deletion(job, ids[model], rows_are_ids = True)
  125.             
  126.             self.gui.status_bar.show_message(_('Deleting books from device.'), 1000)
  127.         
  128.  
  129.     
  130.     def delete_covers(self, *args):
  131.         ids = self._get_selected_ids()
  132.         if not ids:
  133.             return None
  134.         for id in ids:
  135.             self.gui.library_view.model().db.remove_cover(id)
  136.         
  137.         self.gui.library_view.model().refresh_ids(ids)
  138.         self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(), self.gui.library_view.currentIndex())
  139.  
  140.     
  141.     def library_ids_deleted(self, ids_deleted, current_row = None):
  142.         view = self.gui.library_view
  143.         for v in (self.gui.memory_view, self.gui.card_a_view, self.gui.card_b_view):
  144.             if v is None:
  145.                 continue
  146.             
  147.             v.model().clear_ondevice(ids_deleted)
  148.         
  149.         if current_row is not None:
  150.             ci = view.model().index(current_row, 0)
  151.             if ci.isValid():
  152.                 view.set_current_row(current_row)
  153.             
  154.         
  155.  
  156.     
  157.     def delete_books(self, *args):
  158.         view = self.gui.current_view()
  159.         rows = view.selectionModel().selectedRows()
  160.         if not rows or len(rows) == 0:
  161.             return None
  162.         if self.gui.stack.currentIndex() == 0:
  163.             if not confirm('<p>' + _('The selected books will be <b>permanently deleted</b> and the files removed from your calibre library. Are you sure?') + '</p>', 'library_delete_books', self.gui):
  164.                 return None
  165.             ci = view.currentIndex()
  166.             row = None
  167.             ids_deleted = view.model().delete_books(rows)
  168.             self.library_ids_deleted(ids_deleted, row)
  169.         elif not confirm('<p>' + _('The selected books will be <b>permanently deleted</b> from your device. Are you sure?') + '</p>', 'device_delete_books', self.gui):
  170.             return None
  171.         if self.gui.stack.currentIndex() == 1:
  172.             view = self.gui.memory_view
  173.         elif self.gui.stack.currentIndex() == 2:
  174.             view = self.gui.card_a_view
  175.         else:
  176.             view = self.gui.card_b_view
  177.         paths = view.model().paths(rows)
  178.         job = self.gui.remove_paths(paths)
  179.         self.delete_memory[job] = (paths, view.model())
  180.         view.model().mark_for_deletion(job, rows)
  181.         self.gui.status_bar.show_message(_('Deleting books from device.'), 1000)
  182.  
  183.  
  184.