Moved plugins and add loaded file filtering

- Moved prettify_json and lsp_completer plugins to sub categories
- Add filter_out_loaded_files to prevent opening already-loaded files
- Refactor code events into single events module
- Fix signal blocking during file load operations
- Include READONLY state in source view lifecycle handling
This commit is contained in:
2026-03-08 00:46:21 -06:00
parent 22abc02d25
commit 220a8c2743
102 changed files with 8471 additions and 153 deletions

View File

@@ -47,6 +47,16 @@ class CommandSystem:
...
def filter_out_loaded_files(self, uris: list[str]):
event = Event_Factory.create_event(
"filter_out_loaded_files",
uris = uris
)
self.emit_to("files", event)
return event.response
def set_info_labels(self, data: tuple[str]):
event = Event_Factory.create_event(
"set_info_labels",

View File

@@ -18,19 +18,13 @@ def execute(
**kwargs
):
logger.debug("Command: Open File(s)")
file = view.command.get_file(view)
start_path = None
file = view.command.get_file(view)
if not file.ftype == "buffer":
start_path = file.get_location()
gfiles = event_system.emit_and_await("open-files", (None, None, start_path))
if not gfiles: return
if file.ftype == "buffer":
gfile = gfiles.pop()
view.command.exec_with_args("load_file", view, gfile, file)
view.set_buffer(file.buffer)
update_info_bar_if_focused(view.command, view)
for i, gfile in enumerate(gfiles):
view.command.exec_with_args("load_file", view, gfile)
view._on_uri_data_received(
[ gfile.get_uri() for gfile in gfiles ]
)

View File

@@ -34,6 +34,8 @@ class CompletionController(ControllerBase):
event.language_ids
)
elif isinstance(event, Code_Event_Types.AddedNewFileEvent):
...
elif isinstance(event, Code_Event_Types.LoadedNewFileEvent):
self.provider_process_file_load(event)
elif isinstance(event, Code_Event_Types.RemovedFileEvent):
self.provider_process_file_close(event)

View File

@@ -22,6 +22,8 @@ class FilesController(ControllerBase, list):
self.new_file(event)
elif isinstance(event, Code_Event_Types.PopFileEvent):
self.pop_file(event)
elif isinstance(event, Code_Event_Types.FilterOutLoadedFilesEvent):
self.filter_loaded(event)
elif isinstance(event, Code_Event_Types.RemoveFileEvent):
self.remove_file(event)
elif isinstance(event, Code_Event_Types.GetFileEvent):
@@ -30,6 +32,13 @@ class FilesController(ControllerBase, list):
self.get_swap_file(event)
def filter_loaded(self, event: Code_Event_Types.FilterOutLoadedFilesEvent):
loaded_paths = {file.fpath for file in self}
files = [
uri for uri in event.uris if not any(path in uri for path in loaded_paths)
]
event.response = files
def new_file(self, event: Code_Event_Types.AddNewFileEvent):
file = SourceFile()
file.emit = self.emit

View File

@@ -19,8 +19,8 @@ class SourceViewSignalMapper:
self.state_manager = state_manager
def set_buffer_to_active_view(self, buffer):
self.active_view.set_buffer(buffer)
self.active_view.command.exec("update_info_bar")
self.active_view.set_buffer(buffer)
self.active_view.command.exec("update_info_bar")
def connect_signals(self, source_view: SourceView):
signal_mappings = self._get_signal_mappings()

View File

@@ -73,6 +73,7 @@ class SourceViewsController(ControllerBase, list):
for source_view in self:
if not event.file.buffer == source_view.get_buffer(): continue
if not event.next_file:
if source_view.state in [SourceViewStates.INDEPENDENT, SourceViewStates.READONLY]: continue
source_view.command.exec("new_file")
continue
@@ -90,7 +91,7 @@ class SourceViewsController(ControllerBase, list):
def first_map_load(self):
for source_view in self:
if source_view.state == SourceViewStates.INDEPENDENT: continue
if source_view.state in [SourceViewStates.INDEPENDENT, SourceViewStates.READONLY]: continue
source_view.command.exec("new_file")
if not source_view.sibling_left: continue
source_view.get_parent().hide()

View File

@@ -31,7 +31,10 @@ class SourceViewDnDMixin:
self._on_uri_data_received(uris)
def _on_uri_data_received(self, uris: []):
def _on_uri_data_received(self, uris: list[str]):
uris = self.command.filter_out_loaded_files(uris)
if not uris: return
uri = uris.pop(0)
self.command.exec_with_args("dnd_load_file_to_buffer", self, uri)

View File

@@ -47,8 +47,6 @@ class SourceFile(GtkSource.File):
...
def _after_changed(self, buffer: SourceBuffer):
self.check_file_on_disk()
event = Event_Factory.create_event(
"text_changed",
file = self,
@@ -56,25 +54,6 @@ class SourceFile(GtkSource.File):
)
self.emit(event)
if self.is_deleted():
self.was_deleted = True
event = Event_Factory.create_event(
"file_externally_deleted",
file = self,
buffer = buffer
)
self.emit(event)
return
if self.is_externally_modified():
# event = Event_Factory.create_event(
# "file_externally_modified",
# file = self,
# buffer = buffer
# )
# self.emit(event)
return
def _insert_text(
self,
buffer: SourceBuffer,
@@ -145,19 +124,26 @@ class SourceFile(GtkSource.File):
def load_path(self, gfile: Gio.File):
if not gfile: return
self.set_path(gfile)
text = gfile.load_bytes()[0].get_data().decode("UTF-8")
info = gfile.query_info('standard::content-type', Gio.FileQueryInfoFlags.NONE, None)
content_type = info.get_content_type()
self.ftype = Gio.content_type_get_mime_type(content_type)
self.ftype = Gio.content_type_get_mime_type(content_type) \
.replace("application/", "") \
.replace("text/", "") \
.replace("x-", "")
self.set_path(gfile)
logger.debug(f"File content type: {self.ftype}")
undo_manager = self.buffer.get_undo_manager()
self.buffer.block_changed_signal()
self.buffer.block_changed_after_signal()
self.buffer.block_modified_changed_signal()
def move_insert_to_start():
start_itr = self.buffer.get_start_iter()
self.buffer.place_cursor(start_itr)
undo_manager.begin_not_undoable_action()
with self.buffer.freeze_notify():
@@ -170,6 +156,17 @@ class SourceFile(GtkSource.File):
undo_manager.end_not_undoable_action()
self.buffer.set_modified(False)
eve = Event_Factory.create_event(
"loaded_new_file",
file = self
)
self.emit(eve)
self.buffer.unblock_changed_signal()
self.buffer.unblock_changed_after_signal()
self.buffer.unblock_modified_changed_signal()
def set_path(self, gfile: Gio.File):
if not gfile: return
self.set_location(gfile)