forked from Mirrors/apostrophe
Add search and replace to the undo stack as a single action
This is specially important for search and replace *all*.github/fork/yochananmarqos/patch-1
parent
aa3f5c3430
commit
0b6e84bf8c
|
@ -20,6 +20,7 @@
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
import pypandoc
|
import pypandoc
|
||||||
|
@ -52,6 +53,13 @@ def get_builder(builder_file_name):
|
||||||
return builder
|
return builder
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def user_action(text_buffer):
|
||||||
|
text_buffer.begin_user_action()
|
||||||
|
yield text_buffer
|
||||||
|
text_buffer.end_user_action()
|
||||||
|
|
||||||
|
|
||||||
def path_to_file(path):
|
def path_to_file(path):
|
||||||
"""Return a file path (file:///) for the given path"""
|
"""Return a file path (file:///) for the given path"""
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ import re
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
|
|
||||||
|
from uberwriter.helpers import user_action
|
||||||
|
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
from gi.repository import Gdk
|
from gi.repository import Gdk
|
||||||
|
|
||||||
|
@ -162,18 +164,20 @@ class SearchAndReplace:
|
||||||
self.replace(self.active)
|
self.replace(self.active)
|
||||||
|
|
||||||
def replace_all(self, _widget=None, _data=None):
|
def replace_all(self, _widget=None, _data=None):
|
||||||
for match in reversed(self.matches):
|
with user_action(self.textbuffer):
|
||||||
self.do_replace(match)
|
for match in reversed(self.matches):
|
||||||
|
self.__do_replace(match)
|
||||||
self.search(scroll=False)
|
self.search(scroll=False)
|
||||||
|
|
||||||
def replace(self, searchindex, _inloop=False):
|
def replace(self, searchindex, _inloop=False):
|
||||||
self.do_replace(self.matches[searchindex])
|
with user_action(self.textbuffer):
|
||||||
|
self.__do_replace(self.matches[searchindex])
|
||||||
active = self.active
|
active = self.active
|
||||||
self.search(scroll=False)
|
self.search(scroll=False)
|
||||||
self.active = active
|
self.active = active
|
||||||
self.scrollto(self.active)
|
self.scrollto(self.active)
|
||||||
|
|
||||||
def do_replace(self, match):
|
def __do_replace(self, match):
|
||||||
start_iter = self.textbuffer.get_iter_at_offset(match[0])
|
start_iter = self.textbuffer.get_iter_at_offset(match[0])
|
||||||
end_iter = self.textbuffer.get_iter_at_offset(match[1])
|
end_iter = self.textbuffer.get_iter_at_offset(match[1])
|
||||||
self.textbuffer.delete(start_iter, end_iter)
|
self.textbuffer.delete(start_iter, end_iter)
|
||||||
|
|
Loading…
Reference in New Issue