Skip to content

Commit f92f858

Browse files
committed
reactive buffer to user inputs in regards to lists
1 parent c3e4b65 commit f92f858

File tree

1 file changed

+82
-14
lines changed

1 file changed

+82
-14
lines changed

src/Widgets/TextView.vala

Lines changed: 82 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
*/
1212
public class Jorts.TextView : Granite.HyperTextView {
1313

14+
private Gtk.EventControllerKey keyboard;
15+
private string list_item_start;
16+
1417
public string text {
1518
owned get {return buffer.text;}
1619
set {buffer.text = value;}
@@ -27,7 +30,14 @@ public class Jorts.TextView : Granite.HyperTextView {
2730
set_vexpand (true);
2831
set_wrap_mode (Gtk.WrapMode.WORD_CHAR);
2932

30-
//Application.gsettings.bind ("scribbly-mode-active", this, "scribbly", SettingsBindFlags.DEFAULT);
33+
list_item_start = Application.gsettings.get_string ("list-item-start");
34+
//Application.gsettings.bind ("list-item-start", this, "list-item-start", GLib.SettingsBindFlags.GET);
35+
36+
keyboard = new Gtk.EventControllerKey ();
37+
add_controller (keyboard);
38+
39+
keyboard.key_pressed.connect (on_key_pressed);
40+
keyboard.key_released.connect (on_key_released);
3141
}
3242

3343
public void paste () {
@@ -52,24 +62,23 @@ public class Jorts.TextView : Granite.HyperTextView {
5262
var last_line = (uint8)end.get_line ();
5363
debug ("got " + first_line.to_string () + " to " + last_line.to_string ());
5464

55-
var list_item_start = Application.gsettings.get_string ("list-item-start");
5665
var selected_is_list = this.is_list (first_line, last_line, list_item_start);
5766

5867
buffer.begin_user_action ();
5968
if (selected_is_list)
6069
{
61-
this.remove_list (first_line, last_line, list_item_start);
70+
this.remove_list (first_line, last_line);
6271

6372
} else {
64-
this.set_list (first_line, last_line, list_item_start);
73+
this.set_list (first_line, last_line);
6574
}
6675
buffer.end_user_action ();
6776
}
6877

6978
/**
7079
* Add the list prefix only to lines who hasnt it already
7180
*/
72-
private bool has_prefix (uint8 line_number, string list_item_start) {
81+
private bool has_prefix (uint8 line_number) {
7382
Gtk.TextIter start, end;
7483
buffer.get_iter_at_line_offset (out start, line_number, 0);
7584

@@ -89,7 +98,7 @@ public class Jorts.TextView : Granite.HyperTextView {
8998
for (uint8 line_number = first_line; line_number <= last_line; line_number++) {
9099
debug ("doing line " + line_number.to_string ());
91100

92-
if (!this.has_prefix (line_number, list_item_start)) {
101+
if (!this.has_prefix (line_number)) {
93102
return false;
94103
}
95104
}
@@ -100,12 +109,12 @@ public class Jorts.TextView : Granite.HyperTextView {
100109
/**
101110
* Add the list prefix only to lines who hasnt it already
102111
*/
103-
private void set_list (uint8 first_line, uint8 last_line, string list_item_start) {
112+
private void set_list (uint8 first_line, uint8 last_line) {
104113
Gtk.TextIter line_start;
105114
for (uint8 line_number = first_line; line_number <= last_line; line_number++) {
106115

107116
debug ("doing line " + line_number.to_string ());
108-
if (!this.has_prefix (line_number, list_item_start)) {
117+
if (!this.has_prefix (line_number)) {
109118
buffer.get_iter_at_line_offset (out line_start, line_number, 0);
110119
buffer.insert (ref line_start, list_item_start, -1);
111120
}
@@ -115,18 +124,77 @@ public class Jorts.TextView : Granite.HyperTextView {
115124
/**
116125
* Remove list prefix from line x to line y. Presuppose it is there
117126
*/
118-
private void remove_list (uint8 first_line, uint8 last_line, string list_item_start) {
127+
private void remove_list (uint8 first_line, uint8 last_line) {
128+
for (uint8 line_number = first_line; line_number <= last_line; line_number++) {
129+
remove_prefix (line_number);
130+
}
131+
}
132+
133+
/**
134+
* Remove list prefix from line x to line y. Presuppose it is there
135+
*/
136+
private void remove_prefix (uint8 line_number) {
119137
Gtk.TextIter line_start, prefix_end;
120138
var remove_range = list_item_start.length;
121139

122-
for (uint8 line_number = first_line; line_number <= last_line; line_number++) {
140+
debug ("doing line " + line_number.to_string ());
141+
buffer.get_iter_at_line_offset (out line_start, line_number, 0);
142+
buffer.get_iter_at_line_offset (out prefix_end, line_number, remove_range);
143+
buffer.delete (ref line_start, ref prefix_end);
144+
}
123145

124-
debug ("doing line " + line_number.to_string ());
125-
buffer.get_iter_at_line_offset (out line_start, line_number, 0);
126-
buffer.get_iter_at_line_offset (out prefix_end, line_number, remove_range);
127-
buffer.delete (ref line_start, ref prefix_end);
146+
147+
/**
148+
* Handler whenever a key is pressed, to see if user needs something and get ahead
149+
* Some local stuff is deduplicated in the Ifs, because i do not like the idea of getting computation done not needed 98% of the time
150+
*/
151+
private bool on_key_pressed (uint keyval, uint keycode, Gdk.ModifierType state) {
152+
print ("char typed");
153+
// User didnt like list being expanded. Undo that one.
154+
if (keyval == Gdk.Key.BackSpace) {
155+
print ("backspace");
156+
157+
Gtk.TextIter start, end;
158+
buffer.get_selection_bounds (out start, out end);
159+
160+
var line_number = (uint8)start.get_line ();
161+
162+
if (has_prefix (line_number)) {
163+
164+
buffer.get_iter_at_line_offset (out start, line_number, 0);
165+
var text_in_line = buffer.get_slice (start, end, false);
166+
167+
if (text_in_line == list_item_start) {
168+
169+
buffer.begin_user_action ();
170+
buffer.delete (ref start, ref end);
171+
buffer.insert_at_cursor ("\n", -1);
172+
buffer.end_user_action ();
173+
}
174+
}
128175
}
176+
177+
return false;
129178
}
130179

180+
private void on_key_released (uint keyval, uint keycode, Gdk.ModifierType state) {
181+
182+
// User did Enter
183+
if (keyval == Gdk.Key.Return) {
131184

185+
Gtk.TextIter start, end;
186+
buffer.get_selection_bounds (out start, out end);
187+
start.backward_line ();
188+
var line_number = (uint8)start.get_line ();
189+
190+
if (this.has_prefix (line_number)) {
191+
192+
buffer.begin_user_action ();
193+
buffer.insert_at_cursor (list_item_start, -1);
194+
buffer.end_user_action ();
195+
}
196+
}
197+
198+
199+
}
132200
}

0 commit comments

Comments
 (0)