?login_element?

Subversion Repositories NedoOS

Rev

Rev 529 | Blame | Compare with Previous | Last modification | View Log | Download

  1. window_start
  2.         ld (curwindow),iy
  3.         ld (curwindowcolors),ix
  4.          ld hl,0
  5.          ld (pressed_iy),hl
  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
  24.         ld l,(iy+WINELEMENT_NEXT)
  25.         ld h,(iy+WINELEMENT_NEXT+1)
  26.         push hl
  27.         bit WINELEMENT_FLAG_HIDDEN,(iy+WINELEMENT_FLAGS) ;hidden
  28.         jr nz,drawwindow_elements0_skip
  29. curwindow_xy=$+1
  30.         ld de,0
  31.         ld l,(iy+WINELEMENT_X) ;x/2
  32.         ld h,(iy+WINELEMENT_Y) ;y
  33.         add hl,de
  34.         ld c,(iy+WINELEMENT_WID) ;wid/2
  35.         ld b,(iy+WINELEMENT_HGT) ;hgt
  36.         ld a,(iy+WINELEMENT_TYPE) ;type
  37.         ld e,h
  38.         cp T_BUTTON
  39.         jr nz,drawwindow_elements0_nbutton
  40.         push hl
  41.         call shapes_drawbutton
  42.         pop hl
  43.         ld de,0x0404 ;dydx
  44.         call windowelement_drawtext
  45.         jr drawwindow_elements0_skip
  46. drawwindow_elements0_nbutton
  47.         cp T_FLAG
  48.         jr nz,drawwindow_elements0_nflag
  49.         push hl
  50.         call window_drawflag
  51.         pop hl
  52.         ld de,0x0004 ;dydx
  53.         call windowelement_drawtext
  54.         jr drawwindow_elements0_skip
  55. drawwindow_elements0_nflag
  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
  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
  77.        
  78. drawwindow_elements0_skip
  79.         pop iy
  80.         ld a,hy
  81.         or ly
  82.         jr nz,drawwindow_elements0
  83.         ret
  84.  
  85. window_drawflag
  86.         ld e,h
  87. ;l=x/2
  88. ;e=y
  89.         call xytoscraddr        
  90.         ld de,spr_flag_on
  91.         bit WINELEMENT_FLAG_CHECKED,(iy+WINELEMENT_FLAGS)
  92.         jr nz,$+5
  93.         ld de,spr_flag_off
  94.         jp prspr88ega
  95.  
  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
  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.  
  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.  
  255. windowelement_drawtext
  256. ;iy=element
  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
  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)
  285.         call window_invarrzone ;инвертируем пункт под стрелкой
  286.        
  287.         call setpgshapes
  288.  
  289.         call ahl_coords
  290.         call shapes_memorizearr
  291.         call ahl_coords
  292.         call shapes_prarr ;рисуем стрелку
  293.        
  294.          ;ld a,0x07
  295.          ;ld (0xc000),a
  296.          ;out (0xfe),a
  297.          ;ld e,a
  298.          ;OS_SETBORDER
  299.         call waitsomething ;в это время стрелка видна
  300. ;что-то изменилось - стираем стрелку и старое окно, двигаем стрелку, рисуем новое окно и стрелку
  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
  308.  
  309.         call setpgshapes
  310.        
  311.         call ahl_oldcoords
  312.         call shapes_rearr ;стираем стрелку
  313.        
  314. curwindowcolors=$+2
  315.         ld ix,0
  316.         call ahl_oldcoords
  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
  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
  356.         ld a,(iy+WINELEMENT_TYPE)
  357.         cp T_BUTTON
  358.         jr nz,window_nunclick
  359.          ld a,hy
  360.          or a
  361.         call nz,shapes_drawbutton
  362. window_nunclick
  363.        
  364. curwindow=$+2
  365.         ld iy,0
  366.         ld bc,WINDESCRIPTORSIZE
  367.         add iy,bc
  368. window_fire_elements0
  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
  381.         ld l,(iy+WINELEMENT_NEXT)
  382.         ld h,(iy+WINELEMENT_NEXT+1)
  383.         push hl
  384.         bit WINELEMENT_FLAG_DISABLED,(iy+WINELEMENT_FLAGS)
  385.         jr nz,window_fire_elements0_skip
  386.         ld de,(curwindow_xy)
  387.         ld l,(iy+WINELEMENT_X) ;x/2
  388.         ld h,(iy+WINELEMENT_Y) ;y
  389.         add hl,de
  390.         ld a,(iy+WINELEMENT_WID) ;wid/2
  391.         add a,l
  392.         ld c,a
  393.         ld a,(iy+WINELEMENT_HGT) ;hgt
  394.         add a,h
  395.         ld b,a
  396.        ex de,hl
  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
  416.        ex de,hl
  417.         ld c,(iy+WINELEMENT_WID) ;wid/2
  418.         ld b,(iy+WINELEMENT_HGT) ;hgt
  419.         ld a,(mousebuttons)
  420.         rra
  421.         jr c,window_fire_unclick ;unclick
  422.         ld e,h
  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
  429.         cp T_FLAG
  430.         jr z,window_fire_clickflag
  431.         cp T_RADIO
  432.         jr z,window_fire_clickradio
  433.         ;TODO
  434.         jr window_fire_click
  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
  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
  470. window_fire_clickedit      
  471.         call window_fire_click
  472.         jp window_edit
  473. window_fire_clickbutton
  474.         call shapes_drawbutton_pressed
  475. window_fire_click
  476.          ld l,(iy+WINELEMENT_CLICK)
  477.          ld h,(iy+WINELEMENT_CLICK+1)
  478.          jp (hl)
  479. window_fire_unclick
  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)
  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
  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
  516.         call windowelement_getxy ;hl=yx/2
  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
  562.         ret
  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
  685.