Added temp cut/paste buffer commands; added zoom in/out commands; fixed tab closures leaking memory

This commit is contained in:
2025-12-29 00:46:10 -06:00
parent 3fc39042f1
commit 5ee587e205
7 changed files with 146 additions and 10 deletions

View File

@@ -0,0 +1,36 @@
# Python imports
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository import GtkSource
# Application imports
def execute(
view: GtkSource.View = None
):
logger.debug("Cut to Temp Buffer Command")
view.clear_temp_cut_buffer_delayed()
buffer = view.get_buffer()
itr = buffer.get_iter_at_mark( buffer.get_insert() )
start_itr = itr.copy()
end_itr = itr.copy()
start_line = itr.get_line() + 1
start_char = itr.get_line_offset()
start_itr.backward_visible_line()
start_itr.forward_line()
end_itr.forward_line()
line_str = buffer.get_slice(start_itr, end_itr, True)
view._cut_buffer += f"{line_str}"
buffer.delete(start_itr, end_itr)
view.set_temp_cut_buffer_delayed()

View File

@@ -0,0 +1,28 @@
# Python imports
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository import GLib
from gi.repository import GtkSource
# Application imports
def execute(
view: GtkSource.View = None
):
logger.debug("Paste Temp Buffer Command")
view.clear_temp_cut_buffer_delayed()
buffer = view.get_buffer()
itr = buffer.get_iter_at_mark( buffer.get_insert() )
insert_itr = itr.copy()
buffer.insert(insert_itr, view._cut_buffer, -1)
view.set_temp_cut_buffer_delayed()

View File

@@ -0,0 +1,23 @@
# Python imports
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository import GtkSource
# Application imports
def execute(
view: GtkSource.View = None
):
logger.debug("Zoom In Command")
ctx = view.get_style_context()
if view.zoom_level < 99:
ctx.remove_class(f"px{view.zoom_level}")
view.zoom_level += 1
ctx.add_class(f"px{view.zoom_level}")

View File

@@ -0,0 +1,23 @@
# Python imports
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository import GtkSource
# Application imports
def execute(
view: GtkSource.View = None
):
logger.debug("Zoom Out Command")
ctx = view.get_style_context()
if view.zoom_level > 1:
ctx.remove_class(f"px{view.zoom_level}")
view.zoom_level -= 1
ctx.add_class(f"px{view.zoom_level}")

View File

@@ -13,8 +13,7 @@ class TabWidget(Gtk.Box):
def __init__(self):
super(TabWidget, self).__init__()
self._handler_ids: list = []
self.file = None
self.file = None
self._setup_styling()
self._setup_signals()
@@ -51,14 +50,12 @@ class TabWidget(Gtk.Box):
self.add(self.close_btn)
def __del__(self):
for handle_id in self._handler_ids:
self.disconnect(handle_id)
del self.file
self._label_eve_box.disconnect(self._label_eve_box_id)
self.close_btn.disconnect(self.close_btn_id)
def set_select_signal(self, callback):
_id = self._label_eve_box.connect('button-release-event', callback, self.file)
self._handler_ids.append(_id)
self._label_eve_box_id = self._label_eve_box.connect('button-release-event', callback, self.file)
def set_close_signal(self, callback):
_id = self.close_btn.connect('button-release-event', callback, self.file)
self._handler_ids.append(_id)
self.close_btn_id = self.close_btn.connect('button-release-event', callback, self.file)

View File

@@ -26,7 +26,9 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
def __init__(self):
super(SourceView, self).__init__()
self.observers = []
self.observers = []
self._cut_temp_timeout_id = None
self._cut_buffer = ""
self.sibling_right = None
self.sibling_left = None
@@ -38,8 +40,11 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
def _setup_styles(self):
ctx = self.get_style_context()
self.zoom_level = settings_manager.settings.theming.default_zoom
ctx = self.get_style_context()
ctx.add_class("source-view")
ctx.add_class(f"px{self.zoom_level}")
self.set_vexpand(True)
self.set_bottom_margin(800)
@@ -111,3 +116,15 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
def set_files_manager(self, files_manager: SourceFilesManager):
self.files_manager = files_manager
self.files_manager.add_observer(self)
def clear_temp_cut_buffer_delayed(self):
if self._cut_temp_timeout_id:
GLib.source_remove(self._cut_temp_timeout_id)
def set_temp_cut_buffer_delayed(self):
def clear_temp_buffer():
self._cut_buffer = ""
self._cut_temp_timeout_id = None
return False
self._cut_temp_timeout_id = GLib.timeout_add(15000, clear_temp_buffer)

View File

@@ -9,6 +9,18 @@
"line_down": {
"held": "<Control>Down"
},
"zoom_in": {
"held": "<Control>equal"
},
"zoom_out": {
"held": "<Control>minus"
},
"cut_to_temp_buffer": {
"held": "<Control>k"
},
"paste_temp_buffer": {
"held": "<Control>u"
},
"new_file": {
"released": "<Control>t"
},