From 4cdc29383a94497c0fe762833d6577d1c44944ae Mon Sep 17 00:00:00 2001 From: Alexey Ryabov Date: Sun, 11 May 2025 00:18:05 +0500 Subject: [PATCH] Implement drawing and scrolling text in textview --- README.md | 2 + icons.png | Bin 445 -> 523 bytes kterm.asm | 69 ++++++++++---- screenshot.png | Bin 0 -> 3929 bytes textview.asm => textview.inc | 180 ++++++++++++++++++++++++++--------- utils.asm => utils.inc | 0 6 files changed, 186 insertions(+), 65 deletions(-) create mode 100644 screenshot.png rename textview.asm => textview.inc (62%) rename utils.asm => utils.inc (100%) diff --git a/README.md b/README.md index b3c9e90..2f47a41 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Simple serial terminal for KolibriOS. +![screenshot](screenshot.png) + # Requirements - [Fasm](https://flatassembler.net/) 1.7x diff --git a/icons.png b/icons.png index c1ba64d83b4790dfc38c35e365ed9c97f4a20500..b420b222643967128e8db0cf706a6fdfef8a7815 100644 GIT binary patch delta 409 zcmV;K0cQTa1B(QZ7Ya}a1^@s689-Hcks)b+3J5J35Rfcs0004DNklS z)1cpa_^-gg{295iqc781w-8nG;0000|r(8gJJz_Yi9~u@b0F87uOb!^P=Ot#sE{07R=}$ zQD_kuyrbY#fO7;a81R3 z#+FJ^i?pc}EfkWT1`2B#g|bEkwN6N1z*=eL(dGASag+!twT=mB?!%!oq_LQgi8>JxI4z+zrP-$&jw#R;f zFR&A+IZZJFGwrdbPrWI}ThmG4YYsy-e!;tY{!BrOzsz9QDy0-jYu>;oDRg-4Jsb4b c4~dBA1Aj!Yfb5L*x&QzG07*qoM6N<$g6MphVgLXD diff --git a/kterm.asm b/kterm.asm index 1bea7a2..1395db6 100644 --- a/kterm.asm +++ b/kterm.asm @@ -33,7 +33,7 @@ BTN_SEND = 5 BTN_OK = 2 BTN_CANCEL = 3 -__DEBUG__ = 0 +__DEBUG__ = 1 __DEBUG_LEVEL__ = 0 include '../../proc32.inc' @@ -43,8 +43,8 @@ include '../../dll.inc' include '../../debug-fdo.inc' include '../../develop/libraries/box_lib/trunk/box_lib.mac' include '../../../drivers/serial/common.inc' -include 'textview.asm' -include 'utils.asm' +include 'textview.inc' +include 'utils.inc' start: mcall SF_SYS_MISC, SSF_HEAP_INIT @@ -54,7 +54,7 @@ start: or eax, eax jnz .exit - mcall SF_SET_EVENTS_MASK, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_REDRAW + EVM_BUTTON + EVM_KEY + mcall SF_SET_EVENTS_MASK, EVM_MOUSE + EVM_REDRAW + EVM_BUTTON + EVM_KEY mov byte [ed_send_val], 0 stdcall text_view_init, text_view @@ -69,7 +69,16 @@ start: dec eax jz .btn invoke edit_box_mouse, ed_send + push [vscroll.position] invoke scrollbar_mouse, vscroll + pop eax + cmp eax, [vscroll.position] + je @f + mov eax, [vscroll.position] + mov [text_view.curr_line], eax + DEBUGF 0, "vscroll.position=%d\n", eax + stdcall text_view_draw, text_view + @@: jmp .loop .win: call .draw_window @@ -93,7 +102,10 @@ start: @@: cmp ah, BTN_CLEAR jne @f - ; TODO + stdcall text_view_clear, text_view + stdcall text_view_draw, text_view + call update_vscroll + invoke scrollbar_draw, vscroll jmp .loop @@: cmp ah, BTN_SEND @@ -134,6 +146,7 @@ start: mcall SF_DEFINE_BUTTON, <59, 24>, <5, 24>, BTN_CLEAR, [sc.work_light] mcall SF_PUT_IMAGE_EXT, icons, <20, 20>, <3, 7>, 1, icons.palette, 0 + mcall SF_PUT_IMAGE_EXT, icons + 180, <20, 20>, <61, 7>, 1, icons.palette, 0 mov ebx, icons + 60 ; disconnected icon mov al, [is_connected] @@ -180,6 +193,7 @@ start: sub eax, 2 * FONT_HEIGHT + WIN_BORDER_WIDTH + 14 + SCROLL_TOP mov [vscroll.y_size], ax + call update_vscroll invoke scrollbar_draw, vscroll ; editbox and send button @@ -352,15 +366,29 @@ show_conn_window: mcall SF_REDRAW, SSF_END_DRAW ret -send_text: - stdcall text_view_append_line, text_view, ed_send_val - xor eax, eax - push eax - invoke edit_box_set_text, ed_send, esp - pop eax - stdcall text_view_draw, text_view - invoke edit_box_draw, ed_send - ret + +proc send_text + stdcall text_view_append_line, text_view, ed_send_val + xor eax, eax + push eax + invoke edit_box_set_text, ed_send, esp + pop eax + stdcall text_view_draw, text_view + invoke edit_box_draw, ed_send + call update_vscroll + invoke scrollbar_draw, vscroll + ret +endp + +proc update_vscroll + mov eax, [text_view.total_lines] + mov [vscroll.max_area], eax + mov eax, [text_view.rows] + mov [vscroll.cur_area], eax + mov eax, [text_view.curr_line] + mov [vscroll.position], eax + ret +endp align 16 @IMPORT: @@ -409,14 +437,14 @@ port_conf: db 8, 1, SERIAL_CONF_PARITY_NONE, SERIAL_CONF_FLOW_CTRL_NONE port_conf_end: -if __DEBUG__ eq 1 +;if __DEBUG__ eq 1 include_debug_strings -end if +;end if ; https://javl.github.io/image2cpp/ icons: - ; 'icons', 20x60px - db 0xff, 0xff, 0xf0, 0xfc, 0xff, 0xf0, 0xf8, 0x3f, 0xf0, 0xf8, 0x1f, 0xf0, 0xfe, 0x1f, 0xf0, 0xdf + ; 'icons', 20x80px + db 0xff, 0xff, 0xf0, 0xfc, 0x7f, 0xf0, 0xf8, 0x3f, 0xf0, 0xf8, 0x1f, 0xf0, 0xfe, 0x1f, 0xf0, 0xdf db 0x1f, 0xf0, 0x8e, 0x1f, 0xf0, 0xa4, 0x3f, 0xf0, 0x90, 0x1f, 0xf0, 0xc8, 0x0f, 0xf0, 0xe0, 0x07 db 0xf0, 0xfe, 0x43, 0xf0, 0xff, 0x21, 0xf0, 0xff, 0x90, 0xf0, 0xff, 0xc8, 0x70, 0xff, 0xe4, 0x30 db 0xff, 0xf0, 0x70, 0xff, 0xf8, 0xf0, 0xff, 0xfd, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff @@ -427,7 +455,10 @@ icons: db 0xf0, 0xff, 0xff, 0xf0, 0xff, 0x9f, 0xf0, 0xff, 0x0f, 0xf0, 0xfe, 0x07, 0xf0, 0xfe, 0x07, 0xf0 db 0xfc, 0x03, 0xf0, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xfc, 0x03, 0xf0, 0xfe, 0x07, 0xf0, 0xfe db 0x07, 0xf0, 0xff, 0x0f, 0xf0, 0xff, 0x9f, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff - db 0xf0, 0xff, 0xff, 0xf0 + db 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xe3, 0xf0 + db 0xff, 0xc9, 0xf0, 0xff, 0x9c, 0xf0, 0xff, 0x3e, 0x70, 0xfe, 0x7f, 0x70, 0xfc, 0x7f, 0x70, 0xf9 + db 0x3e, 0x70, 0xf3, 0x9c, 0xf0, 0xe7, 0xc9, 0xf0, 0xef, 0xe3, 0xf0, 0xe7, 0xe7, 0xf0, 0xf3, 0xcf + db 0xf0, 0xf9, 0x9f, 0xf0, 0xfc, 0x00, 0x70, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0 .palette: dd 0xffffff dd 0x000000 diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c442d5d06dca2df457946331b1e58fd023066e GIT binary patch literal 3929 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