Subversion Repositories Kolibri OS

Rev

Rev 7937 | Rev 8992 | 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.         stdcall string.copy, default_skin, skin_info
  110.         stdcall string.copy, default_dtp, dtp_name
  111. ;---------------------------------------------------------------------
  112. ; check app param
  113.         stdcall string.length, app_param
  114.         add eax, app_param
  115.         mov ecx, [eax-4]
  116.         cmp ecx, '.skn'
  117.         je  load_skin_from_param
  118.         cmp ecx, '.dtp'
  119.         jne no_param
  120.        
  121. load_dtp_from_param:
  122.         stdcall string.copy, app_param, dtp_name
  123.         call   load_dtp_file.1
  124.         jmp    skin_path_ready
  125.  
  126. load_skin_from_param:
  127.         stdcall string.copy, app_param, skin_info
  128.         call    load_skin_file.2
  129.         jmp     skin_path_ready
  130.  
  131. no_param:
  132.         mcall   48,3,color_table,4*10   ; get current colors
  133.         call    load_skin_file.2
  134.        
  135. skin_path_ready:       
  136. ;---------------------------------------------------------------------
  137. ;OpenDialog     initialisation
  138.         push    dword OpenDialog_data
  139.         call    [OpenDialog_Init]
  140.  
  141.         push    dword OpenDialog_data2
  142.         call    [OpenDialog_Init]
  143. ;--------------------------------------------------------------------
  144. ;init_ColorDialog       ColorDialog_data
  145.         push    dword ColorDialog_data
  146.         call    [ColorDialog_Init]
  147. ;--------------------------------------------------------------------
  148. ; prepare for PathShow
  149.         push    dword PathShow_data_1
  150.         call    [PathShow_prepare]
  151.        
  152.         push    dword PathShow_data_2
  153.         call    [PathShow_prepare]
  154. ;--------------------------------------------------------------------- 
  155. red:
  156.         call    draw_window             ; at first, draw the window
  157. ;--------------------------------------------------------------------- 
  158. still:
  159.         mcall   10      ; wait here for event
  160.  
  161.         dec     eax     ; redraw request ?
  162.         jz      red
  163.  
  164.         dec     eax     ; key in buffer ?
  165.         jz      key
  166.  
  167.         dec     eax     ; button in buffer ?
  168.         jz      button
  169.  
  170.         jmp     still
  171. ;---------------------------------------------------------------------
  172. key:            ; key
  173.         mcall   2       ; just read it and ignore
  174.         jmp     still
  175. ;---------------------------------------------------------------------
  176. button:         ; button
  177.         mcall   17      ; get id
  178.  
  179.         cmp     ah,12   ; load file
  180.         jne     no_load
  181.  
  182.         call    load_dtp_file
  183.         call    draw_window
  184.         jmp     still
  185. ;--------------------------------------
  186. no_load:
  187.         cmp     ah,13   ; save file
  188.         jne     no_save
  189.  
  190.         call    save_file
  191.         jmp     still
  192. ;--------------------------------------
  193. no_save:
  194.         cmp     ah,14   ; set 3d buttons
  195.         jne     no_3d
  196.  
  197.         mcall   48,1,1
  198.         invoke  ini_set_int, aIni, aSectionSkn, aButtonStyle, 1
  199.         jmp     doapply
  200. ;--------------------------------------
  201. no_3d:
  202.         cmp     ah,15   ; set flat buttons
  203.         jne     no_flat
  204.  
  205.         invoke  ini_set_int, aIni, aSectionSkn, aButtonStyle, 0
  206.         mcall   48, 1, 0
  207. ;--------------------------------------
  208. doapply:
  209.         mcall   48, 0, 0
  210.         jmp     still
  211. ;--------------------------------------
  212. no_flat:
  213.         cmp     ah,16   ; apply
  214.         jne     no_apply
  215. ;--------------------------------------
  216. apply_direct:
  217.         mcall   48,2,color_table,10*4
  218.         jmp     doapply
  219. ;--------------------------------------
  220.  no_apply:
  221.         cmp     ah,17   ; load skin file
  222.         jne     no_load_skin
  223.  
  224.         call    load_skin_file
  225.         call    draw_window
  226.         jmp     still
  227. ;--------------------------------------
  228. no_load_skin:
  229.         cmp     ah,18   ; apply skin
  230.         jne     no_apply_skin
  231.  
  232.         cmp     [skin_info],0
  233.         je      no_apply_skin
  234.  
  235.         mcall   48,8,skin_info
  236.         call    draw_window
  237.         jmp     still
  238. ;--------------------------------------
  239. no_apply_skin:
  240.         cmp     ah,31
  241.         jb      no_new_colour
  242.  
  243.         cmp     ah,41
  244.         jg      no_new_colour
  245.        
  246. ;--------------------------------------------------------------------- 
  247. .start_ColorDialog:
  248.         push    dword ColorDialog_data
  249.         call    [ColorDialog_Start]
  250. ; 2 - use another method/not found program
  251.         cmp     [ColorDialog_data.status],2
  252.         je      still
  253. ; 1 - OK, color selected       
  254.         cmp     [ColorDialog_data.status],1
  255.         jne     still
  256. ;--------------------------------------------------------------------- 
  257.        
  258.         shr     eax,8
  259.         sub     eax,31
  260.         shl     eax,2
  261.         mov     ebx,[ColorDialog_data.color]
  262.         and     ebx,0xffffff    ; temporary for ColorDialog!!!!!!!!!!
  263.         mov     [eax+color_table],ebx
  264.         cmp     dword[not_packed_area+SKIN_HEADER.ident],'SKIN'
  265.         jne     @f
  266.  
  267.         mov     edi,[not_packed_area+SKIN_HEADER.params]
  268.         mov     dword[edi+not_packed_area+SKIN_PARAMS.dtp.data+eax],ebx
  269.         call    draw_skin
  270. ;--------------------------------------
  271. @@:
  272.         call    draw_colours
  273.         jmp     still
  274. ;--------------------------------------
  275. no_new_colour:
  276.         cmp     ah,1    ; terminate
  277.         jnz     noid1
  278. ;--------------------------------------
  279. close:
  280.         or      eax,-1
  281.         mcall
  282. ;--------------------------------------
  283. noid1:
  284.         jmp     still
  285. ;---------------------------------------------------------------------
  286. load_dtp_file:
  287. ;---------------------------------------------------------------------
  288. ; invoke OpenDialog
  289.         mov     [OpenDialog_data.type],dword 0
  290.         push    dword OpenDialog_data
  291.         call    [OpenDialog_Start]
  292.         cmp     [OpenDialog_data.status],1
  293.         je      .1
  294.         ret
  295. .1:
  296. ; prepare for PathShow
  297.         push    dword PathShow_data_1
  298.         call    [PathShow_prepare]
  299.  
  300.         call    draw_PathShow
  301. ;---------------------------------------------------------------------
  302. .2:
  303.         xor     eax, eax
  304.         mov     ebx, read_info
  305.         mov     dword [ebx], eax        ; subfunction: read
  306.         mov     dword [ebx+4], eax      ; offset (low dword)
  307.         mov     dword [ebx+8], eax      ; offset (high dword)
  308.         mov     dword [ebx+12], 40     ; read colors file: 4*10 bytes
  309.         mov     dword [ebx+16], color_table ; address
  310.         mcall   70
  311.         ret
  312. ;---------------------------------------------------------------------
  313. load_skin_file:
  314. ;---------------------------------------------------------------------
  315. ; invoke OpenDialog
  316.         push    dword OpenDialog_data2
  317.         call    [OpenDialog_Start]
  318.         cmp     [OpenDialog_data2.status],1
  319.         je      .1
  320.         ret
  321. .1:
  322. ; prepare for PathShow
  323.         push    dword PathShow_data_2
  324.         call    [PathShow_prepare]
  325.  
  326.         call    draw_PathShow
  327. ;---------------------------------------------------------------------
  328. .2:
  329.         xor     eax,eax
  330.         mov     ebx,read_info2
  331.         mov     dword [ebx], eax        ; subfunction: read
  332.         mov     dword [ebx+4], eax      ; offset (low dword)
  333.         mov     dword [ebx+8], eax      ; offset (high dword)
  334.         mov     dword [ebx+12], 32*1024 ; read: max 32 KBytes
  335.         mov     dword [ebx+16], file_load_area ; address
  336.         mcall   70
  337.  
  338.         mov     esi, file_load_area
  339.  
  340.         cmp     dword [esi], 'KPCK'
  341.         jnz     notpacked
  342.  
  343.         cmp     dword [esi+4], 32*1024 ; max 32 KBytes
  344.         ja      doret
  345.  
  346.         push    unpack_area
  347.         push    esi
  348.         call    unpack
  349.         mov     esi,unpack_area
  350. ;--------------------------------------
  351. notpacked:
  352.         cmp     [esi+SKIN_HEADER.ident],dword 'SKIN'
  353.         jne     doret
  354.  
  355.         mov     edi,not_packed_area
  356.         mov     ecx,0x8000/4
  357.         rep     movsd
  358.  
  359.         mov     ebp,not_packed_area
  360.         mov     esi,[ebp+SKIN_HEADER.params]
  361.         add     esi,ebp
  362.         lea     esi,[esi+SKIN_PARAMS.dtp.data]
  363.         mov     edi,color_table
  364.         mov     ecx,10
  365.         rep     movsd
  366. ;--------------------------------------
  367. doret:
  368.         ret
  369. ;---------------------------------------------------------------------
  370. save_file:
  371. ;---------------------------------------------------------------------
  372. ; invoke OpenDialog
  373.         mov     [OpenDialog_data.type],dword 1
  374.         push    dword OpenDialog_data
  375.         call    [OpenDialog_Start]
  376.         cmp     [OpenDialog_data.status],1
  377.         je      .1
  378.         ret
  379. .1:
  380. ; prepare for PathShow
  381.         push    dword PathShow_data_1
  382.         call    [PathShow_prepare]
  383.  
  384.         call    draw_PathShow
  385. ;---------------------------------------------------------------------
  386.         xor     eax,eax
  387.         mov     ebx,write_info
  388.         mov     [ebx],dword 2                   ; subfunction: write
  389.         and     [ebx+4],eax                     ; (reserved)
  390.         and     [ebx+8],eax                     ; (reserved)
  391.         mov     [ebx+12],dword 10*4             ; bytes to write
  392.         mov     [ebx+16],dword color_table      ; address
  393.         mcall   70
  394.         ret
  395. ;---------------------------------------------------------------------
  396. draw_button_row:
  397.         mov     edx,0x60000000 + 31             ; BUTTON ROW
  398.         mov     ebx,220*65536+14
  399.         mov     ecx,10*65536+14
  400.         mov     eax,8
  401. ;-----------------------------------
  402. .newb:
  403.         mcall
  404.         add     ecx,20*65536
  405.         inc     edx
  406.         cmp     edx,0x60000000 + 40
  407.         jbe     .newb
  408.         ret
  409. ;---------------------------------------------------------------------
  410. draw_button_row_of_texts:
  411.         mov     ebx,240*65536+13        ; ROW OF TEXTS
  412.         mov     ecx,[w_work_text]
  413.         mov     edx,text
  414.         mov     esi,32
  415.         mov     eax,4
  416. ;-----------------------------------
  417. .newline:
  418.         mcall
  419.         add     ebx,20
  420.         add     edx,32
  421.         cmp     [edx],byte 'x'
  422.         jne     .newline
  423.         ret
  424. ;---------------------------------------------------------------------
  425. draw_colours:
  426.         pusha
  427.         mov     esi,color_table
  428.         mov     ebx,220*65536+14
  429.         mov     ecx,10*65536+14
  430.         mov     eax,13
  431.         mov     [frame_data.draw_text_flag],dword 0
  432. ;--------------------------------------
  433. newcol:
  434.         mov     edx,[esi]
  435.         mcall
  436.  
  437.         push    ebx ecx
  438.  
  439.         sub     ebx,2 shl 16
  440.         add     bx,4
  441.         sub     ecx,2 shl 16
  442.         add     cx,4
  443.        
  444.         mov     [frame_data.x],ebx
  445.         mov     [frame_data.y],ecx     
  446.  
  447.         push    dword frame_data
  448.         call    [Frame_draw]
  449.  
  450.         pop     ecx ebx
  451.  
  452.         add     ecx,20*65536
  453.         add     esi,4
  454.         cmp     esi,color_table+4*9
  455.         jbe     newcol
  456.  
  457.         popa
  458.         ret
  459. ;----------------------------------------------------------------------
  460. draw_PathShow:
  461.         pusha
  462.         mcall   13,<frame_1.x+5,frame_1.width-15>,<frame_1.y+7,15>,0xffffff
  463.         mcall   13,<frame_2.x+5,frame_2.width-15>,<frame_2.y+7,15>,0xffffff
  464. ; draw for PathShow
  465.         push    dword PathShow_data_1
  466.         call    [PathShow_draw]
  467.        
  468.         push    dword PathShow_data_2
  469.         call    [PathShow_draw]
  470.         popa
  471.         ret
  472. ;---------------------------------------------------------------------
  473. ;   *********************************************
  474. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  475. ;   *********************************************
  476. draw_window:
  477.         mcall   12,1
  478.         mcall   48,3,app_colours,10*4
  479.         mcall   14
  480.         mcall   48,4
  481.         mov     [current_skin_high],eax
  482. ; DRAW WINDOW
  483.         xor     eax,eax         ; function 0 : define and draw window
  484.         xor     esi,esi
  485.         mov     edx,[w_work]    ; color of work area RRGGBB,8->color
  486.         or      edx,0x34000000
  487.         mov     ecx,50 shl 16 + 346
  488.         add     ecx,[current_skin_high]
  489.         mcall   ,<110,440>,,,,title
  490.  
  491.         mcall   9,procinfo,-1
  492.        
  493.         mov     eax,[procinfo+70] ;status of window
  494.         test    eax,100b
  495.         jne     .end
  496.  
  497. ;if lang eq ru
  498.   load_w  = (5*2+6*9)
  499.   save_w  = (5*2+6*9)
  500.   flat_w  = (5*2+6*7)
  501.   apply_w = (5*2+6*9)
  502. ;else
  503. ;  load_w  = (5*2+6*6)
  504. ;  save_w  = (5*2+6*8)
  505. ;  flat_w  = (5*2+6*4)
  506. ;  apply_w = (5*2+6*7)
  507. ;end if
  508. ;-----------------------------------
  509. ; select color DTP frame
  510. ; LOAD BUTTON   ; button 12
  511.         mcall   8,<frame_1.x+10,load_w>,<frame_1.y+25,18>,12,[w_work_button]
  512. ; SAVE BUTTON
  513.         add     ebx,(load_w+2)*65536-load_w+save_w
  514.         inc     edx
  515.         mcall           ; button 13
  516. ; APPLY BUTTON
  517.         mov     ebx,(frame_1.x + frame_1.width - apply_w - 15)*65536+apply_w
  518.         mcall   8,,,16  ; button 17
  519. ; select color DTP button text
  520.         mcall   4,<frame_1.x+16,frame_1.y+31>,[w_work_button_text],t1,t1.size
  521. ;-----------------------------------   
  522. ; select skin frame    
  523. ; LOAD SKIN BUTTON      ; button 17
  524.         mcall   8,<frame_2.x+10,load_w>,<frame_2.y+25,18>,17,[w_work_button]
  525. ; 3D
  526.         mov     ebx,(frame_2.x+155)*65536+34
  527.         mcall   ,,,14   ; button 14
  528. ; FLAT
  529.         add     ebx,36*65536-34+flat_w
  530.         inc     edx
  531.         mcall           ; button 15
  532. ; APPLY SKIN BUTTON
  533.         mov     ebx,(frame_2.x + frame_2.width - apply_w -15)*65536+apply_w
  534.         mcall   ,,,18           ; button 18
  535. ; select skin button text
  536.         mcall   4,<frame_2.x+16,frame_2.y+31>,[w_work_button_text],t2,t2.size
  537. ;-----------------------------------           
  538.         call    draw_button_row
  539.         call    draw_button_row_of_texts
  540.         call    draw_colours
  541. ;-----------------------------------
  542.         mov     [frame_data.x],dword frame_1.x shl 16+frame_1.width
  543.         mov     [frame_data.y],dword frame_1.y shl 16+frame_1.height
  544.         mov     [frame_data.text_pointer],dword select_dtp_text
  545.         mov     eax,[w_work]
  546.         mov     [frame_data.font_backgr_color],eax
  547.         mov     eax,[w_work_text]
  548.         mov     [frame_data.font_color],eax
  549.         mov     [frame_data.draw_text_flag],dword 1
  550.        
  551.         push    dword frame_data
  552.         call    [Frame_draw]
  553. ;-----------------------------------
  554.         mov     [frame_data.x],dword frame_2.x shl 16+frame_2.width
  555.         mov     [frame_data.y],dword frame_2.y shl 16+frame_2.height
  556.         mov     [frame_data.text_pointer],dword select_skin_text
  557.  
  558.         push    dword frame_data
  559.         call    [Frame_draw]
  560. ;-----------------------------------
  561.         call    draw_PathShow
  562. ;-----------------------------------
  563.         cmp     dword[not_packed_area+SKIN_HEADER.ident],'SKIN'
  564.         jne     @f
  565.         call    draw_skin
  566. @@:
  567. .end:
  568.         mcall   12,2
  569.         ret
  570. ;-----------------------------------------------------------------------------
  571. include 'drawskin.inc'
  572. ;-----------------------------------------------------------------------------
  573. ; DATA AREA
  574. ;-----------------------------------------------------------------------------
  575. include 'idata.inc'
  576. ;-----------------------------------------------------------------------------
  577. IM_END:
  578. ;-----------------------------------------------------------------------------
  579. include 'udata.inc'
  580. ;-----------------------------------------------------------------------------
  581. I_END:
  582. ;-----------------------------------------------------------------------------