Subversion Repositories Kolibri OS

Rev

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