2025-12-14 02:44:05 -06:00
|
|
|
# Python imports
|
|
|
|
|
|
|
|
|
|
# Lib imports
|
|
|
|
|
import gi
|
|
|
|
|
gi.require_version('Gtk', '3.0')
|
|
|
|
|
gi.require_version('GtkSource', '4')
|
|
|
|
|
|
|
|
|
|
from gi.repository import Gtk
|
|
|
|
|
from gi.repository import GLib
|
|
|
|
|
from gi.repository import GtkSource
|
|
|
|
|
|
|
|
|
|
# Application imports
|
|
|
|
|
from .source_files_manager import SourceFilesManager
|
|
|
|
|
from .completion_manager import CompletionManager
|
|
|
|
|
from .command_system import CommandSystem
|
|
|
|
|
from .key_mapper import KeyMapper
|
|
|
|
|
|
|
|
|
|
|
2025-12-15 22:50:28 -06:00
|
|
|
|
2025-12-14 02:44:05 -06:00
|
|
|
class SourceView(GtkSource.View):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
super(SourceView, self).__init__()
|
|
|
|
|
|
2025-12-15 22:50:28 -06:00
|
|
|
self.sibling_right = None
|
|
|
|
|
self.sibling_left = None
|
|
|
|
|
self.key_mapper = KeyMapper()
|
2025-12-14 02:44:05 -06:00
|
|
|
|
|
|
|
|
self._setup_styles()
|
|
|
|
|
self._setup_signals()
|
|
|
|
|
self._subscribe_to_events()
|
|
|
|
|
self._load_widgets()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _setup_styles(self):
|
|
|
|
|
ctx = self.get_style_context()
|
|
|
|
|
ctx.add_class("source-view")
|
|
|
|
|
|
|
|
|
|
self.set_vexpand(True)
|
|
|
|
|
|
|
|
|
|
self.set_show_line_marks(True)
|
|
|
|
|
self.set_show_line_numbers(True)
|
|
|
|
|
self.set_smart_backspace(True)
|
|
|
|
|
self.set_indent_on_tab(True)
|
|
|
|
|
self.set_insert_spaces_instead_of_tabs(True)
|
|
|
|
|
self.set_auto_indent(True)
|
|
|
|
|
self.set_monospace(True)
|
|
|
|
|
self.set_tab_width(4)
|
|
|
|
|
self.set_show_right_margin(True)
|
|
|
|
|
self.set_right_margin_position(80)
|
|
|
|
|
self.set_background_pattern(0) # 0 = None, 1 = Grid
|
|
|
|
|
self.set_highlight_current_line(True)
|
|
|
|
|
|
|
|
|
|
def _setup_signals(self):
|
|
|
|
|
# self.connect("show-completion", self._show_completion)
|
|
|
|
|
self.map_id = self.connect("map", self._init_map)
|
|
|
|
|
|
|
|
|
|
# self.connect("focus", self._on_widget_focus)
|
|
|
|
|
# self.connect("focus-in-event", self._focus_in_event)
|
|
|
|
|
|
|
|
|
|
# self.connect("drag-data-received", self._on_drag_data_received)
|
|
|
|
|
self.connect("key-press-event", self._key_press_event)
|
|
|
|
|
self.connect("key-release-event", self._key_release_event)
|
|
|
|
|
# self.connect("button-press-event", self._button_press_event)
|
|
|
|
|
# self.connect("button-release-event", self._button_release_event)
|
|
|
|
|
# self.connect("scroll-event", self._scroll_event)
|
|
|
|
|
|
|
|
|
|
def _subscribe_to_events(self):
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
def _load_widgets(self):
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
def _init_map(self, view):
|
|
|
|
|
def _first_show_init():
|
|
|
|
|
self.disconnect(self.map_id)
|
|
|
|
|
del self.map_id
|
|
|
|
|
|
|
|
|
|
self._handle_first_show()
|
|
|
|
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# GLib.timeout_add(1000, _first_show_init)
|
|
|
|
|
GLib.idle_add(_first_show_init)
|
|
|
|
|
|
|
|
|
|
def _handle_first_show(self):
|
|
|
|
|
self.language_manager = GtkSource.LanguageManager()
|
|
|
|
|
self.style_scheme_manager = GtkSource.StyleSchemeManager()
|
|
|
|
|
self.command = CommandSystem()
|
|
|
|
|
self.files = SourceFilesManager()
|
2025-12-15 22:50:28 -06:00
|
|
|
self.completion = CompletionManager()
|
|
|
|
|
|
|
|
|
|
self.completion.set_completer( self.get_completion() )
|
2025-12-14 02:44:05 -06:00
|
|
|
|
2025-12-15 22:50:28 -06:00
|
|
|
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}"
|
|
|
|
|
)
|
2025-12-14 02:44:05 -06:00
|
|
|
|
2025-12-15 22:50:28 -06:00
|
|
|
self.command.set_data(self)
|
2025-12-14 02:44:05 -06:00
|
|
|
self.exec_command("new_file")
|
|
|
|
|
|
|
|
|
|
def _key_press_event(self, view, eve):
|
|
|
|
|
command = self.key_mapper._key_press_event(eve)
|
|
|
|
|
if not command: return False
|
|
|
|
|
|
|
|
|
|
self.exec_command(command)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def _key_release_event(self, view, eve):
|
|
|
|
|
command = self.key_mapper._key_release_event(eve)
|
|
|
|
|
if not command: return False
|
|
|
|
|
|
|
|
|
|
self.exec_command(command)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def exec_command(self, command: str):
|
|
|
|
|
self.command.exec(command)
|