Skip to content

Commit

Permalink
Add search mode
Browse files Browse the repository at this point in the history
  • Loading branch information
BojanStipic committed Sep 15, 2019
1 parent f9e1b33 commit 4e37520
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 15 deletions.
77 changes: 63 additions & 14 deletions src/MainWindow.glade
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
<mime-type>text/*</mime-type>
</mime-types>
</object>
<object class="GtkImage" id="find_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">edit-find-symbolic</property>
</object>
<object class="GtkWindow" id="main_window">
<property name="can_focus">False</property>
<property name="default_width">800</property>
Expand All @@ -29,6 +34,18 @@
<property name="title" translatable="yes">Open an Executable to Debug</property>
</object>
</child>
<child>
<object class="GtkToggleButton" id="search_toggle">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">find_image</property>
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
Expand Down Expand Up @@ -139,25 +156,57 @@
<property name="orientation">vertical</property>
<property name="wide_handle">True</property>
<child>
<object class="GtkScrolledWindow" id="source_view_scroll">
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<property name="can_focus">False</property>
<child>
<object class="GtkSourceView" id="source_view">
<property name="buffer">source_buffer</property>
<object class="GtkSearchBar" id="search_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkSearchEntry" id="search_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="primary_icon_name">edit-find-symbolic</property>
<property name="primary_icon_activatable">False</property>
<property name="primary_icon_sensitive">False</property>
<property name="placeholder_text" translatable="yes">Search</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="source_view_scroll">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="left_margin">2</property>
<property name="right_margin">2</property>
<property name="monospace">True</property>
<property name="show_line_numbers">True</property>
<property name="show_line_marks">True</property>
<property name="tab_width">4</property>
<property name="auto_indent">True</property>
<property name="smart_home_end">before</property>
<property name="smart_backspace">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkSourceView" id="source_view">
<property name="buffer">source_buffer</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="left_margin">2</property>
<property name="right_margin">2</property>
<property name="monospace">True</property>
<property name="show_line_numbers">True</property>
<property name="show_line_marks">True</property>
<property name="tab_width">4</property>
<property name="auto_indent">True</property>
<property name="smart_home_end">before</property>
<property name="smart_backspace">True</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
</object>
<packing>
Expand Down
65 changes: 64 additions & 1 deletion src/gui.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
use std::fs;
use gtk::prelude::*;
use gtk::{Application, Builder, Window, FileChooserButton};
use gtk::{
Application,
Builder,
Window,
FileChooserButton,
ToggleButton,
SearchBar,
SearchEntry,
};
use gdk::RGBA;
use sourceview::prelude::*;
use sourceview::{
Expand All @@ -9,6 +17,8 @@ use sourceview::{
LanguageManager,
StyleSchemeManager,
Buffer,
SearchContext,
SearchSettings,
};

pub struct MainWindow {
Expand Down Expand Up @@ -89,5 +99,58 @@ impl MainWindow {
source_buffer.remove_source_marks(&iter, &iter, Some("breakpoint"));
}
});

let search_toggle: ToggleButton = self.ui.get_object("search_toggle").unwrap();
let search_bar: SearchBar = self.ui.get_object("search_bar").unwrap();
let search_toggle_c = search_toggle.clone();
let search_bar_c = search_bar.clone();
search_toggle.connect_toggled(move |search_toggle| {
search_bar_c.set_search_mode(search_toggle.get_active());
});
search_bar.connect_property_search_mode_enabled_notify(move |search_bar| {
search_toggle_c.set_active(search_bar.get_search_mode());
});

let search_entry: SearchEntry = self.ui.get_object("search_entry").unwrap();
let ui = self.ui.clone();
search_entry.connect_search_changed(move |search_entry| {
let search = match search_entry.get_text() {
Some(s) => s,
None => return,
};
let settings = SearchSettings::new();
settings.set_search_text(Some(&search));

let buffer: Buffer = ui.get_object("source_buffer").unwrap();
let cursor = buffer.get_insert().unwrap();
let cursor = buffer.get_iter_at_mark(&cursor);

let context = SearchContext::new(&buffer, Some(&settings));
if let Some((lhs, rhs, _)) = context.forward2(&cursor) {
buffer.select_range(&lhs, &rhs);
};
});

let ui = self.ui.clone();
search_entry.connect_next_match(move |search_entry| {
let search = match search_entry.get_text() {
Some(s) => s,
None => return,
};
let settings = SearchSettings::new();
settings.set_search_text(Some(&search));

let buffer: Buffer = ui.get_object("source_buffer").unwrap();
let cursor = buffer.get_selection_bound().unwrap();
let cursor = buffer.get_iter_at_mark(&cursor);

let context = SearchContext::new(&buffer, Some(&settings));
if let Some((lhs, rhs, _)) = context.forward2(&cursor) {
buffer.select_range(&lhs, &rhs);
};
});

search_entry.connect_previous_match(|_| {});
search_entry.connect_stop_search(|_| {});
}
}

0 comments on commit 4e37520

Please sign in to comment.