Handle showing focus better. Change search to search for the currently focused item instead of always searching for the item in the items widget. Some bug fixes.

This commit is contained in:
Charles Haley 2015-02-02 10:55:51 +01:00
parent 64aab7f4a0
commit b9b2a40b3e
3 changed files with 78 additions and 11 deletions

View File

@ -32,6 +32,14 @@ class ShowQuickviewAction(InterfaceAction):
group=self.action_spec[0]) group=self.action_spec[0])
self.focus_action.triggered.connect(self.focus_quickview) self.focus_action.triggered.connect(self.focus_quickview)
self.search_action = QAction(self.gui)
self.gui.addAction(self.search_action)
self.gui.keyboard.register_shortcut('Search from Quickview', _('Search from Quickview'),
description=_('Search for the currently selected Quickview item'),
default_keys=('Shift+S',), action=self.search_action,
group=self.action_spec[0])
self.search_action.triggered.connect(self.search_quickview)
def show_quickview(self, *args): def show_quickview(self, *args):
if self.current_instance: if self.current_instance:
if not self.current_instance.is_closed: if not self.current_instance.is_closed:
@ -71,3 +79,8 @@ class ShowQuickviewAction(InterfaceAction):
if not (self.current_instance and not self.current_instance.is_closed): if not (self.current_instance and not self.current_instance.is_closed):
self.show_quickview() self.show_quickview()
self.current_instance.set_focus() self.current_instance.set_focus()
def search_quickview(self):
if not self.current_instance or self.current_instance.is_closed:
return
self.current_instance.do_search()

View File

@ -51,7 +51,7 @@ IN_WIDGET_DOCK = 3
IN_WIDGET_SEARCH = 4 IN_WIDGET_SEARCH = 4
IN_WIDGET_CLOSE = 5 IN_WIDGET_CLOSE = 5
class BooksKeyPressFilter(QObject): class BooksTableFilter(QObject):
return_pressed_signal = pyqtSignal() return_pressed_signal = pyqtSignal()
@ -61,6 +61,15 @@ class BooksKeyPressFilter(QObject):
return True return True
return False return False
class WidgetFocusFilter(QObject):
focus_entered_signal = pyqtSignal(object)
def eventFilter(self, obj, event):
if event.type() == QEvent.FocusIn:
self.focus_entered_signal.emit(obj)
return False
class WidgetTabFilter(QObject): class WidgetTabFilter(QObject):
def __init__(self, attach_to_Class, which_widget, tab_signal): def __init__(self, attach_to_Class, which_widget, tab_signal):
@ -134,12 +143,20 @@ class Quickview(QDialog, Ui_Quickview):
self.items.currentTextChanged.connect(self.item_selected) self.items.currentTextChanged.connect(self.item_selected)
self.items.setProperty('highlight_current_item', 150) self.items.setProperty('highlight_current_item', 150)
focus_filter = WidgetFocusFilter(self.items)
focus_filter.focus_entered_signal.connect(self.focus_entered)
self.items.installEventFilter(focus_filter)
self.tab_pressed_signal.connect(self.tab_pressed) self.tab_pressed_signal.connect(self.tab_pressed)
# Set up the books table columns # Set up the books table columns
return_filter = BooksKeyPressFilter(self.books_table) return_filter = BooksTableFilter(self.books_table)
return_filter.return_pressed_signal.connect(self.return_pressed) return_filter.return_pressed_signal.connect(self.return_pressed)
self.books_table.installEventFilter(return_filter) self.books_table.installEventFilter(return_filter)
focus_filter = WidgetFocusFilter(self.books_table)
focus_filter.focus_entered_signal.connect(self.focus_entered)
self.books_table.installEventFilter(focus_filter)
self.close_button = self.buttonBox.button(QDialogButtonBox.Close) self.close_button = self.buttonBox.button(QDialogButtonBox.Close)
self.tab_order_widgets = [self.items, self.books_table, self.lock_qv, self.tab_order_widgets = [self.items, self.books_table, self.lock_qv,
@ -160,6 +177,8 @@ class Quickview(QDialog, Ui_Quickview):
self.books_table_header_height = self.books_table.height() self.books_table_header_height = self.books_table.height()
self.books_table.cellDoubleClicked.connect(self.book_doubleclicked) self.books_table.cellDoubleClicked.connect(self.book_doubleclicked)
self.books_table.currentCellChanged.connect(self.books_table_cell_changed) self.books_table.currentCellChanged.connect(self.books_table_cell_changed)
self.books_table.cellClicked.connect(self.books_table_set_search_string)
self.books_table.cellActivated.connect(self.books_table_set_search_string)
self.books_table.sortByColumn(self.title_column, Qt.AscendingOrder) self.books_table.sortByColumn(self.title_column, Qt.AscendingOrder)
# get the standard table row height. Do this here because calling # get the standard table row height. Do this here because calling
@ -181,6 +200,7 @@ class Quickview(QDialog, Ui_Quickview):
self.view.model().new_bookdisplay_data.connect(self.book_was_changed) self.view.model().new_bookdisplay_data.connect(self.book_was_changed)
self.close_button.setDefault(False) self.close_button.setDefault(False)
self.search_button.setToolTip(_('Search in the library view for the currently highlighted selection'))
if self.is_pane: if self.is_pane:
self.dock_button.setText(_('Undock')) self.dock_button.setText(_('Undock'))
self.dock_button.setToolTip(_('Pop up the quickview panel into its own floating window')) self.dock_button.setToolTip(_('Pop up the quickview panel into its own floating window'))
@ -188,9 +208,11 @@ class Quickview(QDialog, Ui_Quickview):
self.lock_qv.setText(_('Lock Quickview contents')) self.lock_qv.setText(_('Lock Quickview contents'))
self.search_button.setText(_('Search')) self.search_button.setText(_('Search'))
self.gui.quickview_splitter.add_quickview_dialog(self) self.gui.quickview_splitter.add_quickview_dialog(self)
self.search_button.setToolTip(self.search_button.toolTip() + _(' (has shortcut)'))
self.close_button.setToolTip(_('The Quickview shortcut toggles this pane on/off'))
else: else:
self.lock_qv.setText(_('&Dock'))
self.close_button.setText(_('&Close')) self.close_button.setText(_('&Close'))
self.dock_button.setText(_('&Dock'))
self.dock_button.setToolTip(_('Embed the quickview panel into the main calibre window')) self.dock_button.setToolTip(_('Embed the quickview panel into the main calibre window'))
self.dock_button.setIcon(QIcon(I('arrow-down.png'))) self.dock_button.setIcon(QIcon(I('arrow-down.png')))
self.set_focus() self.set_focus()
@ -198,9 +220,40 @@ class Quickview(QDialog, Ui_Quickview):
self.books_table.horizontalHeader().sectionResized.connect(self.section_resized) self.books_table.horizontalHeader().sectionResized.connect(self.section_resized)
self.dock_button.clicked.connect(self.show_as_pane_changed) self.dock_button.clicked.connect(self.show_as_pane_changed)
def books_table_cell_changed(self, current_row, current_col, last_row, last_col): def set_search_text(self, txt):
if current_col != 0: if txt:
self.books_table.setCurrentCell(current_row, 0) self.search_button.setEnabled(True)
else:
self.search_button.setEnabled(False)
self.last_search = txt
def focus_entered(self, obj):
if obj == self.books_table:
self.books_table_set_search_string(self.books_table.currentRow(),
self.books_table.currentColumn())
elif obj.currentItem():
self.item_selected(obj.currentItem().text())
def books_table_cell_changed(self, cur_row, cur_col, prev_row, prev_col):
self.books_table_set_search_string(cur_row, cur_col)
def books_table_set_search_string(self, current_row, current_col):
current = self.books_table.currentItem()
if current is None:
return
if current.column() == 0:
self.set_search_text('title:="' + current.text().replace('"', '\\"') + '"')
elif current.column() == 1:
authors = []
for aut in [t.strip() for t in current.text().split('&')]:
authors.append('authors:="' + aut.replace('"', '\\"') + '"')
self.set_search_text(' and '.join(authors))
else:
t = current.text().rpartition('[')[0].strip()
if t:
self.set_search_text('series:="' + t.replace('"', '\\"') + '"')
else:
self.set_search_text(None)
def tab_pressed(self, in_widget, isForward): def tab_pressed(self, in_widget, isForward):
if isForward: if isForward:
@ -251,6 +304,7 @@ class Quickview(QDialog, Ui_Quickview):
if self.no_valid_items: if self.no_valid_items:
return return
self.fill_in_books_box(unicode(txt)) self.fill_in_books_box(unicode(txt))
self.set_search_text(self.current_key + ':"=' + txt.replace('"', '\\"') + '"')
# Given a cell in the library view, display the information # Given a cell in the library view, display the information
def refresh(self, idx): def refresh(self, idx):
@ -319,9 +373,8 @@ class Quickview(QDialog, Ui_Quickview):
sv = '.' + selected_item sv = '.' + selected_item
else: else:
sv = selected_item sv = selected_item
sv = sv.replace('"', r'\"') sv = self.current_key + ':"=' + sv.replace('"', r'\"') + '"'
self.last_search = self.current_key+':"=' + sv + '"' books = self.db.search(sv, return_matches=True,
books = self.db.search(self.last_search, return_matches=True,
sort_results=False) sort_results=False)
self.books_table.setRowCount(len(books)) self.books_table.setRowCount(len(books))
@ -359,6 +412,7 @@ class Quickview(QDialog, Ui_Quickview):
if select_item is not None: if select_item is not None:
self.books_table.setCurrentItem(select_item) self.books_table.setCurrentItem(select_item)
self.books_table.scrollToItem(select_item, QAbstractItemView.PositionAtCenter) self.books_table.scrollToItem(select_item, QAbstractItemView.PositionAtCenter)
self.set_search_text(sv)
# Deal with sizing the table columns. Done here because the numbers are not # Deal with sizing the table columns. Done here because the numbers are not
# correct until the first paint. # correct until the first paint.
@ -400,7 +454,7 @@ class Quickview(QDialog, Ui_Quickview):
em.actual_plugin_.edit_metadata(None) em.actual_plugin_.edit_metadata(None)
def set_focus(self): def set_focus(self):
self.books_table.setFocus(Qt.ActiveWindowFocusReason) self.items.setFocus(Qt.ActiveWindowFocusReason)
# called when a book is clicked on the library view # called when a book is clicked on the library view
def slave(self, current): def slave(self, current):

View File

@ -115,7 +115,7 @@
<string>&amp;Search</string> <string>&amp;Search</string>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Search in the library view for the selected item</string> <string>Search in the library view for the currently highlighted selection</string>
</property> </property>
<property name="autoDefault"> <property name="autoDefault">
<bool>false</bool> <bool>false</bool>