Moved completers to new dir; improved completers and added word completion
This commit is contained in:
@@ -51,7 +51,7 @@ class ProviderResponseCacheBase:
|
||||
text: str = "",
|
||||
info: str = "",
|
||||
completion: any = None
|
||||
):
|
||||
) -> dict:
|
||||
if not label or not text: return
|
||||
|
||||
comp_item = GtkSource.CompletionItem.new()
|
||||
@@ -69,19 +69,51 @@ class ProviderResponseCacheBase:
|
||||
|
||||
return comp_item
|
||||
|
||||
def get_word(self, context):
|
||||
start_iter = context.get_iter()
|
||||
end_iter = None
|
||||
def get_all_marks(self, buffer):
|
||||
marks = []
|
||||
iter_ = buffer.get_start_iter()
|
||||
|
||||
if not isinstance(start_iter, Gtk.TextIter):
|
||||
_, start_iter = context.get_iter()
|
||||
end_iter = start_iter.copy()
|
||||
while iter_:
|
||||
marks = iter_.get_marks()
|
||||
|
||||
for mark in marks:
|
||||
if mark and mark not in marks:
|
||||
marks.append(mark)
|
||||
|
||||
if not iter_.forward_char():
|
||||
break
|
||||
|
||||
return marks
|
||||
|
||||
def get_all_insert_marks(self, buffer):
|
||||
marks = []
|
||||
iter_ = buffer.get_start_iter()
|
||||
|
||||
while iter_:
|
||||
marks = iter_.get_marks()
|
||||
|
||||
for mark in marks:
|
||||
if mark.get_name() and "multi_insert_" in mark.get_name():
|
||||
marks.append(mark)
|
||||
|
||||
if not iter_.forward_char():
|
||||
break
|
||||
|
||||
return marks
|
||||
|
||||
def get_word(self, context) -> str:
|
||||
start_iter = self.get_iter_correctly(context)
|
||||
end_iter = start_iter.copy()
|
||||
|
||||
if not start_iter.starts_word():
|
||||
start_iter.backward_word_start()
|
||||
|
||||
end_iter.forward_word_end()
|
||||
if not end_iter.ends_word():
|
||||
end_iter.forward_word_end()
|
||||
|
||||
buffer = start_iter.get_buffer()
|
||||
|
||||
return buffer.get_text(start_iter, end_iter, False)
|
||||
|
||||
def get_iter_correctly(self, context):
|
||||
return context.get_iter()[1] if isinstance(context.get_iter(), tuple) else context.get_iter()
|
||||
|
||||
@@ -45,10 +45,13 @@ class CompletionController(ControllerBase):
|
||||
def register_completer(self, completer: GtkSource.Completion):
|
||||
self._completers.append(completer)
|
||||
|
||||
completer.add_provider(self.words_provider)
|
||||
# completer.add_provider(self.words_provider)
|
||||
for provider in self._providers.values():
|
||||
completer.add_provider(provider)
|
||||
|
||||
def unregister_completer(self, completer: GtkSource.Completion):
|
||||
self._completers.remove(completer)
|
||||
|
||||
def register_provider(
|
||||
self,
|
||||
provider_name: str,
|
||||
|
||||
@@ -34,6 +34,9 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
|
||||
if not self.insert_markers: return False
|
||||
|
||||
buffer = file.buffer
|
||||
if buffer.is_processing_completion:
|
||||
self.insert_completion_text(buffer, text)
|
||||
return True
|
||||
|
||||
# freeze buffer and insert to each mark (if any)
|
||||
buffer.block_insert_after_signal()
|
||||
@@ -49,6 +52,32 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
|
||||
|
||||
return True
|
||||
|
||||
def insert_completion_text(self, buffer, text):
|
||||
buffer.is_processing_completion = False
|
||||
|
||||
# freeze buffer and insert to each mark (if any)
|
||||
buffer.block_insert_after_signal()
|
||||
buffer.begin_user_action()
|
||||
|
||||
with buffer.freeze_notify():
|
||||
for mark in self.insert_markers:
|
||||
end_itr = buffer.get_iter_at_mark(mark)
|
||||
start_itr = end_itr.copy()
|
||||
|
||||
if not start_itr.starts_word():
|
||||
start_itr.backward_word_start()
|
||||
|
||||
if not end_itr.ends_word():
|
||||
end_itr.forward_word_end()
|
||||
|
||||
buffer.delete(start_itr, end_itr)
|
||||
buffer.insert(end_itr, text, -1)
|
||||
|
||||
buffer.end_user_action()
|
||||
buffer.unblock_insert_after_signal()
|
||||
|
||||
return True
|
||||
|
||||
def move_cursor(self, source_view, step, count, extend_selection, emit):
|
||||
buffer = source_view.get_buffer()
|
||||
|
||||
@@ -95,7 +124,7 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
|
||||
return False
|
||||
|
||||
is_future = key_mapper._key_release_event(eve)
|
||||
if is_future: return False
|
||||
if is_future: return True
|
||||
|
||||
command = key_mapper._key_press_event(eve)
|
||||
if not command: return False
|
||||
@@ -108,7 +137,7 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
|
||||
command = key_mapper._key_release_event(eve)
|
||||
is_past = key_mapper._key_press_event(eve)
|
||||
|
||||
if is_past: return False
|
||||
if is_past: return True
|
||||
if not command: return False
|
||||
|
||||
source_view.command.exec(command)
|
||||
|
||||
@@ -13,6 +13,8 @@ class SourceBuffer(GtkSource.Buffer):
|
||||
def __init__(self):
|
||||
super(SourceBuffer, self).__init__()
|
||||
|
||||
self.is_processing_completion: bool = False
|
||||
|
||||
self._handler_ids = []
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user