Compare commits
2 Commits
7c7e88aaed
...
24bf1e471b
| Author | SHA1 | Date | |
|---|---|---|---|
| 24bf1e471b | |||
| 824dd93696 |
@@ -43,7 +43,7 @@ def call_chain_wrapper(fn):
|
||||
|
||||
# NOTE: Just reminding myself we can add to builtins two different ways...
|
||||
# __builtins__.update({"event_system": Builtins()})
|
||||
builtins.APP_NAME = "<change_me>"
|
||||
builtins.APP_NAME = "<change_me>".replace("<","").replace(">","")
|
||||
|
||||
builtins.keybindings = Keybindings()
|
||||
builtins.event_system = EventSystem()
|
||||
|
||||
@@ -26,6 +26,7 @@ class EditorsContainer(Gtk.Paned):
|
||||
self.ctx = self.get_style_context()
|
||||
self.ctx.add_class("paned-editors-container")
|
||||
|
||||
self.set_size_request(-1, 300)
|
||||
self.set_hexpand(True)
|
||||
self.set_vexpand(True)
|
||||
self.set_wide_handle(True)
|
||||
|
||||
@@ -9,7 +9,6 @@ from gi.repository import GtkSource
|
||||
|
||||
def set_language_and_style(view, file):
|
||||
language = view.language_manager.guess_language(file.fname, None)
|
||||
file.ftype = "buffer" if not language else language
|
||||
file.buffer.set_language(language)
|
||||
file.buffer.set_style_scheme(view.syntax_theme)
|
||||
|
||||
|
||||
@@ -26,16 +26,13 @@ class CommandSystem:
|
||||
method = getattr(commands, command)
|
||||
|
||||
args, kwargs = self.data
|
||||
if kwargs:
|
||||
return method.execute(*args, kwargs)
|
||||
else:
|
||||
return method.execute(*args)
|
||||
return method.execute(*args, **kwargs)
|
||||
|
||||
def exec_with_args(self, command: str, args: list) -> any:
|
||||
def exec_with_args(self, command: str, *args, **kwargs) -> any:
|
||||
if not hasattr(commands, command): return
|
||||
|
||||
method = getattr(commands, command)
|
||||
return method.execute(*args)
|
||||
return method.execute(*args, **kwargs)
|
||||
|
||||
def add_command(self, command_name: str, command: callable):
|
||||
setattr(commands, command_name, command)
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Buffer Redo")
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Buffer Undo")
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ from ..command_helpers import update_info_bar_if_focused
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Close File")
|
||||
view.command.remove_file(view)
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Cut to Temp Buffer")
|
||||
|
||||
|
||||
@@ -15,7 +15,9 @@ from ..command_helpers import update_info_bar_if_focused
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
uri: str
|
||||
uri: str,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: DnD Load File To Buffer")
|
||||
file = view.command.new_file(view)
|
||||
@@ -23,8 +25,9 @@ def execute(
|
||||
gfile = Gio.File.new_for_uri(uri)
|
||||
view.command.exec_with_args(
|
||||
"load_file",
|
||||
(view, gfile, file)
|
||||
view, gfile, file
|
||||
)
|
||||
|
||||
view.set_buffer(file.buffer)
|
||||
|
||||
update_info_bar_if_focused(view.command, view)
|
||||
|
||||
@@ -14,7 +14,9 @@ from gi.repository import Gio
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
uris: list = []
|
||||
uris: list = [],
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: DnD Load Files")
|
||||
for uri in uris:
|
||||
@@ -23,4 +25,4 @@ def execute(
|
||||
except Exception as e:
|
||||
gfile = Gio.File.new_for_path(uri)
|
||||
|
||||
view.command.exec_with_args("load_file", (view, gfile))
|
||||
view.command.exec_with_args("load_file", view, gfile)
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Duplicate Line")
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Focus Left Sibling")
|
||||
if not view.sibling_left: return
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Focus Right Sibling")
|
||||
if not view.sibling_right: return
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Get Current File")
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Get File Type")
|
||||
file = view.command.get_file(view)
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Get Text")
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Go-To")
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Has Focus")
|
||||
ctx = view.get_parent().get_style_context()
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Line Down")
|
||||
view.emit("move-lines", True)
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Line Up")
|
||||
view.emit("move-lines", False)
|
||||
|
||||
@@ -18,6 +18,8 @@ def execute(
|
||||
view: GtkSource.View,
|
||||
gfile: Gio.File,
|
||||
file: SourceFile = None,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Load File")
|
||||
if not file:
|
||||
|
||||
@@ -14,6 +14,8 @@ from gi.repository import Gio
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Load Start File(s)")
|
||||
|
||||
@@ -28,7 +30,7 @@ def execute(
|
||||
|
||||
view.command.exec_with_args(
|
||||
"load_file",
|
||||
(view, gfile, file)
|
||||
view, gfile, file
|
||||
)
|
||||
|
||||
if not starting_files: return
|
||||
@@ -37,4 +39,4 @@ def execute(
|
||||
file = file.replace("FILE|", "")
|
||||
gfile = Gio.File.new_for_path(file)
|
||||
|
||||
view.command.exec_with_args("load_file", (view, gfile))
|
||||
view.command.exec_with_args("load_file", view, gfile)
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Move To Left Sibling")
|
||||
if not view.sibling_left: return
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Move To Right Sibling")
|
||||
if not view.sibling_right: return
|
||||
|
||||
@@ -14,7 +14,9 @@ from ..command_helpers import set_language_and_style, update_info_bar_if_focused
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: New File")
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ from ..command_helpers import update_info_bar_if_focused
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Open File(s)")
|
||||
gfiles = event_system.emit_and_await("open-files")
|
||||
@@ -22,9 +24,9 @@ def execute(
|
||||
file = view.command.get_file(view)
|
||||
if file.ftype == "buffer":
|
||||
gfile = gfiles.pop()
|
||||
view.command.exec_with_args("load_file", (view, gfile, file))
|
||||
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.command.exec_with_args("load_file", view, gfile)
|
||||
|
||||
@@ -13,7 +13,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Paste Temp Buffer")
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ from ..command_helpers import set_language_and_style
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Save File")
|
||||
file = view.command.get_file(view)
|
||||
|
||||
@@ -13,7 +13,9 @@ from ..command_helpers import set_language_and_style, update_info_bar_if_focused
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.info("Command: Save File As")
|
||||
file = view.command.get_file(view)
|
||||
|
||||
@@ -16,7 +16,9 @@ from ..command_helpers import update_info_bar_if_focused
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
file: SourceFile
|
||||
file: SourceFile,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Set Buffer")
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ from gi.repository import GtkSource
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
language: str
|
||||
language: str,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Set Buffer Language")
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ from gi.repository import GtkSource
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
style: str
|
||||
style: str,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Set Buffer Style")
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Set Focus Border")
|
||||
ctx = view.get_parent().get_style_context()
|
||||
|
||||
@@ -13,6 +13,8 @@ from gi.repository import GtkSource
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Set MiniView")
|
||||
event_system.emit("set-mini-view", (view,))
|
||||
|
||||
@@ -12,7 +12,9 @@ from gi.repository import GtkSource
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Show Completion")
|
||||
completer = view.get_completion()
|
||||
|
||||
@@ -13,6 +13,8 @@ from gi.repository import GtkSource
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Update Info Bar")
|
||||
file = view.command.get_file(view)
|
||||
|
||||
@@ -13,7 +13,9 @@ from gi.repository import Pango
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Zoom In")
|
||||
|
||||
|
||||
@@ -13,7 +13,9 @@ from gi.repository import Pango
|
||||
|
||||
|
||||
def execute(
|
||||
view: GtkSource.View = None
|
||||
view: GtkSource.View,
|
||||
*args,
|
||||
**kwargs
|
||||
):
|
||||
logger.debug("Command: Zoom Out")
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@ class TabsController(ControllerBase):
|
||||
self.update_tab_label(event)
|
||||
elif isinstance(event, Code_Event_Types.ModifiedChangedEvent):
|
||||
self.tabs_widget.modified_changed( event.buffer )
|
||||
elif isinstance(event, Code_Event_Types.FileExternallyDeletedEvent):
|
||||
self.tabs_widget.externally_deleted( event.buffer )
|
||||
elif isinstance(event, Code_Event_Types.AddedNewFileEvent):
|
||||
self.add_tab(event)
|
||||
elif isinstance(event, Code_Event_Types.PoppedFileEvent):
|
||||
|
||||
@@ -40,10 +40,14 @@ class SourceViewsController(ControllerBase, list):
|
||||
self.signal_mapper.insert_text(event.file, event.text)
|
||||
|
||||
def _register_command(self, event: Code_Event_Types.RegisterCommandEvent):
|
||||
if not isinstance(event.binding, list):
|
||||
event.binding = [ event.binding ]
|
||||
|
||||
for binding in event.binding:
|
||||
self.state_manager.key_mapper.map_command(
|
||||
event.command_name,
|
||||
{
|
||||
f"{event.binding_mode}": event.binding
|
||||
f"{event.binding_mode}": binding
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ class SourceViewsInsertState:
|
||||
event = Event_Factory.create_event("focused_view", view = source_view)
|
||||
emit(event)
|
||||
|
||||
def insert_text(self, file, text):
|
||||
def insert_text(self, file, text: str):
|
||||
|
||||
return True
|
||||
|
||||
def move_cursor(self, source_view, step, count, extend_selection, emit):
|
||||
@@ -51,21 +52,23 @@ class SourceViewsInsertState:
|
||||
def key_press_event(self, source_view, eve, key_mapper):
|
||||
command = key_mapper._key_press_event(eve)
|
||||
is_future = key_mapper._key_release_event(eve)
|
||||
char_str = key_mapper.get_char(eve)
|
||||
|
||||
if is_future: return True
|
||||
if not command: return False
|
||||
|
||||
source_view.command.exec(command)
|
||||
source_view.command.exec_with_args(command, source_view, char_str)
|
||||
|
||||
return True
|
||||
|
||||
def key_release_event(self, source_view, eve, key_mapper):
|
||||
command = key_mapper._key_release_event(eve)
|
||||
is_past = key_mapper._key_press_event(eve)
|
||||
char_str = key_mapper.get_char(eve)
|
||||
|
||||
if is_past: return True
|
||||
if not command: return False
|
||||
|
||||
source_view.command.exec(command)
|
||||
source_view.command.exec_with_args(command, source_view, char_str)
|
||||
|
||||
return True
|
||||
|
||||
@@ -96,19 +96,28 @@ class KeyMapper:
|
||||
getattr(self.states[state], press_state)[keyname] = command
|
||||
|
||||
def _key_press_event(self, eve):
|
||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||||
keyname = self.get_keyname(eve)
|
||||
char_str = self.get_char(eve)
|
||||
|
||||
self._set_key_state(eve)
|
||||
if keyname in self.states[self.state].held:
|
||||
return self.states[self.state].held[keyname]
|
||||
|
||||
if char_str in self.states[self.state].held:
|
||||
return self.states[self.state].held[char_str]
|
||||
|
||||
|
||||
def _key_release_event(self, eve):
|
||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||||
keyname = self.get_keyname(eve)
|
||||
char_str = self.get_char(eve)
|
||||
|
||||
self._set_key_state(eve)
|
||||
if keyname in self.states[self.state].released:
|
||||
return self.states[self.state].released[keyname]
|
||||
|
||||
if char_str in self.states[self.state].released:
|
||||
return self.states[self.state].released[char_str]
|
||||
|
||||
def _set_key_state(self, eve):
|
||||
modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
||||
is_control = modifiers & Gdk.ModifierType.CONTROL_MASK
|
||||
@@ -137,3 +146,9 @@ class KeyMapper:
|
||||
|
||||
def get_raw_keyname(self, eve):
|
||||
return Gdk.keyval_name(eve.keyval)
|
||||
|
||||
def get_keyname(self, eve):
|
||||
return Gdk.keyval_name(eve.keyval).lower()
|
||||
|
||||
def get_char(self, eve):
|
||||
return chr( Gdk.keyval_to_unicode(eve.keyval) )
|
||||
|
||||
@@ -26,14 +26,14 @@ class SourceViewDnDMixin:
|
||||
if info == 80:
|
||||
uris = data.get_uris()
|
||||
|
||||
if not uris: return
|
||||
if not uris:
|
||||
uris = data.get_text().split("\n")
|
||||
|
||||
self._on_uri_data_received(uris)
|
||||
|
||||
def _on_uri_data_received(self, uris: []):
|
||||
uri = uris.pop(0)
|
||||
self.command.exec_with_args("dnd_load_file_to_buffer", (self, uri))
|
||||
self.command.exec_with_args("dnd_load_file_to_buffer", self, uri)
|
||||
|
||||
if not uris: return
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ class SourceFile(GtkSource.File):
|
||||
self.fname: str = "buffer"
|
||||
self.fpath: str = "buffer"
|
||||
self.ftype: str = "buffer"
|
||||
self.was_deleted: bool = False
|
||||
self.buffer: SourceBuffer = SourceBuffer()
|
||||
|
||||
self._set_signals()
|
||||
@@ -56,17 +57,22 @@ class SourceFile(GtkSource.File):
|
||||
self.emit(event)
|
||||
|
||||
if self.is_deleted():
|
||||
print("is_deleted")
|
||||
# event = Event_Factory.create_event("file_deleted", buffer = buffer)
|
||||
# event.file = self
|
||||
# self.emit(event)
|
||||
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():
|
||||
print("is_externally_modified")
|
||||
# event = Event_Factory.create_event("file_externally_modified", buffer = buffer)
|
||||
# event.file = self
|
||||
# self.emit(event)
|
||||
# event = Event_Factory.create_event(
|
||||
# "file_externally_modified",
|
||||
# file = self,
|
||||
# buffer = buffer
|
||||
# )
|
||||
# self.emit(event)
|
||||
return
|
||||
|
||||
def _insert_text(
|
||||
@@ -128,6 +134,11 @@ class SourceFile(GtkSource.File):
|
||||
|
||||
f.write(text)
|
||||
|
||||
if self.was_deleted:
|
||||
self.was_deleted = False
|
||||
self.set_location( None )
|
||||
self.set_location( gfile )
|
||||
|
||||
return gfile
|
||||
|
||||
|
||||
@@ -135,11 +146,27 @@ class SourceFile(GtkSource.File):
|
||||
if not gfile: return
|
||||
|
||||
self.set_path(gfile)
|
||||
data = gfile.load_bytes()[0].get_data().decode("UTF-8")
|
||||
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)
|
||||
logger.debug(f"File content type: {self.ftype}")
|
||||
|
||||
undo_manager = self.buffer.get_undo_manager()
|
||||
|
||||
def move_insert_to_start():
|
||||
start_itr = self.buffer.get_start_iter()
|
||||
self.buffer.place_cursor(start_itr)
|
||||
|
||||
undo_manager.begin_not_undoable_action()
|
||||
self.buffer.insert_at_cursor(data)
|
||||
|
||||
with self.buffer.freeze_notify():
|
||||
start_itr, end_itr = self.buffer.get_bounds()
|
||||
|
||||
self.buffer.delete(start_itr, end_itr)
|
||||
self.buffer.insert(start_itr, text, -1)
|
||||
GLib.idle_add(move_insert_to_start)
|
||||
|
||||
undo_manager.end_not_undoable_action()
|
||||
self.buffer.set_modified(False)
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@ class TabWidget(Gtk.Box):
|
||||
|
||||
self.set_orientation(0)
|
||||
self.set_hexpand(False)
|
||||
self.set_vexpand(False)
|
||||
self.set_size_request(-1, 12)
|
||||
|
||||
def _setup_signals(self):
|
||||
...
|
||||
|
||||
@@ -122,11 +122,19 @@ class TabsWidget(Gtk.Notebook):
|
||||
if not buffer == tab.file.buffer: continue
|
||||
|
||||
ctx = tab.label.get_style_context()
|
||||
ctx.remove_class("file-deleted")
|
||||
if buffer.get_modified():
|
||||
ctx.add_class("file-changed")
|
||||
else:
|
||||
ctx.remove_class("file-changed")
|
||||
|
||||
def externally_deleted(self, buffer):
|
||||
for page_widget in self.get_children():
|
||||
tab = self.get_tab_label(page_widget)
|
||||
if not buffer == tab.file.buffer: continue
|
||||
ctx = tab.label.get_style_context()
|
||||
ctx.add_class("file-deleted")
|
||||
|
||||
def close_item(self, menu_item, page_widget):
|
||||
tab = self.get_tab_label(page_widget)
|
||||
tab.close_bttn.clicked()
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# Python imports
|
||||
from pathlib import Path
|
||||
import json
|
||||
|
||||
# Lib imports
|
||||
@@ -6,10 +7,12 @@ import gi
|
||||
gi.require_version('Gdk', '3.0')
|
||||
gi.require_version('WebKit2', '4.0')
|
||||
from gi.repository import Gdk
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gio
|
||||
from gi.repository import WebKit2
|
||||
|
||||
# Application imports
|
||||
from libs.settings.other.webkit_ui_settings import WebkitUISettings
|
||||
from libs.settings.webkit.webkit_ui_settings import WebkitUISettings
|
||||
from libs.dto.base_event import BaseEvent
|
||||
|
||||
|
||||
@@ -17,7 +20,9 @@ class WebkitUI(WebKit2.WebView):
|
||||
def __init__(self):
|
||||
super(WebkitUI, self).__init__()
|
||||
|
||||
self._load_settings()
|
||||
self._setup_styling()
|
||||
self._setup_signals()
|
||||
self._subscribe_to_events()
|
||||
self._setup_content_manager()
|
||||
|
||||
@@ -29,6 +34,9 @@ class WebkitUI(WebKit2.WebView):
|
||||
self.set_hexpand(True)
|
||||
self.set_background_color( Gdk.RGBA(0, 0, 0, 0.0) )
|
||||
|
||||
def _setup_signals(self):
|
||||
self.connect("context-menu", self._on_context_menu)
|
||||
|
||||
def _subscribe_to_events(self):
|
||||
event_system.subscribe(f"ui-message", self.ui_message)
|
||||
|
||||
@@ -50,6 +58,18 @@ class WebkitUI(WebKit2.WebView):
|
||||
except Exception as e:
|
||||
logger.info(e)
|
||||
|
||||
def _on_context_menu(self, web_view, context_menu, event, hit_test_result):
|
||||
action = Gio.SimpleAction.new("Developer Tools", None)
|
||||
item = WebKit2.ContextMenuItem.new_from_gaction(action, "Developer Tools")
|
||||
|
||||
def show_developer_tools(action, parameter):
|
||||
inspector = self.get_inspector()
|
||||
inspector.show()
|
||||
|
||||
action.connect("activate", show_developer_tools)
|
||||
|
||||
context_menu.append(item)
|
||||
|
||||
def load_url(self, url: str = ""):
|
||||
if not url:
|
||||
url = "https://duckduckgo.com/"
|
||||
@@ -60,11 +80,21 @@ class WebkitUI(WebKit2.WebView):
|
||||
if not path:
|
||||
path = settings_manager.path_manager.get_context_path()
|
||||
|
||||
data = None
|
||||
with open(f"{path}/index.html", "r") as f:
|
||||
data = f.read()
|
||||
base_path = Path(path)
|
||||
index_file = base_path / "index.html"
|
||||
|
||||
self.load_html(content = data, base_uri = f"file://{path}")
|
||||
if not index_file.exists():
|
||||
raise FileNotFoundError(f"index.html not found in {base_path}")
|
||||
|
||||
try:
|
||||
data = index_file.read_text(encoding = "utf-8")
|
||||
except Exception as e:
|
||||
raise RuntimeError(f"Failed to read {index_file}: {e}")
|
||||
|
||||
self.load_html(
|
||||
content = data,
|
||||
base_uri = index_file.as_uri()
|
||||
)
|
||||
|
||||
def ui_message(self, message, mtype):
|
||||
command = f"displayMessage('{message}', '{mtype}', '3')"
|
||||
|
||||
@@ -33,7 +33,9 @@ class ControllerManager(Singleton, dict):
|
||||
raise ControllerManagerException("Must pass in a 'name' and 'controller'...")
|
||||
|
||||
if name in self.keys():
|
||||
raise ControllerManagerException(f"Can't bind controller to registered name of '{name}'...")
|
||||
raise ControllerManagerException(
|
||||
f"Can't bind controller to existing registered name of '{name}'..."
|
||||
)
|
||||
|
||||
controller.set_controller_context( self._crete_controller_context() )
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
from .code_event import CodeEvent
|
||||
from .register_provider_event import RegisterProviderEvent
|
||||
from .register_command_event import RegisterCommandEvent
|
||||
from .file_externally_modified_event import FileExternallyModifiedEvent
|
||||
from .file_externally_deleted_event import FileExternallyDeletedEvent
|
||||
|
||||
from .get_new_command_system_event import GetNewCommandSystemEvent
|
||||
from .request_completion_event import RequestCompletionEvent
|
||||
|
||||
13
src/libs/dto/code/file_externally_deleted_event.py
Normal file
13
src/libs/dto/code/file_externally_deleted_event.py
Normal file
@@ -0,0 +1,13 @@
|
||||
# Python imports
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
from .code_event import CodeEvent
|
||||
|
||||
|
||||
|
||||
@dataclass
|
||||
class FileExternallyDeletedEvent(CodeEvent):
|
||||
...
|
||||
13
src/libs/dto/code/file_externally_modified_event.py
Normal file
13
src/libs/dto/code/file_externally_modified_event.py
Normal file
@@ -0,0 +1,13 @@
|
||||
# Python imports
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
from .code_event import CodeEvent
|
||||
|
||||
|
||||
|
||||
@dataclass
|
||||
class FileExternallyModifiedEvent(CodeEvent):
|
||||
...
|
||||
@@ -17,4 +17,4 @@ class RegisterCommandEvent(BaseEvent):
|
||||
command_name: str = ""
|
||||
command: callable = None
|
||||
binding_mode: str = ""
|
||||
binding: str = ""
|
||||
binding: str or list = ""
|
||||
|
||||
@@ -95,7 +95,7 @@ class WebkitUISettings(WebKit2.Settings):
|
||||
self.set_property('javascript-can-open-windows-automatically', False)
|
||||
|
||||
# Debugging
|
||||
self.set_property('enable-developer-extras', False)
|
||||
self.set_property('enable-developer-extras', True)
|
||||
self.set_property('enable-write-console-messages-to-stdout', False)
|
||||
self.set_property('draw-compositing-indicators', False)
|
||||
self.set_property('enable-mock-capture-devices', False)
|
||||
@@ -3,6 +3,7 @@ import os
|
||||
import sys
|
||||
import importlib
|
||||
import traceback
|
||||
import asyncio
|
||||
from os.path import join
|
||||
from os.path import isdir
|
||||
|
||||
@@ -75,9 +76,14 @@ class PluginsController(ControllerBase, PluginsControllerMixin, PluginReloadMixi
|
||||
module = self._load_plugin_module(path, folder, target)
|
||||
|
||||
if is_pre_launch:
|
||||
asyncio.run(
|
||||
self.execute_plugin(module, manifest_meta)
|
||||
)
|
||||
else:
|
||||
GLib.idle_add(self.execute_plugin, module, manifest_meta)
|
||||
GLib.idle_add(
|
||||
asyncio.run,
|
||||
self.execute_plugin(module, manifest_meta)
|
||||
)
|
||||
except Exception as e:
|
||||
logger.info(f"Malformed Plugin: Not loading -->: '{folder}' !")
|
||||
logger.debug(f"Trace: {traceback.print_exc()}")
|
||||
@@ -119,7 +125,7 @@ class PluginsController(ControllerBase, PluginsControllerMixin, PluginReloadMixi
|
||||
manifest_metas: list = self._manifest_manager.get_post_launch_plugins()
|
||||
self._load_plugins(manifest_metas)
|
||||
|
||||
def execute_plugin(self, module: type, manifest_meta: ManifestMeta):
|
||||
async def execute_plugin(self, module: type, manifest_meta: ManifestMeta):
|
||||
plugin = module.Plugin()
|
||||
plugin.plugin_context: PluginContext = self.create_plugin_context()
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Gtk + HTML + Python App</title>
|
||||
<!-- <base href="/"> -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="stylesheet" href="resources/css/libs/bootstrap5/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="resources/css/libs/bootstrap-icons/bootstrap-icons.css">
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Reference in New Issue
Block a user