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:
@@ -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",
|
||||
|
||||
@@ -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 ]
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user