Subversion Repositories NedoOS

Rev

Rev 529 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
518 alone 1
window_start
2
        ld (curwindow),iy
3
        ld (curwindowcolors),ix
521 alone 4
         ld hl,0
5
         ld (pressed_iy),hl
518 alone 6
        ld l,(iy);1 ;x/2
7
        ld h,(iy+1);10 ;y
8
        ld c,(iy+2);159 ;wid/2
9
        ld b,(iy+3);100 ;hgt
10
        ld (curwindow_xy),hl
11
        ld (curwindow_wh),bc
12
        ld e,h
13
;l=x/2
14
;e=y
15
;hx=brush color byte 0bRLrrrlll
16
;lx=background fill color byte 0bRLrrrlll
17
;b=hgt
18
;c=wid/2
19
        call shapes_drawwindow
20
        ;jr $
21
        ld bc,WINDESCRIPTORSIZE
22
        add iy,bc
23
drawwindow_elements0
521 alone 24
        ld l,(iy+WINELEMENT_NEXT)
25
        ld h,(iy+WINELEMENT_NEXT+1)
518 alone 26
        push hl
521 alone 27
        bit WINELEMENT_FLAG_HIDDEN,(iy+WINELEMENT_FLAGS) ;hidden
518 alone 28
        jr nz,drawwindow_elements0_skip
29
curwindow_xy=$+1
30
        ld de,0
521 alone 31
        ld l,(iy+WINELEMENT_X) ;x/2
32
        ld h,(iy+WINELEMENT_Y) ;y
518 alone 33
        add hl,de
521 alone 34
        ld c,(iy+WINELEMENT_WID) ;wid/2
35
        ld b,(iy+WINELEMENT_HGT) ;hgt
36
        ld a,(iy+WINELEMENT_TYPE) ;type
518 alone 37
        ld e,h
38
        cp T_BUTTON
39
        jr nz,drawwindow_elements0_nbutton
521 alone 40
        push hl
518 alone 41
        call shapes_drawbutton
521 alone 42
        pop hl
43
        ld de,0x0404 ;dydx
44
        call windowelement_drawtext
518 alone 45
        jr drawwindow_elements0_skip
46
drawwindow_elements0_nbutton
529 alone 47
        cp T_FLAG
48
        jr nz,drawwindow_elements0_nflag
521 alone 49
        push hl
529 alone 50
        call window_drawflag
521 alone 51
        pop hl
529 alone 52
        ld de,0x0004 ;dydx
521 alone 53
        call windowelement_drawtext
518 alone 54
        jr drawwindow_elements0_skip
529 alone 55
drawwindow_elements0_nflag
535 alone 56
        cp T_RADIO
57
        jr nz,drawwindow_elements0_nradio
58
        push hl
59
        call window_drawradio
60
        pop hl
61
        ld de,0x0004 ;dydx
62
        call windowelement_drawtext
63
        jr drawwindow_elements0_skip
64
drawwindow_elements0_nradio
526 alone 65
        cp T_LABEL
66
        jr nz,drawwindow_elements0_nlabel
67
        ld de,0x0000 ;dydx
68
        call windowelement_drawtext
69
        jr drawwindow_elements0_skip
70
drawwindow_elements0_nlabel
71
        cp T_EDIT
72
        jr nz,drawwindow_elements0_nedit
73
        ld de,0x0000 ;dydx
74
        call windowelement_drawtext
75
        jr drawwindow_elements0_skip
76
drawwindow_elements0_nedit
518 alone 77
 
78
drawwindow_elements0_skip
79
        pop iy
80
        ld a,hy
81
        or ly
82
        jr nz,drawwindow_elements0
83
        ret
521 alone 84
 
529 alone 85
window_drawflag
86
        ld e,h
87
;l=x/2
88
;e=y
89
        call xytoscraddr        
535 alone 90
        ld de,spr_flag_on
529 alone 91
        bit WINELEMENT_FLAG_CHECKED,(iy+WINELEMENT_FLAGS)
92
        jr nz,$+5
93
        ld de,spr_flag_off
94
        jp prspr88ega
95
 
535 alone 96
window_drawradio
97
        ld e,h
98
;l=x/2
99
;e=y
100
        call xytoscraddr        
101
        ld de,spr_radio_on
102
        bit WINELEMENT_FLAG_CHECKED,(iy+WINELEMENT_FLAGS)
103
        jr nz,$+5
104
        ld de,spr_radio_off
105
        jp prspr88ega
106
 
107
spr_flag_on
529 alone 108
        db 0b00000000
109
        db 0b00000000
110
        db 0b10000000
111
        db 0b10000000
112
        db 0b01000000
113
        db 0b01000000
114
        db 0b01000000
115
        db 0b00000000
116
 
117
        db 0b00000000
118
        db 0b00000000
119
        db 0b00000000
120
        db 0b00000000
121
        db 0b00000000
122
        db 0b00000000
123
        db 0b01000000
124
        db 0b10000000
125
 
126
        db 0b00000000
127
        db 0b00000000
128
        db 0b00000000
129
        db 0b01000000
130
        db 0b10000000
131
        db 0b10000000
132
        db 0b00000000
133
        db 0b00000000
134
 
135
        db 0b01000000
136
        db 0b10000000
137
        db 0b10000000
138
        db 0b00000000
139
        db 0b00000000
140
        db 0b00000000
141
        db 0b00000000
142
        db 0b00000000
143
 
144
spr_flag_off
145
        db 0b00000000
146
        db 0b00000000
147
        db 0b01000000
148
        db 0b00000000
149
        db 0b00000000
150
        db 0b00000000
151
        db 0b01000000
152
        db 0b00000000
153
 
154
        db 0b00000000
155
        db 0b00000000
156
        db 0b00000000
157
        db 0b10000000
158
        db 0b01000000
159
        db 0b10000000
160
        db 0b00000000
161
        db 0b00000000
162
 
163
        db 0b00000000
164
        db 0b00000000
165
        db 0b01000000
166
        db 0b10000000
167
        db 0b00000000
168
        db 0b10000000
169
        db 0b01000000
170
        db 0b00000000
171
 
172
        db 0b00000000
173
        db 0b00000000
174
        db 0b00000000
175
        db 0b00000000
176
        db 0b00000000
177
        db 0b00000000
178
        db 0b00000000
179
        db 0b00000000
180
 
535 alone 181
spr_radio_off
182
        db 0b00000000
183
        db 0b00000000
184
        db 0b01000000
185
        db 0b10000000
186
        db 0b10000000
187
        db 0b10000000
188
        db 0b01000000
189
        db 0b00000000
190
 
191
        db 0b00000000
192
        db 0b11000000
193
        db 0b00000000
194
        db 0b00000000
195
        db 0b00000000
196
        db 0b00000000
197
        db 0b00000000
198
        db 0b11000000
199
 
200
        db 0b00000000
201
        db 0b10000000
202
        db 0b01000000
203
        db 0b00000000
204
        db 0b00000000
205
        db 0b00000000
206
        db 0b01000000
207
        db 0b10000000
208
 
209
        db 0b00000000
210
        db 0b00000000
211
        db 0b00000000
212
        db 0b10000000
213
        db 0b10000000
214
        db 0b10000000
215
        db 0b00000000
216
        db 0b00000000
217
 
218
spr_radio_on
219
        db 0b00000000
220
        db 0b00000000
221
        db 0b01000000
222
        db 0b10000000
223
        db 0b10000000
224
        db 0b10000000
225
        db 0b01000000
226
        db 0b00000000
227
 
228
        db 0b00000000
229
        db 0b11000000
230
        db 0b00000000
231
        db 0b11000000
232
        db 0b11000000
233
        db 0b11000000
234
        db 0b00000000
235
        db 0b11000000
236
 
237
        db 0b00000000
238
        db 0b10000000
239
        db 0b01000000
240
        db 0b10000000
241
        db 0b10000000
242
        db 0b10000000
243
        db 0b01000000
244
        db 0b10000000
245
 
246
        db 0b00000000
247
        db 0b00000000
248
        db 0b00000000
249
        db 0b10000000
250
        db 0b10000000
251
        db 0b10000000
252
        db 0b00000000
253
        db 0b00000000
254
 
521 alone 255
windowelement_drawtext
526 alone 256
;iy=element
521 alone 257
;hl=yx/2
258
;de=dydx/2
259
        add hl,de
260
        ld e,h
261
;l=x/2
262
;e=y
263
        call xytoscraddr
264
        push iy
265
        pop de
266
        ex de,hl
267
        ld bc,WINELEMENTSTRUCTSIZE
268
        add hl,bc ;hl=text
269
        ex de,hl
270
;hl=scr
271
;de=text
272
        jp shapes_prtext48ega
518 alone 273
 
274
window_mainloop
275
        ld a,ZONE_NO
276
        ld (prarr_zone),a
277
 
278
        call setpgs_scr
279
;1. всё выводим
280
;2. ждём событие
281
;3. всё стираем
282
;4. обрабатываем событие
283
        call ahl_coords
284
        ld ix,(curwindowcolors)
521 alone 285
        call window_invarrzone ;инвертируем пункт под стрелкой
518 alone 286
 
287
        call setpgshapes
288
 
289
        call ahl_coords
290
        call shapes_memorizearr
291
        call ahl_coords
292
        call shapes_prarr ;рисуем стрелку
293
 
521 alone 294
         ;ld a,0x07
295
         ;ld (0xc000),a
296
         ;out (0xfe),a
297
         ;ld e,a
298
         ;OS_SETBORDER
518 alone 299
        call waitsomething ;в это время стрелка видна
300
;что-то изменилось - стираем стрелку и старое окно, двигаем стрелку, рисуем новое окно и стрелку
521 alone 301
         ;ld a,0x02
302
         ;ld (0xc000),a
303
         ;out (0xfe),a
304
         ;ld e,a
305
         ;OS_SETBORDER
306
         ;ld a,r
307
         ;ld (0x8000),a
518 alone 308
 
309
        call setpgshapes
310
 
311
        call ahl_oldcoords
312
        call shapes_rearr ;стираем стрелку
313
 
314
curwindowcolors=$+2
315
        ld ix,0
521 alone 316
        call ahl_oldcoords
518 alone 317
        call window_invarrzone ;восстанавливаем (инвертируем) пункт под стрелкой
318
        call window_mousebuttons
319
        call window_keys
320
 
321
curwindow_wh=$+1
322
        ld bc,0 ;на случай, кгда клик вне окна закрывает окно
323
 
324
        jp window_mainloop
325
 
326
window_mousebuttons
327
        call isfirechanged
328
;a=старые кнопки XOR новые
329
;nz=что-то изменилось
330
        ret z
331
        ;ld a,(mousebuttons)
332
        cpl
333
        and 7
334
        cp 3
335
        ;jr nc,win_mmb ;LMB+RMB или MMB
336
        rra
337
        jp c,window_fire
338
        rra
339
        jr c,window_rmb
340
        ret ;никогда
341
 
342
window_fire
343
window_rmb
521 alone 344
        ld a,(mousebuttons)
345
        rra
346
        jr nc,window_nunclick ;ветвление click (NC)/unclick (C)
347
pressed_iy=$+2
348
        ld iy,0
349
        ld de,(curwindow_xy)
350
        ld l,(iy+WINELEMENT_X) ;x/2
351
        ld h,(iy+WINELEMENT_Y) ;y
352
        add hl,de
353
        ld c,(iy+WINELEMENT_WID) ;wid/2
354
        ld b,(iy+WINELEMENT_HGT) ;hgt
355
        ld e,h
526 alone 356
        ld a,(iy+WINELEMENT_TYPE)
357
        cp T_BUTTON
358
        jr nz,window_nunclick
521 alone 359
         ld a,hy
360
         or a
361
        call nz,shapes_drawbutton
362
window_nunclick
363
 
518 alone 364
curwindow=$+2
365
        ld iy,0
366
        ld bc,WINDESCRIPTORSIZE
367
        add iy,bc
368
window_fire_elements0
535 alone 369
         ld a,(iy+WINELEMENT_TYPE)
370
         cp T_RADIO
371
         jr nz,window_fire_elements_nradio
372
        ld a,(window_firstradio+1) ;HSB
373
        or a
374
        jr nz,window_fire_elements_radiook
375
        ld (window_firstradio),iy
376
         jr window_fire_elements_radiook
377
window_fire_elements_nradio
378
        ld hl,0
379
        ld (window_firstradio),hl
380
window_fire_elements_radiook
521 alone 381
        ld l,(iy+WINELEMENT_NEXT)
382
        ld h,(iy+WINELEMENT_NEXT+1)
518 alone 383
        push hl
521 alone 384
        bit WINELEMENT_FLAG_DISABLED,(iy+WINELEMENT_FLAGS)
385
        jr nz,window_fire_elements0_skip
518 alone 386
        ld de,(curwindow_xy)
521 alone 387
        ld l,(iy+WINELEMENT_X) ;x/2
388
        ld h,(iy+WINELEMENT_Y) ;y
518 alone 389
        add hl,de
521 alone 390
        ld a,(iy+WINELEMENT_WID) ;wid/2
518 alone 391
        add a,l
392
        ld c,a
521 alone 393
        ld a,(iy+WINELEMENT_HGT) ;hgt
518 alone 394
        add a,h
395
        ld b,a
521 alone 396
       ex de,hl
518 alone 397
        call ahl_coords
398
;de=element_yx/2
399
;hl=x
400
;a=y
401
;touched if:
402
;element_y(d) <= y(a) < element_y+hgt(b)
403
        cp d
404
        jr c,window_fire_elements0_skip
405
        cp b
406
        jr nc,window_fire_elements0_skip
407
;and element_x/2(e) <= x/2(L) < element_x/2+wid/2(c)
408
        srl h
409
        ld a,l
410
        rra
411
        cp e
412
        jr c,window_fire_elements0_skip
413
        cp c
414
        jr nc,window_fire_elements0_skip
415
         pop af ;skip next element
521 alone 416
       ex de,hl
417
        ld c,(iy+WINELEMENT_WID) ;wid/2
418
        ld b,(iy+WINELEMENT_HGT) ;hgt
518 alone 419
        ld a,(mousebuttons)
420
        rra
421
        jr c,window_fire_unclick ;unclick
521 alone 422
        ld e,h
526 alone 423
         ld (pressed_iy),iy
424
        ld a,(iy+WINELEMENT_TYPE)
425
        cp T_BUTTON
426
        jr z,window_fire_clickbutton
427
        cp T_EDIT
428
        jr z,window_fire_clickedit
529 alone 429
        cp T_FLAG
430
        jr z,window_fire_clickflag
535 alone 431
        cp T_RADIO
432
        jr z,window_fire_clickradio
526 alone 433
        ;TODO
434
        jr window_fire_click
535 alone 435
window_fire_elements0_skip
436
        pop iy
437
        ld a,hy
438
        or ly
439
        jp nz,window_fire_elements0
440
        ret
441
window_fire_clickradio
442
        push iy
443
window_firstradio=$+2
444
        ld iy,0
445
window_fire_clickradio0
446
         ld a,(iy+WINELEMENT_TYPE)
447
         cp T_RADIO
448
         jr nz,window_fire_clickradiook
449
        res WINELEMENT_FLAG_CHECKED,(iy+WINELEMENT_FLAGS)
450
        call windowelement_getxy ;hl=yx/2
451
        call window_drawradio
452
        ld l,(iy+WINELEMENT_NEXT)
453
        ld h,(iy+WINELEMENT_NEXT+1)
454
        push hl
455
        pop iy
456
        ld a,h
457
        or l
458
        jr nz,window_fire_clickradio0
459
window_fire_clickradiook
460
        pop iy
461
        set WINELEMENT_FLAG_CHECKED,(iy+WINELEMENT_FLAGS)
462
        call windowelement_getxy ;hl=yx/2
463
        jp window_drawradio
529 alone 464
window_fire_clickflag
465
        ld a,(iy+WINELEMENT_FLAGS)
466
        xor 1<<WINELEMENT_FLAG_CHECKED
467
        ld (iy+WINELEMENT_FLAGS),a
468
        call windowelement_getxy ;hl=yx/2
469
        jp window_drawflag
526 alone 470
window_fire_clickedit      
471
        call window_fire_click
529 alone 472
        jp window_edit
526 alone 473
window_fire_clickbutton
518 alone 474
        call shapes_drawbutton_pressed
526 alone 475
window_fire_click
521 alone 476
         ld l,(iy+WINELEMENT_CLICK)
477
         ld h,(iy+WINELEMENT_CLICK+1)
518 alone 478
         jp (hl)
479
window_fire_unclick
521 alone 480
        ld bc,(pressed_iy)
481
        ld a,ly
482
        sub c
483
        ld c,a
484
        ld a,hy
485
        sbc a,b
486
        or c
487
        ret nz
488
         ld l,(iy+WINELEMENT_UNCLICK)
489
         ld h,(iy+WINELEMENT_UNCLICK+1)
518 alone 490
         jp (hl)
491
 
492
window_close
493
         pop af ;skip window_mainloop return addr
494
        ret
495
 
496
window_keys
497
        ld a,(key)
498
;TODO пройтись по всем элементам окна и проверить горячую клавишу
499
        ret
500
 
501
window_invarrzone
521 alone 502
;пройтись по всем элементам окна ;только те, у которых invertible
503
        ld (window_invarrzone_a),a
504
        ld (window_invarrzone_hl),hl
505
        ld iy,(curwindow)
506
        ld bc,WINDESCRIPTORSIZE
507
        add iy,bc
508
window_invarrzone0
509
        ld l,(iy+WINELEMENT_NEXT)
510
        ld h,(iy+WINELEMENT_NEXT+1)
511
        push hl
512
        bit WINELEMENT_FLAG_DISABLED,(iy+WINELEMENT_FLAGS)
513
        jr nz,window_invarrzone0_skip
514
        bit WINELEMENT_FLAG_INVERTIBLE,(iy+WINELEMENT_FLAGS)
515
        jr z,window_invarrzone0_skip
526 alone 516
        call windowelement_getxy ;hl=yx/2
521 alone 517
        ld a,(iy+WINELEMENT_WID) ;wid/2
518
        add a,l
519
        ld c,a
520
        ld a,(iy+WINELEMENT_HGT) ;hgt
521
        add a,h
522
        ld b,a        
523
       ex de,hl
524
        ;call ahl_coords
525
window_invarrzone_a=$+1
526
        ld a,0
527
window_invarrzone_hl=$+1
528
        ld hl,0
529
;de=element_yx/2
530
;hl=x
531
;a=y
532
;touched if:
533
;element_y(d) <= y(a) < element_y+hgt(b)
534
        cp d
535
        jr c,window_invarrzone0_skip
536
        cp b
537
        jr nc,window_invarrzone0_skip
538
;and element_x/2(e) <= x/2(L) < element_x/2+wid/2(c)
539
        srl h
540
        ld a,l
541
        rra
542
        cp e
543
        jr c,window_invarrzone0_skip
544
        cp c
545
        jr nc,window_invarrzone0_skip
546
         pop af ;skip next element
547
       ex de,hl
548
        ld e,(iy+WINELEMENT_WID) ;wid/2
549
        ld d,(iy+WINELEMENT_HGT) ;hgt
550
        srl e
551
        srl e ;wid/8
552
        ld b,h ;y
553
        ld c,l
554
        srl c
555
        srl c ;x/8
556
        jp shapes_invbox
557
window_invarrzone0_skip
558
        pop iy
559
        ld a,hy
560
        or ly
561
        jp nz,window_invarrzone0
518 alone 562
        ret
526 alone 563
 
564
windowelement_getxy
565
        ld de,(curwindow_xy)
566
        ld l,(iy+WINELEMENT_X) ;x/2
567
        ld h,(iy+WINELEMENT_Y) ;y
568
        add hl,de
569
        ret
570
 
571
strtoint
572
;hl=str
573
;out: hl=int
574
        ld de,0
575
strtoint0
576
        ld a,(hl)
577
        sub '0'
578
        cp 10
579
        jr nc,strtointq
580
        inc hl
581
        ex de,hl
582
        push de
583
        ld d,h
584
        ld e,l
585
        add hl,hl
586
        add hl,hl
587
        add hl,de ;*5
588
        add hl,hl ;*10
589
        ld e,a
590
        ld d,0
591
        add hl,de
592
        pop de
593
        ex de,hl
594
        jr strtoint0
595
strtointq
596
        ex de,hl
597
        ret
598
 
599
window_edit
600
        ;ld ix,(curwindowcolors)
601
        ;ld hl,3
602
;TODO hl=strlen (когда будет ввод в середину строки)
603
        ;ld (window_edit_strlen),hl
604
        push iy
605
        pop hl
606
        ld de,WINELEMENTSTRUCTSIZE
607
        add hl,de
608
        ld (window_edit_str),hl
609
;находим длину строки
610
        call strlen_wo_trailing_spaces
611
        ld (window_edit_curx),hl
612
 
613
window_edit0
614
        ;ld bc,filenamey*256 + filenamex8 ;y, x/8
615
        ;ld de,filenamehgt*256 + filenamewid8 ;d=hgt ;e=wid
616
        ;xor a
617
        ;call shapes_fillbox
618
window_edit_nokey
619
        call windowelement_getxy ;hl=yx/2
620
        ;ld hl,filenamey*256 + filenamex8*4 ;y, x/8
621
        ld de,0
622
;iy=element
623
;hl=yx/2
624
;de=dydx/2
625
        call windowelement_drawtext
626
        ;halt
627
        ;GET_KEY
628
        ;cp NOKEY
629
        ;jr z,editfilename_nokey
630
        push ix
631
        push iy
632
        YIELDGETKEYLOOP
633
        pop iy
634
        pop ix
635
window_edit_str=$+1
636
        ld hl,0
637
        cp key_enter
638
        ret z
639
window_edit_curx=$+1
640
        ld bc,0
641
        add hl,bc
642
        cp key_backspace
643
        jr z,window_edit_backspace
644
        cp 0x20
645
        jr c,window_edit_nokey ;прочие системные кнопки не нужны
646
        ld e,a
647
        ld a,(hl)
648
        or a
649
        jr z,window_edit0 ;максимальная длина строки, нельзя вводить
650
        ld (hl),e
651
        inc bc
652
        ld (window_edit_curx),bc
653
        jr window_edit0
654
window_edit_backspace
655
        ld a,b
656
        or c
657
        jr z,window_edit0 ;удалять нечего
658
        dec hl
659
        ld (hl),' '
660
        dec bc
661
        ld (window_edit_curx),bc
662
        jr window_edit0
663
 
664
strlen_wo_trailing_spaces
665
;hl=str
666
;out: hl=length
667
        xor a
668
        push hl
669
        call strlen_pp
670
        ex (sp),hl
671
        ld a,' '
672
        call strlen_pp
673
        pop bc
674
        call minhl_bc_tobc
675
        ld h,b
676
        ld l,c
677
        ret
678
strlen_pp
679
        ld bc,0 ;чтобы точно найти терминатор
680
        cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
681
        ld hl,-1
682
        or a
683
        sbc hl,bc
684
        ret