diff --git a/Ccs/editor.py b/Ccs/editor.py index 64a3773905d974afc7bb2facf311e4e6546399eb..01944da4c5d9d03b1bf96c8d21e748915eda5c29 100644 --- a/Ccs/editor.py +++ b/Ccs/editor.py @@ -163,6 +163,7 @@ class CcsEditor(Gtk.Window): self.add(self.paned) self.grid = Gtk.Grid() + self.grid.connect('key-release-event', self._kill_search) self.paned.add1(self.grid) menubar = self.create_menus() @@ -171,6 +172,9 @@ class CcsEditor(Gtk.Window): toolbar = self.create_toolbar() self.grid.attach(toolbar, 0, 1, 2, 1) + self.search_context = None + self.editor_notebook = Gtk.Notebook(scrollable=True) + self.editor_notebook.connect('switch-page', self._set_search_context) self.searchbar = self.create_searchbar() self.grid.attach(self.searchbar, 0, 2, 3, 1) @@ -180,7 +184,6 @@ class CcsEditor(Gtk.Window): self.sourcemarks = {} self.create_mark_attributes() - self.editor_notebook = Gtk.Notebook(scrollable=True) self.grid.attach(self.editor_notebook, 0, 3, 3, 1) if self.cfg.has_option('ccs-editor', 'color_scheme'): @@ -637,7 +640,7 @@ class CcsEditor(Gtk.Window): action.connect("activate", self.on_search_clicked) action_group.add_action_with_accel(action, "<control>F") - action = Gtk.Action(name="EditComment", label="Comment Line(s)", tooltip=None) + action = Gtk.Action(name="EditComment", label="Comment Lines", tooltip=None) action.connect("activate", self._on_comment_lines) action_group.add_action_with_accel(action, "<control>B") @@ -825,6 +828,10 @@ class CcsEditor(Gtk.Window): def _get_active_view(self): nbpage = self.editor_notebook.get_current_page() scrolled_window = self.editor_notebook.get_nth_page(nbpage) + + if scrolled_window is None: + return + view = scrolled_window.get_child() return view @@ -1274,25 +1281,81 @@ class CcsEditor(Gtk.Window): searchbar = Gtk.SearchBar.new() searchbar.set_search_mode(False) searchbar.set_show_close_button(True) - searchentry = Gtk.SearchEntry(width_chars=30) + self.searchentry = Gtk.SearchEntry(width_chars=40) + + # self.searchentry.connect('search-changed', self.search_and_mark) + self.searchentry.connect('search-changed', self._on_search_changed) + self.searchentry.connect('activate', self._on_search_next2) + # self.searchentry.connect('next-match', self._on_search_next) + self.searchentry.connect('next-match', self._on_search_next2) + # self.searchentry.connect('previous-match', self._on_search_previous) + self.searchentry.connect('previous-match', self._on_search_prev2) - searchentry.connect('search-changed', self.search_and_mark) - searchentry.connect('next-match', self._on_search_next, searchentry) - searchentry.connect('previous-match', self._on_search_previous, searchentry) + self._init_search_settings() next = Gtk.Button.new_from_icon_name('go-down-symbolic', Gtk.IconSize.BUTTON) - next.connect('clicked', self._on_search_next, searchentry) + next.connect('clicked', self._on_search_next2) prev = Gtk.Button.new_from_icon_name('go-up-symbolic', Gtk.IconSize.BUTTON) - prev.connect('clicked', self._on_search_previous, searchentry) + prev.connect('clicked', self._on_search_prev2) + + csens = Gtk.CheckButton.new_with_label('match case') + csens.connect('toggled', self._set_case_sensitive) hbox = Gtk.HBox() searchbar.add(hbox) - hbox.pack_start(searchentry, 0, 0, 0) + hbox.pack_start(self.searchentry, 1, 1, 4) hbox.pack_start(prev, 0, 0, 0) hbox.pack_start(next, 0, 0, 0) + hbox.pack_start(csens, 0, 0, 6) return searchbar + def _set_case_sensitive(self, widget): + self.search_settings.set_case_sensitive(widget.get_active()) + + def _on_search_changed(self, widget): + self.findtext(start_offset=0) + + def _on_search_next2(self, widget): + self.findtext() + + def _on_search_prev2(self, *args): + self.findtext(start_offset=0, back=True) + + def _init_search_settings(self): + self.search_settings = GtkSource.SearchSettings() + self.search_settings.set_case_sensitive(False) + self.search_settings.set_wrap_around(True) + self.searchentry.bind_property('text', self.search_settings, 'search-text') + + def _set_search_context(self, notebook, nbchild, nbpage, *args): + self.current_view = nbchild.get_child() + self.current_buffer = self.current_view.get_buffer() + self.search_context = GtkSource.SearchContext.new(self.current_buffer, self.search_settings) + + def findtext(self, start_offset=1, back=False): + buf = self.current_buffer + insert = buf.get_iter_at_mark(buf.get_insert()) + insert.forward_chars(start_offset) + + if not back: + match, start_iter, end_iter, wrapped = self.search_context.forward2(insert) + else: + match, start_iter, end_iter, wrapped = self.search_context.backward2(insert) + + if match: + buf.place_cursor(start_iter) + buf.move_mark(buf.get_selection_bound(), end_iter) + self.current_view.scroll_to_mark(buf.get_insert(), 0.25, True, 0.5, 0.5) + return True + else: + buf.place_cursor(buf.get_iter_at_mark(buf.get_insert())) + + def _kill_search(self, widget, evt, *args): + if evt.keyval == Gdk.KEY_Escape: + self.searchentry.delete_text(0, -1) + self.searchbar.set_search_mode(False) + def create_textview(self, filename=None): scrolledwindow = Gtk.ScrolledWindow() scrolledwindow.set_hexpand(True) @@ -1457,8 +1520,6 @@ class CcsEditor(Gtk.Window): """ dump line into console """ line = textbuffer.get_text(begin, end, True) - # self.ipython_view.text_buffer.insert_at_cursor(line, len(line)) - # self.ipython_view._processLine() self._to_console(line) return iter @@ -1486,9 +1547,6 @@ class CcsEditor(Gtk.Window): """ dump line into console """ line = textbuffer.get_text(start, stop, True) - # line += '\n' - - # self._to_console_via_socket(line) self._to_console(line) self._set_play_mark(view, stop) @@ -1509,12 +1567,6 @@ class CcsEditor(Gtk.Window): """ dump line into console """ line = textbuffer.get_text(start, end, True) - # line += '\n' - - # self.ipython_view.text_buffer.insert_at_cursor(line, len(line)) - # self.ipython_view._processLine() - # self._to_console(line, editor_read=True) - # self._to_console_via_socket(line) self._to_console(line) self._set_play_mark(view, end) @@ -1583,47 +1635,44 @@ class CcsEditor(Gtk.Window): if self.searchbar.get_search_mode(): self.searchbar.get_child().get_child().get_children()[1].get_children()[0].get_children()[0].grab_focus() - def search_and_mark(self, searchentry, start=None, direction='next'): - searchtext = searchentry.get_text() - view = self._get_active_view() - textbuffer = view.get_buffer() - if start is None: - start, end = textbuffer.get_bounds() - else: - start = textbuffer.get_iter_at_mark(start) - end = textbuffer.get_end_iter() - # tag_found = textbuffer.create_tag(background='limegreen')#, foreground='black') - - if direction == 'next': - found = start.forward_search(searchtext, 0) - else: - found = start.backward_search(searchtext, 0) - - if found: - start, end = found - textbuffer.select_range(start, end) - if direction == 'next': - last_search_pos = textbuffer.create_mark('last_search_pos', end, False) - else: - last_search_pos = textbuffer.create_mark('last_search_pos', start, False) - # textbuffer.apply_tag(tag_found, match_start, match_end) - # view.scroll_to_iter(match_start,0.,False,0,0) - view.scroll_mark_onscreen(last_search_pos) - return - - def _on_search_next(self, widget, searchentry, last_search_pos=None): - view = self._get_active_view() - textbuffer = view.get_buffer() - last_search_pos = textbuffer.get_mark('last_search_pos') - self.search_and_mark(searchentry=searchentry, start=last_search_pos, direction='next') - return - - def _on_search_previous(self, widget, searchentry, last_search_pos=None): - view = self._get_active_view() - textbuffer = view.get_buffer() - last_search_pos = textbuffer.get_mark('last_search_pos') - self.search_and_mark(searchentry=searchentry, start=last_search_pos, direction='prev') - return + # def search_and_mark(self, widget=None, start=None, direction='next'): + # searchtext = self.searchentry.get_text() + # view = self._get_active_view() + # textbuffer = view.get_buffer() + # if start is None: + # start, end = textbuffer.get_bounds() + # else: + # start = textbuffer.get_iter_at_mark(start) + # end = textbuffer.get_end_iter() + # # tag_found = textbuffer.create_tag(background='limegreen')#, foreground='black') + # + # if direction == 'next': + # found = start.forward_search(searchtext, 0) + # else: + # found = start.backward_search(searchtext, 0) + # + # if found: + # start, end = found + # textbuffer.select_range(start, end) + # if direction == 'next': + # last_search_pos = textbuffer.create_mark('last_search_pos', end, False) + # else: + # last_search_pos = textbuffer.create_mark('last_search_pos', start, False) + # # textbuffer.apply_tag(tag_found, match_start, match_end) + # # view.scroll_to_iter(match_start,0.,False,0,0) + # view.scroll_mark_onscreen(last_search_pos) + + # def _on_search_next(self, widget, *args): + # view = self._get_active_view() + # textbuffer = view.get_buffer() + # last_search_pos = textbuffer.get_mark('last_search_pos') + # self.search_and_mark(start=last_search_pos, direction='next') + + # def _on_search_previous(self, widget, *args): + # view = self._get_active_view() + # textbuffer = view.get_buffer() + # last_search_pos = textbuffer.get_mark('last_search_pos') + # self.search_and_mark(start=last_search_pos, direction='prev') def on_button_action(self, widget): action_name = widget.get_name()