diff --git a/src/calibre/devices/folder_device/driver.py b/src/calibre/devices/folder_device/driver.py index 9cd1280cc9..5919d6d2fb 100644 --- a/src/calibre/devices/folder_device/driver.py +++ b/src/calibre/devices/folder_device/driver.py @@ -38,7 +38,7 @@ class FOLDER_DEVICE(USBMS): THUMBNAIL_HEIGHT = 68 # Height for thumbnails on device - CAN_SET_METADATA = True + CAN_SET_METADATA = ['title', 'authors'] SUPPORTS_SUB_DIRS = True #: Icon for this device diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index fc3332a337..2307bf94d6 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -37,7 +37,7 @@ class DevicePlugin(Plugin): THUMBNAIL_HEIGHT = 68 #: Whether the metadata on books can be set via the GUI. - CAN_SET_METADATA = True + CAN_SET_METADATA = ['title', 'authors', 'collections'] #: Path separator for paths to books on device path_sep = os.sep diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index f06a804b93..b8516aab4f 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -30,7 +30,7 @@ class KOBO(USBMS): # Ordered list of supported formats FORMATS = ['epub', 'pdf'] - CAN_SET_METADATA = True + CAN_SET_METADATA = ['collections'] VENDOR_ID = [0x2237] PRODUCT_ID = [0x4161] @@ -126,7 +126,7 @@ class KOBO(USBMS): book = self.book_from_path(prefix, lpath, title, authors, mime, date, ContentType, ImageID) # print 'Update booklist' book.device_collections = [playlist_map[lpath]] if lpath in playlist_map else [] - + if bl.add_book(book, replace_metadata=False): changed = True except: # Probably a path encoding error @@ -250,7 +250,7 @@ class KOBO(USBMS): # print "Delete file normalized path: " + path extension = os.path.splitext(path)[1] ContentType = self.get_content_type_from_extension(extension) - + ContentID = self.contentid_from_path(path, ContentType) ImageID = self.delete_via_sql(ContentID, ContentType) @@ -453,7 +453,7 @@ class KOBO(USBMS): query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 1 and ContentID like \'file:///mnt/sd/%\'' elif oncard != 'carda' and oncard != 'cardb': query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 1 and ContentID not like \'file:///mnt/sd/%\'' - + try: cursor.execute (query) except: @@ -489,7 +489,7 @@ class KOBO(USBMS): query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 2 and ContentID like \'file:///mnt/sd/%\'' elif oncard != 'carda' and oncard != 'cardb': query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 2 and ContentID not like \'file:///mnt/sd/%\'' - + try: cursor.execute (query) except: @@ -519,7 +519,7 @@ class KOBO(USBMS): else: connection.commit() # debug_print('Database: Commit set ReadStatus as Finished') - else: # No collections + else: # No collections # Since no collections exist the ReadStatus needs to be reset to 0 (Unread) print "Reseting ReadStatus to 0" # Reset Im_Reading list in the database @@ -527,7 +527,7 @@ class KOBO(USBMS): query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ContentID like \'file:///mnt/sd/%\'' elif oncard != 'carda' and oncard != 'cardb': query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ContentID not like \'file:///mnt/sd/%\'' - + try: cursor.execute (query) except: @@ -541,7 +541,7 @@ class KOBO(USBMS): connection.close() # debug_print('Finished update_device_database_collections', collections_attributes) - + def sync_booklists(self, booklists, end_session=True): # debug_print('KOBO: started sync_booklists') paths = self.get_device_paths() diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index f90a8ab263..7952660c21 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -27,7 +27,7 @@ class PRS505(USBMS): FORMATS = ['epub', 'lrf', 'lrx', 'rtf', 'pdf', 'txt'] - CAN_SET_METADATA = True + CAN_SET_METADATA = ['title', 'authors', 'collections'] VENDOR_ID = [0x054c] #: SONY Vendor Id PRODUCT_ID = [0x031e] diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index a0d1d9dbf8..b4fe5d25fc 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -50,7 +50,7 @@ class USBMS(CLI, Device): book_class = Book FORMATS = [] - CAN_SET_METADATA = False + CAN_SET_METADATA = [] METADATA_CACHE = 'metadata.calibre' def get_device_information(self, end_session=True): diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index af1b42bf33..8efd038db8 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -907,7 +907,7 @@ class DeviceBooksModel(BooksModel): # {{{ } self.marked_for_deletion = {} self.search_engine = OnDeviceSearch(self) - self.editable = True + self.editable = ['title', 'authors', 'collections'] self.book_in_library = None def mark_for_deletion(self, job, rows, rows_are_ids=False): @@ -953,13 +953,13 @@ class DeviceBooksModel(BooksModel): # {{{ if self.map[index.row()] in self.indices_to_be_deleted(): return Qt.ItemIsUserCheckable # Can't figure out how to get the disabled flag in python flags = QAbstractTableModel.flags(self, index) - if index.isValid() and self.editable: + if index.isValid(): cname = self.column_map[index.column()] - if cname in ('title', 'authors') or \ - (cname == 'collections' and \ - callable(getattr(self.db, 'supports_collections', None)) and \ - self.db.supports_collections() and \ - prefs['manage_device_metadata']=='manual'): + if cname in self.editable and \ + cname != 'collections' or \ + (callable(getattr(self.db, 'supports_collections', None)) and \ + self.db.supports_collections() and \ + prefs['manage_device_metadata']=='manual'): flags |= Qt.ItemIsEditable return flags @@ -1243,7 +1243,14 @@ class DeviceBooksModel(BooksModel): # {{{ def set_editable(self, editable): # Cannot edit if metadata is sent on connect. Reason: changes will # revert to what is in the library on next connect. - self.editable = editable and prefs['manage_device_metadata']!='on_connect' + if isinstance(editable, list): + self.editable = editable + elif editable: + self.editable = ['title', 'authors', 'collections'] + else: + self.editable = [] + if prefs['manage_device_metadata']=='on_connect': + self.editable = [] def set_search_restriction(self, s): pass