Subversion Repositories Kolibri OS

Rev

Rev 7639 | Rev 7938 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;    UNIFORM WINDOW COLOURS & SKIN
  3. ;
  4. ;    Compile with FASM for Menuet
  5. ;
  6. ;    < russian edition by Ivan Poddubny >
  7. ;    < skin selection by Mike Semenyako >
  8. ;******************************************************************************
  9. ; last update:  01/04/2013
  10. ; written by:   Marat Zakiyanov aka Mario79, aka Mario
  11. ; changes:      select colors with ColorDialog
  12. ;               some redesign of the look of the program
  13. ;******************************************************************************
  14. ; last update:  10/09/2010
  15. ; written by:   Marat Zakiyanov aka Mario79, aka Mario
  16. ; changes:      select path with OpenDialog
  17. ;******************************************************************************
  18.         use32
  19.         org 0
  20.         db 'MENUET01'   ; identifier
  21.         dd 1            ; header version
  22.         dd START        ; start address
  23.         dd IM_END       ; file size
  24.         dd I_END        ; memory
  25.         dd stacktop     ; stack pointer
  26.         dd app_param    ; parameters
  27.         dd cur_dir_path ; path to file
  28.  
  29. include 'lang.inc'
  30. include '../../../proc32.inc'
  31. include '../../../config.inc'           ;for nightbuild
  32. include '../../../macros.inc'
  33. include '../../../string.inc'
  34. include '../../../dll.inc'
  35. include 'kglobals.inc'
  36. include 'unpacker.inc'
  37. include '../../../develop/libraries/box_lib/load_lib.mac'
  38.         @use_library
  39. ;******************************************************************************
  40. ;--------------------------------------
  41. struct SKIN_HEADER
  42.   ident   dd ?
  43.   version dd ?
  44.   params  dd ?
  45.   buttons dd ?
  46.   bitmaps dd ?
  47. ends
  48. ;--------------------------------------
  49. struct SKIN_PARAMS
  50.   skin_height    dd ?
  51.   margin.right   dw ?
  52.   margin.left    dw ?
  53.   margin.bottom  dw ?
  54.   margin.top     dw ?
  55.   colors.inner   dd ?
  56.   colors.outer   dd ?
  57.   colors.frame   dd ?
  58.   colors_1.inner dd ?
  59.   colors_1.outer dd ?
  60.   colors_1.frame dd ?
  61.   dtp.size       dd ?
  62.   dtp.data       db 40 dup (?)
  63. ends
  64. ;--------------------------------------
  65. struct SKIN_BUTTONS
  66.   type     dd ?
  67.   pos:
  68.     left   dw ?
  69.     top    dw ?
  70.   size:
  71.     width  dw ?
  72.     height dw ?
  73. ends
  74. ;--------------------------------------
  75. struct SKIN_BITMAPS
  76.   kind  dw ?
  77.   type  dw ?
  78.   _data  dd ?
  79. ends
  80. ;--------------------------------------
  81. frame_1:
  82.   .x      = 5
  83.   .y      = 220
  84.   .width  = 420
  85.   .height = 50
  86. ;--------------------------------------  
  87. frame_2:
  88.   .x      = 5
  89.   .y      = 280
  90.   .width  = 420
  91.   .height = 50
  92. ;---------------------------------------------------------------------
  93. START:          ; start of execution
  94. ;---------------------------------------------------------------------
  95.         mcall   68,11
  96.        
  97.         test    eax,eax
  98.         jz      close  
  99.  
  100. stdcall dll.Load,LibIniImportTable
  101. load_libraries l_libs_start,end_l_libs
  102.  
  103. ;if return code =-1 then exit, else nornary work
  104.         inc     eax
  105.         test    eax,eax
  106.         jz      close
  107. ;---------------------------------------------------------------------
  108. ; set default pathes
  109.         mov     edi,skin_info
  110.         mov     esi,default_skin
  111.         xor     eax,eax
  112.         cld
  113. @@:
  114.         lodsb
  115.         stosb
  116.         test    eax,eax
  117.         jnz     @b
  118.        
  119.         mov     edi,dtp_name
  120.         mov     esi,default_dtp
  121.         xor     eax,eax
  122.         cld
  123. @@:
  124.         lodsb
  125.         stosb
  126.         test    eax,eax
  127.         jnz     @b
  128. ;---------------------------------------------------------------------
  129. ; check app param
  130.         stdcall string.length, app_param
  131.         add eax, app_param
  132.         mov ecx, [eax-4]
  133.         cmp ecx, '.skn'
  134.         je  load_skin_from_param
  135.         cmp ecx, '.dtp'
  136.         jne no_param
  137.        
  138. load_dtp_from_param:
  139.         mov     edi,dtp_name
  140.         mov     esi,app_param
  141.         xor     eax,eax
  142.         cld
  143. @@:
  144.         lodsb
  145.         stosb
  146.         test   eax,eax
  147.         jnz    @b      
  148.         call   load_dtp_file.1
  149.         jmp    skin_path_ready
  150.  
  151. load_skin_from_param:
  152.         mov    edi,skin_info
  153.         mov    esi,app_param
  154.         xor    eax,eax
  155.         cld
  156. @@:
  157.         lodsb
  158.         stosb
  159.         test    eax,eax
  160.         jnz     @b     
  161.         call    load_skin_file.2
  162.         jmp     skin_path_ready
  163.  
  164. no_param:
  165.         mcall   48,3,color_table,4*10   ; get current colors
  166.         call    load_skin_file.2
  167.        
  168. skin_path_ready:       
  169. ;---------------------------------------------------------------------
  170. ;OpenDialog     initialisation
  171.         push    dword OpenDialog_data
  172.         call    [OpenDialog_Init]
  173.  
  174.         push    dword OpenDialog_data2
  175.         call    [OpenDialog_Init]
  176. ;--------------------------------------------------------------------
  177. ;init_ColorDialog       ColorDialog_data
  178.         push    dword ColorDialog_data
  179.         call    [ColorDialog_Init]
  180. ;--------------------------------------------------------------------
  181. ; prepare for PathShow
  182.         push    dword PathShow_data_1
  183.         call    [PathShow_prepare]
  184.        
  185.         push    dword PathShow_data_2
  186.         call    [PathShow_prepare]
  187. ;--------------------------------------------------------------------- 
  188. red:
  189.         call    draw_window             ; at first, draw the window
  190. ;--------------------------------------------------------------------- 
  191. still:
  192.         mcall   10      ; wait here for event
  193.  
  194.         dec     eax     ; redraw request ?
  195.         jz      red
  196.  
  197.         dec     eax     ; key in buffer ?
  198.         jz      key
  199.  
  200.         dec     eax     ; button in buffer ?
  201.         jz      button
  202.  
  203.         jmp     still
  204. ;---------------------------------------------------------------------
  205. key:            ; key
  206.         mcall   2       ; just read it and ignore
  207.         jmp     still
  208. ;---------------------------------------------------------------------
  209. button:         ; button
  210.         mcall   17      ; get id
  211.  
  212.         cmp     ah,12   ; load file
  213.         jne     no_load
  214.  
  215.         call    load_dtp_file
  216.         call    draw_window
  217.         jmp     still
  218. ;--------------------------------------
  219. no_load:
  220.         cmp     ah,13   ; save file
  221.         jne     no_save
  222.  
  223.         call    save_file
  224.         jmp     still
  225. ;--------------------------------------
  226. no_save:
  227.         cmp     ah,14   ; set 3d buttons
  228.         jne     no_3d
  229.  
  230.         mcall   48,1,1
  231.         invoke  ini_set_int, aIni, aSectionSkn, aButtonStyle, 1
  232.         jmp     doapply
  233. ;--------------------------------------
  234. no_3d:
  235.         cmp     ah,15   ; set flat buttons
  236.         jne     no_flat
  237.  
  238.         invoke  ini_set_int, aIni, aSectionSkn, aButtonStyle, 0
  239.         mcall   48, 1, 0
  240. ;--------------------------------------
  241. doapply:
  242.         mcall   48, 0, 0
  243.         jmp     still
  244. ;--------------------------------------
  245. no_flat:
  246.         cmp     ah,16   ; apply
  247.         jne     no_apply
  248. ;--------------------------------------
  249. apply_direct:
  250.         mcall   48,2,color_table,10*4
  251.         jmp     doapply
  252. ;--------------------------------------
  253.  no_apply:
  254.         cmp     ah,17   ; load skin file
  255.         jne     no_load_skin
  256.  
  257.         call    load_skin_file
  258.         call    draw_window
  259.         jmp     still
  260. ;--------------------------------------
  261. no_load_skin:
  262.         cmp     ah,18   ; apply skin
  263.         jne     no_apply_skin
  264.  
  265.         cmp     [skin_info],0
  266.         je      no_apply_skin
  267.  
  268.         mcall   48,8,skin_info
  269.         call    draw_window
  270.         jmp     still
  271. ;--------------------------------------
  272. no_apply_skin:
  273.         cmp     ah,31
  274.         jb      no_new_colour
  275.  
  276.         cmp     ah,41
  277.         jg      no_new_colour
  278.        
  279. ;--------------------------------------------------------------------- 
  280. .start_ColorDialog:
  281.         push    dword ColorDialog_data
  282.         call    [ColorDialog_Start]
  283. ; 2 - use another method/not found program
  284.         cmp     [ColorDialog_data.status],2
  285.         je      still
  286. ; 1 - OK, color selected       
  287.         cmp     [ColorDialog_data.status],1
  288.         jne     still
  289. ;--------------------------------------------------------------------- 
  290.        
  291.         shr     eax,8
  292.         sub     eax,31
  293.         shl     eax,2
  294.         mov     ebx,[ColorDialog_data.color]
  295.         and     ebx,0xffffff    ; temporary for ColorDialog!!!!!!!!!!
  296.         mov     [eax+color_table],ebx
  297.         cmp     dword[not_packed_area+SKIN_HEADER.ident],'SKIN'
  298.         jne     @f
  299.  
  300.         mov     edi,[not_packed_area+SKIN_HEADER.params]
  301.         mov     dword[edi+not_packed_area+SKIN_PARAMS.dtp.data+eax],ebx
  302.         call    draw_skin
  303. ;--------------------------------------
  304. @@:
  305.         call    draw_colours
  306.         jmp     still
  307. ;--------------------------------------
  308. no_new_colour:
  309.         cmp     ah,1    ; terminate
  310.         jnz     noid1
  311. ;--------------------------------------
  312. close:
  313.         or      eax,-1
  314.         mcall
  315. ;--------------------------------------
  316. noid1:
  317.         jmp     still
  318. ;---------------------------------------------------------------------
  319. load_dtp_file:
  320. ;---------------------------------------------------------------------
  321. ; invoke OpenDialog
  322.         mov     [OpenDialog_data.type],dword 0
  323.         push    dword OpenDialog_data
  324.         call    [OpenDialog_Start]
  325.         cmp     [OpenDialog_data.status],1
  326.         je      .1
  327.         ret
  328. .1:
  329. ; prepare for PathShow
  330.         push    dword PathShow_data_1
  331.         call    [PathShow_prepare]
  332.  
  333.         call    draw_PathShow
  334. ;---------------------------------------------------------------------
  335. .2:
  336.         xor     eax, eax
  337.         mov     ebx, read_info
  338.         mov     dword [ebx], eax        ; subfunction: read
  339.         mov     dword [ebx+4], eax      ; offset (low dword)
  340.         mov     dword [ebx+8], eax      ; offset (high dword)
  341.         mov     dword [ebx+12], 40     ; read colors file: 4*10 bytes
  342.         mov     dword [ebx+16], color_table ; address
  343.         mcall   70
  344.         ret
  345. ;---------------------------------------------------------------------
  346. load_skin_file:
  347. ;---------------------------------------------------------------------
  348. ; invoke OpenDialog
  349.         push    dword OpenDialog_data2
  350.         call    [OpenDialog_Start]
  351.         cmp     [OpenDialog_data2.status],1
  352.         je      .1
  353.         ret
  354. .1:
  355. ; prepare for PathShow
  356.         push    dword PathShow_data_2
  357.         call    [PathShow_prepare]
  358.  
  359.         call    draw_PathShow
  360. ;---------------------------------------------------------------------
  361. .2:
  362.         xor     eax,eax
  363.         mov     ebx,read_info2
  364.         mov     dword [ebx], eax        ; subfunction: read
  365.         mov     dword [ebx+4], eax      ; offset (low dword)
  366.         mov     dword [ebx+8], eax      ; offset (high dword)
  367.         mov     dword [ebx+12], 32*1024 ; read: max 32 KBytes
  368.         mov     dword [ebx+16], file_load_area ; address
  369.         mcall   70
  370.  
  371.         mov     esi, file_load_area
  372.  
  373.         cmp     dword [esi], 'KPCK'
  374.         jnz     notpacked
  375.  
  376.         cmp     dword [esi+4], 32*1024 ; max 32 KBytes
  377.         ja      doret
  378.  
  379.         push    unpack_area
  380.         push    esi
  381.         call    unpack
  382.         mov     esi,unpack_area
  383. ;--------------------------------------
  384. notpacked:
  385.         cmp     [esi+SKIN_HEADER.ident],dword 'SKIN'
  386.         jne     doret
  387.  
  388.         mov     edi,not_packed_area
  389.         mov     ecx,0x8000/4
  390.         rep     movsd
  391.  
  392.         mov     ebp,not_packed_area
  393.         mov     esi,[ebp+SKIN_HEADER.params]
  394.         add     esi,ebp
  395.         lea     esi,[esi+SKIN_PARAMS.dtp.data]
  396.         mov     edi,color_table
  397.         mov     ecx,10
  398.         rep     movsd
  399. ;--------------------------------------
  400. doret:
  401.         ret
  402. ;---------------------------------------------------------------------
  403. save_file:
  404. ;---------------------------------------------------------------------
  405. ; invoke OpenDialog
  406.         mov     [OpenDialog_data.type],dword 1
  407.         push    dword OpenDialog_data
  408.         call    [OpenDialog_Start]
  409.         cmp     [OpenDialog_data.status],1
  410.         je      .1
  411.         ret
  412. .1:
  413. ; prepare for PathShow
  414.         push    dword PathShow_data_1
  415.         call    [PathShow_prepare]
  416.  
  417.         call    draw_PathShow
  418. ;---------------------------------------------------------------------
  419.         xor     eax,eax
  420.         mov     ebx,write_info
  421.         mov     [ebx],dword 2                   ; subfunction: write
  422.         and     [ebx+4],eax                     ; (reserved)
  423.         and     [ebx+8],eax                     ; (reserved)
  424.         mov     [ebx+12],dword 10*4             ; bytes to write
  425.         mov     [ebx+16],dword color_table      ; address
  426.         mcall   70
  427.         ret
  428. ;---------------------------------------------------------------------
  429. draw_button_row:
  430.         mov     edx,0x60000000 + 31             ; BUTTON ROW
  431.         mov     ebx,220*65536+14
  432.         mov     ecx,10*65536+14
  433.         mov     eax,8
  434. ;-----------------------------------
  435. .newb:
  436.         mcall
  437.         add     ecx,20*65536
  438.         inc     edx
  439.         cmp     edx,0x60000000 + 40
  440.         jbe     .newb
  441.         ret
  442. ;---------------------------------------------------------------------
  443. draw_button_row_of_texts:
  444.         mov     ebx,240*65536+13        ; ROW OF TEXTS
  445.         mov     ecx,[w_work_text]
  446.         mov     edx,text
  447.         mov     esi,32
  448.         mov     eax,4
  449. ;-----------------------------------
  450. .newline:
  451.         mcall
  452.         add     ebx,20
  453.         add     edx,32
  454.         cmp     [edx],byte 'x'
  455.         jne     .newline
  456.         ret
  457. ;---------------------------------------------------------------------
  458. draw_colours:
  459.         pusha
  460.         mov     esi,color_table
  461.         mov     ebx,220*65536+14
  462.         mov     ecx,10*65536+14
  463.         mov     eax,13
  464.         mov     [frame_data.draw_text_flag],dword 0
  465. ;--------------------------------------
  466. newcol:
  467.         mov     edx,[esi]
  468.         mcall
  469.  
  470.         push    ebx ecx
  471.  
  472.         sub     ebx,2 shl 16
  473.         add     bx,4
  474.         sub     ecx,2 shl 16
  475.         add     cx,4
  476.        
  477.         mov     [frame_data.x],ebx
  478.         mov     [frame_data.y],ecx     
  479.  
  480.         push    dword frame_data
  481.         call    [Frame_draw]
  482.  
  483.         pop     ecx ebx
  484.  
  485.         add     ecx,20*65536
  486.         add     esi,4
  487.         cmp     esi,color_table+4*9
  488.         jbe     newcol
  489.  
  490.         popa
  491.         ret
  492. ;----------------------------------------------------------------------
  493. draw_PathShow:
  494.         pusha
  495.         mcall   13,<frame_1.x+5,frame_1.width-15>,<frame_1.y+7,15>,0xffffff
  496.         mcall   13,<frame_2.x+5,frame_2.width-15>,<frame_2.y+7,15>,0xffffff
  497. ; draw for PathShow
  498.         push    dword PathShow_data_1
  499.         call    [PathShow_draw]
  500.        
  501.         push    dword PathShow_data_2
  502.         call    [PathShow_draw]
  503.         popa
  504.         ret
  505. ;---------------------------------------------------------------------
  506. ;   *********************************************
  507. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  508. ;   *********************************************
  509. draw_window:
  510.         mcall   12,1
  511.         mcall   48,3,app_colours,10*4
  512.         mcall   14
  513.         mcall   48,4
  514.         mov     [current_skin_high],eax
  515. ; DRAW WINDOW
  516.         xor     eax,eax         ; function 0 : define and draw window
  517.         xor     esi,esi
  518.         mov     edx,[w_work]    ; color of work area RRGGBB,8->color
  519.         or      edx,0x34000000
  520.         mov     ecx,50 shl 16 + 346
  521.         add     ecx,[current_skin_high]
  522.         mcall   ,<110,440>,,,,title
  523.  
  524.         mcall   9,procinfo,-1
  525.        
  526.         mov     eax,[procinfo+70] ;status of window
  527.         test    eax,100b
  528.         jne     .end
  529.  
  530. ;if lang eq ru
  531.   load_w  = (5*2+6*9)
  532.   save_w  = (5*2+6*9)
  533.   flat_w  = (5*2+6*7)
  534.   apply_w = (5*2+6*9)
  535. ;else
  536. ;  load_w  = (5*2+6*6)
  537. ;  save_w  = (5*2+6*8)
  538. ;  flat_w  = (5*2+6*4)
  539. ;  apply_w = (5*2+6*7)
  540. ;end if
  541. ;-----------------------------------
  542. ; select color DTP frame
  543. ; LOAD BUTTON   ; button 12
  544.         mcall   8,<frame_1.x+10,load_w>,<frame_1.y+25,18>,12,[w_work_button]
  545. ; SAVE BUTTON
  546.         add     ebx,(load_w+2)*65536-load_w+save_w
  547.         inc     edx
  548.         mcall           ; button 13
  549. ; APPLY BUTTON
  550.         mov     ebx,(frame_1.x + frame_1.width - apply_w - 15)*65536+apply_w
  551.         mcall   8,,,16  ; button 17
  552. ; select color DTP button text
  553.         mcall   4,<frame_1.x+16,frame_1.y+31>,[w_work_button_text],t1,t1.size
  554. ;-----------------------------------   
  555. ; select skin frame    
  556. ; LOAD SKIN BUTTON      ; button 17
  557.         mcall   8,<frame_2.x+10,load_w>,<frame_2.y+25,18>,17,[w_work_button]
  558. ; 3D
  559.         mov     ebx,(frame_2.x+155)*65536+34
  560.         mcall   ,,,14   ; button 14
  561. ; FLAT
  562.         add     ebx,36*65536-34+flat_w
  563.         inc     edx
  564.         mcall           ; button 15
  565. ; APPLY SKIN BUTTON
  566.         mov     ebx,(frame_2.x + frame_2.width - apply_w -15)*65536+apply_w
  567.         mcall   ,,,18           ; button 18
  568. ; select skin button text
  569.         mcall   4,<frame_2.x+16,frame_2.y+31>,[w_work_button_text],t2,t2.size
  570. ;-----------------------------------           
  571.         call    draw_button_row
  572.         call    draw_button_row_of_texts
  573.         call    draw_colours
  574. ;-----------------------------------
  575.         mov     [frame_data.x],dword frame_1.x shl 16+frame_1.width
  576.         mov     [frame_data.y],dword frame_1.y shl 16+frame_1.height
  577.         mov     [frame_data.text_pointer],dword select_dtp_text
  578.         mov     eax,[w_work]
  579.         mov     [frame_data.font_backgr_color],eax
  580.         mov     eax,[w_work_text]
  581.         mov     [frame_data.font_color],eax
  582.         mov     [frame_data.draw_text_flag],dword 1
  583.        
  584.         push    dword frame_data
  585.         call    [Frame_draw]
  586. ;-----------------------------------
  587.         mov     [frame_data.x],dword frame_2.x shl 16+frame_2.width
  588.         mov     [frame_data.y],dword frame_2.y shl 16+frame_2.height
  589.         mov     [frame_data.text_pointer],dword select_skin_text
  590.  
  591.         push    dword frame_data
  592.         call    [Frame_draw]
  593. ;-----------------------------------
  594.         call    draw_PathShow
  595. ;-----------------------------------
  596.         cmp     dword[not_packed_area+SKIN_HEADER.ident],'SKIN'
  597.         jne     @f
  598.         call    draw_skin
  599. @@:
  600. .end:
  601.         mcall   12,2
  602.         ret
  603. ;-----------------------------------------------------------------------------
  604. include 'drawskin.inc'
  605. ;-----------------------------------------------------------------------------
  606. ; DATA AREA
  607. ;-----------------------------------------------------------------------------
  608. include 'idata.inc'
  609. ;-----------------------------------------------------------------------------
  610. IM_END:
  611. ;-----------------------------------------------------------------------------
  612. include 'udata.inc'
  613. ;-----------------------------------------------------------------------------
  614. I_END:
  615. ;-----------------------------------------------------------------------------