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 }