Added temp cut/paste buffer commands; added zoom in/out commands; fixed tab closures leaking memory
This commit is contained in:
36
src/core/widgets/code/commands/cut_to_temp_buffer.py
Normal file
36
src/core/widgets/code/commands/cut_to_temp_buffer.py
Normal 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()
|
||||||
28
src/core/widgets/code/commands/paste_temp_buffer.py
Normal file
28
src/core/widgets/code/commands/paste_temp_buffer.py
Normal 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()
|
||||||
23
src/core/widgets/code/commands/zoom_in.py
Normal file
23
src/core/widgets/code/commands/zoom_in.py
Normal 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}")
|
||||||
23
src/core/widgets/code/commands/zoom_out.py
Normal file
23
src/core/widgets/code/commands/zoom_out.py
Normal 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}")
|
||||||
@@ -13,8 +13,7 @@ class TabWidget(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TabWidget, self).__init__()
|
super(TabWidget, self).__init__()
|
||||||
|
|
||||||
self._handler_ids: list = []
|
self.file = None
|
||||||
self.file = None
|
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
@@ -51,14 +50,12 @@ class TabWidget(Gtk.Box):
|
|||||||
self.add(self.close_btn)
|
self.add(self.close_btn)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
for handle_id in self._handler_ids:
|
|
||||||
self.disconnect(handle_id)
|
|
||||||
del self.file
|
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):
|
def set_select_signal(self, callback):
|
||||||
_id = self._label_eve_box.connect('button-release-event', callback, self.file)
|
self._label_eve_box_id = self._label_eve_box.connect('button-release-event', callback, self.file)
|
||||||
self._handler_ids.append(_id)
|
|
||||||
|
|
||||||
def set_close_signal(self, callback):
|
def set_close_signal(self, callback):
|
||||||
_id = self.close_btn.connect('button-release-event', callback, self.file)
|
self.close_btn_id = self.close_btn.connect('button-release-event', callback, self.file)
|
||||||
self._handler_ids.append(_id)
|
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(SourceView, self).__init__()
|
super(SourceView, self).__init__()
|
||||||
|
|
||||||
self.observers = []
|
self.observers = []
|
||||||
|
self._cut_temp_timeout_id = None
|
||||||
|
self._cut_buffer = ""
|
||||||
|
|
||||||
self.sibling_right = None
|
self.sibling_right = None
|
||||||
self.sibling_left = None
|
self.sibling_left = None
|
||||||
@@ -38,8 +40,11 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styles(self):
|
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("source-view")
|
||||||
|
ctx.add_class(f"px{self.zoom_level}")
|
||||||
|
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
self.set_bottom_margin(800)
|
self.set_bottom_margin(800)
|
||||||
@@ -111,3 +116,15 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
|
|||||||
def set_files_manager(self, files_manager: SourceFilesManager):
|
def set_files_manager(self, files_manager: SourceFilesManager):
|
||||||
self.files_manager = files_manager
|
self.files_manager = files_manager
|
||||||
self.files_manager.add_observer(self)
|
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)
|
||||||
|
|||||||
@@ -9,6 +9,18 @@
|
|||||||
"line_down": {
|
"line_down": {
|
||||||
"held": "<Control>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": {
|
"new_file": {
|
||||||
"released": "<Control>t"
|
"released": "<Control>t"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user