diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index f2f048a5d5..a2ee6d343b 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -67,8 +67,9 @@ def render_html(mi, css, vertical, widget, all_fields=False): # {{{ % (table, right_pane)) return ans -def get_field_list(fm): - fieldlist = list(gprefs['book_display_fields']) +def get_field_list(fm, use_defaults=False): + src = gprefs.defaults if use_defaults else gprefs + fieldlist = list(src['book_display_fields']) names = frozenset([x[0] for x in fieldlist]) for field in fm.displayable_field_keys(): if field not in names: diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index ce5e0d9877..921e62d4c3 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -650,6 +650,11 @@ class BooksView(QTableView): # {{{ def column_map(self): return self._model.column_map + def refresh_book_details(self): + idx = self.currentIndex() + if idx.isValid(): + self._model.current_changed(idx, idx) + def scrollContentsBy(self, dx, dy): # Needed as Qt bug causes headerview to not always update when scrolling QTableView.scrollContentsBy(self, dx, dy) diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index ed4312ad86..bae08f5455 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -6,7 +6,7 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' from PyQt4.Qt import (QApplication, QFont, QFontInfo, QFontDialog, - QAbstractListModel) + QAbstractListModel, Qt) from calibre.gui2.preferences import ConfigWidgetBase, test_widget, CommaSeparatedList from calibre.gui2.preferences.look_feel_ui import Ui_Form @@ -15,12 +15,82 @@ from calibre.utils.localization import (available_translations, get_language, get_lang) from calibre.utils.config import prefs from calibre.utils.icu import sort_key +from calibre.gui2 import NONE +from calibre.gui2.book_details import get_field_list -class DisplayedFields(QAbstractListModel): +class DisplayedFields(QAbstractListModel): # {{{ - def __init__(self, parent=None): + def __init__(self, db, parent=None): QAbstractListModel.__init__(self, parent) + self.fields = [] + self.db = db + self.changed = False + + def initialize(self, use_defaults=False): + self.fields = [[x[0], x[1]] for x in + get_field_list(self.db.field_metadata, + use_defaults=use_defaults)] + self.reset() + self.changed = True + + def rowCount(self, *args): + return len(self.fields) + + def data(self, index, role): + try: + field, visible = self.fields[index.row()] + except: + return NONE + if role == Qt.DisplayRole: + name = field + try: + name = self.db.field_metadata[field]['name'] + except: + pass + if not name: + name = field + return name + if role == Qt.CheckStateRole: + return Qt.Checked if visible else Qt.Unchecked + return NONE + + def flags(self, index): + ans = QAbstractListModel.flags(self, index) + return ans | Qt.ItemIsUserCheckable + + def setData(self, index, val, role): + ret = False + if role == Qt.CheckStateRole: + val, ok = val.toInt() + if ok: + self.fields[index.row()][1] = bool(val) + self.changed = True + ret = True + self.dataChanged.emit(index, index) + return ret + + def restore_defaults(self): + self.initialize(use_defaults=True) + + def commit(self): + if self.changed: + gprefs['book_display_fields'] = self.fields + + def move(self, idx, delta): + row = idx.row() + delta + if row >= 0 and row < len(self.fields): + t = self.fields[row] + self.fields[row] = self.fields[row-delta] + self.fields[row-delta] = t + self.dataChanged.emit(idx, idx) + idx = self.index(row) + self.dataChanged.emit(idx, idx) + self.changed = True + return idx + +# }}} + class ConfigWidget(ConfigWidgetBase, Ui_Form): def genesis(self, gui): @@ -82,11 +152,18 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.current_font = self.initial_font = None self.change_font_button.clicked.connect(self.change_font) + self.display_model = DisplayedFields(self.gui.current_db, + self.field_display_order) + self.display_model.dataChanged.connect(self.changed_signal) + self.field_display_order.setModel(self.display_model) + self.df_up_button.clicked.connect(self.move_df_up) + self.df_down_button.clicked.connect(self.move_df_down) def initialize(self): ConfigWidgetBase.initialize(self) self.current_font = self.initial_font = gprefs['font'] self.update_font_display() + self.display_model.initialize() def restore_defaults(self): ConfigWidgetBase.restore_defaults(self) @@ -95,6 +172,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): if ofont is not None: self.changed_signal.emit() self.update_font_display() + self.display_model.restore_defaults() + self.changed_signal.emit() def build_font_obj(self): font_info = self.current_font @@ -113,6 +192,24 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.font_display.setText(name + ' [%dpt]'%fi.pointSize()) + def move_df_up(self): + idx = self.field_display_order.currentIndex() + if idx.isValid(): + idx = self.display_model.move(idx, -1) + if idx is not None: + sm = self.field_display_order.selectionModel() + sm.select(idx, sm.ClearAndSelect) + self.field_display_order.setCurrentIndex(idx) + + def move_df_down(self): + idx = self.field_display_order.currentIndex() + if idx.isValid(): + idx = self.display_model.move(idx, 1) + if idx is not None: + sm = self.field_display_order.selectionModel() + sm.select(idx, sm.ClearAndSelect) + self.field_display_order.setCurrentIndex(idx) + def change_font(self, *args): fd = QFontDialog(self.build_font_obj(), self) if fd.exec_() == fd.Accepted: @@ -129,12 +226,13 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): gprefs['font'] = self.current_font QApplication.setFont(self.font_display.font()) rr = True + self.display_model.commit() return rr - def refresh_gui(self, gui): self.update_font_display() gui.tags_view.reread_collapse_parameters() + gui.library_view.refresh_book_details() if __name__ == '__main__': app = QApplication([]) diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui index 2d5409271c..076fad2a0b 100644 --- a/src/calibre/gui2/preferences/look_feel.ui +++ b/src/calibre/gui2/preferences/look_feel.ui @@ -21,8 +21,8 @@ 0 0 - 682 - 254 + 699 + 306 @@ -189,8 +189,8 @@ 0 0 - 699 - 151 + 649 + 96 @@ -308,8 +308,8 @@ then the tags will be displayed each on their own line. 0 0 - 699 - 306 + 429 + 63 @@ -374,7 +374,7 @@ then the tags will be displayed each on their own line. - + Select displayed metadata @@ -388,7 +388,7 @@ then the tags will be displayed each on their own line. - + Move up @@ -399,7 +399,7 @@ then the tags will be displayed each on their own line. - + Move down @@ -425,6 +425,16 @@ then the tags will be displayed each on their own line. + + + + Note that comments will always be displayed at the end, regardless of the position you assign here. + + + true + + +