Add editboxes

This commit is contained in:
2025-05-08 23:53:37 +05:00
parent 06ec187648
commit 611c742435
2 changed files with 206 additions and 20 deletions

118
kterm.asm
View File

@@ -17,10 +17,18 @@ use32
WIN_BORDER_WIDTH = 5 WIN_BORDER_WIDTH = 5
FONT_HEIGHT = 16 FONT_HEIGHT = 16
SCROLL_WIDTH = 16
SCROLL_TOP = 34
CONN_WIN_STACK_SIZE = 1024 CONN_WIN_STACK_SIZE = 1024
BTN_CLOSE = 1 BTN_CLOSE = 1
BTN_SETUP = 2 BTN_SETUP = 2
BTN_CONN = 3 BTN_CONN = 3
BTN_SEND = 4
BTN_OK = 2
BTN_CANCEL = 3
__DEBUG__ = 0 __DEBUG__ = 0
__DEBUG_LEVEL__ = 0 __DEBUG_LEVEL__ = 0
@@ -32,6 +40,7 @@ include '../../dll.inc'
include '../../debug-fdo.inc' include '../../debug-fdo.inc'
include '../../develop/libraries/box_lib/trunk/box_lib.mac' include '../../develop/libraries/box_lib/trunk/box_lib.mac'
include '../../../drivers/serial/common.inc' include '../../../drivers/serial/common.inc'
include 'textview.asm'
include 'utils.asm' include 'utils.asm'
start: start:
@@ -54,12 +63,15 @@ start:
jz .key jz .key
dec eax dec eax
jz .btn jz .btn
invoke edit_box_mouse, ed_send
invoke scrollbar_mouse, vscroll
jmp .loop jmp .loop
.win: .win:
call .draw_window call .draw_window
jmp .loop jmp .loop
.key: .key:
mcall SF_GET_KEY mcall SF_GET_KEY
invoke edit_box_key, ed_send
jmp .loop jmp .loop
.btn: .btn:
mcall SF_GET_BUTTON mcall SF_GET_BUTTON
@@ -96,6 +108,8 @@ start:
mcall SF_THREAD_INFO, pi, -1 mcall SF_THREAD_INFO, pi, -1
; TODO limit minimum window size
; prevent drawing if the window is collapsed ; prevent drawing if the window is collapsed
test [pi.wnd_state], 0x04 test [pi.wnd_state], 0x04
jnz .end_redraw jnz .end_redraw
@@ -114,7 +128,67 @@ start:
@@: @@:
mcall SF_PUT_IMAGE_EXT, , <20, 20>, <32, 7>, 1, icons.palette, 0 mcall SF_PUT_IMAGE_EXT, , <20, 20>, <32, 7>, 1, icons.palette, 0
; TODO limit minimum window size ; text view
xor eax, eax
mov [text_view.left], eax
add eax, SCROLL_TOP
mov [text_view.top], eax
mov eax, [pi.client_box.width]
sub eax, SCROLL_WIDTH + 4
mov [text_view.width], eax
mov eax, [pi.client_box.height]
sub eax, 2 * FONT_HEIGHT + WIN_BORDER_WIDTH + 14 + SCROLL_TOP
mov [text_view.height], eax
stdcall text_view_draw, text_view
; scrollbar
mov [vscroll.all_redraw], 1
mov eax, [sc.work]
mov [vscroll.bg_color], eax
mov eax, [sc.work_button]
mov [vscroll.front_color], eax
mov eax, [sc.work_text]
mov [vscroll.line_color], eax
mov [vscroll.type], 0
mov eax, [pi.client_box.width]
sub eax, SCROLL_WIDTH + 2
mov [vscroll.x_pos], ax
mov eax, [pi.client_box.height]
sub eax, 2 * FONT_HEIGHT + WIN_BORDER_WIDTH + 14 + SCROLL_TOP
mov [vscroll.y_size], ax
invoke scrollbar_draw, vscroll
; editbox and send button
edit_boxes_set_sys_color main_win_edits_start, main_win_edits_end, sc
mov eax, [pi.client_box.width]
sub eax, 46
mov [ed_send.width], eax
mov eax, [pi.client_box.height]
sub eax, 2 * FONT_HEIGHT + WIN_BORDER_WIDTH + 10
mov [ed_send.top], eax
invoke edit_box_draw, ed_send
mov ebx, [pi.client_box.width]
sub ebx, 42
shl ebx, 16
add ebx, 40
mov ecx, [pi.client_box.height]
sub ecx, 2 * FONT_HEIGHT + WIN_BORDER_WIDTH + 10
shl ecx, 16
add ecx, FONT_HEIGHT + 4
mcall SF_DEFINE_BUTTON, , , BTN_SEND, [sc.work_button]
add ebx, 4 shl 16
mov bx, word [pi.client_box.height]
sub bx, 2 * FONT_HEIGHT + WIN_BORDER_WIDTH + 7
mov ecx, 0x90000000
or ecx, [sc.work_button_text]
mcall SF_DRAW_TEXT, , , send_label
; status bar ; status bar
@@ -199,8 +273,8 @@ show_conn_window:
jmp .loop jmp .loop
.btn: .btn:
mcall SF_GET_BUTTON mcall SF_GET_BUTTON
cmp ah, BTN_CLOSE ; cmp ah, BTN_CLOSE
jne .loop ; jne .loop
and [is_conn_win_opened], 0 and [is_conn_win_opened], 0
mcall SF_TERMINATE_PROCESS mcall SF_TERMINATE_PROCESS
@@ -235,10 +309,26 @@ show_conn_window:
mov edx, baud_label mov edx, baud_label
mcall SF_DRAW_TEXT, <0, 45> mcall SF_DRAW_TEXT, <0, 45>
edit_boxes_set_sys_color win_conn_edits_start, win_conn_edits_end, sc edit_boxes_set_sys_color conn_win_edits_start, conn_win_edits_end, sc
invoke edit_box_draw, ed_port invoke edit_box_draw, ed_port
invoke edit_box_draw, ed_baud invoke edit_box_draw, ed_baud
mcall SF_DEFINE_BUTTON, <CONN_WIN_WIDTH - 137, 60>, \
<CONN_WIN_HEIGHT - 55, 24>, BTN_OK, \
[sc.work_button]
mcall SF_DEFINE_BUTTON, <CONN_WIN_WIDTH - 71, 60>, \
<CONN_WIN_HEIGHT - 55, 24>, BTN_CANCEL, \
[sc.work_button]
mov ecx, 0x90000000
or ecx, [sc.work_button_text]
mcall SF_DRAW_TEXT, <CONN_WIN_WIDTH - 114, CONN_WIN_HEIGHT - 50>, , ok_label
mov ecx, 0x90000000
or ecx, [sc.work_button_text]
mcall SF_DRAW_TEXT, <CONN_WIN_WIDTH - 65, CONN_WIN_HEIGHT - 50>, , cancel_label
mcall SF_REDRAW, SSF_END_DRAW mcall SF_REDRAW, SSF_END_DRAW
ret ret
@@ -250,16 +340,26 @@ library box_lib, 'box_lib.obj'
import box_lib,\ import box_lib,\
edit_box_draw, 'edit_box_draw',\ edit_box_draw, 'edit_box_draw',\
edit_box_key, 'edit_box_key',\ edit_box_key, 'edit_box_key',\
edit_box_mouse, 'edit_box_mouse' edit_box_mouse, 'edit_box_mouse',\
scrollbar_draw, 'scrollbar_v_draw',\
scrollbar_mouse, 'scrollbar_v_mouse'
win_conn_edits_start: conn_win_edits_start:
ed_port edit_box 80, CONN_WIN_WIDTH - 80 - 11, 10, 0xffffff, 0x6f9480, \ ed_port edit_box 80, CONN_WIN_WIDTH - 80 - 11, 10, 0xffffff, 0x6f9480, \
0, 0, 0x10000000, 6, ed_port_val, mouse_dd, \ 0, 0, 0x10000000, 6, ed_port_val, mouse_dd, \
ed_focus + ed_figure_only ed_focus + ed_figure_only
ed_baud edit_box 80, CONN_WIN_WIDTH - 80 - 11, 42, 0xffffff, 0x6f9480, \ ed_baud edit_box 80, CONN_WIN_WIDTH - 80 - 11, 42, 0xffffff, 0x6f9480, \
0, 0, 0x10000000, 6, ed_baud_val, mouse_dd, \ 0, 0, 0x10000000, 6, ed_baud_val, mouse_dd, \
ed_figure_only ed_figure_only
win_conn_edits_end: conn_win_edits_end:
main_win_edits_start:
ed_send edit_box 0, 0, 0, 0xffffff, 0x6f9480, \
0, 0, 0x10000000, 10, ed_send_val, mouse_dd, \
ed_focus, 0, 0
main_win_edits_end:
vscroll scrollbar SCROLL_WIDTH, 0, 0, SCROLL_TOP, SCROLL_WIDTH, 0, 0, 0, 0, 0, 0, 5
text_view TEXT_VIEW
is_connected db 0 is_connected db 0
is_conn_win_opened db 0 is_conn_win_opened db 0
@@ -267,8 +367,12 @@ app_name db 'kterm', 0
conn_win_name db 'Settings', 0 conn_win_name db 'Settings', 0
port_label db 'Port:', 0 port_label db 'Port:', 0
baud_label db 'Baud:', 0 baud_label db 'Baud:', 0
ok_label db 'Ok', 0
cancel_label db 'Cancel', 0
send_label db 'Send', 0
status_msg db ' ', 0 status_msg db ' ', 0
port_num dd 0 port_num dd 0
ed_send_val db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
port_conf: port_conf:
dd port_conf_end - port_conf dd port_conf_end - port_conf
dd 9600 dd 9600

82
textview.asm Normal file
View File

@@ -0,0 +1,82 @@
BUF_SIZE = 4096
struct TEXT_VIEW
left dd ?
top dd ?
width dd ?
height dd ?
bg_color dd ?
fg_color dd ?
buf_data dd ?
buf_size dd ?
total_lines dd ?
curr_line dd ?
max_length dd ?
ends
proc text_view_init stdcall uses ebx, text_view:dword
mov eax, [text_view]
ret
endp
proc text_view_deinit stdcall, text_view:dword
endp
proc text_view_draw stdcall uses ebx esi, text_view:dword
mov esi, [text_view]
mov ebx, [esi + TEXT_VIEW.left]
shl ebx, 16
add ebx, [esi + TEXT_VIEW.width]
mov ecx, [esi + TEXT_VIEW.top]
shl ecx, 16
add ecx, [esi + TEXT_VIEW.height]
xor edx, edx
call draw_frame
ret
endp
proc text_view_append_line stdcall, text_view:dword, strp:dword
endp
draw_frame:
; ebx = left << 16 + width
; ecx = top << 16 + height
; edx = color
push ebx ecx
mov eax, ebx
shr eax, 16
add ebx, eax
dec ebx
mov eax, ecx
shr eax, 16
add ecx, eax
dec ecx
push ecx
push ecx
mov eax, ecx
shr eax, 16
mov cx, ax ; ecx = top << 16 + top
mcall SF_DRAW_LINE
pop ecx
mov eax, ecx
shl ecx, 16
mov cx, ax ; ecx = height << 16 + height
mcall SF_DRAW_LINE
pop ecx
push ebx
mov eax, ebx
shr eax, 16
mov bx, ax
mcall SF_DRAW_LINE
pop ebx
mov eax, ebx
shl ebx, 16
mov bx, ax
mcall SF_DRAW_LINE
pop ecx ebx
ret