Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.                 control ProgressBar
  3. */
  4.  
  5. void ProgressBarDrawProgress(struct ControlProgressBar *ProgressBar)
  6. {
  7.         int     x;
  8.         int     y;
  9.         int     pos_progress;
  10.         int     sizex;
  11.         int     sizey;
  12.         char    v;
  13.         struct FINITION *fin;
  14.         gui_message_t   message;
  15.         gui_text_size_t         size;
  16.         gui_text_t              *Text;
  17.        
  18.         if ((ProgressBar->flags & FLAG_SHOW_CONTROL)==FALSE)    return;
  19.  
  20.         x=ProgressBar->ctrl_x;
  21.         y=ProgressBar->ctrl_y;
  22.         sizex=ProgressBar->ctrl_sizex;
  23.         sizey=ProgressBar->ctrl_sizey;
  24.         fin=(struct FINITION*)ProgressBar->finition;
  25.  
  26.         if (ProgressBar->progress<0.0)  ProgressBar->progress=0.0;
  27.         if (ProgressBar->progress>1.0)  ProgressBar->progress=1.0;
  28.  
  29.         v=ProgressBar->prb_flags & FLAG_PB_HORIZONTAL_ORIENTATION_ON;
  30.         if (v!=FALSE)
  31.         {
  32.                 pos_progress=(int)(ProgressBar->progress*(sizex-2));
  33.  
  34.                 if (ProgressBar->prb_flags & FLAG_PB_FROM_LEFT_TO_RIGHT_ON)
  35.                 {
  36.                         Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x+1,y+1,pos_progress,sizey-2,COLOR_FON,COLOR_MIDDLE_LIGHT);
  37.                         Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x+1+pos_progress,y+1,sizex-2-pos_progress,
  38.                                                                                         sizey-2,COLOR_MIDDLE_LIGHT,COLOR_LIGHT);
  39.                         if (ProgressBar->prb_flags & FLAG_PB_TEXT_ON)
  40.                         {
  41.                                 if (fin->flags & FINITION_ON)
  42.                                 {
  43.                                         message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION;
  44.                                         message.arg1=fin->x;
  45.                                         message.arg2=fin->y;
  46.                                         message.arg3=fin->sizex;
  47.                                         message.arg4=fin->sizey;
  48.                                 }
  49.                                 else
  50.                                 {
  51.                                         message.type=MESSAGE_FULL_REDRAW_ALL;
  52.                                 }
  53.                                 Text=(gui_text_t*)ProgressBar->child_bk;
  54.                                 size=GetStringSize((font_t*)Text->font,Text->text);
  55.                                 Text->ctrl_sizex=(DWORD)size.sizex;
  56.                                 Text->ctrl_sizey=(DWORD)size.sizey;
  57.                                 Text->ctrl_x=x+(sizex/2)-(Text->ctrl_sizex/2);
  58.                                 Text->ctrl_y=y+(sizey/2)-(Text->ctrl_sizey/2);
  59.                                
  60.                                 SendMessage((struct HEADER*)ProgressBar,&message);
  61.                         }
  62.                 }
  63.  
  64.                 if (ProgressBar->prb_flags & FLAG_PB_FROM_RIGHT_TO_LEFT_ON)
  65.                 {
  66.                         //Draw(fin,"filled_rectangle",x+sizex-pos_progress-1,y+1,x+sizex-1,sizey-2,0xff0000);
  67.                 }
  68.                
  69.         }
  70. }
  71.  
  72. void DrawProgressBar(struct ControlProgressBar *ProgressBar)
  73. {
  74.         int             x,y,sizex,sizey;
  75.         char            c;
  76.         char            *save_buf,*buf;
  77.         int             save_size_x,save_size_y;
  78.         DWORD           draw_output,flags;
  79.         finition_t      *fin;
  80.  
  81.         x=ProgressBar->ctrl_x;
  82.         y=ProgressBar->ctrl_y;
  83.         sizex=ProgressBar->ctrl_sizex;
  84.         sizey=ProgressBar->ctrl_sizey;
  85.         fin=(struct FINITION*)ProgressBar->finition;
  86.  
  87.         //alocate a buffer for draw text
  88.         c=screen.bits_per_pixel >> 3;
  89.         buf=malloc(sizex*sizey*c);
  90.  
  91.         //save current screen parameters
  92.         save_buf=screen.buffer;
  93.         save_size_x=screen.size_x;
  94.         save_size_y=screen.size_y;
  95.         draw_output=screen.draw_output;
  96.  
  97.         //load parameters of local buffer
  98.         screen.buffer=buf;
  99.         screen.size_x=sizex;
  100.         screen.size_y=sizey;
  101.         screen.draw_output=DRAW_OUTPUT_BUFFER;
  102.  
  103.         //move control
  104.         SetControlNewPosition(ProgressBar,0,0);
  105.         //save finition parameters
  106.         flags=fin->flags;
  107.         fin->flags &=FINITION_OFF;
  108.  
  109.         //draw progress bar in buffer
  110.         Draw(fin,TOOL_RECTANGLE,0,0,sizex,sizey,COLOR_ABSOLUTE_DARK);
  111.         ProgressBarDrawProgress(ProgressBar);
  112.  
  113.         //restore last position of control
  114.         SetControlNewPosition(ProgressBar,x,y);
  115.         //restore finition
  116.         fin->flags=flags;
  117.  
  118.         //restore screen parameters
  119.         screen.buffer=save_buf;
  120.         screen.size_x=save_size_x;
  121.         screen.size_y=save_size_y;
  122.         screen.draw_output=draw_output;
  123.  
  124.         //move rendered objects from local buffer to screen
  125.         if (fin->flags & FINITION_ON)
  126.                 DrawImageFinit(fin,x,y,sizex,sizey,screen.bits_per_pixel,buf);
  127.         else
  128.                 DrawImage(x,y,sizex,sizey,screen.bits_per_pixel,buf);
  129.  
  130.         //free local buffer
  131.         free(buf);
  132. }
  133.  
  134. void SetProgressBarPulse(struct ControlProgressBar *ProgressBar,int time_tick)
  135. {
  136.         struct TIMER *timer;
  137.         struct  HEADERPARENT    *main_parent;
  138.  
  139.         main_parent=(struct     HEADERPARENT*)ProgressBar->main_parent;
  140.         if (main_parent!=(struct HEADERPARENT*)NULL)
  141.         {
  142.                 main_parent->number_timers_for_controls++;
  143.  
  144.                 ProgressBar->timer=(DWORD*)SetTimerCallbackForControl(time_tick,&DrawProgressBar,ProgressBar);
  145.                 timer=(struct TIMER*)ProgressBar->timer;
  146.                 timer->flags=timer->flags | FLAG_TIMER_ON;
  147.         }
  148. }
  149.  
  150. //---------------------------------------------------------------------------------
  151. //                       control ProgressBar
  152. //---------------------------------------------------------------------------------
  153. void ProgressBarProc(struct ControlProgressBar *ProgressBar,struct MESSAGE *message)
  154. {
  155.         int                     btn_state;
  156.         char                    v;
  157.         struct TIMER            *timer;
  158.         struct  FINITION        *fin;
  159.  
  160.         switch(message->type)
  161.         {
  162.                 case MESSAGE_FULL_REDRAW_ALL:
  163.                 {
  164.                         //draw ProgressBar
  165.                         if (ProgressBar->flags & FLAG_SHOW_CONTROL)     DrawProgressBar(ProgressBar);
  166.                         break;
  167.                 }
  168.                 case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION:
  169.                 {
  170.                         fin=(struct FINITION*)ProgressBar->finition;
  171.                         fin->flags=fin->flags | FINITION_ON;
  172.                         fin->x=message->arg1;
  173.                         fin->y=message->arg2;
  174.                         fin->sizex=message->arg3;
  175.                         fin->sizey=message->arg4;
  176.                         DrawProgressBar(ProgressBar);
  177.                         break;
  178.                 }
  179.                 case MESSAGE_SPECIALIZED:
  180.                 {       //redraw bar of progress
  181.                         if (ProgressBar->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON)
  182.                         {
  183.                                 if (ProgressBar->flags & FLAG_SHOW_CONTROL)     ProgressBarDrawProgress(ProgressBar);
  184.                                 ProgressBar->flags=ProgressBar->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF;
  185.                         }                      
  186.                         break;
  187.                 }
  188.                 case MESSAGE_CHANGE_POSITION_EVENT:
  189.                 {
  190.                         ProgressBar->ctrl_x=ProgressBar->ctrl_x+message->arg1;
  191.                         ProgressBar->ctrl_y=ProgressBar->ctrl_y+message->arg2;
  192.                         SendMessage((struct HEADER*)ProgressBar,message);
  193.                         break;
  194.                 }
  195.                 case MESSAGE_CALL_TIMER_EVENT:
  196.                 {
  197.                         if (ProgressBar->timer!=(DWORD*)NULL)
  198.                         {
  199.                                 timer=(struct TIMER*)ProgressBar->timer;
  200.                                 if (timer->flags & FLAG_TIMER_ON)       Timer(timer);
  201.                         }
  202.                         SendMessage((struct HEADER*)ProgressBar,message);
  203.                         break;
  204.                 }
  205.                 case MESSAGE_DESTROY_CONTROL:
  206.                 {
  207.                         if (ProgressBar->timer!=(DWORD*)NULL)   free(ProgressBar->timer);
  208.                         free(ProgressBar->finition);
  209.                         SendMessage((struct HEADER*)ProgressBar,message);
  210.                         break;
  211.                 }
  212.                 case MESSAGE_SET_MAIN_PARENT:
  213.                 {
  214.                         SendMessage((struct HEADER*)ProgressBar,message);
  215.                         ProgressBar->main_parent=(DWORD*)message->arg1;
  216.                         SendMessage((struct HEADER*)ProgressBar,message);
  217.                         break;
  218.                 }
  219.  
  220.                 default: break;
  221.         }
  222. }
  223.  
  224. //---------------------------------------------------------------------------------
  225. //                              create control ProgressBar
  226. //---------------------------------------------------------------------------------
  227. void* CreateProgressBarEmpty(struct ProgressBarData *info_for_control)
  228. {
  229.         struct ControlProgressBar *ProgressBar;
  230.         struct FINITION         *fin;
  231.  
  232.         ProgressBar=malloc(sizeof(struct ControlProgressBar));
  233.         ProgressBar->finition=malloc(sizeof(struct FINITION));
  234.         fin=(struct FINITION*)ProgressBar->finition;
  235.         fin->flags=0;
  236.  
  237.         ID++;
  238. #ifdef  DEBUG
  239.         printf("\ncreated progress bar with ID=%d",(int)ID);
  240. #endif
  241.         ProgressBar->child_bk=(DWORD*)NULL;
  242.         ProgressBar->child_fd=(DWORD*)NULL;
  243.         ProgressBar->active_control_for_keys=(DWORD*)NULL;
  244.         ProgressBar->active_control_for_mouse=(DWORD*)NULL;
  245.         ProgressBar->callback=(DWORD*)NULL;
  246.         ProgressBar->timer=(DWORD*)NULL;
  247.         ProgressBar->ctrl_proc=(DWORD*)&ProgressBarProc;
  248.         ProgressBar->ctrl_x=(DWORD)info_for_control->x;
  249.         ProgressBar->ctrl_y=(DWORD)info_for_control->y;
  250.         ProgressBar->ctrl_sizex=(DWORD)info_for_control->width;
  251.         ProgressBar->ctrl_sizey=(DWORD)info_for_control->height;
  252.         ProgressBar->ctrl_ID=ID;
  253.         ProgressBar->progress=info_for_control->progress;
  254.         ProgressBar->flags=0;
  255.         ProgressBar->flags=ProgressBar->flags | FLAG_SHOW_CONTROL;
  256.  
  257.         ProgressBar->prb_flags=0;
  258.         ProgressBar->prb_flags=ProgressBar->prb_flags | FLAG_PB_HORIZONTAL_ORIENTATION_ON;
  259.         ProgressBar->prb_flags=ProgressBar->prb_flags | FLAG_PB_FROM_LEFT_TO_RIGHT_ON;
  260.  
  261.         return(ProgressBar);
  262. }
  263.  
  264. void* CreateProgressBar(gui_progress_bar_data_t *info)
  265. {
  266.         gui_text_t                      *text;
  267.         gui_text_data_t         txtdata;
  268.         gui_progress_bar_t      *pbar;
  269.        
  270.         pbar=CreateProgressBarEmpty(info);
  271.        
  272.         txtdata.x=0;
  273.         txtdata.y=0;
  274.         txtdata.font=NULL;
  275.         txtdata.background=FALSE;
  276.         txtdata.color=0;
  277.         txtdata.text=malloc(16);
  278.         txtdata.text[0]='\0';
  279.         text=CreateText(&txtdata);
  280.        
  281.         text->ctrl_x=pbar->ctrl_sizex/2;
  282.         text->ctrl_y=pbar->ctrl_sizey/2;
  283.         PackControls(pbar,text);
  284.        
  285.         text->flags &=FLAG_HIDE_CONTROL;
  286.  
  287.         return(pbar);
  288. }
  289.  
  290. void    ProgressBarSetText(gui_progress_bar_t *pbar,char *txt)
  291. {
  292.         gui_text_t                      *text;
  293.         long                            len1,len2;
  294.        
  295.         text=(gui_text_t*)pbar->child_bk;
  296.        
  297.         if (*txt!='\0')
  298.         {
  299.                 len1=strlen(text->text);
  300.                 len2=strlen(txt);
  301.                 if (len1<len2)
  302.                 {
  303.                         free(text->text);
  304.                         text->text=malloc(len2+1);//one byte for simbol end of string
  305.                 }
  306.                 memmove(text->text,txt,len2);
  307.                 text->text[len2]='\0';
  308.                 pbar->prb_flags|=FLAG_PB_TEXT_ON;
  309.                 text->flags |=FLAG_SHOW_CONTROL;
  310.         }
  311. }
  312.  
  313. char    *ProgressBarGetText(gui_progress_bar_t *pbar)
  314. {
  315.         gui_text_t                      *text;
  316.  
  317.         text=(gui_text_t*)pbar->child_bk;
  318.        
  319.         return(text->text);
  320. }
  321.