Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1698 IgorA 1
 
1706 IgorA 2
align 4
1705 IgorA 3
but_obj_move_up:
4
	stdcall [tl_node_move_up], tree2
5
	ret
6
7
 
1706 IgorA 8
align 4
1705 IgorA 9
but_obj_move_down:
10
	stdcall [tl_node_move_down], tree2
11
	ret
12
13
 
1706 IgorA 14
align 4
15
but_obj_copy:
16
push ecx esi edi
17
	stdcall [tl_node_get_data], tree2
18
	pop esi
19
	mov edi,[tree2.data_info] ;данные 0-го узла, используем для копирования
20
	xor ecx,ecx
21
	mov cx,word[tree2.info_size]
22
	cld
23
	rep movsb
24
pop edi esi ecx
25
	ret
26
27
 
28
align 4
29
but_obj_paste:
30
push eax ebx ecx edi
31
	mov eax,[tree2.data_info] ;данные 0-го узла, используем для копирования
1717 IgorA 32
	mov ebx,dword[eax]
33
	call find_obj_in_opt
34
	xor ecx,ecx
35
	mov cx,word[edi+obj_opt.img-obj_opt] ;cx - индекс главной иконки добавляемого объекта
36
	shl ecx,16
37
	stdcall [tl_node_add], tree2,ecx,eax ;добавляем объект
5917 IgorA 38
	stdcall [tl_draw], tree2
1717 IgorA 39
pop edi ecx ebx eax
1706 IgorA 40
	ret
41
42
 
1698 IgorA 43
;функция обратная к данной on_file_object_select
44
align 4
45
but_element_change:
46
	;foc_obj - указатель на последний выбранный узел в tree2
47
	cmp dword[foc_obj],0
48
	je .err_obj
1714 IgorA 49
		pushad
1698 IgorA 50
		;установка текстовых свойств
1714 IgorA 51
		xor ebx,ebx
1711 IgorA 52
		mov edi,edit2
53
		@@:
1714 IgorA 54
			call get_obj_win_param
1711 IgorA 55
			inc ebx
56
			add edi,ed_struc_size
57
			cmp edi,prop_wnd_edits_end
58
		jl @b
1714 IgorA 59
60
 
61
		mov edx,dword[foc_obj]
62
		mov dword[edx+u_object.typid-u_object],0 ;на случай если ничего не выбрано
63
		stdcall [tl_node_get_data],tree3
64
		cmp eax,0
65
		je @f
66
			mov eax,dword[eax] ;берем порядковый номер (в памяти) выбранного объекта
67
			mov dword[edx+u_object.typid-u_object],eax
68
		@@:
69
70
 
71
		mov edi,ch1.flags
72
		mov eax,1
73
		xor ebx,ebx
74
		@@:
75
			bt dword[edi],1
1715 IgorA 76
			jnc .opt_no_sel
1714 IgorA 77
				or ebx,eax ;накопление отмеченных опций
78
			.opt_no_sel:
79
			shl eax,1
80
			add edi,ch_struc_size
81
			cmp edi,check_boxes_end
82
		jl @b
83
		mov dword[edx+u_object.modif-u_object],ebx
84
		popad
1698 IgorA 85
	.err_obj:
1714 IgorA 86
	call draw_constructor ;обновляем окно конструктора
1698 IgorA 87
	;call draw_window
1714 IgorA 88
	ret
1698 IgorA 89
90
 
1711 IgorA 91
; ebx - property column
92
; edi - pointer to property editbox
93
align 4
1698 IgorA 94
get_obj_win_param:
1711 IgorA 95
	pushad
96
		mov esi,ed_text
97
		stdcall get_obj_text_col, [foc_obj], ebx ;edx - смещение для текста
98
		stdcall get_obj_text_len_col, [foc_obj], ebx ;eax - длинна поля
99
		cld
1698 IgorA 100
		mov edi,edx
101
		mov ecx,eax
102
		rep movsb
103
	popad
1711 IgorA 104
	ret
1698 IgorA 105
106
 
107
;  obj - pointer to object
108
;  ind - column index
109
;output:
110
;  edx + offset
111
;  edx = 0 if not text
112
align 4
113
proc get_obj_text_col, obj:dword, ind:dword
114
	mov edx,dword[obj]
115
	add edx,4 ;goto text
1717 IgorA 116
push ebx ecx
117
	mov ecx,dword[ind]
118
	cmp cx,0
119
	je .end_fun
1698 IgorA 120
121
 
1717 IgorA 122
1698 IgorA 123
 
1717 IgorA 124
	call find_obj_in_opt ;ищем структуру с опциями объекта
1698 IgorA 125
126
 
127
	dec ecx
1717 IgorA 128
	shl ecx,1 ;умножаем на 2
129
	add edi,ecx ;+ ind*2
130
	xor ecx,ecx
1698 IgorA 131
	mov cx,word[edi] ;ecx - сдиг для искомого поля
132
	add edx,ecx
133
134
 
135
	jg @f
136
		mov edx,0 ;not text
137
	@@:
138
	cmp cx,MAX_LEN_OBJ_TXT
139
	jl @f
140
		mov edx,0 ;not text
141
	@@:
142
143
 
1717 IgorA 144
	.end_fun:
1698 IgorA 145
pop ecx ebx
1717 IgorA 146
	ret
1698 IgorA 147
endp
148
149
 
150
;  obj - указатель на объект
151
;  ind - номер поля внутри объекта
152
;output:
153
;  eax - длинна текстового поля внутри объекта
154
align 4
155
proc get_obj_text_len_col uses ebx ecx edi, obj:dword, ind:dword
5917 IgorA 156
	xor eax,eax
1698 IgorA 157
	mov ecx,dword[ind]
1717 IgorA 158
	mov eax,dword[obj]
1698 IgorA 159
	mov ebx,dword[eax] ;в ebx попадает код объекта
1717 IgorA 160
	xor eax,eax
1698 IgorA 161
162
 
163
164
 
165
	shl ecx,1 ;умножаем на 2
1717 IgorA 166
	add edi,ecx ;+ ind*2
167
1698 IgorA 168
 
169
	cmp ax,0
170
	jg @f
171
		mov eax,MAX_LEN_OBJ_TXT ;последние поля для удобства кодируются 0, а не MAX_LEN_OBJ_TXT, исправляем ситуацию
172
	@@:
173
	cmp dword[ind],0
174
	je .end_fun ;для первого поля сдиг = 0, потому в структуре он не хранится, т.к. известен заранее
175
	sub ax,word[edi-2] ;отнимаем сдиг для искомого поля, получаем длинну поля
176
177
 
178
	jg @f
179
		mov eax,0 ;поле пустое, не используется
180
	@@:
181
	cmp ax,MAX_LEN_OBJ_TXT
182
	jl @f
183
		mov eax,0 ;not text
184
	@@:
185
186
 
187
	ret
188
endp
189
190
 
191
proc draw_obj_icon, o_type:dword,n_col:dword, coord_y:dword
1714 IgorA 192
	pushad
1698 IgorA 193
	xor ebx,ebx
194
	mov ebx,dword[o_type]
1717 IgorA 195
	call find_obj_in_opt
1698 IgorA 196
197
 
198
	mov ebx,[n_col]
199
	shl ebx,1
200
	add edi,ebx ;move index (+bh)
201
	xor ecx,ecx
202
	mov cx,[edi]
203
204
 
205
	jge @f
206
		jmp .end_fun ;error icon index
207
	@@:
208
209
 
210
	imul ecx,0x300
211
	add ebx,ecx
212
213
 
214
	mov ecx,0x100010 ;ecx - size:16*16
215
	mov edx,3 ;отступ от левого края рамки до иконки
1714 IgorA 216
	shl edx,16
1698 IgorA 217
	add edx,[coord_y]
218
	int 0x40
219
	.end_fun:
220
	popad
221
	ret
222
endp
223
224
 
225
proc draw_icon, ind:dword,coord_x:dword,coord_y:dword
226
	pushad
227
	mov ecx,[ind]
228
	cmp ecx,0
229
	jl .end_fun
230
		mov ebx,bmp_icon
231
		imul ecx,0x300
232
		add ebx,ecx
233
234
 
235
		mov ecx,0x100010 ;ecx - size:16*16
236
		mov edx,[coord_x]
237
		shl edx,16
238
		add edx,[coord_y]
239
		int 0x40
240
	.end_fun:
241
	popad
242
	ret
243
endp
244
245
 
246
;  ebx = cod object
1717 IgorA 247
;output:
1698 IgorA 248
;  edi = pointer to option struct
249
align 4
250
find_obj_in_opt:
251
	push ecx
252
	xor ecx,ecx ;find 'ebx' in options
1717 IgorA 253
	mov edi,obj_opt
1698 IgorA 254
	@@:
255
		cmp ebx,dword[edi] ;find
1717 IgorA 256
		je @f
1698 IgorA 257
		inc ecx
258
		cmp ecx,MAX_OBJ_TYPES
259
		je @f ;not find
260
		add edi,sizeof.ObjOpt
261
		jmp @b
262
	@@:
263
	pop ecx
264
	ret
265
266
 
267
 
268
	;нужен для ускорения последущего поиска
269
270
 
271
;eax - указатель на структуру найденного объекта
272
align 4
273
proc find_obj_in_file, o_type:dword
274
push ebx esi
275
	mov ebx,[o_type]
276
	stdcall dword[tl_node_poi_get_info], tree2,0
5917 IgorA 277
	mov esi,eax
278
1698 IgorA 279
 
280
		cmp esi,0
281
		je .find_no
282
283
 
5917 IgorA 284
		cmp eax,0
1698 IgorA 285
		je .find_no
286
287
 
1717 IgorA 288
		je .find_yes
1698 IgorA 289
290
 
5917 IgorA 291
		mov esi,eax ;переходим к следущему узлу
292
1698 IgorA 293
 
294
295
 
296
		mov dword[obj_find_last],esi
297
		jmp @f
298
	.find_no:
299
		mov dword[obj_find_last],0
300
		xor eax,eax
301
	@@:
302
pop esi ebx
303
	ret
304
endp
305
306
 
307
;eax - указатель на структуру найденного объекта
308
align 4
309
proc find_obj_in_file_next uses ebx esi, o_type:dword
5917 IgorA 310
	cmp dword[obj_find_last],0
1698 IgorA 311
	je .find_no
312
313
 
1717 IgorA 314
1698 IgorA 315
 
5917 IgorA 316
	mov esi,eax ;переходим к следущему узлу
317
1698 IgorA 318
 
319
		cmp esi,0
320
		je .find_no
321
322
 
5917 IgorA 323
		cmp eax,0
1698 IgorA 324
		je .find_no
325
326
 
1717 IgorA 327
		je .find_yes
1698 IgorA 328
329
 
5917 IgorA 330
		mov esi,eax ;переходим к следущему узлу
331
1698 IgorA 332
 
333
334
 
335
		mov dword[obj_find_last],esi
336
		jmp @f
337
	.find_no:
338
		mov dword[obj_find_last],0
339
		xor eax,eax
340
	@@:
341
	ret
342
endp
343
344
 
345
but_show_constructor:
346
	mov byte[show_mode],0
347
	stdcall [buf2d_draw], buf_fon
348
	ret
349
350
 
351
but_show_code:
352
	mov byte[show_mode],1
353
	stdcall [ted_draw], tedit0
354
	ret
355
356
 
357
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
358
;output:
359
; eax - число
360
align 4
361
proc conv_str_to_int, buf:dword
362
	xor eax,eax
363
	push ebx esi
364
	xor ebx,ebx
365
	mov esi,[buf]
366
	cmp word[esi],'0x'
367
	je .load_digit_16
368
369
 
370
		mov bl,byte[esi]
371
		cmp bl,'0'
372
		jl @f
373
		cmp bl,'9'
374
		jg @f
375
			sub bl,'0'
376
			imul eax,10
377
			add eax,ebx
378
			inc esi
379
			jmp .load_digit_10
380
	jmp @f
381
382
 
383
		add esi,2
384
	.cycle_16:
385
		mov bl,byte[esi]
386
		cmp bl,'0'
387
		jl @f
388
		cmp bl,'f'
389
		jg @f
390
		cmp bl,'9'
391
		jle .us1
392
			cmp bl,'A'
393
			jl @f ;отсеиваем символы >'9' и <'A'
394
		.us1: ;составное условие
395
		cmp bl,'F'
396
		jle .us2
397
			cmp bl,'a'
398
			jl @f ;отсеиваем символы >'F' и <'a'
399
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
400
		.us2: ;составное условие
401
			sub bl,'0'
402
			cmp bl,9
403
			jle .cor1
404
				sub bl,7 ;convert 'A' to '10'
405
			.cor1:
406
			shl eax,4
407
			add eax,ebx
408
			inc esi
409
			jmp .cycle_16
410
	@@:
411
412
 
413
	ret
414
endp
415
>