mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
parent
64aab7f4a0
commit
b9b2a40b3e
@ -32,6 +32,14 @@ class ShowQuickviewAction(InterfaceAction):
|
||||
group=self.action_spec[0])
|
||||
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):
|
||||
if self.current_instance:
|
||||
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):
|
||||
self.show_quickview()
|
||||
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()
|
||||
|
@ -51,7 +51,7 @@ IN_WIDGET_DOCK = 3
|
||||
IN_WIDGET_SEARCH = 4
|
||||
IN_WIDGET_CLOSE = 5
|
||||
|
||||
class BooksKeyPressFilter(QObject):
|
||||
class BooksTableFilter(QObject):
|
||||
|
||||
return_pressed_signal = pyqtSignal()
|
||||
|
||||
@ -61,6 +61,15 @@ class BooksKeyPressFilter(QObject):
|
||||
return True
|
||||
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):
|
||||
|
||||
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.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)
|
||||
# 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)
|
||||
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.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.cellDoubleClicked.connect(self.book_doubleclicked)
|
||||
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)
|
||||
|
||||
# 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.close_button.setDefault(False)
|
||||
self.search_button.setToolTip(_('Search in the library view for the currently highlighted selection'))
|
||||
if self.is_pane:
|
||||
self.dock_button.setText(_('Undock'))
|
||||
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.search_button.setText(_('Search'))
|
||||
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:
|
||||
self.lock_qv.setText(_('&Dock'))
|
||||
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.setIcon(QIcon(I('arrow-down.png')))
|
||||
self.set_focus()
|
||||
@ -198,9 +220,40 @@ class Quickview(QDialog, Ui_Quickview):
|
||||
self.books_table.horizontalHeader().sectionResized.connect(self.section_resized)
|
||||
self.dock_button.clicked.connect(self.show_as_pane_changed)
|
||||
|
||||
def books_table_cell_changed(self, current_row, current_col, last_row, last_col):
|
||||
if current_col != 0:
|
||||
self.books_table.setCurrentCell(current_row, 0)
|
||||
def set_search_text(self, txt):
|
||||
if txt:
|
||||
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):
|
||||
if isForward:
|
||||
@ -251,6 +304,7 @@ class Quickview(QDialog, Ui_Quickview):
|
||||
if self.no_valid_items:
|
||||
return
|
||||
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
|
||||
def refresh(self, idx):
|
||||
@ -319,9 +373,8 @@ class Quickview(QDialog, Ui_Quickview):
|
||||
sv = '.' + selected_item
|
||||
else:
|
||||
sv = selected_item
|
||||
sv = sv.replace('"', r'\"')
|
||||
self.last_search = self.current_key+':"=' + sv + '"'
|
||||
books = self.db.search(self.last_search, return_matches=True,
|
||||
sv = self.current_key + ':"=' + sv.replace('"', r'\"') + '"'
|
||||
books = self.db.search(sv, return_matches=True,
|
||||
sort_results=False)
|
||||
|
||||
self.books_table.setRowCount(len(books))
|
||||
@ -359,6 +412,7 @@ class Quickview(QDialog, Ui_Quickview):
|
||||
if select_item is not None:
|
||||
self.books_table.setCurrentItem(select_item)
|
||||
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
|
||||
# correct until the first paint.
|
||||
@ -400,7 +454,7 @@ class Quickview(QDialog, Ui_Quickview):
|
||||
em.actual_plugin_.edit_metadata(None)
|
||||
|
||||
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
|
||||
def slave(self, current):
|
||||
|
@ -115,7 +115,7 @@
|
||||
<string>&Search</string>
|
||||
</property>
|
||||
<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 name="autoDefault">
|
||||
<bool>false</bool>
|
||||
|
Loading…
x
Reference in New Issue
Block a user