Refactor LSP manager and file handling
- Refactored LSPClient and LSPClientEvents to use workspace path and initialization options. - Updated LSPManager to pass workspace path to client creation. - Modified LSPManagerUI to handle user home paths and workspace configurations. - Enhanced file handling to manage buffer and directory types. - Introduced CreatedSourceViewEvent for source view creation event tracking. - Added better error handling and logging for file operations. Other minor UI and widget adjustments for improved layout and drag-and-drop handling.
This commit is contained in:
@@ -28,6 +28,7 @@ class CenterContainer(Gtk.Box):
|
||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||
self.set_hexpand(True)
|
||||
self.set_vexpand(True)
|
||||
self.set_size_request(320, -1)
|
||||
|
||||
def _setup_signals(self):
|
||||
self.connect("show", self._handle_show)
|
||||
|
||||
@@ -29,6 +29,7 @@ class EditorsContainer(Gtk.Paned):
|
||||
self.set_hexpand(True)
|
||||
self.set_vexpand(True)
|
||||
self.set_wide_handle(True)
|
||||
self.set_size_request(320, -1)
|
||||
|
||||
def _setup_signals(self):
|
||||
self.connect("map", self._init_map)
|
||||
|
||||
@@ -18,16 +18,12 @@ class BaseControllerMixin:
|
||||
files = []
|
||||
|
||||
for arg in unknownargs + [args.new_tab,]:
|
||||
if os.path.isdir( arg.replace("file://", "") ):
|
||||
files.append( f"DIR|{arg.replace('file://', '')}" )
|
||||
continue
|
||||
if os.path.isfile(arg):
|
||||
files.append(f"{arg}")
|
||||
|
||||
# NOTE: If passing line number with file split against :
|
||||
if os.path.isfile( arg.replace("file://", "").split(":")[0] ):
|
||||
files.append( f"FILE|{arg.replace('file://', '')}" )
|
||||
continue
|
||||
|
||||
logger.info(f"Not a File: {arg}")
|
||||
if os.path.isdir(arg):
|
||||
message = f"DIR|{arg}"
|
||||
ipc_server.send_ipc_message(message)
|
||||
|
||||
if not files: return
|
||||
|
||||
|
||||
@@ -111,6 +111,12 @@ class SourceViewsController(ControllerBase, list):
|
||||
self.signal_mapper.connect_signals(source_view)
|
||||
|
||||
self.append(source_view)
|
||||
|
||||
event = Event_Factory.create_event(
|
||||
"created_source_view", view = source_view
|
||||
)
|
||||
self.emit(event)
|
||||
|
||||
return source_view
|
||||
|
||||
def first_map_load(self):
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
#gi.require_version('Gdk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
#from gi.repository import Gdk
|
||||
|
||||
|
||||
# Application imports
|
||||
|
||||
@@ -12,25 +15,41 @@ from gi.repository import Gtk
|
||||
class SourceViewDnDMixin:
|
||||
|
||||
def _set_up_dnd(self):
|
||||
PLAIN_TEXT_TARGET_TYPE = 70
|
||||
URI_TARGET_TYPE = 80
|
||||
text_target = Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags(0), PLAIN_TEXT_TARGET_TYPE)
|
||||
uri_target = Gtk.TargetEntry.new('text/uri-list', Gtk.TargetFlags(0), URI_TARGET_TYPE)
|
||||
targets = [ text_target, uri_target ]
|
||||
URI_TARGET_TYPE = 10
|
||||
PLAIN_TEXT_TARGET_TYPE = 50
|
||||
|
||||
uri_target = Gtk.TargetEntry.new(
|
||||
'text/uri-list', Gtk.TargetFlags(0), URI_TARGET_TYPE
|
||||
)
|
||||
text_target = Gtk.TargetEntry.new(
|
||||
'text/plain', Gtk.TargetFlags(0), PLAIN_TEXT_TARGET_TYPE
|
||||
)
|
||||
targets = Gtk.TargetList.new([ uri_target, text_target ])
|
||||
|
||||
self.drag_dest_set_target_list(targets)
|
||||
|
||||
def _on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
|
||||
if info == 70: return
|
||||
def _on_drag_data_received(
|
||||
self, widget, drag_context, x, y, data, info, time
|
||||
):
|
||||
target = data.get_target().name()
|
||||
|
||||
if info == 80:
|
||||
if (info == 10) or (target == "text/uri-list"):
|
||||
uris = data.get_uris()
|
||||
|
||||
if not uris:
|
||||
uris = data.get_text().split("\n")
|
||||
|
||||
self._on_uri_data_received(uris)
|
||||
|
||||
drag_context.finish(True, False, time)
|
||||
|
||||
return
|
||||
elif (info == 50) or (target == "text/plain"):
|
||||
...
|
||||
else:
|
||||
logger.info(f"DnD Dropped File Type: {target}")
|
||||
|
||||
drag_context.finish(False, False, time)
|
||||
|
||||
def _on_uri_data_received(self, uris: list[str]):
|
||||
uris = self.command.filter_out_loaded_files(uris)
|
||||
if not uris: return
|
||||
|
||||
@@ -155,9 +155,10 @@ class SourceFile(GtkSource.File):
|
||||
self.buffer.unblock_modified_changed_signal()
|
||||
|
||||
def is_externally_modified(self) -> bool:
|
||||
stat = os.stat(self.fpath)
|
||||
current = (stat.st_mtime_ns, stat.st_size)
|
||||
if self.fname == "buffer": return
|
||||
|
||||
stat = os.stat(self.fpath)
|
||||
current = (stat.st_mtime_ns, stat.st_size)
|
||||
is_modified = \
|
||||
hasattr(self, "last_state") and not current == self.last_state
|
||||
|
||||
@@ -169,7 +170,12 @@ class SourceFile(GtkSource.File):
|
||||
loaded, contents, etag_out = gfile.load_contents()
|
||||
if not loaded: raise Exception("File couldn't be loaded...'")
|
||||
|
||||
text = contents.decode("UTF-8")
|
||||
# Note:
|
||||
# "strict" (default) -> raises an error on invalid bytes
|
||||
# "ignore" -> skips invalid bytes entirely
|
||||
# "replace" -> replaces invalid bytes with <20>
|
||||
# "backslashreplace" -> uses escape sequences like \xFF
|
||||
text = contents.decode("UTF-8", errors = "replace")
|
||||
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) \
|
||||
@@ -177,6 +183,7 @@ class SourceFile(GtkSource.File):
|
||||
.replace("text/", "") \
|
||||
.replace("x-", "")
|
||||
|
||||
del contents
|
||||
self.set_path(gfile)
|
||||
logger.debug(f"File content type: {self.ftype}")
|
||||
self._load_data(text)
|
||||
|
||||
@@ -19,10 +19,10 @@ class SourceView(GtkSource.View, SourceViewDnDMixin):
|
||||
def __init__(self, state: SourceViewStates = SourceViewStates.INSERT):
|
||||
super(SourceView, self).__init__()
|
||||
|
||||
self.state = state
|
||||
self.state = state
|
||||
|
||||
self.sibling_right = None
|
||||
self.sibling_left = None
|
||||
self.sibling_right = None
|
||||
self.sibling_left = None
|
||||
|
||||
self._setup_styles()
|
||||
self._setup_signals()
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
from .code_event import CodeEvent
|
||||
from .toggle_plugins_ui_event import TogglePluginsUiEvent
|
||||
from .create_source_view_event import CreateSourceViewEvent
|
||||
from .created_source_view_event import CreatedSourceViewEvent
|
||||
from .register_completer_event import RegisterCompleterEvent
|
||||
from .unregister_completer_event import UnregisterCompleterEvent
|
||||
from .register_provider_event import RegisterProviderEvent
|
||||
|
||||
14
src/libs/dto/code/events/created_source_view_event.py
Normal file
14
src/libs/dto/code/events/created_source_view_event.py
Normal file
@@ -0,0 +1,14 @@
|
||||
# Python imports
|
||||
from dataclasses import dataclass
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
from .code_event import CodeEvent
|
||||
from libs.dto.states.source_view_states import SourceViewStates
|
||||
|
||||
|
||||
|
||||
@dataclass
|
||||
class CreatedSourceViewEvent(CodeEvent):
|
||||
...
|
||||
@@ -13,9 +13,11 @@ from .requests import Requests
|
||||
class Manifest:
|
||||
name: str = ""
|
||||
author: str = ""
|
||||
credit: str = ""
|
||||
description: str = ""
|
||||
version: str = "0.0.1"
|
||||
support: str = "support@mail.com"
|
||||
credit: str = ""
|
||||
copyright: str = "GPLv2"
|
||||
pre_launch: bool = False
|
||||
autoload: bool = True
|
||||
requests: Requests = field(default_factory = lambda: Requests())
|
||||
|
||||
Reference in New Issue
Block a user