Added more commands to code; refactored container classes; general cleanup
This commit is contained in:
@@ -12,8 +12,7 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None,
|
||||
buffer: GtkSource.Buffer= None
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Close File Command")
|
||||
file = editor.files.new()
|
||||
|
||||
19
src/core/widgets/code/commands/focus_left_sibling.py
Normal file
19
src/core/widgets/code/commands/focus_left_sibling.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Focus Left Sibling Command")
|
||||
if not editor.sibling_left: return
|
||||
editor.sibling_left.grab_focus()
|
||||
19
src/core/widgets/code/commands/focus_right_sibling.py
Normal file
19
src/core/widgets/code/commands/focus_right_sibling.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Focus Right Sibling Command")
|
||||
if not editor.sibling_right: return
|
||||
editor.sibling_right.grab_focus()
|
||||
@@ -12,8 +12,7 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None,
|
||||
buffer: GtkSource.Buffer= None
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Line Up Command")
|
||||
editor.emit("move-lines", True)
|
||||
|
||||
@@ -12,8 +12,7 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None,
|
||||
buffer: GtkSource.Buffer= None
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Line Up Command")
|
||||
editor.emit("move-lines", False)
|
||||
|
||||
26
src/core/widgets/code/commands/move_to_left_sibling.py
Normal file
26
src/core/widgets/code/commands/move_to_left_sibling.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Move To Left Sibling Command")
|
||||
if not editor.sibling_left: return
|
||||
|
||||
buffer = editor.get_buffer()
|
||||
sibling_file, popped_file = editor.files.pop_file(buffer)
|
||||
|
||||
editor.set_buffer(sibling_file.buffer)
|
||||
editor.sibling_left.set_buffer(buffer)
|
||||
editor.sibling_left.files.append(popped_file)
|
||||
editor.sibling_left.grab_focus()
|
||||
27
src/core/widgets/code/commands/move_to_right_sibling.py
Normal file
27
src/core/widgets/code/commands/move_to_right_sibling.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Move To Right Sibling Command")
|
||||
if not editor.sibling_right: return
|
||||
|
||||
buffer = editor.get_buffer()
|
||||
sibling_file, popped_file = editor.files.pop_file(buffer)
|
||||
|
||||
editor.set_buffer(sibling_file.buffer)
|
||||
editor.sibling_right.set_buffer(buffer)
|
||||
editor.sibling_right.files.append(popped_file)
|
||||
editor.sibling_right.grab_focus()
|
||||
|
||||
@@ -12,8 +12,7 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None,
|
||||
buffer: GtkSource.Buffer= None
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("New File Command")
|
||||
file = editor.files.new()
|
||||
|
||||
@@ -12,17 +12,16 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None,
|
||||
buffer: GtkSource.Buffer= None
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Open File(s) Command")
|
||||
gfiles = event_system.emit_and_await("open_files")
|
||||
gfiles = event_system.emit_and_await("open-files")
|
||||
if not gfiles: return
|
||||
|
||||
size = len(gfiles)
|
||||
for i, gfile in enumerate(gfiles):
|
||||
file = editor.files.new()
|
||||
file.set_path(gfile)
|
||||
file.load_path(gfile)
|
||||
|
||||
language = editor.language_manager \
|
||||
.guess_language(file.fname, None)
|
||||
|
||||
30
src/core/widgets/code/commands/save_file.py
Normal file
30
src/core/widgets/code/commands/save_file.py
Normal file
@@ -0,0 +1,30 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Save File Command")
|
||||
buffer = editor.get_buffer()
|
||||
file = editor.files.get_file(buffer)
|
||||
|
||||
if file.ftype == "buffer":
|
||||
file.save_as()
|
||||
language = editor.language_manager \
|
||||
.guess_language(file.fname, None)
|
||||
file.ftype = language
|
||||
file.buffer.set_language(language)
|
||||
return
|
||||
|
||||
file.save()
|
||||
|
||||
26
src/core/widgets/code/commands/save_file_as.py
Normal file
26
src/core/widgets/code/commands/save_file_as.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('GtkSource', '4')
|
||||
|
||||
from gi.repository import GtkSource
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.info("Save File As Command")
|
||||
buffer = editor.get_buffer()
|
||||
file = editor.files.get_file(buffer)
|
||||
|
||||
file.save_as()
|
||||
|
||||
language = editor.language_manager \
|
||||
.guess_language(file.fname, None)
|
||||
file.ftype = language
|
||||
file.buffer.set_language(language)
|
||||
@@ -12,7 +12,7 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
editor: GtkSource.View = None,
|
||||
buffer: GtkSource.Buffer= None
|
||||
editor: GtkSource.View = None
|
||||
):
|
||||
logger.debug("Show Completion Command")
|
||||
editor.completion.request_completion()
|
||||
|
||||
@@ -5,30 +5,33 @@ import gi
|
||||
from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
from .custom_completion_providers.lsp_completion_provider import LSPCompletionProvider
|
||||
from .completion_providers.example_completion_provider import ExampleCompletionProvider
|
||||
from .completion_providers.lsp_completion_provider import LSPCompletionProvider
|
||||
|
||||
|
||||
|
||||
class CompletionManager():
|
||||
def __init__(self, completer):
|
||||
def __init__(self):
|
||||
super(CompletionManager, self).__init__()
|
||||
|
||||
self._completor = completer
|
||||
self._lsp_provider = LSPCompletionProvider()
|
||||
self._timeout_id = None
|
||||
|
||||
|
||||
def set_completer(self, completer):
|
||||
self._completor = completer
|
||||
|
||||
def request_completion(self):
|
||||
if self._timeout_id:
|
||||
GLib.source_remove(self._timeout_id)
|
||||
|
||||
self._timeout_id = GLib.timeout_add(
|
||||
1000,
|
||||
800,
|
||||
self._process_request_completion
|
||||
)
|
||||
|
||||
def _process_request_completion(self):
|
||||
print('hello')
|
||||
self._start_completion()
|
||||
|
||||
self._timeout_id = None
|
||||
return False
|
||||
@@ -51,11 +54,12 @@ class CompletionManager():
|
||||
"""
|
||||
Note: Use IF NO providers have been added to completion...
|
||||
"""
|
||||
self._completion.start(
|
||||
self._completor.start(
|
||||
[
|
||||
ExampleCompletionProvider(),
|
||||
self._lsp_provider
|
||||
],
|
||||
self._completion.create_context()
|
||||
self._completor.create_context()
|
||||
)
|
||||
|
||||
|
||||
@@ -19,14 +19,14 @@ class ExampleCompletionProvider(GObject.GObject, GtkSource.CompletionProvider):
|
||||
This is a custom Completion Example Provider.
|
||||
# NOTE: used information from here --> https://warroom.rsmus.com/do-that-auto-complete/
|
||||
"""
|
||||
__gtype_name__ = 'CustomProvider'
|
||||
__gtype_name__ = 'ExampleCompletionProvider'
|
||||
|
||||
def __init__(self):
|
||||
GObject.Object.__init__(self)
|
||||
|
||||
def do_get_name(self):
|
||||
""" Returns: a new string containing the name of the provider. """
|
||||
return _('ExampleProvider')
|
||||
return 'Example Completion Provider'
|
||||
|
||||
def do_match(self, context):
|
||||
""" Get whether the provider match the context of completion detailed in context. """
|
||||
@@ -34,6 +34,16 @@ class ExampleCompletionProvider(GObject.GObject, GtkSource.CompletionProvider):
|
||||
# TODO: Fix me
|
||||
return True
|
||||
|
||||
def do_get_priority(self):
|
||||
""" Determin position in result list along other providor results. """
|
||||
return 1
|
||||
|
||||
# def do_get_activation(self):
|
||||
# """ The context for when a provider will show results """
|
||||
# return GtkSource.CompletionActivation.NONE
|
||||
# return GtkSource.CompletionActivation.USER_REQUESTED
|
||||
# return GtkSource.CompletionActivation.INTERACTIVE
|
||||
|
||||
def do_populate(self, context):
|
||||
"""
|
||||
In this instance, it will do 2 things:
|
||||
@@ -46,7 +56,7 @@ class ExampleCompletionProvider(GObject.GObject, GtkSource.CompletionProvider):
|
||||
"""
|
||||
|
||||
proposals = [
|
||||
# GtkSource.CompletionItem(label='Hello World!', text = 'Hello World!', icon = None, info = None) # NOTE: Always proposed...
|
||||
GtkSource.CompletionItem(label='Hello World!', text = 'Hello World!', icon = None, info = None) # NOTE: Always proposed...
|
||||
]
|
||||
|
||||
# Gtk Versions differ on get_iter responses...
|
||||
@@ -28,6 +28,9 @@ class LSPCompletionProvider(GObject.Object, GtkSource.CompletionProvider):
|
||||
self.lsp_data = None
|
||||
|
||||
|
||||
def pre_populate(self, context):
|
||||
...
|
||||
|
||||
def do_get_name(self):
|
||||
return "LSP Code Completion"
|
||||
|
||||
@@ -35,19 +38,36 @@ class LSPCompletionProvider(GObject.Object, GtkSource.CompletionProvider):
|
||||
return context.get_iter()[1] if isinstance(context.get_iter(), tuple) else context.get_iter()
|
||||
|
||||
def do_match(self, context):
|
||||
iter = self.get_iter_correctly(context)
|
||||
iter.backward_char()
|
||||
|
||||
buffer = iter.get_buffer()
|
||||
if buffer.get_context_classes_at_iter(iter) != ['no-spell-check']:
|
||||
return False
|
||||
|
||||
ch = iter.get_char()
|
||||
# NOTE: Look to re-add or apply supprting logic to use spaces
|
||||
# As is it slows down the editor in certain contexts...
|
||||
# if not (ch in ('_', '.', ' ') or ch.isalnum()):
|
||||
if not (ch in ('_', '.') or ch.isalnum()):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def do_get_priority(self):
|
||||
return 1
|
||||
|
||||
def do_get_activation(self):
|
||||
return GtkSource.CompletionActivation.USER_REQUESTED
|
||||
|
||||
return 5
|
||||
|
||||
def do_populate(self, context, items = []):
|
||||
self.lsp_data
|
||||
# self.lsp_data
|
||||
proposals = []
|
||||
|
||||
comp_item = GtkSource.CompletionItem.new()
|
||||
comp_item.set_label("LSP Class")
|
||||
comp_item.set_text("LSP Code")
|
||||
# comp_item.set_icon(self.get_icon_for_type(completion.type))
|
||||
comp_item.set_info("A test LSP completion item...")
|
||||
|
||||
context.add_proposals(self, [comp_item], True)
|
||||
|
||||
|
||||
|
||||
@@ -93,15 +93,14 @@ class KeyMapper:
|
||||
self.states = copy.deepcopy(self._map)
|
||||
|
||||
def _key_press_event(self, eve):
|
||||
keyname = Gdk.keyval_name(eve.keyval)
|
||||
print(keyname)
|
||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||||
|
||||
self._set_key_state(eve)
|
||||
if keyname in self.states[self.state].held:
|
||||
return self.states[self.state].held[keyname]
|
||||
|
||||
def _key_release_event(self, eve):
|
||||
keyname = Gdk.keyval_name(eve.keyval)
|
||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||||
|
||||
self._set_key_state(eve)
|
||||
if keyname in self.states[self.state].released:
|
||||
|
||||
40
src/core/widgets/code/miniview_widget.py
Normal file
40
src/core/widgets/code/miniview_widget.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('GtkSource', '4')
|
||||
from gi.repository.GtkSource import Map
|
||||
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
class MiniViewWidget(Map):
|
||||
def __init__(self):
|
||||
super(MiniViewWidget, self).__init__()
|
||||
|
||||
self._setup_styling()
|
||||
self._setup_signals()
|
||||
self._subscribe_to_events()
|
||||
self._load_widgets()
|
||||
|
||||
self.show_all()
|
||||
|
||||
|
||||
def _setup_styling(self):
|
||||
self.set_hexpand(False)
|
||||
ctx = self.get_style_context()
|
||||
ctx.add_class("mini-view")
|
||||
|
||||
def _setup_signals(self):
|
||||
...
|
||||
|
||||
def _subscribe_to_events(self):
|
||||
event_system.subscribe(f"set-mini-view", self.set_smini_view)
|
||||
|
||||
def _load_widgets(self):
|
||||
...
|
||||
|
||||
def set_smini_view(self, source_view):
|
||||
self.set_view(source_view)
|
||||
@@ -30,16 +30,20 @@ class SourceFile(GtkSource.File):
|
||||
self._set_signals()
|
||||
|
||||
|
||||
def set_path(self, gfile: Gio.File.new_for_path):
|
||||
def load_path(self, gfile: Gio.File):
|
||||
if not gfile: return
|
||||
|
||||
self.set_path(gfile)
|
||||
data = gfile.load_bytes()[0].get_data().decode("UTF-8")
|
||||
|
||||
self.buffer.insert_at_cursor(data)
|
||||
|
||||
def set_path(self, gfile: Gio.File):
|
||||
if not gfile: return
|
||||
self.set_location(gfile)
|
||||
|
||||
self.fpath = gfile.get_parent().get_path(),
|
||||
self.fname = gfile.get_basename()
|
||||
data = gfile.load_bytes()[0].get_data().decode("UTF-8")
|
||||
|
||||
self.buffer.insert_at_cursor(data)
|
||||
|
||||
def _set_signals(self):
|
||||
self.buffer.set_signals(
|
||||
@@ -70,8 +74,33 @@ class SourceFile(GtkSource.File):
|
||||
# logger.info("SourceFile._mark_set")
|
||||
...
|
||||
|
||||
def _modified_changed(self,buffer: SourceBuffer):
|
||||
def _modified_changed(self, buffer: SourceBuffer):
|
||||
logger.info("SourceFile._modified_changed")
|
||||
|
||||
def _write_file(self, gfile: Gio.File):
|
||||
if not gfile: return
|
||||
|
||||
with open(gfile.get_path(), 'w') as f:
|
||||
start_itr = self.buffer.get_start_iter()
|
||||
end_itr = self.buffer.get_end_iter()
|
||||
text = self.buffer.get_text(start_itr, end_itr, True)
|
||||
|
||||
f.write(text)
|
||||
|
||||
return gfile
|
||||
|
||||
def save(self):
|
||||
self._write_file( self.get_location() )
|
||||
|
||||
def save_as(self):
|
||||
print("poop")
|
||||
file = event_system.emit_and_await("save-file-dialog")
|
||||
if not file: return
|
||||
|
||||
self._write_file(file)
|
||||
self.set_path(file)
|
||||
|
||||
return file
|
||||
|
||||
def close(self):
|
||||
del self.buffer
|
||||
@@ -24,6 +24,28 @@ class SourceFilesManager(list):
|
||||
|
||||
super().append(file)
|
||||
|
||||
def get_file(self, buffer: SourceBuffer):
|
||||
if not buffer: return
|
||||
|
||||
for i, file in enumerate(self):
|
||||
if not buffer == file.buffer: continue
|
||||
return file
|
||||
|
||||
def pop_file(self, buffer: SourceBuffer):
|
||||
if not buffer: return
|
||||
|
||||
for i, file in enumerate(self):
|
||||
if not buffer == file.buffer: continue
|
||||
|
||||
popped_file = self.pop(i)
|
||||
sibling_file = None
|
||||
if len(self) == 0:
|
||||
sibling_file = self.new()
|
||||
else:
|
||||
sibling_file = self[ i - 1 if i > 0 else i + 1]
|
||||
|
||||
return sibling_file, popped_file
|
||||
|
||||
def remove_file(self, buffer: SourceBuffer):
|
||||
if not buffer: return
|
||||
|
||||
|
||||
@@ -16,11 +16,14 @@ from .command_system import CommandSystem
|
||||
from .key_mapper import KeyMapper
|
||||
|
||||
|
||||
|
||||
class SourceView(GtkSource.View):
|
||||
def __init__(self):
|
||||
super(SourceView, self).__init__()
|
||||
|
||||
self.key_mapper = KeyMapper()
|
||||
self.sibling_right = None
|
||||
self.sibling_left = None
|
||||
self.key_mapper = KeyMapper()
|
||||
|
||||
self._setup_styles()
|
||||
self._setup_signals()
|
||||
@@ -84,14 +87,18 @@ class SourceView(GtkSource.View):
|
||||
self.style_scheme_manager = GtkSource.StyleSchemeManager()
|
||||
self.command = CommandSystem()
|
||||
self.files = SourceFilesManager()
|
||||
self.completion = CompletionManager(
|
||||
self.get_completion()
|
||||
self.completion = CompletionManager()
|
||||
|
||||
self.completion.set_completer( self.get_completion() )
|
||||
|
||||
self.style_scheme_manager.append_search_path(
|
||||
f"{settings_manager.get_home_config_path()}/code_styles"
|
||||
)
|
||||
self.syntax_theme = self.style_scheme_manager.get_scheme(
|
||||
f"{settings.theming.syntax_theme}"
|
||||
)
|
||||
|
||||
self.style_scheme_manager.append_search_path(f"{settings_manager.get_home_config_path()}/code_styles")
|
||||
self.syntax_theme = self.style_scheme_manager.get_scheme("penguins-in-space")
|
||||
|
||||
self.command.set_data(self, self.get_buffer())
|
||||
self.command.set_data(self)
|
||||
self.exec_command("new_file")
|
||||
|
||||
def _key_press_event(self, view, eve):
|
||||
@@ -108,8 +115,5 @@ class SourceView(GtkSource.View):
|
||||
self.exec_command(command)
|
||||
return True
|
||||
|
||||
def _show_completion(self, view):
|
||||
self.completion.request_completion()
|
||||
|
||||
def exec_command(self, command: str):
|
||||
self.command.exec(command)
|
||||
|
||||
Reference in New Issue
Block a user