Moved completers to new dir; improved completers and added word completion

This commit is contained in:
2026-02-16 01:37:13 -06:00
parent 80a4620724
commit bcd87801e6
43 changed files with 662 additions and 247 deletions

View File

@@ -38,20 +38,20 @@ class ProviderResponseCacheBase:
def process_file_change(self, buffer: GtkSource.Buffer):
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_change' not implemented...")
def filter(self, word: str):
def filter(self, word: str) -> list[dict]:
raise ProviderResponseCacheException("ProviderResponseCacheBase 'filter' not implemented...")
def filter_with_context(self, context: GtkSource.CompletionContext):
def filter_with_context(self, context: GtkSource.CompletionContext) -> list[dict]:
raise ProviderResponseCacheException("ProviderResponseCacheBase 'filter_with_context' not implemented...")
def create_completion_item(
self,
label: str = "",
text: str = "",
info: str = "",
completion: any = None
):
label: str = "",
text: str = "",
info: str = "",
icon: any = None
) -> dict:
if not label or not text: return
comp_item = GtkSource.CompletionItem.new()
@@ -62,26 +62,58 @@ class ProviderResponseCacheBase:
comp_item.set_info(info)
# comp_item.set_markup(f"<h3>{info}</h3>")
if completion:
if icon:
comp_item.set_icon(
self.get_icon_for_type(completion.type)
self.get_icon_for_type(icon.type)
)
return comp_item
def get_word(self, context):
start_iter = context.get_iter()
end_iter = None
def get_all_marks(self, buffer) -> list:
marks: list = []
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) -> list:
marks: list = []
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) -> Gtk.TextIter:
return context.get_iter()[1] if isinstance(context.get_iter(), tuple) else context.get_iter()

View File

@@ -17,9 +17,6 @@ class CompletionController(ControllerBase):
def __init__(self):
super(CompletionController, self).__init__()
self.words_provider = GtkSource.CompletionWords.new("words", None)
self.words_provider.props.activation = GtkSource.CompletionActivation.INTERACTIVE
self._completers: list[GtkSource.Completion] = []
self._providers: dict[str, GtkSource.CompletionProvider] = {}
@@ -45,10 +42,12 @@ class CompletionController(ControllerBase):
def register_completer(self, completer: GtkSource.Completion):
self._completers.append(completer)
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,
@@ -68,14 +67,10 @@ class CompletionController(ControllerBase):
completer.remove_provider(provider)
def provider_process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
self.words_provider.register(event.file.buffer)
for provider in self._providers.values():
provider.response_cache.process_file_load(event)
def provider_process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
self.words_provider.unregister(event.file.buffer)
for provider in self._providers.values():
provider.response_cache.process_file_close(event)

View File

@@ -32,8 +32,11 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
def insert_text(self, file, text):
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()

View File

@@ -13,6 +13,8 @@ class SourceBuffer(GtkSource.Buffer):
def __init__(self):
super(SourceBuffer, self).__init__()
self.is_processing_completion: bool = False
self._handler_ids = []