Bugfixes related to scrolling of the text.

git-svn-id: svn://kolibrios.org@4621 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2014-03-08 17:31:33 +00:00
parent fd5287e58e
commit 83400f932d
3 changed files with 40 additions and 39 deletions

View File

@ -13,7 +13,7 @@
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
version equ '0.17'
version equ '0.18'
; connection status
STATUS_DISCONNECTED = 0
@ -313,9 +313,10 @@ button:
je exit
mov [window_active], edx
mov [scroll2.position], 1 ;;; FIXME
call draw_window
push [edx + window.text_line_print]
pop [scroll2.position]
call draw_window
jmp mainloop
exit:
@ -517,10 +518,6 @@ sockaddr1:
status dd STATUS_DISCONNECTED
textbox_height dd 12 ; in characters
textbox_width dd 78 ; in characters, not pixels ;)
window_active dd windows
window_print dd windows
@ -572,6 +569,9 @@ xsize dd ?
ysize dd ?
mouse_dd dd ?
textbox_height dd ? ; in characters
textbox_width dd ? ; in characters, not pixels ;)
colors system_colors
irc_server_name rb MAX_SERVER_NAME ; TODO: move this server URL into window struct
@ -581,7 +581,6 @@ user_nick rb MAX_NICK_LEN
user_real_name rb MAX_REAL_LEN
quit_msg rb 250
diff16 "windows", 0, $ + 1*sizeof.window ;+ 6
windows rb MAX_WINDOWS*sizeof.window
IM_END:

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
@ -35,10 +35,7 @@ text_insert_newlines: ; esi = ASCIIZ string
inc edx
jmp .next_line
.soft_nl:
inc edx
mov byte[esi-1], ' '
mov ebx, esi
jmp .more
.space:
mov ebx, esi ; last detected space
jmp .more
@ -62,9 +59,9 @@ text_nextline:
mov ecx, [textbox_width]
.loop:
cmp byte[esi], 0
je .done
lodsb
test al, al
jz .done
cmp al, 10
je .done
cmp al, 13
@ -132,7 +129,6 @@ print_character:
ret
.uh_ow:
pusha
mov edi, [esi + window.text_start]
mov [esi + window.text_print], edi
@ -165,13 +161,20 @@ draw_channel_text:
add [edi + window.text_lines], edx
mov [edi + window.text_scanned], esi
; should we scroll up/down some lines ? ; TODO: only scroll down automatically when scrollbar is at lowest position ?
; Is scrollbar at lowest position?
mov edx, [scroll2.position]
test edx, edx
jz .yesscroll
add edx, [scroll2.cur_area]
sub edx, [scroll2.max_area]
jne .noscroll
.yesscroll:
; Scrollbar was at lowest position, scroll down automatically when new text arrived.
mov edx, [edi + window.text_lines]
sub edx, [textbox_height]
jle .noscroll ; There are less lines of text than fit into the window, dont scroll..
sub edx, [edi + window.text_line_print]
je .noscroll ; We are already at the bottom pos, dont scroll..
.scroll_to_pos: ; edx = number of lines to go up/down (flags must indicate direction)
pushf
add [edi + window.text_line_print], edx
@ -179,12 +182,13 @@ draw_channel_text:
popf
ja .loop_forward
std ; set direction flag so we can scan backwards
dec esi
dec esi ; move our cursor just in front of newline, for scanning backwards
dec edx ;;;;; FIXME: this seems to be needed, but why ???
.loop_backward:
call text_nextline
inc edx
jnz .loop_backward
inc esi
inc esi ; move the cursor just after last newline
cld
jmp .ok
@ -197,22 +201,25 @@ draw_channel_text:
mov [edi + window.text_print], esi
.noscroll:
mov edx, [edi + window.text_print]
; Calculate start coordinates (align text to bottom)
; Calculate start offset coordinates (align text to bottom)
mov ebx, [textbox_height]
sub ebx, [edi + window.text_lines]
jae @f
xor ebx, ebx
@@:
jb .no_offset
imul ebx, FONT_HEIGHT
add ebx, TEXT_X shl 16 + TEXT_Y
push [edi + window.text_start]
pop [edi + window.text_print]
jmp .draw_text
.no_offset:
xor ebx, ebx
.draw_text:
; Prepare to actually draw some text
mov eax, [textbox_height] ; max number of lines to draw
add ebx, TEXT_X shl 16 + TEXT_Y
mov ecx, [colors.work_text] ; default text color
mov edx, [edi + window.text_print]
.drawloop:
cmp byte[edx], 0
je .end
je .end_of_text
; Clear one row of characters
pusha
@ -230,7 +237,7 @@ draw_channel_text:
add esi, [textbox_width]
.line:
cmp byte[edx], 0
je .end
je .end_of_text
cmp byte[edx], 13
je .newline_soft
@ -274,27 +281,23 @@ draw_channel_text:
add ebx, TEXT_X shl 16 + FONT_HEIGHT
dec eax
jnz .drawloop
.end_of_text:
; take care of the scrollbar
.scrollbar:
; Update and draw scrollbar when nescessary
mov edi, [window_active]
mov edx, [edi + window.text_lines]
cmp edx, [textbox_height]
ja .draw_scroll
mov [scroll2.position], 0 ; disable scrollbar
jmp .scroll_done
jbe .scroll_done
.draw_scroll:
mov [scroll2.max_area], edx
mov eax, [edi + window.text_line_print]
mov [scroll2.position], eax
push dword scroll2 ; redraw scrollbar
call [scrollbar_draw]
mov [scroll2.all_redraw], 0 ; next time, dont redraw it completely
.scroll_done:
.end:
ret
@ -310,9 +313,8 @@ dec_to_esi:
cmp al, 9
ja .done
inc edx
shl esi, 1 ; esi * 2
lea esi, [esi + 4*esi] ; esi * 5
add esi, eax
lea esi, [esi*4 + esi] ; esi * 5
lea esi, [esi*2 + eax] ; esi * 2 + eax
jmp .loop
.done:
cmp esi, 16

View File

@ -37,7 +37,7 @@ window_create_textbox:
mov [ebx + window.data_ptr], eax
mov [ebx + window.flags], 0
add eax, window_data.text+1 ; let text begin at offset 1, this way the text will be prepended with a 0
add eax, window_data.text+2 ; let text begin at offset 2, this way the text will be prepended with two null bytes
mov [ebx + window.text_start], eax
mov [ebx + window.text_print], eax
mov [ebx + window.text_write], eax