Rev 6706 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6689 | siemargl | 1 | ; ---------------------------------------------------------------------------- ; |
2 | ; Tooltip widget |
||
3 | ; |
||
4 | ; Created by Siemargl, 2016 |
||
5 | ; |
||
6 | ; Changelist |
||
7 | ; 161107 - initial version + test |
||
8 | |||
9 | |||
10 | ; http://stackoverflow.com/questions/8976600/fasm-how-to-send-struct-to-proc |
||
11 | virtual at edi |
||
12 | ttip tooltip ?, ?, ?, ?, ?, ?, ?, ?, ? |
||
13 | end virtual |
||
14 | |||
15 | ; ---------------------------------------------------------------------------- ; |
||
16 | ; инициализация всей цепочки тултипов, формирование размеров и буферов памяти |
||
17 | ; return eax zero if fails |
||
18 | align 16 |
||
19 | proc tooltip_init uses esi edi, ttip:dword |
||
20 | locals |
||
21 | max_len dw ? ;maximum chars in line |
||
22 | lines dw ? ;lines in tooltip |
||
23 | endl |
||
24 | |||
25 | mov edi, [ttip] |
||
26 | jmp .tail_call |
||
27 | .list_next: |
||
28 | ; init statics |
||
29 | mov [ttip.mouse], 0 |
||
30 | mov [ttip.tm_strt], 0 |
||
31 | mov [ttip.video_y], 0 |
||
32 | mov [ttip.video_x], 0 |
||
33 | mov [ttip.video], 0 |
||
34 | stdcall get_font_size, [ttip.col_txt] |
||
35 | mov [ttip.font_sz], eax |
||
36 | |||
37 | ; count num of lines and max len |
||
38 | mov esi, [ttip.txt] |
||
39 | mov [lines], 1 ; lines |
||
40 | mov [max_len], 0 ; max_len |
||
41 | .line: |
||
42 | mov ecx, 0 ; len |
||
43 | .symb: |
||
44 | mov al, [esi] |
||
45 | cmp al, 0 |
||
46 | je .eos |
||
47 | cmp al, 13 |
||
48 | jne .next |
||
49 | inc [lines] |
||
50 | inc esi |
||
51 | cmp cx, [max_len] ; detect max |
||
52 | jle @f |
||
53 | mov [max_len], cx |
||
54 | @@: |
||
55 | jmp .line |
||
56 | .next: |
||
57 | inc ecx |
||
58 | inc esi |
||
59 | jmp .symb |
||
60 | .eos:; string ended, we have correct width and hight |
||
61 | cmp cx, [max_len] ; detect max |
||
62 | jle @f |
||
63 | mov [max_len], cx |
||
64 | @@: |
||
65 | |||
66 | mov eax, [ttip.font_sz] |
||
67 | shr eax, 16 |
||
68 | imul [max_len] |
||
69 | mov dx, ax ; width in pixels |
||
70 | mov [ttip.video_w], ax |
||
71 | mov eax, [ttip.font_sz] ; lo word == h |
||
72 | and eax, $FFFF |
||
73 | imul ax, [lines] |
||
74 | mov [ttip.video_h], ax |
||
75 | imul [ttip.video_w] |
||
76 | imul eax, 3 ; eax have now width * height in pixels *3 |
||
77 | ; getmem |
||
78 | invoke mem.alloc, eax |
||
79 | mov [ttip.video], eax |
||
80 | test eax, eax |
||
81 | je .exitp ; malloc fails |
||
82 | |||
83 | ; cycle list |
||
84 | mov edi, [ttip.next] |
||
85 | .tail_call: |
||
86 | test edi, edi |
||
87 | jne .list_next |
||
88 | xor eax, eax |
||
6706 | siemargl | 89 | inc eax ; good return |
6689 | siemargl | 90 | .exitp: |
91 | ret |
||
92 | endp |
||
93 | |||
94 | ; ---------------------------------------------------------------------------- ; |
||
95 | ; очистка памяти всей цепочки тултипов |
||
96 | align 4 |
||
97 | proc tooltip_delete uses edi, ttip:dword |
||
98 | mov edi, [ttip] |
||
99 | jmp .tail_call |
||
100 | .list_next: |
||
101 | mov eax, [ttip.video] |
||
102 | test eax, eax |
||
103 | je @f |
||
104 | invoke mem.free, eax |
||
105 | @@: |
||
106 | mov edi, [ttip.next] |
||
107 | .tail_call: |
||
108 | test edi, edi |
||
109 | jne .list_next |
||
110 | ret |
||
111 | endp |
||
112 | |||
113 | ; ---------------------------------------------------------------------------- ; |
||
114 | ; показ нужного из всей цепочки тултипов при бездействии (event 0) |
||
115 | align 4 |
||
116 | proc tooltip_test_show uses edi ebx, ttip:dword |
||
117 | mov edi, [ttip] |
||
118 | jmp .tail_call |
||
119 | .list_next: |
||
120 | cmp [ttip.tm_strt], 0 ; таймер 0, значит мы не в зоне |
||
121 | je .nextp |
||
122 | cmp [ttip.video_y], 0 ; тултип уже отображен |
||
123 | ;;; jne .redraw |
||
124 | jne .nextp |
||
125 | mcall SF_SYSTEM_GET, SSF_TIME_COUNT |
||
126 | movzx ebx, [ttip.tm_wait] |
||
127 | sub eax, ebx |
||
128 | cmp eax, [ttip.tm_strt] |
||
129 | jl .exitp ; мог быть только один |
||
130 | ; время оттикало, сохраняем область и рисуемся |
||
131 | ;CopyScreen(shadow_buf, 5*skinned+x+wForm.left, GetSkinHeight()*skinned+y+wForm.top, w, h); |
||
132 | mcall SF_THREAD_INFO, proc_info, -1 |
||
133 | movzx edx, word [proc_info + 34] ; window x position |
||
134 | add edx, 5 |
||
135 | shl edx, 16 |
||
136 | mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT |
||
137 | movzx ebx, word [proc_info + 38] ; window y position |
||
138 | add eax, ebx |
||
139 | add edx, eax ; x_y |
||
140 | add edx, [ttip.mouse] |
||
141 | add edx, 20 ; pixels below mouse |
||
142 | mov ecx, dword [ttip.video_h] ; w_h |
||
143 | mcall SF_GET_IMAGE, [ttip.video] |
||
144 | |||
145 | mov eax, [ttip.mouse] ; сохраним позицию где рисуемся |
||
146 | add eax, 20 ; pixels below mouse |
||
147 | mov [ttip.video_y], ax |
||
148 | shr eax, 16 |
||
149 | mov [ttip.video_x], ax |
||
150 | .redraw: ; рисуемся относительно мыши!!! |
||
151 | stdcall tooltip_draw, edi |
||
152 | |||
153 | jmp .exitp ; мог быть только один |
||
154 | .nextp: |
||
155 | mov edi, [ttip.next] |
||
156 | .tail_call: |
||
157 | test edi, edi |
||
158 | jne .list_next |
||
159 | .exitp: |
||
160 | ret |
||
161 | endp |
||
162 | |||
163 | ; рисуемся относительно мыши!!! |
||
164 | ; internal func |
||
165 | proc tooltip_draw uses esi edi ebx, ttip:dword |
||
166 | locals |
||
167 | line dw ? ;line # drawing |
||
168 | ptr_li dd ? ;line begin |
||
169 | endl |
||
170 | mov edi, [ttip] |
||
171 | ; draw square |
||
172 | movzx ebx, [ttip.video_x] |
||
173 | shl ebx, 16 |
||
174 | mov bx, [ttip.video_w] |
||
175 | movzx ecx, [ttip.video_y] |
||
176 | shl ecx, 16 |
||
177 | mov cx, [ttip.video_h] |
||
178 | mcall SF_DRAW_RECT, , , [ttip.col_bkg] |
||
179 | |||
180 | ; цикл по строкам |
||
181 | ; count num of lines and max len |
||
182 | mov esi, [ttip.txt] |
||
183 | mov [line], 0 ; line # |
||
184 | .line: |
||
185 | mov ecx, 0 ; len |
||
186 | mov [ptr_li], esi |
||
187 | .symb: |
||
188 | mov al, [esi] |
||
189 | cmp al, 0 |
||
190 | je @f |
||
191 | cmp al, 13 |
||
192 | jne .next |
||
193 | @@: |
||
194 | ; draw line if len > 0 |
||
195 | test ecx, ecx |
||
196 | je @f |
||
197 | ; draw single line |
||
198 | pushad |
||
199 | mov esi, ecx ; length |
||
200 | movzx ebx, [ttip.video_x] |
||
201 | shl ebx, 16 |
||
202 | mov eax, [ttip.font_sz] |
||
203 | and eax, $FFFF |
||
204 | imul ax, [line] |
||
205 | add ax, [ttip.video_y] |
||
206 | add ebx, eax |
||
207 | mov ecx, [ttip.col_txt] |
||
208 | and ecx, $37FFFFFF |
||
209 | mov edx, [ptr_li] |
||
210 | mcall SF_DRAW_TEXT |
||
211 | popad |
||
212 | @@: |
||
213 | cmp byte ptr esi, 0 |
||
214 | je .exitp |
||
215 | inc [line] |
||
216 | inc esi |
||
217 | jmp .line |
||
218 | .next: |
||
219 | inc ecx |
||
220 | inc esi |
||
221 | jmp .symb |
||
222 | .exitp: |
||
223 | ret |
||
224 | endp |
||
225 | |||
226 | ; ---------------------------------------------------------------------------- ; |
||
227 | ; убрать тултипы при щелчке мыши или съезде из зоны. для всей цепочки тултипов при событии мыши |
||
228 | ; если mouse_coord == -1 опросит мышь |
||
229 | align 4 |
||
230 | proc tooltip_mouse, ttip:dword |
||
231 | locals |
||
232 | mouse_coord dd ? |
||
233 | mouse_but dd ? |
||
234 | endl |
||
235 | pushad |
||
236 | ; опросим мышь и рассуем по тултипам |
||
237 | mcall SF_MOUSE_GET, SSF_WINDOW_POSITION |
||
238 | mov [mouse_coord], eax |
||
239 | mcall SF_MOUSE_GET, SSF_BUTTON |
||
240 | mov [mouse_but], eax |
||
241 | mov edi, [ttip] |
||
242 | .list_next: |
||
243 | test edi, edi |
||
244 | je .exitp |
||
245 | cmp [mouse_but], 0 ; при щелчке стираемся |
||
246 | jne @f |
||
247 | ; попадаем ли в зону контроля |
||
248 | mov eax, [mouse_coord] |
||
249 | mov [ttip.mouse], eax ; место где была замечена мышь! (хз зачем) |
||
250 | mov ecx, eax |
||
251 | shr ecx, 16 |
||
252 | cmp cx, [ttip.zone_x] ; zone_x is higher word |
||
253 | jl @f |
||
254 | cmp ax, [ttip.zone_y] |
||
255 | jl @f |
||
256 | mov cx, [ttip.zone_w] |
||
257 | add cx, [ttip.zone_x] |
||
258 | shl ecx, 16 |
||
259 | cmp eax, ecx ; x+w < mouse_x (mouse_y in low word ignored) |
||
260 | jge @f |
||
261 | mov cx, [ttip.zone_y] |
||
262 | add cx, [ttip.zone_h] |
||
263 | cmp ax, cx |
||
264 | jge @f |
||
265 | ; мы в зоне - засекаем старт, если его не было |
||
266 | cmp [ttip.tm_strt], 0 |
||
267 | jne .nextp |
||
268 | mcall SF_SYSTEM_GET, SSF_TIME_COUNT |
||
269 | mov [ttip.tm_strt], eax |
||
270 | jmp .nextp |
||
271 | @@: |
||
272 | ; если есть буфер, вернуть картинку взад, иначе идем дальше по цепочке |
||
273 | mov [ttip.tm_strt], 0 |
||
< |