mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Choosing completion candidates now works
This commit is contained in:
parent
2c662d3bef
commit
c9081f49c7
@ -33,7 +33,8 @@ class CompletionPopup(QWidget):
|
||||
self.setCursor(Qt.PointingHandCursor)
|
||||
|
||||
self.matcher = None
|
||||
self.current_results = self.current_size_hint = None
|
||||
self.current_results = self.current_size_hint = self.current_query = None
|
||||
self.current_completion = None
|
||||
self.max_text_length = 0
|
||||
self.current_index = -1
|
||||
self.current_top_index = 0
|
||||
@ -52,7 +53,8 @@ class CompletionPopup(QWidget):
|
||||
self.rendered_text_cache.clear()
|
||||
self.current_size_hint = None
|
||||
|
||||
def set_items(self, items, descriptions=None):
|
||||
def set_items(self, items, descriptions=None, query=None):
|
||||
self.current_query = query
|
||||
self.current_results = tuple(items.iteritems())
|
||||
self.current_size_hint = None
|
||||
self.descriptions = descriptions or {}
|
||||
@ -143,6 +145,16 @@ class CompletionPopup(QWidget):
|
||||
self.current_index += 1
|
||||
self.ensure_index_visible(self.current_index)
|
||||
self.update()
|
||||
self.activate_current_result()
|
||||
|
||||
def activate_current_result(self):
|
||||
if self.current_completion is not None:
|
||||
c = self.current_completion
|
||||
text = self.current_query if self.current_index == -1 else self.current_results[self.current_index][0]
|
||||
c.insertText(text)
|
||||
chars = string_length(text)
|
||||
c.setPosition(c.position() - chars)
|
||||
c.setPosition(c.position() + chars, c.KeepAnchor)
|
||||
|
||||
def ensure_index_visible(self, index):
|
||||
if index < self.current_top_index:
|
||||
@ -186,6 +198,16 @@ class CompletionPopup(QWidget):
|
||||
QWidget.hide(self)
|
||||
self.relayout_timer.stop()
|
||||
|
||||
def abort(self):
|
||||
self.hide()
|
||||
self.current_completion = self.current_query = None
|
||||
|
||||
def mark_completion(self, editor, query):
|
||||
self.current_completion = c = editor.textCursor()
|
||||
chars = string_length(query or '')
|
||||
c.setPosition(c.position() - chars), c.setPosition(c.position() + chars, c.KeepAnchor)
|
||||
self.hide()
|
||||
|
||||
def handle_result(self, result):
|
||||
if result.traceback:
|
||||
prints(result.traceback)
|
||||
@ -203,13 +225,13 @@ class CompletionPopup(QWidget):
|
||||
if not items:
|
||||
self.hide()
|
||||
return
|
||||
self.set_items(items, descriptions)
|
||||
self.set_items(items, descriptions, result.query)
|
||||
self.show()
|
||||
|
||||
def handle_keypress(self, ev):
|
||||
key = ev.key()
|
||||
if key == Qt.Key_Escape:
|
||||
self.hide(), ev.accept()
|
||||
self.abort(), ev.accept()
|
||||
return True
|
||||
if key == Qt.Key_Tab:
|
||||
self.choose_next_result(previous=ev.modifiers() & Qt.ShiftModifier)
|
||||
@ -221,9 +243,6 @@ class CompletionPopup(QWidget):
|
||||
if key in (Qt.Key_Up, Qt.Key_Down):
|
||||
self.choose_next_result(previous=key == Qt.Key_Up)
|
||||
return True
|
||||
if key in (Qt.Key_Enter, Qt.Key_Return) and self.current_index > -1:
|
||||
self.index_activated(self.current_index)
|
||||
return True
|
||||
return False
|
||||
|
||||
def eventFilter(self, obj, ev):
|
||||
@ -250,12 +269,10 @@ class CompletionPopup(QWidget):
|
||||
y = ev.pos().y()
|
||||
idx = self.index_for_y(y)
|
||||
if idx is not None:
|
||||
self.index_activated(idx)
|
||||
self.activate_current_result()
|
||||
self.hide()
|
||||
ev.accept()
|
||||
|
||||
def index_activated(self, idx):
|
||||
print ('index activated', idx)
|
||||
self.hide()
|
||||
|
||||
if __name__ == '__main__':
|
||||
from calibre.utils.matcher import Matcher
|
||||
|
@ -171,7 +171,7 @@ def run_main(func):
|
||||
with closing(Client(address, authkey=key)) as control_conn, closing(Client(address, authkey=key)) as data_conn:
|
||||
func(control_conn, data_conn)
|
||||
|
||||
Result = namedtuple('Result', 'request_id ans traceback')
|
||||
Result = namedtuple('Result', 'request_id ans traceback query')
|
||||
|
||||
def main(control_conn, data_conn):
|
||||
from calibre.gui2.tweak_book.completion.basic import handle_control_request
|
||||
@ -190,7 +190,7 @@ def main(control_conn, data_conn):
|
||||
import traceback
|
||||
ans, tb = None, traceback.format_exc()
|
||||
if request.id is not None:
|
||||
result = Result(request.id, ans, tb)
|
||||
result = Result(request.id, ans, tb, request.query)
|
||||
try:
|
||||
eintr_retry_call(control_conn.send, result)
|
||||
except EOFError:
|
||||
|
@ -665,7 +665,7 @@ class TextEdit(PlainTextEdit):
|
||||
if self.completion_popup.isVisible() and not self.completion_popup.rect().contains(ev.pos()):
|
||||
# For some reason using eventFilter for this does not work, so we
|
||||
# implement it here
|
||||
self.completion_popup.hide()
|
||||
self.completion_popup.abort()
|
||||
if ev.modifiers() & Qt.CTRL:
|
||||
url = self.link_for_position(ev.pos())
|
||||
if url is not None:
|
||||
@ -795,9 +795,9 @@ class TextEdit(PlainTextEdit):
|
||||
result = self.smarts.get_completion_data(self, ev)
|
||||
if result is None:
|
||||
self.last_completion_request += 1
|
||||
self.completion_popup.hide()
|
||||
else:
|
||||
self.last_completion_request = self.request_completion(*result)
|
||||
self.completion_popup.mark_completion(self, None if result is None else result[-1])
|
||||
|
||||
def handle_completion_result(self, result):
|
||||
if result.request_id[0] >= self.last_completion_request:
|
||||
|
Loading…
x
Reference in New Issue
Block a user