⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 status_bar.c

📁 brew平台下的进度条显示
💻 C
字号:
#include "status_bar.h"

// 积己磊
// in_status_num = 4;
// rect = NULL;
// is_draw_line = TRUE;
static void denit(Status_Bar *b);
static void draw(Status_Bar *b);
static boolean start_processbar(Status_Bar *b);
static void stop_processbar(Status_Bar *b);
static void _processbar_timer_cb_func(void * data);
static void set_status(Status_Bar *b, uint8 status_index, boolean is_on);
static void move_processbar(Status_Bar *b);
static void set_position(Status_Bar *b, uint16 x, uint16 y, uint16 width, uint16 height);

void Status_Bar_init(Status_Bar *b, IDisplay   * in_display,
                                 IShell     * in_shell,
                                 uint8        in_status_num,
                                 AEERect    * rect,
                                 boolean      is_draw_line)
{
  MEMSET(b, '\0', sizeof(Status_Bar));	
  
  b->_shell                = in_shell;
  b->_is_draw_line         = is_draw_line;
  b->_process_bar_position = 0;
  b->_status_num           = in_status_num;
  b->_display = in_display;
  if (rect)
	  b->_position_info = *rect;
  else
	  SETAEERECT(&b->_position_info, 0, 0, 100, 20);
  if (b->_g == NULL) 
	  ISHELL_CreateInstance(b->_shell, AEECLSID_GRAPHICS, (void **)&b->_g);
  b->_fg_color = MAKE_RGB(36, 36, 85);
  b->_bg_color = MAKE_RGB(36, 36, 85);
  b->_max_process_bar_width = 100;

  MEMSET(b->_status, (byte)FALSE, in_status_num);
  b->denit = denit;
  b->draw = draw;
  b->set_position = set_position;
  b->start_processbar = start_processbar;
  b->stop_processbar = stop_processbar;
  b->move_processbar = move_processbar;
  b->set_status = set_status;
  b->processbar_timer_cb_func = _processbar_timer_cb_func;
  b->_is_visible = TRUE;
  
  return;
} // end 积己磊


// 家戈磊
static void denit(Status_Bar *b)
{
  if (b->_g) {
	  IGRAPHICS_Release(b->_g);
	  b->_g = NULL;
  }
  b->_is_visible = FALSE;
  // 鸥捞赣 吝瘤
  
  b->stop_processbar(b);
} // end 家戈磊


/***************************
* 坷滚扼捞爹 窃荐
***************************/
static void draw(Status_Bar *b)
{
  AEECircle  temp_circle;
  RGB_Struct org_rgb, temp_rgb;
  boolean    org_fill_mode;

  uint8 temp_i;
  AEERect temp_rect;

  temp_circle.r = b->_status_radius;

  if( b->_display == NULL || b->_g == NULL )
    return;

  if( b->_is_visible != TRUE )
    return;

  // 扼牢阑 器窃茄促搁
  if(b->_is_draw_line == TRUE )
  {
    IDISPLAY_DrawRect(b->_display,
                      &b->_position_info,
                      b->_fg_color,
                      b->_bg_color,
                      IDF_RECT_FRAME | IDF_RECT_FILL);
  } // end if
  else
  {
    IDISPLAY_DrawRect(b->_display,
                      &b->_position_info,
                      b->_fg_color,
                      b->_bg_color,
                      IDF_RECT_FILL);
  } // end else

  // 捞傈狼 祸阑 备窃
  IGRAPHICS_GetFillColor( b->_g,
                          &(org_rgb.r),
                          &(org_rgb.g),
                          &(org_rgb.b),
                          &(org_rgb.reserved));  

  org_fill_mode = IGRAPHICS_SetFillMode(b->_g, TRUE);

  // 惑怕滚瓢甸阑 弊覆
  for(temp_i = 0 ; temp_i < b->_status_num ; temp_i ++)
  {
    if(b->_status[temp_i] == TRUE )
      temp_rgb.rgb = STATUS_BAR_ON_COLOR;
    else
      temp_rgb.rgb = STATUS_BAR_OFF_COLOR;

    IGRAPHICS_SetFillColor( b->_g,
                            (uint8)((temp_rgb.rgb & 0xff000000) >> 24),
                            (uint8)((temp_rgb.rgb & 0x00ff0000) >> 16),
                            (uint8)((temp_rgb.rgb & 0x0000ff00) >> 8),
                            (uint8)(temp_rgb.rgb & 0x000000ff));

    temp_circle.cx = b->_status_position[temp_i][0];
    temp_circle.cy = b->_status_position[temp_i][1];
    IGRAPHICS_DrawCircle(b->_g, &temp_circle);
  } // end for

  temp_rect.x  = b->_position_info.x + OBJECT_HORTIZONTAL_GAP;
  temp_rect.y  = b->_position_info.y + 1;
  temp_rect.dx = b->_max_process_bar_width;
  temp_rect.dy = b->_position_info.dy - 2;

  // progress bar啊 甸绢哎 荐 乐绰 后 傍埃阑 弊赴促
  IDISPLAY_DrawRect(b->_display,
                    &temp_rect,
                    b->_fg_color,
                    RGB_WHITE,
                    IDF_RECT_FILL);
#ifndef MIN
#define MIN(a,b) ( (a) < (b) ? (a) : (b))
#endif

  if( b->_process_bar_position > 0 )
  {
    temp_rect.dx = MIN(b->_process_bar_position, b->_max_process_bar_width);
    IDISPLAY_FrameButton( b->_display, 
                          &temp_rect, 
                          FALSE, 
                          b->_bg_color);
  } // end if

  // 盔贰 盲框葛靛客 盲框祸栏肺 函版
  IGRAPHICS_SetFillMode(b->_g, org_fill_mode);

  IGRAPHICS_SetFillColor( b->_g,
                          org_rgb.r ,
                          org_rgb.g,
                          org_rgb.b,
                          org_rgb.reserved);

  IDISPLAY_Update(b->_display);

  return;
} // end void Brew_Status_Bar::draw()

static void set_position(Status_Bar *b, uint16 x, uint16 y, 
                                   uint16 width, uint16 height)
{
	uint8 temp_i;
//  Brew_Component::set_position(x, y, width, height);

  // 惑怕 滚瓢狼 馆瘤抚 拌魂
  b->_status_radius = (height-2)/2;

  // 柳青官狼农扁 拌魂
  b->_max_process_bar_width = width - (OBJECT_HORTIZONTAL_GAP*2 + 
                                    (b->_status_radius*2+OBJECT_HORTIZONTAL_GAP)*
                                    b->_status_num);

  // 惑怕 滚瓢狼 困摹甫 拌魂
  for( temp_i = 0 ; temp_i < b->_status_num ; temp_i ++)
  {
    b->_status_position[temp_i][0] = x + b->_max_process_bar_width + 
                                  OBJECT_HORTIZONTAL_GAP*2 + b->_status_radius +
                                  ((b->_status_radius*2 + OBJECT_HORTIZONTAL_GAP) *
                                    temp_i);
    b->_status_position[temp_i][1] = y + height/2;
  } // end for

  return;
} // end void Brew_Status_Bar::set_position()




// 鸥捞赣 角青 窃荐
static boolean start_processbar(Status_Bar *b)
{
  if( ISHELL_SetTimer(b->_shell, PROCESS_BAR_TIMER_GAP, 
	  b->processbar_timer_cb_func, (void *)b ) == SUCCESS )
  {
    return TRUE;
  } // end if
  else
  {
    return FALSE;
  } // end else
} // end boolean start_ticker()

// 鸥捞赣 吝瘤 窃荐
static void stop_processbar(Status_Bar *b)
{
  ISHELL_CancelTimer( b->_shell,
                      b->processbar_timer_cb_func, 
                      (void *)b );

  b->_process_bar_position = 0;
//  b->draw(b);
  return;
} // end 


// 橇肺技胶 官 捞悼 窃荐
static void move_processbar(Status_Bar *b)
{
  ISHELL_CancelTimer( b->_shell,
                      b->processbar_timer_cb_func, 
                      (void *)b );
  if( b->_process_bar_position > b->_max_process_bar_width )
    b->_process_bar_position = 0;
  else
    b->_process_bar_position += PROCESS_BAR_MOVING_GAP;

  b->draw(b);

  return;
} // end void Brew_Status_Bar::move_processbar()


// 惑怕 滚瓢阑 悸泼
static void set_status(Status_Bar *b, uint8 status_index, boolean is_on)
{
  if( status_index > b->_status_num )
    return;

  b->_status[status_index] = is_on;
  b->draw(b);
  return;
} // end void Brew_Status_Bar::set_status()



/*******************************
* 鸥捞赣 妮归 窃荐
*******************************/

// 鸥捞赣 窃荐
static void _processbar_timer_cb_func(void * data)
{
  Status_Bar * in_arg = (Status_Bar *)data;

  if( in_arg == NULL )
    return;

  // 悼累 风凭 角青
  in_arg->move_processbar(in_arg);

  // 犁 角青
  in_arg->start_processbar(in_arg);

  return;
} // end void _processbar_timer_cb_func()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -