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.setCursor(Qt.PointingHandCursor)
|
||||||
|
|
||||||
self.matcher = None
|
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.max_text_length = 0
|
||||||
self.current_index = -1
|
self.current_index = -1
|
||||||
self.current_top_index = 0
|
self.current_top_index = 0
|
||||||
@ -52,7 +53,8 @@ class CompletionPopup(QWidget):
|
|||||||
self.rendered_text_cache.clear()
|
self.rendered_text_cache.clear()
|
||||||
self.current_size_hint = None
|
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_results = tuple(items.iteritems())
|
||||||
self.current_size_hint = None
|
self.current_size_hint = None
|
||||||
self.descriptions = descriptions or {}
|
self.descriptions = descriptions or {}
|
||||||
@ -143,6 +145,16 @@ class CompletionPopup(QWidget):
|
|||||||
self.current_index += 1
|
self.current_index += 1
|
||||||
self.ensure_index_visible(self.current_index)
|
self.ensure_index_visible(self.current_index)
|
||||||
self.update()
|
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):
|
def ensure_index_visible(self, index):
|
||||||
if index < self.current_top_index:
|
if index < self.current_top_index:
|
||||||
@ -186,6 +198,16 @@ class CompletionPopup(QWidget):
|
|||||||
QWidget.hide(self)
|
QWidget.hide(self)
|
||||||
self.relayout_timer.stop()
|
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):
|
def handle_result(self, result):
|
||||||
if result.traceback:
|
if result.traceback:
|
||||||
prints(result.traceback)
|
prints(result.traceback)
|
||||||
@ -203,13 +225,13 @@ class CompletionPopup(QWidget):
|
|||||||
if not items:
|
if not items:
|
||||||
self.hide()
|
self.hide()
|
||||||
return
|
return
|
||||||
self.set_items(items, descriptions)
|
self.set_items(items, descriptions, result.query)
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def handle_keypress(self, ev):
|
def handle_keypress(self, ev):
|
||||||
key = ev.key()
|
key = ev.key()
|
||||||
if key == Qt.Key_Escape:
|
if key == Qt.Key_Escape:
|
||||||
self.hide(), ev.accept()
|
self.abort(), ev.accept()
|
||||||
return True
|
return True
|
||||||
if key == Qt.Key_Tab:
|
if key == Qt.Key_Tab:
|
||||||
self.choose_next_result(previous=ev.modifiers() & Qt.ShiftModifier)
|
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):
|
if key in (Qt.Key_Up, Qt.Key_Down):
|
||||||
self.choose_next_result(previous=key == Qt.Key_Up)
|
self.choose_next_result(previous=key == Qt.Key_Up)
|
||||||
return True
|
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
|
return False
|
||||||
|
|
||||||
def eventFilter(self, obj, ev):
|
def eventFilter(self, obj, ev):
|
||||||
@ -250,12 +269,10 @@ class CompletionPopup(QWidget):
|
|||||||
y = ev.pos().y()
|
y = ev.pos().y()
|
||||||
idx = self.index_for_y(y)
|
idx = self.index_for_y(y)
|
||||||
if idx is not None:
|
if idx is not None:
|
||||||
self.index_activated(idx)
|
self.activate_current_result()
|
||||||
|
self.hide()
|
||||||
ev.accept()
|
ev.accept()
|
||||||
|
|
||||||
def index_activated(self, idx):
|
|
||||||
print ('index activated', idx)
|
|
||||||
self.hide()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
from calibre.utils.matcher import Matcher
|
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:
|
with closing(Client(address, authkey=key)) as control_conn, closing(Client(address, authkey=key)) as data_conn:
|
||||||
func(control_conn, 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):
|
def main(control_conn, data_conn):
|
||||||
from calibre.gui2.tweak_book.completion.basic import handle_control_request
|
from calibre.gui2.tweak_book.completion.basic import handle_control_request
|
||||||
@ -190,7 +190,7 @@ def main(control_conn, data_conn):
|
|||||||
import traceback
|
import traceback
|
||||||
ans, tb = None, traceback.format_exc()
|
ans, tb = None, traceback.format_exc()
|
||||||
if request.id is not None:
|
if request.id is not None:
|
||||||
result = Result(request.id, ans, tb)
|
result = Result(request.id, ans, tb, request.query)
|
||||||
try:
|
try:
|
||||||
eintr_retry_call(control_conn.send, result)
|
eintr_retry_call(control_conn.send, result)
|
||||||
except EOFError:
|
except EOFError:
|
||||||
|
@ -665,7 +665,7 @@ class TextEdit(PlainTextEdit):
|
|||||||
if self.completion_popup.isVisible() and not self.completion_popup.rect().contains(ev.pos()):
|
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
|
# For some reason using eventFilter for this does not work, so we
|
||||||
# implement it here
|
# implement it here
|
||||||
self.completion_popup.hide()
|
self.completion_popup.abort()
|
||||||
if ev.modifiers() & Qt.CTRL:
|
if ev.modifiers() & Qt.CTRL:
|
||||||
url = self.link_for_position(ev.pos())
|
url = self.link_for_position(ev.pos())
|
||||||
if url is not None:
|
if url is not None:
|
||||||
@ -795,9 +795,9 @@ class TextEdit(PlainTextEdit):
|
|||||||
result = self.smarts.get_completion_data(self, ev)
|
result = self.smarts.get_completion_data(self, ev)
|
||||||
if result is None:
|
if result is None:
|
||||||
self.last_completion_request += 1
|
self.last_completion_request += 1
|
||||||
self.completion_popup.hide()
|
|
||||||
else:
|
else:
|
||||||
self.last_completion_request = self.request_completion(*result)
|
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):
|
def handle_completion_result(self, result):
|
||||||
if result.request_id[0] >= self.last_completion_request:
|
if result.request_id[0] >= self.last_completion_request:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user