1 module unde.viewers.text_viewer.events;
2 
3 import unde.global_state;
4 import unde.lib;
5 import unde.tick;
6 import unde.viewers.text_viewer.lib;
7 import unde.file_manager.events;
8 import unde.command_line.events;
9 import unde.keybar.lib;
10 import unde.translations.lib;
11 
12 import derelict.sdl2.sdl;
13 
14 import std.stdio;
15 import std..string;
16 import std.math;
17 import std.functional;
18 
19 private void
20 change_wrap_mode(GlobalState gs)
21 {
22     with (gs.text_viewer)
23     {
24         wraplines = !wraplines;
25         if (wraplines)
26         {
27             x = 0;
28         }
29         last_redraw = 0;
30     }
31 }
32 
33 private void
34 go_to_beginning_or_to_the_end(GlobalState gs)
35 {
36     with (gs.text_viewer)
37     {
38         if (gs.shift)
39         {
40             File file;
41             try {
42                 file = File(path);
43             }
44             catch (Exception exp)
45             {
46                 return;
47             }
48             rectsize.offset = file.size;
49             y = gs.screen.h;
50         }
51         else
52         {
53             rectsize.offset = 0;
54             y = 0;
55             put_rectsize(gs);
56         }
57         last_redraw = 0;
58     }
59 }
60 
61 private void
62 textviewer_page_up(GlobalState gs)
63 {
64     with (gs.text_viewer)
65     {
66         int line_height = cast(int)(round(SQRT2^^9)*1.2);
67         y += gs.screen.h - 2*line_height;
68     }
69 }
70 
71 private void
72 textviewer_page_down(GlobalState gs)
73 {
74     with (gs.text_viewer)
75     {
76         int line_height = cast(int)(round(SQRT2^^9)*1.2);
77         y -= gs.screen.h - 2*line_height;
78     }
79 }
80 
81 void process_event(GlobalState gs, ref SDL_Event event)
82 {
83     switch( event.type )
84     {
85         case SDL_MOUSEMOTION:
86             if (gs.mouse_buttons & unDE_MouseButtons.Left)
87             {
88                 with (gs.text_viewer)
89                 {
90                     if (gs.command_line.ctrl_mode ^ gs.ctrl)
91                     {
92                         if (mouse_offset > first_click)
93                         {
94                             start_selection = first_click;
95                             end_selection = mouse_offset;
96                         }
97                         else
98                         {
99                             start_selection = mouse_offset;
100                             end_selection = first_click;
101                         }
102                     }
103                     else
104                     {
105                         if (!wraplines)
106                             x += event.motion.xrel;
107                         y += event.motion.yrel;
108                     }
109                     last_redraw = 0;
110                 }
111             }
112             gs.mouse_screen_x = event.motion.x;
113             gs.mouse_screen_y = event.motion.y;
114             gs.moved_while_click++;
115             break;
116             
117         case SDL_MOUSEBUTTONDOWN:
118             switch (event.button.button)
119             {
120                 case SDL_BUTTON_LEFT:
121                     gs.mouse_buttons |= unDE_MouseButtons.Left;
122                     gs.moved_while_click = 0;
123                     with (gs.text_viewer)
124                     {
125                         if (gs.command_line.ctrl_mode ^ gs.ctrl)
126                         {
127                             first_click = mouse_offset;
128                         }
129                     }
130                     break;
131                 case SDL_BUTTON_MIDDLE:
132                     gs.mouse_buttons |= unDE_MouseButtons.Middle;
133                     break;
134                 case SDL_BUTTON_RIGHT:
135                     gs.mouse_buttons |= unDE_MouseButtons.Right;
136                     break;
137                 default:
138                     break;
139             }
140             break;
141             
142         case SDL_MOUSEBUTTONUP:
143             if (gs.mouse_screen_x < gs.screen.w)
144             {
145                 switch (event.button.button)
146                 {
147                     case SDL_BUTTON_LEFT:
148                         with(gs.text_viewer)
149                         {
150                             gs.mouse_buttons &= ~unDE_MouseButtons.Left;
151                             if (!gs.moved_while_click)
152                             {
153                                 if (SDL_GetTicks() - gs.last_left_click < DOUBLE_DELAY)
154                                 {
155                                     gs.state = State.FileManager;
156                                     gs.dirty = true;
157                                 }
158                                 else if (gs.shift)
159                                 {
160                                     if (mouse_offset > first_click)
161                                     {
162                                         end_selection = mouse_offset;
163                                     }
164                                     else
165                                     {
166                                         start_selection = mouse_offset;
167                                     }
168                                     selection_to_buffer(gs);
169                                 }
170                                 else if (gs.command_line.ctrl_mode ^ gs.ctrl)
171                                 {
172                                     start_selection = -1;
173                                     end_selection = -1;
174                                     last_redraw = 0;
175                                 }
176                                 gs.last_left_click = SDL_GetTicks();
177                             }
178                             else if (gs.command_line.ctrl_mode ^ gs.ctrl)
179                             {
180                                 if (mouse_offset > first_click)
181                                 {
182                                     start_selection = first_click;
183                                     end_selection = mouse_offset;
184                                 }
185                                 else
186                                 {
187                                     start_selection = mouse_offset;
188                                     end_selection = first_click;
189                                 }
190                                 last_redraw = 0;
191                                 selection_to_buffer(gs);
192                             }
193                         }
194                         break;
195                     case SDL_BUTTON_MIDDLE:
196                         gs.mouse_buttons &= ~unDE_MouseButtons.Middle;
197                         break;
198                     case SDL_BUTTON_RIGHT:
199                         gs.mouse_buttons &= ~unDE_MouseButtons.Right;
200 
201                         with (gs.text_viewer)
202                         {
203                             if (path in gs.selection_hash)
204                                 gs.selection_hash.remove(path);
205                             else
206                                 /* EN: FIXME: Sort type of the directory maybe other
207                                    RU: ИСПРАВЬ_МЕНЯ: Сортировка директории может быть другой */
208                                 gs.selection_hash[path] = rectsize.rect(SortType.BySize);
209                         }
210 
211                         break;
212                     default:
213                         break;
214                 }
215             }
216             break;
217 
218         case SDL_MOUSEWHEEL:
219             with (gs.text_viewer)
220             {
221                 if (gs.command_line.ctrl_mode ^ gs.ctrl)
222                 {
223                     y += event.wheel.y * 40;
224                 }
225                 else
226                 {
227                     fontsize += event.wheel.y;
228 
229                     if (fontsize < 5) fontsize = 5;
230                     if (fontsize > 15) fontsize = 15;
231                 }
232                 last_redraw = 0;
233             }
234             break;
235             
236         case SDL_QUIT:
237             /* Do something event.quit */
238             gs.finish=true;
239             break;
240             
241         default:
242             //writeln("Ignored event: "~to!string(event.type));
243             break;
244     }
245 }
246 
247 void
248 setup_keybar_textviewer_default(GlobalState gs)
249 {
250     gs.keybar.handlers.clear();
251     gs.keybar.handlers_down.clear();
252     gs.keybar.handlers_double.clear();
253 
254     gs.keybar.handlers[SDL_SCANCODE_Q] = KeyHandler(toDelegate(&quit), _("Quit"), "exit.png");
255     gs.keybar.handlers[SDL_SCANCODE_PRINTSCREEN] = KeyHandler(toDelegate(&make_screenshot), _("Make screenshot"), "Prt Sc");
256     gs.keybar.handlers[SDL_SCANCODE_M] = KeyHandler(toDelegate(&mark), _("Make Mark"), "mark.png");
257     gs.keybar.handlers[SDL_SCANCODE_APOSTROPHE] = KeyHandler(toDelegate(&gomark), _("Go To Mark"), "gomark.png");
258     gs.keybar.handlers[SDL_SCANCODE_A] = KeyHandler(toDelegate(&deselect_all), _("Clear selection"), "deselect.png");
259     gs.keybar.handlers_down[SDL_SCANCODE_LSHIFT] = KeyHandler(toDelegate(&setup_keybar_textviewer_shift), "", "Shift");
260     gs.keybar.handlers_down[SDL_SCANCODE_RSHIFT] = KeyHandler(toDelegate(&setup_keybar_textviewer_shift), "", "");
261     gs.keybar.handlers[SDL_SCANCODE_LEFT] = KeyHandler(toDelegate(&text_prev), _("Next Text"), "←");
262     gs.keybar.handlers[SDL_SCANCODE_RIGHT] = KeyHandler(toDelegate(&text_next), _("Prev Text"), "→");
263     gs.keybar.handlers[SDL_SCANCODE_W] = KeyHandler(toDelegate(&change_wrap_mode), _("On/Off wrap lines"), "Wrap");
264     gs.keybar.handlers[SDL_SCANCODE_G] = KeyHandler(toDelegate(&go_to_beginning_or_to_the_end), _("Go To Beginining"), "Begin");
265     gs.keybar.handlers[SDL_SCANCODE_PAGEUP] = KeyHandler(toDelegate(&textviewer_page_up), _("Page Up"), "PgUp");
266     gs.keybar.handlers[SDL_SCANCODE_PAGEDOWN] = KeyHandler(toDelegate(&textviewer_page_down), _("Page Down"), "PgD");
267     gs.keybar.handlers_double[SDL_SCANCODE_LCTRL] = KeyHandler(toDelegate(&turn_on_off_ctrl_mode), _("Ctrl Mode"), "Ctrl");
268     gs.keybar.handlers_double[SDL_SCANCODE_RCTRL] = KeyHandler(toDelegate(&turn_on_off_ctrl_mode), "", "");
269 }
270 
271 void
272 setup_keybar_textviewer_shift(GlobalState gs)
273 {
274     gs.keybar.handlers.clear();
275     gs.keybar.handlers_down.clear();
276     gs.keybar.handlers_double.clear();
277 
278     gs.keybar.handlers[SDL_SCANCODE_M] = KeyHandler(toDelegate(&unmark), _("Delete Mark"), "unmark.png");
279     gs.keybar.handlers[SDL_SCANCODE_G] = KeyHandler(toDelegate(&go_to_beginning_or_to_the_end), _("Go To End"), "End");
280     gs.keybar.handlers[SDL_SCANCODE_LSHIFT] = KeyHandler(toDelegate(&setup_keybar_textviewer_default), "", "Shift");
281     gs.keybar.handlers[SDL_SCANCODE_RSHIFT] = KeyHandler(toDelegate(&setup_keybar_textviewer_default), "", "");
282 }