From e4cd8a4d74c6e14e7cfdec30922875a7469a22f8 Mon Sep 17 00:00:00 2001 From: Kiril Lipatov Date: Mon, 14 Apr 2025 19:46:57 +0200 Subject: [PATCH] Calc+ v1.0 (#189) - Bigger fonts - System colors - Code refactoring to make UI flexible and more readable - Move from ISO to IMG - Add to main menu, add to desktop instead of Calc, remove from App+ - Localization to all system languages - Source code file is now UTF-8 Co-authored-by: Burer Reviewed-on: https://git.kolibrios.org/KolibriOS/kolibrios/pulls/189 Reviewed-by: Max Logaev Co-authored-by: Kiril Lipatov Co-committed-by: Kiril Lipatov --- data/Tupfile.lua | 2 +- data/common/settings/app_plus.ini | 1 - data/en_US/settings/icon.ini | 4 +- data/en_US/settings/menu.dat | 1 + data/es_ES/settings/icon.ini | 4 +- data/es_ES/settings/menu.dat | 1 + data/et_EE/settings/icon.ini | 4 +- data/et_EE/settings/menu.dat | 1 + data/it_IT/settings/icon.ini | 4 +- data/it_IT/settings/menu.dat | 1 + data/ru_RU/settings/icon.ini | 4 +- data/ru_RU/settings/menu.dat | 1 + programs/other/calcplus/Tupfile.lua | 5 +- programs/other/calcplus/build.bat | 2 - programs/other/calcplus/calcplus.asm | 1388 ++++++++++++++------------ 15 files changed, 744 insertions(+), 679 deletions(-) delete mode 100644 programs/other/calcplus/build.bat diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 66cea9233..11802a3e6 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -410,6 +410,7 @@ tup.append_table(img_files, { {"ACLOCK", VAR_PROGS .. "/demos/aclock/aclock"}, {"APM", VAR_PROGS .. "/system/apm/apm"}, {"CALC", VAR_PROGS .. "/other/calc/trunk/calc"}, + {"CALCPLUS", VAR_PROGS .. "/other/calcplus/calcplus"}, {"CALENDAR", VAR_PROGS .. "/system/calendar/trunk/calendar"}, {"COLRDIAL", VAR_PROGS .. "/system/colrdial/color_dialog"}, {"CROPFLAT", VAR_PROGS .. "/system/cropflat/cropflat"}, @@ -626,7 +627,6 @@ tup.append_table(extra_files, { {"kolibrios/media/zsea/plugins/rotate.obj", VAR_PROGS .. "/media/zsea/plugins/rotate/rotate.obj"}, {"kolibrios/media/zsea/plugins/scaling.obj", VAR_PROGS .. "/media/zsea/plugins/scaling/scaling.obj"}, {"kolibrios/utils/AMDtemp", VAR_PROGS .. "/system/amd_temp_view/AMDtemp"}, - {"kolibrios/utils/calcplus", VAR_PROGS .. "/other/calcplus/calcplus"}, {"kolibrios/utils/kfm/kfm", VAR_PROGS .. "/fs/kfm/trunk/kfm"}, {"kolibrios/utils/tedit/t_edit", VAR_PROGS .. "/other/t_edit/t_edit"}, {"kolibrios/3D/blocks/block.bin", VAR_PROGS .. "/bcc32/games/blocks/block.bin"} diff --git a/data/common/settings/app_plus.ini b/data/common/settings/app_plus.ini index c5a571062..97faf56db 100644 --- a/data/common/settings/app_plus.ini +++ b/data/common/settings/app_plus.ini @@ -29,7 +29,6 @@ Dicty=/k/utils/DICTY.KEX,79 fNav=/k/utils/fNav/fNav,93 CncEditor=/k/utils/cnc_editor/cnc_editor,15 Life=/k/demos/life2,13 -Calc+=/k/utils/calcplus,4 TinyBasic=/k/develop/TinyBasic/TinyBasic,91 THashView=/k/utils/thashview,124 Notes=/k/utils/notes,117 diff --git a/data/en_US/settings/icon.ini b/data/en_US/settings/icon.ini index 918208874..a52b7835f 100644 --- a/data/en_US/settings/icon.ini +++ b/data/en_US/settings/icon.ini @@ -235,8 +235,8 @@ ico=58 x=68 y=68 [21] -name=CALC -path=CALC +name=CALC+ +path=CALCPLUS param= ico=4 x=204 diff --git a/data/en_US/settings/menu.dat b/data/en_US/settings/menu.dat index d3fd5709a..0a08cde79 100644 --- a/data/en_US/settings/menu.dat +++ b/data/en_US/settings/menu.dat @@ -92,6 +92,7 @@ 59 Screen keyboard |zkey #10 **** DATA PROCESSING 16 Calculator |calc +16 Calculator+ |calcplus 03 Tinypad |tinypad 28 CodeEdit |develop/cedit 21 Table processor |table diff --git a/data/es_ES/settings/icon.ini b/data/es_ES/settings/icon.ini index 918208874..a52b7835f 100644 --- a/data/es_ES/settings/icon.ini +++ b/data/es_ES/settings/icon.ini @@ -235,8 +235,8 @@ ico=58 x=68 y=68 [21] -name=CALC -path=CALC +name=CALC+ +path=CALCPLUS param= ico=4 x=204 diff --git a/data/es_ES/settings/menu.dat b/data/es_ES/settings/menu.dat index 5ae082fe7..dd26b370d 100644 --- a/data/es_ES/settings/menu.dat +++ b/data/es_ES/settings/menu.dat @@ -96,6 +96,7 @@ 24 NDN * |/kolibrios/utils/ndn/ndn #11 **** PROCESO DE DATOS 16 Calculadora |calc +16 Calculadora+ |calcplus 16 Tinypad |tinypad 16 CodeEdit |develop/cedit 16 Procesador de tablas |table diff --git a/data/et_EE/settings/icon.ini b/data/et_EE/settings/icon.ini index 316e7459a..0e2a4d8ec 100644 --- a/data/et_EE/settings/icon.ini +++ b/data/et_EE/settings/icon.ini @@ -235,8 +235,8 @@ ico=58 x=68 y=68 [21] -name=CALC -path=CALC +name=CALC+ +path=CALCPLUS param= ico=4 x=204 diff --git a/data/et_EE/settings/menu.dat b/data/et_EE/settings/menu.dat index 56cc76124..58b4cadfd 100644 --- a/data/et_EE/settings/menu.dat +++ b/data/et_EE/settings/menu.dat @@ -80,6 +80,7 @@ 65 NDN * |/kolibrios/utils/ndn/ndn #11 **** DATA PROCESSING **** 16 Kalkulaator |calc +16 Kalkulaator+ |calcplus 16 Teksti redaktor |tinypad 16 CodeEdit |develop/cedit 16 Tabelarvutus |table diff --git a/data/it_IT/settings/icon.ini b/data/it_IT/settings/icon.ini index 918208874..a52b7835f 100644 --- a/data/it_IT/settings/icon.ini +++ b/data/it_IT/settings/icon.ini @@ -235,8 +235,8 @@ ico=58 x=68 y=68 [21] -name=CALC -path=CALC +name=CALC+ +path=CALCPLUS param= ico=4 x=204 diff --git a/data/it_IT/settings/menu.dat b/data/it_IT/settings/menu.dat index 95d6703b8..e3521b39b 100644 --- a/data/it_IT/settings/menu.dat +++ b/data/it_IT/settings/menu.dat @@ -79,6 +79,7 @@ 65 NDN * |/kolibrios/utils/ndn/ndn #11 **** DATA PROCESSING 16 Calcolatrice |calc +16 Calcolatrice+ |calcplus 16 Tinypad |tinypad 16 CodeEdit |develop/cedit 16 Table Processor |table diff --git a/data/ru_RU/settings/icon.ini b/data/ru_RU/settings/icon.ini index 3883986d9..c707f7bec 100644 --- a/data/ru_RU/settings/icon.ini +++ b/data/ru_RU/settings/icon.ini @@ -235,8 +235,8 @@ ico=58 x=68 y=68 [21] -name=CALC -path=CALC +name=CALC+ +path=CALCPLUS param= ico=4 x=204 diff --git a/data/ru_RU/settings/menu.dat b/data/ru_RU/settings/menu.dat index 33ba40721..b30d0589e 100644 --- a/data/ru_RU/settings/menu.dat +++ b/data/ru_RU/settings/menu.dat @@ -90,6 +90,7 @@ 59 Экранная клавиатура |zkey #10 **** Офис 16 Калькулятор |calc +16 Калькулятор+ |calcplus 03 Редактор Tinypad |tinypad 28 Редактор CodeEdit |develop/cedit 21 Табличный процессор |table diff --git a/programs/other/calcplus/Tupfile.lua b/programs/other/calcplus/Tupfile.lua index e6cab4f15..6e5ed9a6c 100644 --- a/programs/other/calcplus/Tupfile.lua +++ b/programs/other/calcplus/Tupfile.lua @@ -1,2 +1,5 @@ if tup.getconfig("NO_FASM") ~= "" then return end -tup.rule("calcplus.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "calcplus") +HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR") +tup.include(HELPERDIR .. "/use_fasm.lua") +tup.rule("calcplus.asm", FASM .. " -dlang=" .. tup.getconfig("LANG") .. " %f %o" .. tup.getconfig("KPACK_CMD"), "%B") + diff --git a/programs/other/calcplus/build.bat b/programs/other/calcplus/build.bat deleted file mode 100644 index 47c354cbd..000000000 --- a/programs/other/calcplus/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -@fasm calcplus.asm calc+ -@pause \ No newline at end of file diff --git a/programs/other/calcplus/calcplus.asm b/programs/other/calcplus/calcplus.asm index 8f328163f..eedb40637 100644 --- a/programs/other/calcplus/calcplus.asm +++ b/programs/other/calcplus/calcplus.asm @@ -1,668 +1,728 @@ - VERSION equ "0.5" +; SPDX-License-Identifier: GPL-2.0-only +; +; Calc+ - Multifunctional calculator +; Copyright (C) 2014-2025 KolibriOS team +; +; Contributor eAndrew - Main code +; Contributor Leency - Code refactoring and UX/UI update +; Contributor Burer - Code refactoring and UI update - use32 - org 0 - db 'MENUET01' - dd 1, main, dataend, memory, stacktop, 0, 0 +; ==================================================================== - include "../../proc32.inc" - include "../../macros.inc" - include "../../dll.inc" - include "../../develop/libraries/box_lib/trunk/box_lib.mac" - ; include "../../debug.inc" - include "parser.inc" +use32 +org 0 - ;=============================== +db 'MENUET01' +dd 1 +dd START +dd I_END +dd MEM +dd STACKTOP +dd 0, 0 - LIST_ITEM_SIZE equ 16 - LIST_ITEM_COUNT equ 6 - LIST_SIZE equ LIST_ITEM_SIZE * LIST_ITEM_COUNT - LIST_ITEM_COLOR1 equ dword [scn.btn_face] - LIST_ITEM_COLOR2 equ dword [scn.win_face] - LIST_ITEM_TEXT1 equ dword [scn.btn_text] - LIST_ITEM_TEXT2 equ dword [scn.win_text] - LIST_ITEM_Y equ LIST_ITEM_SIZE / 2 - 3 - - KEYB_SIZE equ 140 - - sz_cont db "Keyboard ", 0x10 - sz_head db "Calc+ v", VERSION, 0 - btn_clr db "" - buttons db "|%^*/-+)(=7894561230" - edb1 edit_box 0, 8, 12, 0, 0, 0, 0, 0, 480, \ - exp, group, ed_always_focus + ed_focus, 0, 0 - - imports: - library gui, "box_lib.obj" - import gui, editbox.draw, "edit_box", \ - editbox.key, "edit_box_key", \ - editbox.mouse, "edit_box_mouse" - - ;=============================== - - main: - mov [ans.buffer], dword "= 0" - mov [ans.size], 3 * 6 + 9 - - mcall 40, 100111b - ; mcall 48, 3, scn, 192 - - - m2m [edb1.color], [scn.gui_face] - m2m [edb1.shift_color], [scn.gui_select] - m2m [edb1.focus_border_color], [scn.gui_face] - m2m [edb1.text_color], [scn.gui_text] - - mcall 68, 11 - stdcall dll.Load, imports - - ;---------------------- - - update: - mcall 23, 5 - - cmp eax, EV_REDRAW - je ev_redraw - cmp eax, EV_KEY - je ev_key - cmp eax, EV_BUTTON - je ev_button - cmp eax, EV_MOUSE - je ev_mouse - - jmp update - - ;---------------------- - - ev_redraw: - mcall 12, 1 - - ; WINDOW - mov edx, [scn.win_face] - or edx, 0x34 shl 24 - mcall 0, <100, 236 + 100 - 50 - 25>, <100, 66 + LIST_SIZE>, , , sz_head - - ; TOOLBAR - mov ebx, 120 shl 16 + 64 - mcall 8, , <-17, 12>, 2 + 1 shl 30 - add ebx, 4 shl 16 - (64 + 14) - mcall 4, , [scn.win_title], sz_cont, 10 - - ; CONTENT - call draw_textbox - call draw_keyb - call draw_list - - mcall 12, 2 - - jmp update - - ;---------------------- - - ev_key: - mcall 2 - cmp ah, 27 - je exit - cmp ah, 13 - je calc - invoke editbox.key, edb1 - jmp update - - ;---------------------- - - ev_button: - mcall 17 - - ; EXIT - cmp ah, 1 - je exit - - ; DELETE - cmp ah, 4 - jne .not_del - cmp [edb1.pos], 0 - je update - mov eax, exp - add eax, [edb1.pos] - dec eax - mov ebx, exp - add ebx, [edb1.size] - inc ebx - @@: - cmp eax, ebx - je @f - mov cl, [eax + 1] - mov [eax], cl - inc eax - jmp @b - @@: - dec [edb1.pos] - dec [edb1.size] - m2m [edb1.shift], [edb1.pos] - jmp .redraw - .not_del: - - ; SHOW/HIDE KEYBOARD - cmp ah, 2 - jne .not_keyb - - cmp [keyb], byte 0 - je .open - - mov [keyb], 0 - mov [sz_cont + 9], byte 0x10 - mcall 67, -1, -1, 286 - 25, -1 - jmp update - - .open: - mov [keyb], 1 - mov [sz_cont + 9], byte 0x11 - mcall 67, -1, -1, 286 - 25 + KEYB_SIZE, -1 - jmp update - .not_keyb: - - ; CALCULATE - cmp ah, 19 - je calc - - ; LIST - cmp ah, 0x60 - jl .not_list - - sub ah, 0x60 - movzx ebx, ah - imul ebx, 512 - add ebx, history - add ebx, 482 - stdcall str_len, ebx - - mov edx, exp - add edx, [edb1.size] - add edx, eax - mov edi, exp - add edi, [edb1.pos] - @@: - cmp edx, edi - je @f - mov esi, edx - sub esi, eax - push eax - mov al, [esi] - mov [edx], al - pop eax - dec edx - jmp @b - @@: - add [edb1.size], eax - - @@: - cmp eax, 0 - je @f - mov cl, [ebx] - mov [edi], cl - inc edi - inc ebx - dec eax - inc [edb1.pos] - jmp @b - @@: - - jmp .redraw - .not_list: - - ; KEYBOARD - cmp ah, 10 - jl update - cmp ah, 50 - jg update - mov dh, ah - - mov ebx, exp - add ebx, [edb1.size] - mov ecx, exp - add ecx, [edb1.pos] - cmp dh, 30 - jl @f - add ebx, 2 - @@: - cmp ebx, ecx - je @f - mov dl, [ebx - 1] - mov [ebx], dl - dec ebx - jmp @b - @@: - - movzx eax, dh - add eax, buttons - sub eax, 10 - mov al, [eax] - - mov [ebx], al - inc [edb1.size] - inc [edb1.pos] - cmp dh, 30 - jl @f - add [edb1.size], 2 - add [edb1.pos], 2 - @@: - .redraw: - call draw_textbox - jmp update - - ;---------------------- - - ev_mouse: - mcall 2 - - invoke editbox.mouse, edb1 - jmp update - - ;---------------------- - - exit: - mcall -1 - - ;---------------------- - - calc: - stdcall parse - cmp [error_n], 0 - jne .error - - mov [ans.buffer], word "= " - - stdcall convert_to_str, eax, ans.buffer + 2 - add eax, 2 - mov edi, eax - imul eax, 6 - add eax, 9 - mov [ans.size], eax - - ; HISTORY - mov ecx, LIST_ITEM_COUNT - 1 - mov eax, history - add eax, (LIST_ITEM_COUNT - 1) * 512 - @@: - mov ebx, eax - sub ebx, 512 - stdcall str_cpy, ebx, eax - add ebx, 480 - add eax, 480 - stdcall str_cpy, ebx, eax - sub ebx, 480 - sub eax, 480 - mov esi, [ebx + 508] - mov [eax + 508], esi - sub eax, 512 - loop @b - - stdcall str_cpy, exp, history - stdcall str_cpy, ans.buffer, history + 480 - mov esi, [ans.size] - mov dword[history + 508], esi - not [his_even] - - ; Check length - mov esi, 37 - sub esi, edi - stdcall str_len, exp - sub esi, eax - cmp esi, 0 - jg .redraw - - mov ebx, history - add ebx, eax - add ebx, esi - mov [ebx], dword ".." - - jmp .redraw - - ; ERRORS - - .error: - cmp [error_n], 1 - je .err_1 - cmp [error_n], 4 - je .err_4 - - mov [ans.buffer + 0], dword "Expe" - mov [ans.buffer + 4], dword "cted" - mov [ans.buffer + 8], dword " ')'" - mov [ans.buffer + 12], byte 0 - mov [ans.size], 81 - - cmp [error_n], 2 - je .redraw - cmp [error_n], 3 - je .err_3 - cmp [error_n], 5 - je .err_5 - .err_1: - mov [ans.buffer + 0], dword "Div." - mov [ans.buffer + 4], dword " by " - mov [ans.buffer + 8], byte "0" - mov [ans.buffer + 9], byte 0 - mov [ans.size], 63 - jmp .redraw - .err_4: - mov [ans.buffer + 0], dword "Inpu" - mov [ans.buffer + 4], dword "t er" - mov [ans.buffer + 8], dword "rror" - mov [ans.buffer + 12], byte 0 - mov [ans.size], 81 - jmp .redraw - .err_3: - mov [ans.buffer + 10], byte "(" - jmp .redraw - .err_5: - mov [ans.buffer + 10], byte "|" - jmp .redraw - - .redraw: - call draw_textbox - call draw_list - jmp update - - ;---------------------- - - proc draw_button, x, y - mcall 8, <[x], 30>, <[y], 21>, [but_id], [but_c] - - mov ebx, [x] - mov esi, [txt_size] - imul esi, 3 - mov edi, 16 - sub edi, esi - add ebx, edi - shl ebx, 16 - add ebx, [y] - add ebx, 7 - mcall 4, , [but_tc], [txt_id], [txt_size] - - mov eax, [txt_size] - add [txt_id], eax - inc dword [but_id] - - ret - endp - - ;---------------------- - - proc draw_textbox - mcall 13, <4, 320 - 50 - 25>, < 8, 23>, [scn.gui_frame] - mov edx, [scn.gui_face] - cmp [error_n], 0 - je @f - mov edx, 0xFFAAAA - @@: - mcall 13, < 5, 318 - 50 - 25>, < 9, 21> - mcall , < 5, 318 - 50 - 25>, < 9, 1>, [scn.3d_face] - mcall , < 5, 1>, < 10, 20> - mcall , < 5, 318 - 50 - 25>, < 31, 1>, [scn.3d_light] - - mov ebx, 328 - 16 - 50 - 25 - sub ebx, [ans.size] - shl ebx, 16 - add ebx, 16 - mov ecx, [scn.gui_intext] - or ecx, 1 shl 31 - mcall 4, , , ans.buffer - - mov ecx, [scn.gui_text] - mcall , <310 - 50 - 25, 16>, , btn_clr, 1 - add ebx, 1 shl 16 - mcall - - mcall 8, <305 - 50 - 25, 17>, <9, 20>, 0x40000004 - - mcall 1, 4, 8, [scn.win_body] - mcall , 323 - 50 - 25 - mcall , , 30, [scn.3d_light] - mcall , 4 - - mov ebx, 318 - 16 - 50 - 25 - sub ebx, [ans.size] - cmp ebx, 24 - jg @f - mov ebx, 24 - @@: - mov [edb1.width], ebx - m2m [edb1.color], [scn.gui_face] - m2m [edb1.focus_border_color], [scn.gui_face] - cmp [error_n], 0 - je @f - mov [edb1.color], 0xFFAAAA - mov [edb1.focus_border_color], 0xFFAAAA - @@: - invoke editbox.draw, edb1 - - ret - endp - - ;---------------------- - - proc draw_keyb - cmp [keyb], byte 0 - je @f - - mov [txt_size], 1 - mov [but_id], 0x0000000A - mov [txt_id], buttons - - mov eax, [scn.win_face] - mov [but_c], eax - mov eax, [scn.win_text] - mov [but_tc], eax - stdcall draw_button, 4 + 278 - 25, 42 - 25 - 8 - stdcall draw_button, 37 + 278 - 25, 42 - 25 - 8 - stdcall draw_button, 70 + 278 - 25, 42 - 25 - 8 - stdcall draw_button, 103 + 278 - 25, 42 - 25 - 8 - stdcall draw_button, 103 + 278 - 25, 66 - 25 - 8 - stdcall draw_button, 103 + 278 - 25, 90 - 25 - 8 - stdcall draw_button, 103 + 278 - 25, 114 - 25 - 8 - stdcall draw_button, 70 + 278 - 25, 139 - 25 - 8 - stdcall draw_button, 37 + 278 - 25, 139 - 25 - 8 - - mov eax, [scn.btn_inface] - mov [but_c], eax - mov eax, [scn.btn_intext] - mov [but_tc], eax - stdcall draw_button, 103 + 278 - 25, 139 - 25 - 8 - - mov eax, [scn.btn_face] - mov [but_c], eax - mov eax, [scn.btn_text] - mov [but_tc], eax - stdcall draw_button, 4 + 278 - 25, 66 - 25 - 8 - stdcall draw_button, 37 + 278 - 25, 66 - 25 - 8 - stdcall draw_button, 70 + 278 - 25, 66 - 25 - 8 - stdcall draw_button, 4 + 278 - 25, 90 - 25 - 8 - stdcall draw_button, 37 + 278 - 25, 90 - 25 - 8 - stdcall draw_button, 70 + 278 - 25, 90 - 25 - 8 - stdcall draw_button, 4 + 278 - 25, 114 - 25 - 8 - stdcall draw_button, 37 + 278 - 25, 114 - 25 - 8 - stdcall draw_button, 70 + 278 - 25, 114 - 25 - 8 - stdcall draw_button, 4 + 278 - 25, 139 - 25 - 8 - - @@: - ret - endp - - ;---------------------- - - proc draw_list - ; BACKGROUND - mov edi, LIST_ITEM_COUNT - mov eax, 13 - mov ebx, 4 shl 16 + 320 - 50 - 25 - mov ecx, 37 shl 16 + LIST_ITEM_SIZE - mov edx, LIST_ITEM_COLOR1 - cmp [his_even], byte 0 - je @f - mov edx, LIST_ITEM_COLOR2 - @@: - mcall - add ecx, LIST_ITEM_SIZE shl 16 - cmp edx, LIST_ITEM_COLOR1 - je .set_color_to_2 - mov edx, LIST_ITEM_COLOR1 - jmp .next - .set_color_to_2: - mov edx, LIST_ITEM_COLOR2 - .next: - dec edi - cmp edi, 0 - jne @b - - ; BUTTONS - mov edi, LIST_ITEM_COUNT - mov eax, 8 - mov ebx, 4 shl 16 + 320 - 50 - 25 - mov ecx, 37 shl 16 + LIST_ITEM_SIZE - mov edx, 0x40000060 - @@: - mcall - add ecx, LIST_ITEM_SIZE shl 16 - inc edx - dec edi - cmp edi, 0 - jne @b - - ; TEXT - mov edi, LIST_ITEM_COUNT - mov eax, 4 - mov ebx, 8 shl 16 + 37 + LIST_ITEM_Y - mov ecx, LIST_ITEM_TEXT1 - cmp [his_even], byte 0 - je @f - mov ecx, LIST_ITEM_TEXT2 - @@: - or ecx, 1 shl 31 - mov edx, history - @@: - mcall - - push ebx - add ebx, (320 - 50 - 25) shl 16 - mov esi, [edx + 508] - shl esi, 16 - sub ebx, esi - add edx, 480 - mcall - pop ebx - - add edx, 32 - add ebx, LIST_ITEM_SIZE - - and ecx, 0xFFFFFF - cmp ecx, LIST_ITEM_TEXT2 - je .set_color_to_2_txt - mov ecx, LIST_ITEM_TEXT2 - jmp .next_txt - .set_color_to_2_txt: - mov ecx, LIST_ITEM_TEXT1 - .next_txt: - or ecx, 1 shl 31 - - dec edi - cmp edi, 0 - jne @b - - ret - endp - - ;---------------------- - - proc str_len uses ebx, str - xor eax, eax - mov ebx, [str] - @@: - cmp [ebx], byte 0 - je @f - inc eax - inc ebx - jmp @b - @@: - - ret - endp - - ;---------------------- - - proc str_cpy uses eax ebx ecx, from, to - mov eax, [from] - mov ebx, [to] - @@: - cmp [eax], byte 0 - je @f - mov cl, [eax] - mov [ebx], cl - inc eax - inc ebx - jmp @b - @@: - mov [ebx], byte 0 - ret - endp - - ;---------------------- - - dataend: - - ;=============================== - - rb 2048 - stacktop: - - exp rb 480 - exp_pos rd 1 - exp_lvl rd 1 - abs_lvl rd 1 - group rd 1 - - ans.buffer:rb 480 - ans.size rd 1 - error_n rd 1 - - timer rd 1 - but_id rd 1 - but_c rd 1 - but_tc rd 1 - txt_id rd 1 - txt_size rd 1 - keyb rb 1 - - his_even rb 1 - history rb 512 * LIST_ITEM_COUNT - rb 512 - -struc system_colors_internal { - .3d_face dd 0xCED0D0 - .3d_dark dd 0xD7D7D7 - .3d_light dd 0xFEFEFE - .win_title dd 0x2F2F2F - .win_body dd 0xE4DFE1 - .btn_face dd 0xEFEBEF - .btn_text dd 0x373C42 - .win_text dd 0x000000 - .panel_frame dd 0x94AECE - .win_face dd 0xE1E1E1 - .win_inface dd 0xE1E1E1 - .win_frame dd 0x204962 - .btn_inface dd 0xEFEBEF - .btn_intext dd 0xD0D9E8 - .btn_fctext dd 0x2D3135 - .gui_shadow dd 0xFFFFFF - .gui_face dd 0xFAF8FA - .gui_inface dd 0xF6F3F6 - .gui_fcface dd 0xFAF8FA - .gui_frame dd 0x7698C0 - .gui_text dd 0x373C42 - .gui_intext dd 0x5F5F5F - .gui_select dd 0xC7C9C9 -} - - scn system_colors_internal - - memory: +; ==================================================================== + +include "../../proc32.inc" +include "../../macros.inc" +include "../../KOSfuncs.inc" +include "../../encoding.inc" +include "../../dll.inc" +include "../../develop/libraries/box_lib/trunk/box_lib.mac" +include "parser.inc" + +imports: + + library gui, "box_lib.obj" + import gui, editbox.draw, "edit_box", \ + editbox.key, "edit_box_key", \ + editbox.mouse, "edit_box_mouse" + +; ==================================================================== + +LIST_X = 8 +LIST_Y = 47 +LIST_ITEM_H = 26 +LIST_ITEM_W = 295 +LIST_ITEM_COUNT = 8 +LIST_H = LIST_ITEM_H * LIST_ITEM_COUNT +LIST_TEXT_Y = LIST_ITEM_H / 2 - 8 + +KEYB_BTN_W = 37 +KEYB_BTN_H = 37 +GAP = 5 + +KEYBOARD_X = LIST_ITEM_W + 16 +KEYBOARD_Y = LIST_Y +KEYBOARD_W = 190 + +LIST_ITEM_TEXT1 equ dword [sc.work_text] +LIST_ITEM_TEXT2 equ dword [sc.work_text] + +WIN_X = 200 +WIN_Y = 200 +WIN_W = LIST_ITEM_W + KEYBOARD_W + 7 +WIN_H = LIST_H + 60 + +sz_head db "Calc+", 0 +btn_clr db "" ; "Enter" symbol, curved arrow in input area +buttons db "|%^*/-+)(=7894561230" +edb1 edit_box 0, 14, 12, 0xFFFFFF, 0x94AECE, 0xFFC90E, 0xCACACA, 0x10000000, \ + 480, exp, group, ed_always_focus + ed_focus, 0, 0 + +; ==================================================================== + +START: + mov [ans.buffer], dword " = 0" + mov [ans.size], 4 * 8 + 9 + + mcall SF_SET_EVENTS_MASK, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + + m2m [edb1.color], [scn.gui_face] + + mcall SF_SYS_MISC, SSF_HEAP_INIT + stdcall dll.Load, imports + +; ==================================================================== + +update: + mcall SF_WAIT_EVENT_TIMEOUT, 5 + + cmp eax, EV_REDRAW + je ev_redraw + + cmp eax, EV_KEY + je ev_key + + cmp eax, EV_BUTTON + je ev_button + + cmp eax, EV_MOUSE + je ev_mouse + + jmp update + +; ==================================================================== + +ev_redraw: + mcall SF_REDRAW, SSF_BEGIN_DRAW + mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc, sizeof.system_colors + + ; WINDOW + mov edx, [sc.work] + or edx, 0x34 shl 24 + + mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT + mov ecx, WIN_Y shl 16 + WIN_H + add ecx, eax + + mcall SF_GET_SCREEN_SIZE + shr eax, 16 + mov ebx, eax + sub ebx, WIN_W + shr ebx, 1 + + mcall 0, , , , , sz_head + + ; CONTENT + call draw_textbox + call draw_keyb + call draw_list + + mcall SF_REDRAW, SSF_END_DRAW + + jmp update + +; ==================================================================== + +ev_key: + mcall SF_GET_KEY + + cmp ah, 27 + je exit + + cmp ah, 13 + je calc + + invoke editbox.key, edb1 + + jmp update + +; ==================================================================== + +ev_button: + mcall SF_GET_BUTTON + + ; EXIT + cmp ah, 1 + je exit + + cmp ah, 250 + jne @f + mcall SF_FILE, f70_calc + jmp update + + ; DELETE + @@: + cmp ah, 4 + jne .not_del + + cmp [edb1.pos], 0 + je update + mov eax, exp + add eax, [edb1.pos] + dec eax + mov ebx, exp + add ebx, [edb1.size] + inc ebx + + @@: + cmp eax, ebx + je @f + mov cl, [eax + 1] + mov [eax], cl + inc eax + jmp @b + + @@: + dec [edb1.pos] + dec [edb1.size] + m2m [edb1.shift], [edb1.pos] + jmp .redraw + + .not_del: + + ; CALCULATE + cmp ah, 19 + je calc + + ; LIST + cmp ah, 0x60 + jl .not_list + + sub ah, 0x60 + movzx ebx, ah + imul ebx, 512 + add ebx, history + add ebx, 482 + stdcall str_len, ebx + + mov edx, exp + add edx, [edb1.size] + add edx, eax + mov edi, exp + add edi, [edb1.pos] + + @@: + cmp edx, edi + je @f + mov esi, edx + sub esi, eax + push eax + mov al, [esi] + mov [edx], al + pop eax + dec edx + jmp @b + + @@: + add [edb1.size], eax + + @@: + cmp eax, 0 + je @f + mov cl, [ebx] + mov [edi], cl + inc edi + inc ebx + dec eax + inc [edb1.pos] + jmp @b + + @@: + jmp .redraw + + .not_list: + + ; KEYBOARD + cmp ah, 10 + jl update + cmp ah, 50 + jg update + mov dh, ah + + mov ebx, exp + add ebx, [edb1.size] + mov ecx, exp + add ecx, [edb1.pos] + cmp dh, 30 + jl @f + add ebx, 2 + + @@: + cmp ebx, ecx + je @f + mov dl, [ebx - 1] + mov [ebx], dl + dec ebx + jmp @b + + @@: + movzx eax, dh + add eax, buttons + sub eax, 10 + mov al, [eax] + + mov [ebx], al + inc [edb1.size] + inc [edb1.pos] + cmp dh, 30 + jl @f + add [edb1.size], 2 + add [edb1.pos], 2 + + @@: + .redraw: + call draw_textbox + jmp update + +; ==================================================================== + +ev_mouse: + mcall SF_GET_KEY + + invoke editbox.mouse, edb1 + jmp update + +; ==================================================================== + +exit: + mcall SF_TERMINATE_PROCESS + +; ==================================================================== + +calc: + stdcall parse + cmp [error_n], 0 + jne .error + + mov [ans.buffer], dword " = " + + stdcall convert_to_str, eax, ans.buffer + 3 + add eax, 3 + mov edi, eax + imul eax, 8 ; char_w + add eax, 9 + mov [ans.size], eax + + ; HISTORY + mov ecx, LIST_ITEM_COUNT - 1 + mov eax, history + add eax, (LIST_ITEM_COUNT - 1) * 512 + + @@: + mov ebx, eax + sub ebx, 512 + stdcall str_cpy, ebx, eax + add ebx, 480 + add eax, 480 + stdcall str_cpy, ebx, eax + sub ebx, 480 + sub eax, 480 + mov esi, [ebx + 508] + mov [eax + 508], esi + sub eax, 512 + loop @b + + stdcall str_cpy, exp, history + stdcall str_cpy, ans.buffer, history + 480 + mov esi, [ans.size] + mov dword[history + 508], esi + + ; Check length + mov esi, 37 + sub esi, edi + stdcall str_len, exp + sub esi, eax + cmp esi, 0 + jg .redraw + + mov ebx, history + add ebx, eax + add ebx, esi + mov [ebx], dword ".." + + jmp .redraw + + ; ERRORS + .error: + cmp [error_n], 1 + je .err_1 + cmp [error_n], 4 + je .err_4 + + mov [ans.buffer + 0], dword "Expe" + mov [ans.buffer + 4], dword "cted" + mov [ans.buffer + 8], dword " ')'" + mov [ans.buffer + 12], byte 0 + mov [ans.size], 105 + + cmp [error_n], 2 + je .redraw + cmp [error_n], 3 + je .err_3 + cmp [error_n], 5 + je .err_5 + + .err_1: + mov [ans.buffer + 0], dword "Div." + mov [ans.buffer + 4], dword " by " + mov [ans.buffer + 8], byte "0" + mov [ans.buffer + 9], byte 0 + mov [ans.size], 81 + jmp .redraw + + .err_4: + mov [ans.buffer + 0], dword "Inpu" + mov [ans.buffer + 4], dword "t er" + mov [ans.buffer + 8], dword "rror" + mov [ans.buffer + 12], byte 0 + mov [ans.size], 105 + jmp .redraw + + .err_3: + mov [ans.buffer + 10], byte "(" + jmp .redraw + + .err_5: + mov [ans.buffer + 10], byte "|" + jmp .redraw + + .redraw: + + call draw_textbox + call draw_list + jmp update + +; ==================================================================== + +proc draw_textbox + + ; border + mcall SF_DRAW_RECT, , < 8, 30>, [sc.work_graph] + + ; background + mov edx, [scn.gui_face] + cmp [error_n], 0 + je @f + mov edx, 0xFFAAAA + + @@: + mcall SF_DRAW_RECT, , < 9, 28> + mcall , , < 9, 1>, [scn.gui_tb_in_shd] + mcall , , < 10, 27> + + mov ebx, LIST_X + LIST_ITEM_W - 12 + sub ebx, [ans.size] + shl ebx, 16 + add ebx, 16 + mov ecx, [scn.gui_intext] + add ecx, 0x10000000 + or ecx, 1 shl 31 + mcall SF_DRAW_TEXT, , , ans.buffer + + mcall , , [scn.gui_intext], btn_clr, 1 + add ebx, 1 shl 16 + mcall + + mcall SF_DEFINE_BUTTON, , <9, 27>, 4 + BT_HIDE + + mov ebx, LIST_ITEM_W - 18 + sub ebx, [ans.size] + cmp ebx, 24 + jg @f + mov ebx, 24 + + @@: + mov [edb1.width], ebx + m2m [edb1.color] , [scn.gui_face] + m2m [edb1.focus_border_color], [scn.gui_face] + cmp [error_n], 0 + je @f + mov [edb1.color] , 0x00FFAAAA + mov [edb1.focus_border_color], 0x00FFAAAA + + @@: + invoke editbox.draw, edb1 + ret + +endp + +; ==================================================================== + +proc draw_button, x, y + + mcall SF_DEFINE_BUTTON, <[x], KEYB_BTN_W>, <[y], KEYB_BTN_H>, [but_id], [but_c] + + mov ebx, [x] + add ebx, KEYB_BTN_W/2-4 + + shl ebx, 16 + add ebx, [y] + add ebx, KEYB_BTN_H/2 - 6 + or [but_tc], 0x01000000 ; use bigger font + mcall SF_DRAW_TEXT, , [but_tc], [txt_id], [txt_size] + + mov eax, [txt_size] + add [txt_id], eax + inc dword [but_id] + + ret + +endp + +; ==================================================================== + +proc draw_keyb + + mcall SF_DEFINE_BUTTON, , <8, 29>, 250, [sc.work_light] + mov ecx, [sc.work_text] + or ecx, 0x10000000 + mcall SF_DRAW_TEXT, <(KEYB_BTN_W + GAP - engineering_len*2)*2 - GAP/2 + KEYBOARD_X, KEYB_BTN_H / 2 - 10 + 8>, , engineering_str, engineering_len + + mov [txt_size], 1 + mov [but_id], 0x0000000A + mov [txt_id], buttons + + m2m [but_c], [sc.work] + m2m [but_tc], [sc.work_text] + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*1 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 + + mov [but_c] , 0x00F0969D + mov [but_tc], 0x00FFFFFF + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*3, KEYBOARD_Y +(KEYB_BTN_H + GAP)*4 + + m2m [but_c] , [sc.work_button] + m2m [but_tc], [sc.work_button_text] + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + KEYB_BTN_H + GAP + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + KEYB_BTN_H + GAP + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + KEYB_BTN_H + GAP + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*2 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*1, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*2, KEYBOARD_Y + (KEYB_BTN_H + GAP)*3 + stdcall draw_button, KEYBOARD_X + (KEYB_BTN_W + GAP)*0, KEYBOARD_Y + (KEYB_BTN_H + GAP)*4 + + ret + +endp + +; ==================================================================== + +proc draw_list + + ; BACKGROUND + mov eax, SF_DRAW_RECT + mov ebx, LIST_X shl 16 + LIST_ITEM_W + mov ecx, LIST_Y shl 16 + LIST_ITEM_H + mov edx, [sc.work_light] + mov edi, LIST_ITEM_COUNT + + @@: + mcall + ; draw separator { + push ecx edx + sub ecx, LIST_ITEM_H - 1 + mov edx, [sc.work_dark] + mcall + ; } + pop edx ecx + add ecx, LIST_ITEM_H shl 16 + + .next: + dec edi + cmp edi, 0 + jne @b + + mcall , , , [sc.work_dark] + mcall , , + mcall , , + + ; BUTTONS + mov eax, SF_DEFINE_BUTTON + mov ebx, LIST_X shl 16 + LIST_ITEM_W + mov ecx, 43 shl 16 + LIST_ITEM_H + mov edx, 60 + BT_HIDE + mov edi, LIST_ITEM_COUNT + + @@: + mcall + add ecx, LIST_ITEM_H shl 16 + inc edx + dec edi + cmp edi, 0 + jne @b + + ; TEXT + mov eax, SF_DRAW_TEXT + mov ebx, (LIST_X + LIST_X) shl 16 + LIST_Y + LIST_TEXT_Y + 1 + mov ecx, [sc.work_text] + mov edi, LIST_ITEM_COUNT + + @@: + or ecx, 1 shl 31 + mov edx, history + + @@: + add ecx, 0x10000000 + mcall + + push ebx + add ebx, (LIST_ITEM_W - 8) shl 16 + mov esi, [edx + 508] + shl esi, 16 + sub ebx, esi + add edx, 480 + mcall + pop ebx + + add edx, 32 + add ebx, LIST_ITEM_H + + and ecx, 0xFFFFFF + cmp ecx, LIST_ITEM_TEXT2 + je .set_color_to_2_txt + mov ecx, LIST_ITEM_TEXT2 + jmp .next_txt + + .set_color_to_2_txt: + mov ecx, LIST_ITEM_TEXT1 + + .next_txt: + or ecx, 1 shl 31 + + dec edi + cmp edi, 0 + jne @b + + ret + +endp + +; ==================================================================== + +proc str_len uses ebx, str + + xor eax, eax + mov ebx, [str] + + @@: + cmp [ebx], byte 0 + je @f + inc eax + inc ebx + jmp @b + + @@: + ret + +endp + +; ==================================================================== + +proc str_cpy uses eax ebx ecx, from, to + + mov eax, [from] + mov ebx, [to] + + @@: + cmp [eax], byte 0 + je @f + mov cl, [eax] + mov [ebx], cl + inc eax + inc ebx + jmp @b + + @@: + mov [ebx], byte 0 + ret + +endp + +; ==================================================================== + +if lang eq ru_RU + + engineering_str cp866 "╨Ш╨╜╨╢╨╡╨╜╨╡╤А╨╜╤Л╨╣ ╤А╨╡╨╢╨╕╨╝" + engineering_len = $ - engineering_str + +else if lang eq es_ES + + engineering_str db " Modo ingeniero " + engineering_len = $ - engineering_str +else + + engineering_str db "Engineering calc" + engineering_len = $ - engineering_str + +endf + +; ==================================================================== + +f70_calc: + dd SSF_START_APP + dd 0 + dd 0 + dd 0 + dd 0 + db '/sys/calc', 0 + +; system colors internal +scn: + .gui_tb_in_shd dd 0x00CED0D0 + .gui_face dd 0x00FAF8FA + .gui_text dd 0x10373C42 + .gui_intext dd 0x005F5F5F + .gui_select dd 0x00C7C9C9 + +; ==================================================================== + +I_END: + +rb 2048 + +STACKTOP: + +exp rb 480 +exp_pos rd 1 +exp_lvl rd 1 +abs_lvl rd 1 +group rd 1 + +ans.buffer: rb 480 +ans.size rd 1 +error_n rd 1 + +timer rd 1 +but_id rd 1 +but_c rd 1 +but_tc rd 1 +txt_id rd 1 +txt_size rd 1 + +history rb 512 * LIST_ITEM_COUNT + rb 512 + +sc system_colors + +MEM: