Skip to content

Commit 3eeff86

Browse files
committed
add selection
1 parent 4b21fb1 commit 3eeff86

4 files changed

Lines changed: 81 additions & 15 deletions

File tree

lib/libgui/edit.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,9 @@ void gl_render_edit_once(edit_t *self, float x, float y, char *text,
505505
}
506506
}
507507

508-
void calc_lineno_width(edit_t *self){
508+
void calc_lineno_width(edit_t *self) {
509509
int no = calc_number(self->buffer->line_count);
510-
self->lineno_width = no * self->font_size/self->scale+ 10;
510+
self->lineno_width = no * self->font_size / self->scale + 10;
511511
}
512512

513513
void gl_render_edit(edit_t *self, float x, float y) {
@@ -549,6 +549,15 @@ void update_cursor_pos(buffer_t *self) {
549549
measure_text(self->font, self->lines[cur_row]->texts, self->cursor_col);
550550
}
551551

552+
int gl_edit_get_line_count(edit_t *self) { return self->buffer->line_count; }
553+
554+
int gl_edit_get_row_count(edit_t *self, int row) {
555+
if (row < self->buffer->line_count) {
556+
return self->buffer->lines[row]->count;
557+
}
558+
return 0;
559+
}
560+
552561
void gl_edit_cursor_move_left(buffer_t *self) {
553562
if (self->cursor_col > 0) {
554563
self->cursor_col--;
@@ -595,17 +604,24 @@ void gl_edit_cursor_move_down(buffer_t *self) {
595604

596605
void gl_edit_mouse_motion_event(edit_t *self, float x, float y) {
597606
// printf("gl_edit_mouse_motion_event %f,%f\n", x, y);
598-
x -= self->lineno_width/self->scale;
607+
x -= self->lineno_width / self->scale;
599608
if (self->select_press == 1) {
600609
pos_to_cursor(self->buffer, x - self->scroll_x, y - self->scroll_y);
601610
self->select_end[0] = self->buffer->cursor_row;
602611
self->select_end[1] = self->buffer->cursor_col;
603612
}
604613
}
614+
void gl_edit_set_selection(edit_t *self, int start_row, int start_col,
615+
int end_row, int end_col) {
616+
self->select_start[0] = start_row;
617+
self->select_start[1] = start_col;
618+
self->select_end[0] = end_row;
619+
self->select_end[1] = end_col;
620+
}
605621

606622
void gl_edit_mouse_event(edit_t *self, int action, float x, float y) {
607623
// printf("gl_edit_mouse_event %d %f,%f\n", action, x, y);
608-
x -= self->lineno_width/self->scale;
624+
x -= self->lineno_width / self->scale;
609625

610626
if (action == 1) { // press mouse button
611627
pos_to_cursor(self->buffer, x - self->scroll_x, y - self->scroll_y);
@@ -799,18 +815,13 @@ char *gl_get_selection(edit_t *self) {
799815
end = tmp;
800816
}
801817
}
802-
// printf("--------->self->select_start[1]=%d self->select_end[1]=%d
803-
// %d,%d\n",
804-
// self->select_start[1], self->select_end[1], start, end);
805-
// printf("&self->select_text[pos]=%p
806-
// &line->texts[start]=%p\n",&self->select_text[pos], &line->texts[start]);
807-
808818
memcpy(&self->select_text[pos], &line->texts[start], end - start);
809819
pos += (end - start);
810820
memcpy(&self->select_text[pos], self->crlf, crlf_len);
811821
pos += crlf_len;
812822
}
813823
self->select_text[pos - 1] = 0;
824+
// printf("gl_get_selection %s\n",self->select_text);
814825
return self->select_text;
815826
}
816827

packages/gui/duck.ss

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,48 @@
584584
(lambda (ww name value)
585585
(gl-edit-set-lineno-color (widget-get-attrs ww '%edit) value)
586586
))
587-
587+
588+
(widget-set-attrs
589+
widget
590+
"%event-get-selection-hook"
591+
(lambda (ww name)
592+
(gl-edit-get-selection (widget-get-attrs ww '%edit))
593+
))
594+
595+
(widget-set-attrs
596+
widget
597+
"%event-get-selection-hook"
598+
(lambda (ww name)
599+
(gl-edit-get-selection (widget-get-attrs ww '%edit))
600+
))
601+
602+
(widget-set-attrs
603+
widget
604+
"%event-get-line-count-hook"
605+
(lambda (ww name)
606+
(gl-edit-get-line-count (widget-get-attrs ww '%edit))
607+
))
608+
609+
(widget-set-attrs
610+
widget
611+
"%event-get-last-row-count-hook"
612+
(lambda (ww name)
613+
(gl-edit-get-row-count (widget-get-attrs ww '%edit)
614+
(- (gl-edit-get-line-count (widget-get-attrs ww '%edit)) 1))
615+
))
616+
617+
(widget-set-attrs
618+
widget
619+
"%event-selection-hook"
620+
(lambda (ww name val)
621+
(gl-edit-set-selection (widget-get-attrs ww '%edit)
622+
(list-ref val 0)
623+
(list-ref val 1)
624+
(list-ref val 2)
625+
(list-ref val 3)
626+
)
627+
))
628+
588629
(widget-set-attrs
589630
widget
590631
"%event-syntax-on-hook"

packages/gui/graphic.ss

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@
5454
gl-edit-set-font-line-height
5555
gl-edit-set-show-no
5656
gl-edit-set-lineno-color
57-
57+
gl-edit-get-selection
58+
gl-edit-set-selection
59+
gl-edit-get-line-count
60+
gl-edit-get-row-count
5861
)
5962
(import (scheme) (utils libutil) (cffi cffi) (gles gles2) )
6063

@@ -78,6 +81,14 @@
7881
(def-function gl-edit-set-editable "gl_edit_set_editable" (void* int) void)
7982
(def-function gl-edit-set-show-no "gl_edit_set_show_no" (void* int) void)
8083
(def-function gl-edit-set-lineno-color "gl_edit_set_lineno_color" (void* int) void)
84+
(def-function gl-edit-get-selection "gl_get_selection" (void* ) string)
85+
(def-function gl-edit-set-selection "gl_edit_set_selection" (void* int int int int) void)
86+
87+
88+
(def-function gl-edit-get-line-count "gl_edit_get_line_count" (void* ) int)
89+
(def-function gl-edit-get-row-count "gl_edit_get_row_count" (void* int) int)
90+
91+
8192

8293

8394
(def-function gl-new-edit "gl_new_edit" (int float float float float) void*)

packages/gui/widget.ss

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,10 @@
498498

499499
(define (widget-get-attrs widget name)
500500
(let ((h (vector-ref widget %attrs )))
501-
(hashtable-ref h name '() )))
501+
(let ((hook (hashtable-ref h (format "%event-get-~a-hook" name) '())))
502+
(if (procedure? hook)
503+
(hook widget name)
504+
(hashtable-ref h name '() )))))
502505

503506
(define (widget-attrs widget)
504507
(vector-ref widget %attrs))
@@ -507,8 +510,8 @@
507510
(let ((h (vector-ref widget %attrs )))
508511
(hashtable-set! h name value)
509512
(let ((hook (hashtable-ref h (format "%event-~a-hook" name) '())))
510-
(if (procedure? hook)
511-
(hook widget name value)))
513+
(if (procedure? hook)
514+
(hook widget name value)))
512515
))
513516

514517
(define (widget-get-events widget name)

0 commit comments

Comments
 (0)