1111*/
1212public 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