1
from __future__ import with_statement
4
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
8
from PyQt4.Qt import Qt, QDialog, QAbstractTableModel, QVariant, SIGNAL, \
9
QModelIndex, QInputDialog, QLineEdit, QFileDialog
11
from calibre.gui2.viewer.bookmarkmanager_ui import Ui_BookmarkManager
12
from calibre.gui2 import NONE, qstring_to_unicode
14
class BookmarkManager(QDialog, Ui_BookmarkManager):
15
def __init__(self, parent, bookmarks):
16
QDialog.__init__(self, parent)
20
self.bookmarks = bookmarks[:]
23
self.connect(self.button_revert, SIGNAL('clicked()'), self.set_bookmarks)
24
self.connect(self.button_delete, SIGNAL('clicked()'), self.delete_bookmark)
25
self.connect(self.button_edit, SIGNAL('clicked()'), self.edit_bookmark)
26
self.connect(self.button_export, SIGNAL('clicked()'), self.export_bookmarks)
27
self.connect(self.button_import, SIGNAL('clicked()'), self.import_bookmarks)
29
def set_bookmarks(self, bookmarks=None):
31
bookmarks = self.bookmarks[:]
32
self._model = BookmarkTableModel(self, bookmarks)
33
self.bookmarks_table.setModel(self._model)
35
def delete_bookmark(self):
36
indexes = self.bookmarks_table.selectionModel().selectedIndexes()
38
self._model.remove_row(indexes[0].row())
40
def edit_bookmark(self):
41
indexes = self.bookmarks_table.selectionModel().selectedIndexes()
43
title, ok = QInputDialog.getText(self, _('Edit bookmark'), _('New title for bookmark:'), QLineEdit.Normal, self._model.data(indexes[0], Qt.DisplayRole).toString())
44
title = QVariant(unicode(title).strip())
46
self._model.setData(indexes[0], title, Qt.EditRole)
48
def get_bookmarks(self):
49
return self._model.bookmarks
51
def export_bookmarks(self):
52
filename = QFileDialog.getSaveFileName(self, _("Export Bookmarks"),
53
'%s%suntitled.pickle' % (os.getcwdu(), os.sep),
54
_("Saved Bookmarks (*.pickle)"))
58
with open(filename, 'w') as fileobj:
59
cPickle.dump(self._model.bookmarks, fileobj)
61
def import_bookmarks(self):
62
filename = QFileDialog.getOpenFileName(self, _("Import Bookmarks"), '%s' % os.getcwdu(), _("Pickled Bookmarks (*.pickle)"))
67
with open(filename, 'r') as fileobj:
68
imported = cPickle.load(fileobj)
81
bookmarks = self._model.bookmarks[:]
83
if bm not in bookmarks and bm[0] != 'calibre_current_page_bookmark':
85
self.set_bookmarks(bookmarks)
88
class BookmarkTableModel(QAbstractTableModel):
91
def __init__(self, parent, bookmarks):
92
QAbstractTableModel.__init__(self, parent)
94
self.bookmarks = bookmarks[:]
96
def rowCount(self, parent):
97
if parent and parent.isValid():
99
return len(self.bookmarks)
101
def columnCount(self, parent):
102
if parent and parent.isValid():
104
return len(self.headers)
106
def data(self, index, role):
107
if role in (Qt.DisplayRole, Qt.EditRole):
108
ans = self.bookmarks[index.row()][0]
109
return NONE if ans is None else QVariant(ans)
112
def setData(self, index, value, role):
113
if role == Qt.EditRole:
114
self.bookmarks[index.row()] = (qstring_to_unicode(value.toString()).strip(), self.bookmarks[index.row()][1])
115
self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index, index)
119
def flags(self, index):
120
flags = QAbstractTableModel.flags(self, index)
121
flags |= Qt.ItemIsEditable
124
def headerData(self, section, orientation, role):
125
if role != Qt.DisplayRole:
127
if orientation == Qt.Horizontal:
128
return QVariant(self.headers[section])
130
return QVariant(section+1)
132
def remove_row(self, row):
133
self.beginRemoveRows(QModelIndex(), row, row)
134
del self.bookmarks[row]