Subversion Repositories Kolibri OS

Rev

Rev 2249 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6972 IgorA 1
; элемент Optionbox для библиотеки box_lib.obj
2
; на код применена GPL2 лицензия
3
; файл создан 13.02.2009 
4
; последняя модификация 12.09.2017 IgorA
1032 Lrz 5
 
6972 IgorA 6
align 16
1032 Lrz 7
option_box_draw:
6972 IgorA 8
	pusha
1032 Lrz 9
 
6972 IgorA 10
	mov   eax,dword[esp+36]
11
@@:
12
	mov   edi,dword[eax]
13
	test  edi,edi
14
	je    option_check
15
	call  option_box_draw_box
16
	add   eax,4
17
	jmp   @b
1032 Lrz 18
 
19
option_check:
6972 IgorA 20
	mov   eax,dword[esp+36]
21
@@:
22
	mov   edi,dword[eax]
23
	test  edi,edi
24
	je    @f
1032 Lrz 25
 
6972 IgorA 26
	mov   ebx,dword[edi]
27
	mov   ebx,dword[ebx]
28
	cmp   edi,ebx
29
	jne   .clear_op
30
 
31
	pusha
32
	call  option_box_draw_op
33
	popa
34
	add   eax,4
35
	jmp   @b
36
 
1032 Lrz 37
.clear_op:
6972 IgorA 38
	pusha
39
	call  option_box_clear_op
40
	popa
41
	add   eax,4
42
	jmp   @b
1032 Lrz 43
 
6972 IgorA 44
@@:
45
	popa
46
	ret 4
1032 Lrz 47
 
48
 
6972 IgorA 49
align 16
1032 Lrz 50
option_box_mouse:
6972 IgorA 51
	pusha
52
	mcall SF_MOUSE_GET,SSF_BUTTON
53
	test  eax,eax
54
	jnz @f
1227 mario79 55
	popa
6972 IgorA 56
	ret 4
57
 
1227 mario79 58
@@:
6972 IgorA 59
	mov   eax,dword[esp+36]
60
@@:
61
	mov   edi,dword[eax]
62
	test  edi,edi
63
	je    option_check
64
	call  option_box_mouse_op
65
	add   eax,4
66
	jmp   @b
1032 Lrz 67
 
6972 IgorA 68
align 16
1032 Lrz 69
option_box_draw_box:
6972 IgorA 70
	pusha   ;сохраним все регистры
1032 Lrz 71
 
6972 IgorA 72
	movzx ebx,word op_left
73
	shl   ebx,16
74
	add   ebx,dword op_size
75
	movzx ecx,word op_top
76
	shl   ecx,16
77
	add   ecx,dword op_size
78
	mcall SF_DRAW_RECT,,,op_border_color ;рисуем рамку
1032 Lrz 79
 
6972 IgorA 80
	add   ebx,1 shl 16 - 2
81
	add   ecx,1 shl 16 - 2
82
	mcall ,,,op_color ;закрашиваем внутренности чекбокса
1032 Lrz 83
 
6972 IgorA 84
;	mov   eax,dword option_group
85
;	mov   eax,[eax]
86
;	cmp   eax,edi
87
;	jne   @f
88
;	call  option_box_draw_op  ;нарисовать включенный чек бокс
1032 Lrz 89
 
6972 IgorA 90
 
1032 Lrz 91
;----------------------------
1432 mario79 92
;расчет куда будет произведен вывод текста
1032 Lrz 93
;----------------------------
6972 IgorA 94
@@:
95
	movzx ebx,word op_left ;загрузить значение х для чек бокса
96
	add   ebx,dword op_size
97
	add   ebx,dword op_text_margin ;добавить размер стороны и расстояние на котором начнется вывод текста
98
	shl   ebx,16       ;сдвинем на 16 разрядов в лево (умножим на 65536)
99
	mov   bx,word op_top ;загрузим значение по y
100
	mov   eax,op_size
101
	shr   eax,1
102
	add   eax,4
103
	add   ebx,eax
104
	sub   ebx,7        ;добавим значение длины стороны -9+2
105
	mov   esi,dword op_text_length
106
	mcall SF_DRAW_TEXT,,op_text_color,op_text_ptr ;Вывод надписи на канву
107
	popa               ;восстановить значения регистров из стека
108
	ret                ;выйдем из процедуры
1032 Lrz 109
 
6972 IgorA 110
option_box_clear_op:   ;очистка чек бокса
111
	mov   edx,dword op_color ;цвет внутри чек бокса
112
	jmp   @f         ;безусловный прыжок на нижнюю метку @@
1032 Lrz 113
 
114
 
6972 IgorA 115
option_box_draw_op:    ;нарисовать включенный чек бокс
116
	mov   edx,dword op_border_color ;загрузить цвет
1032 Lrz 117
@@:
6972 IgorA 118
	movzx ebx,word op_left ;загрузить координату по х
119
	mov   eax,dword op_size
120
	mov   bp,ax
121
	shr   eax,2
122
	push  ax
1032 Lrz 123
 
6972 IgorA 124
	push  ax
125
	add   ebx,eax
126
	shl   ebx,16       ;сдвинем на 16 разрядов в лево (умножим на 65536)
127
	pop   ax
128
	lea   eax,[eax*2]
129
	sub   bp,ax        ;сохраним регистр bx в регистре указателя базы
130
	mov   bx,bp
1032 Lrz 131
 
6972 IgorA 132
	movzx ecx,word op_top ;загрузить координату по у
133
	pop   ax
134
	add   cx,ax
135
	shl   ecx,16       ;сдвинем на 16 разрядов в лево (умножим на 65536)
136
	mov   cx,bp        ;загрузим значения регистра указателя базы в cx
137
	mcall SF_DRAW_RECT ;вывод полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
138
	ret                ;выйти из процедуры
1032 Lrz 139
 
6972 IgorA 140
 
1032 Lrz 141
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1432 mario79 142
;Обработчик mouse
1032 Lrz 143
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6972 IgorA 144
align 16
1432 mario79 145
option_box_mouse_op:                 ;обработка мыши
1032 Lrz 146
pusha
6972 IgorA 147
	mov   esi,dword op_text_length ;загрузить кол-во символов в текстовой строке
148
	imul  esi,6                ;или можно и так умножить на 6
149
	add   esi,dword op_text_margin ;добавить 3 - расстояние от чек бокса до надписи
1032 Lrz 150
 
6972 IgorA 151
	mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;получить координаты курсора относительно окна
1032 Lrz 152
 
6972 IgorA 153
	movzx ebx,word op_top      ;загрузить в bx значение координаты у
154
	cmp   ax,bx                ;сравнить с с координатой курсора
155
	jl    option_box_mouse_end ;SF <> OF если меньше
156
	add   ebx,dword op_size    ;добавить размер
157
	cmp   ax,bx                ;сравнить
158
	jg    option_box_mouse_end ;ZF = 0 и SF = OF если больше
159
 
160
	shr   eax,16               ;разделим на 65536 или просто сдвинем биты на 16 значений
161
	movzx ebx,word op_left     ;произведем аналогичное сравнение
162
	cmp   ax,bx                ;сравнить регистры
163
	jl    option_box_mouse_end ;если меньше
164
	add   ebx,dword op_size    ;добавить длину стороны прямоугольника
165
	add   ebx,esi              ;Учесть в значении по х еще и длину надписи к чекбоксу
166
	cmp   ax,bx                ;стравнить регистры
167
	jg    option_box_mouse_end ;если больше
168
	mov   eax,dword option_group
169
	mov   [eax],edi
170
 
1032 Lrz 171
option_box_mouse_end:
6972 IgorA 172
	popa                         ;восстановить регистры из стека
173
	ret                          ;выйти