Choosing completion candidates now works

This commit is contained in:
Kovid Goyal 2014-12-27 14:27:09 +05:30
parent 2c662d3bef
commit c9081f49c7
3 changed files with 32 additions and 15 deletions

View File

@ -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

View File

@ -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:

View File

@ -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: