mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Work on results view for notes browser
This commit is contained in:
parent
6992f86c71
commit
634f30156d
@ -4,8 +4,9 @@
|
|||||||
import os
|
import os
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from qt.core import (
|
from qt.core import (
|
||||||
QCheckBox, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QMenu, QSize, Qt,
|
QAbstractItemView, QCheckBox, QDialogButtonBox, QFont, QHBoxLayout, QIcon,
|
||||||
QToolButton, QVBoxLayout, QWidget, pyqtSignal,
|
QKeySequence, QLabel, QMenu, QSize, Qt, QToolButton, QTreeWidget, QTreeWidgetItem,
|
||||||
|
QVBoxLayout, QWidget, pyqtSignal,
|
||||||
)
|
)
|
||||||
|
|
||||||
from calibre.db.backend import FTSQueryError
|
from calibre.db.backend import FTSQueryError
|
||||||
@ -42,6 +43,119 @@ class NotesResultsDelegate(ResultsDelegate):
|
|||||||
return False, before, text, after, False
|
return False, before, text, after, False
|
||||||
|
|
||||||
|
|
||||||
|
class ResultsList(QTreeWidget):
|
||||||
|
|
||||||
|
current_result_changed = pyqtSignal(object)
|
||||||
|
|
||||||
|
def __init__(self, parent):
|
||||||
|
QTreeWidget.__init__(self, parent)
|
||||||
|
self.setHeaderHidden(True)
|
||||||
|
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
|
||||||
|
self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
|
self.customContextMenuRequested.connect(self.show_context_menu)
|
||||||
|
self.delegate = NotesResultsDelegate(self)
|
||||||
|
self.setItemDelegate(self.delegate)
|
||||||
|
self.section_font = QFont(self.font())
|
||||||
|
self.itemDoubleClicked.connect(self.item_activated)
|
||||||
|
self.section_font.setItalic(True)
|
||||||
|
self.currentItemChanged.connect(self.current_item_changed)
|
||||||
|
self.number_of_results = 0
|
||||||
|
self.item_map = []
|
||||||
|
|
||||||
|
def current_item_changed(self, current, previous):
|
||||||
|
if current is not None:
|
||||||
|
r = current.data(0, Qt.ItemDataRole.UserRole)
|
||||||
|
if isinstance(r, dict):
|
||||||
|
self.current_result_changed.emit(r)
|
||||||
|
else:
|
||||||
|
self.current_result_changed.emit(None)
|
||||||
|
|
||||||
|
def item_activated(self, item):
|
||||||
|
r = item.data(0, Qt.ItemDataRole.UserRole)
|
||||||
|
if isinstance(r, dict):
|
||||||
|
raise NotImplementedError('TODO: Implement me')
|
||||||
|
|
||||||
|
def show_context_menu(self, pos):
|
||||||
|
raise NotImplementedError('TODO: Implement me')
|
||||||
|
|
||||||
|
def show_next(self, backwards=False):
|
||||||
|
item = self.currentItem()
|
||||||
|
if item is None:
|
||||||
|
return
|
||||||
|
i = int(item.data(0, Qt.ItemDataRole.UserRole + 1))
|
||||||
|
i += -1 if backwards else 1
|
||||||
|
i %= self.number_of_results
|
||||||
|
self.setCurrentItem(self.item_map[i])
|
||||||
|
|
||||||
|
def edit_note(self, item):
|
||||||
|
raise NotImplementedError('TODO: Implement me')
|
||||||
|
|
||||||
|
def keyPressEvent(self, ev):
|
||||||
|
if ev.matches(QKeySequence.StandardKey.Delete):
|
||||||
|
self.delete_requested.emit()
|
||||||
|
ev.accept()
|
||||||
|
return
|
||||||
|
if ev.key() == Qt.Key.Key_F2:
|
||||||
|
item = self.currentItem()
|
||||||
|
if item:
|
||||||
|
self.edit_note(item)
|
||||||
|
ev.accept()
|
||||||
|
return
|
||||||
|
return QTreeWidget.keyPressEvent(self, ev)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tree_state(self):
|
||||||
|
ans = {'closed': set()}
|
||||||
|
item = self.currentItem()
|
||||||
|
if item is not None:
|
||||||
|
ans['current'] = item.data(0, Qt.ItemDataRole.UserRole)
|
||||||
|
for item in (self.topLevelItem(i) for i in range(self.topLevelItemCount())):
|
||||||
|
if not item.isExpanded():
|
||||||
|
ans['closed'].add(item.data(0, Qt.ItemDataRole.UserRole))
|
||||||
|
return ans
|
||||||
|
|
||||||
|
@tree_state.setter
|
||||||
|
def tree_state(self, state):
|
||||||
|
closed = state['closed']
|
||||||
|
for item in (self.topLevelItem(i) for i in range(self.topLevelItemCount())):
|
||||||
|
if item.data(0, Qt.ItemDataRole.UserRole) in closed:
|
||||||
|
item.setExpanded(False)
|
||||||
|
|
||||||
|
cur = state.get('current')
|
||||||
|
if cur is not None:
|
||||||
|
for item in self.item_map:
|
||||||
|
if item.data(0, Qt.ItemDataRole.UserRole) == cur:
|
||||||
|
self.setCurrentItem(item)
|
||||||
|
break
|
||||||
|
|
||||||
|
def set_results(self, results, emphasize_text):
|
||||||
|
self.clear()
|
||||||
|
self.delegate.emphasize_text = emphasize_text
|
||||||
|
self.number_of_results = 0
|
||||||
|
self.item_map = []
|
||||||
|
db = current_db()
|
||||||
|
fm = db.field_metadata
|
||||||
|
field_map = {f: {'title': fm[f].get('name') or f, 'matches': []} for f in db.field_supports_notes()}
|
||||||
|
for result in results:
|
||||||
|
field_map[result['field']]['matches'].append(result)
|
||||||
|
for field, entry in field_map.items():
|
||||||
|
section = QTreeWidgetItem([entry['title']], 1)
|
||||||
|
section.setFlags(Qt.ItemFlag.ItemIsEnabled)
|
||||||
|
section.setFont(0, self.section_font)
|
||||||
|
section.setData(0, Qt.ItemDataRole.UserRole, field)
|
||||||
|
self.addTopLevelItem(section)
|
||||||
|
section.setExpanded(True)
|
||||||
|
for result in entry['matches']:
|
||||||
|
item = QTreeWidgetItem(section, [' '], 2)
|
||||||
|
self.item_map.append(item)
|
||||||
|
item.setFlags(Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemNeverHasChildren)
|
||||||
|
item.setData(0, Qt.ItemDataRole.UserRole, result)
|
||||||
|
item.setData(0, Qt.ItemDataRole.UserRole + 1, self.number_of_results)
|
||||||
|
self.number_of_results += 1
|
||||||
|
if self.item_map:
|
||||||
|
self.setCurrentItem(self.item_map[0])
|
||||||
|
|
||||||
|
|
||||||
class RestrictFields(QWidget):
|
class RestrictFields(QWidget):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -215,8 +329,6 @@ class NotesBrowser(Dialog):
|
|||||||
det_msg=str(err), show=True)
|
det_msg=str(err), show=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
from calibre.library import db
|
from calibre.library import db
|
||||||
app = Application([])
|
app = Application([])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user