static void ppspinner_update(Layer *layer, GContext *g) {
  PPSpinnerData *data = (PPSpinnerData *)layer_get_data(layer);
  GRect bounds = layer_get_frame(layer);
  // cache some values on stack
  int frame_number = data->current_frame;
  int corner_radius = data->corner_radius;
  int segments = data->segments; 

  // # w = width of segment # g = width of gap # z = ratio of width to gap # s = segments
  // # we know w, s, z # we want to find w, g
  // all_width = w s + g (s-1) // g = w z
  // all_width = w s + (w z)(s-1)
  // w = all_width / (s z + s - z) 
  float gap_to_piece_ratio = 0.25;
  int piece_width = (bounds.size.w + 0.0) / (segments * gap_to_piece_ratio + segments - gap_to_piece_ratio);
  int piece_gap = piece_width * gap_to_piece_ratio;
  int piece_height = bounds.size.h;

  graphics_context_set_stroke_color(g, GColorBlack);
  graphics_context_set_fill_color(g, GColorBlack);
  for (int i = 0, x = 0; i < segments; i++, x += piece_width + piece_gap) {
    GRect piece_frame = GRect(x, 0, piece_width, piece_height);
    graphics_draw_round_rect(g, piece_frame, corner_radius);
    if (frame_number % segments == i) {
      graphics_fill_rect(g, piece_frame, corner_radius, GCornersAll);
    }
  }
}
Beispiel #2
0
static void canvas_update_proc(Layer *layer, GContext *ctx) 
{
  // Custom drawing happens here!
  GRect rect_bounds = GRect(20, 110, 105, 40);
  GRect rect_bounds2;
  GRect rect_bounds3 = GRect(25, 115, 95, 30);
  int corner_radius = 5;
  
  rect_bounds2 = GRect(25, 115, StatusBar, 30);
  
  // Draw a rectangle
//  graphics_draw_rect(ctx, rect_bounds);
  graphics_draw_round_rect(ctx, rect_bounds, corner_radius);
  graphics_draw_round_rect(ctx, rect_bounds3, corner_radius);
  graphics_fill_rect(ctx, rect_bounds2, corner_radius, GCornersAll);
}
void draw_battery(Layer *layer, GContext *ctx) {
  GRect bounds = layer_get_bounds(layer);
  int battery_height = bounds.size.h - 2 * border;
  GRect battery_rect = GRect(border, border, sidebar_width, battery_height);
  graphics_draw_round_rect(ctx, battery_rect, 2);

  int fill_height = (int)(battery_height / 100.0 * battery_charge_percent);
  int fill_start_y = border + battery_height - fill_height;
  GRect battery_fill_rect = GRect(border, fill_start_y, sidebar_width, fill_height);
  graphics_fill_rect(ctx, battery_fill_rect, 2, GCornersAll);
}
Beispiel #4
0
static void progress_layer_update_callback(Layer *layer, GContext *ctx)
{
  graphics_context_set_stroke_color(ctx, GColorBlack);
  graphics_context_set_fill_color(ctx, GColorBlack);
  GRect rect = layer_get_bounds(layer);
  graphics_draw_round_rect(ctx, rect, 0);
  rect.origin.x += 2;
  rect.origin.y += 2;
  rect.size.h -= 4;
  rect.size.w = (rect.size.w-4)*percent / 100;
  graphics_fill_rect(ctx, rect, 0, GCornerNone);
}
static void progress_bar_layer_update(ProgressBarLayer *bar, GContext *ctx) {
  ProgressData *data = (ProgressData *)layer_get_data(bar);

  // Outline the progress bar
  graphics_context_set_stroke_color(ctx, GColorBlack);
  GRect bounds = layer_get_bounds(bar);
  graphics_draw_round_rect(ctx, GRect(0, 0, bounds.size.w, bounds.size.h), 4);

  // Fill the progress bar
  graphics_context_set_fill_color(ctx, GColorBlack);
  graphics_fill_rect(ctx, GRect(0, 0, data->progress, bounds.size.h), 4, GCornersAll);
  ++data->progress;
}
Beispiel #6
0
void status_layer_update_callback(Layer *layer, GContext* ctx) {
  // Fill the background:
  graphics_context_set_fill_color(ctx, GColorBlack);  
  graphics_fill_rect(ctx, GRect(0, 0, BOX_WIDTH, BOX_HEIGHT), 2, GCornersAll);
    
  // Status
  graphics_context_set_fill_color(ctx, GColorBlack);  
  graphics_context_set_stroke_color(ctx, GColorWhite);  
  graphics_context_set_text_color(ctx, GColorWhite);
  graphics_draw_round_rect(ctx, layer_get_bounds(layer), 2);
  graphics_draw_text(ctx, statusbuffer, fonts_get_system_font(FONT_KEY_ROBOTO_CONDENSED_21), 
                    GRect(4, 0, 120, 40), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL);
}
Beispiel #7
0
static void bg_layer_draw(Layer *layer, GContext *ctx) {
	GRect bounds = layer_get_bounds(layer);
	
	graphics_context_set_fill_color(ctx, GColorBlack);
	
	// time remaining container
	graphics_fill_rect(ctx, GRect(0, 0, bounds.size.w, 75), 4, GCornersAll);
	
	// filename container
	graphics_draw_round_rect(ctx, GRect(0,77, bounds.size.w, 40), 4);
	
	// status container
	graphics_fill_rect(ctx, GRect(0, 121, bounds.size.w, 25), 4, GCornersAll);
}
Beispiel #8
0
static void draw_box(Layer *layer, GContext *ctx, GColor border_color, GColor back_color, GColor text_color, char *text) {
  GRect bounds = layer_get_bounds(layer);
  graphics_context_set_fill_color(ctx, back_color);
  graphics_fill_rect(ctx, layer_get_bounds(layer), PBL_IF_RECT_ELSE(8, 0), GCornersAll);
  IF_3(graphics_context_set_stroke_width(ctx, 3)); 
  graphics_context_set_stroke_color(ctx, border_color);
  graphics_draw_round_rect(ctx, layer_get_bounds(layer), PBL_IF_RECT_ELSE(8, 0));
  graphics_context_set_text_color(ctx, text_color);
  GSize text_size = graphics_text_layout_get_content_size(text, s_res_gothic_18_bold, 
                                                          GRect(5, 5, bounds.size.w-10, bounds.size.h-2), 
                                                          GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter);
  graphics_draw_text(ctx, text, s_res_gothic_18_bold, 
                     GRect(5, ((bounds.size.h-text_size.h)/2)-4, bounds.size.w-10, text_size.h), 
                     GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
}
Beispiel #9
0
static void draw_info(Layer *layer, GContext *ctx) {
  GRect bounds = layer_get_bounds(layer);
  graphics_context_set_fill_color(ctx, COLOR_FALLBACK(GColorPictonBlue, GColorBlack));
  graphics_fill_rect(ctx, layer_get_bounds(layer), 8, GCornersAll);
  IF_B(graphics_context_set_stroke_width(ctx, 3)); 
  graphics_context_set_stroke_color(ctx, COLOR_FALLBACK(GColorBlueMoon, GColorWhite));
  graphics_draw_round_rect(ctx, layer_get_bounds(layer), 8);
  graphics_context_set_text_color(ctx, COLOR_FALLBACK(GColorBlack, GColorWhite));
  GSize text_size = graphics_text_layout_get_content_size(s_info, s_res_gothic_18_bold, 
                                                          GRect(5, 5, bounds.size.w-10, bounds.size.h-10), 
                                                          GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter);
  graphics_draw_text(ctx, s_info, s_res_gothic_18_bold, 
                     GRect(5, ((bounds.size.h-text_size.h)/2)-4, bounds.size.w-10, text_size.h), 
                     GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
}
void pptoaster_draw(struct Layer *layer, GContext *g) {
  static GTextLayoutCacheRef text_layout_cache;

  GRect bounds = layer_get_frame(layer);
  bounds.origin = GPointZero;

  graphics_context_set_fill_color(g, GColorWhite);
  graphics_context_set_stroke_color(g, GColorBlack);
  graphics_context_set_text_color(g, GColorBlack);
  graphics_fill_rect(g, bounds, PPTOASTER_CORNER_RADIUS, GCornersAll);
  graphics_draw_round_rect(g, bounds, PPTOASTER_CORNER_RADIUS);
  
  if (bounds.size.h > PPTOASTER_TEXT_INSET * 2) {
    bounds = grect_crop(bounds, PPTOASTER_TEXT_INSET);
  }

  graphics_draw_text(g, pptoaster.message, pptoaster.font, bounds, GTextOverflowModeFill, GTextAlignmentCenter, text_layout_cache);
}
Beispiel #11
0
static void update_card(GContext* ctx, int card_no)
{
	int title_height = graphics_text_layout_get_content_size(title_strings[card_no],fonts_get_system_font(FONT_KEY_GOTHIC_18),GRect(0,0,142-54,168),GTextOverflowModeWordWrap, GTextAlignmentLeft).h;
	
	//card
	graphics_context_set_fill_color(ctx, GColorWhite);
	if(title_height > 18)
		graphics_fill_rect(ctx, GRect(0, 12, 144, 168), 0, GCornerNone);
	else
		graphics_fill_rect(ctx, GRect(0, 26, 144, 168), 0, GCornerNone);
	
	//icon box
	graphics_context_set_stroke_color(ctx, GColorWhite);
	graphics_draw_round_rect(ctx,GRect(144-54, 0, 54, 54),3);		
	graphics_context_set_fill_color(ctx, GColorBlack);
	graphics_fill_rect(ctx, GRect(144-53, 1, 52, 52), 3, GCornersAll);
	
	//icon
	graphics_draw_bitmap_in_rect(ctx, &icon_bitmaps[card_no],GRect(144-51,3,48,48));
	
	//text
	graphics_context_set_text_color(ctx, GColorBlack);	
	if(title_height > 18)
		graphics_draw_text(ctx, 
						   title_strings[card_no],  
						   fonts_get_system_font(FONT_KEY_GOTHIC_18),
						   GRect( 2, 12, 142-54, 20),
						   GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL);
	else
		graphics_draw_text(ctx, 
					   title_strings[card_no],  
					   fonts_get_system_font(FONT_KEY_GOTHIC_18),
					   GRect( 2, 26, 142-54, 20),
					   GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL);
	
	graphics_draw_text(ctx, 
					   text_strings[card_no],  
					   fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD),
					   GRect( 2, MIN_CARD_HEIGHT - 7, 142, 60),
					   (expanded_visible)?GTextOverflowModeWordWrap:GTextOverflowModeTrailingEllipsis, GTextAlignmentLeft, NULL);
}
Beispiel #12
0
static void draw_onoff(Layer *layer, GContext *ctx) {
  GRect bounds = layer_get_bounds(layer);
  GColor border_color;
  GColor fill_color;
#ifdef PBL_COLOR
  switch (s_onoff_mode) {
    case MODE_OFF:
      border_color = GColorRed;
      fill_color = GColorMelon;
      break;
    case MODE_ON:
      border_color = GColorJaegerGreen;
      fill_color = GColorMintGreen;
      break;
    case MODE_ACTIVE:
      border_color = GColorChromeYellow;
      fill_color = GColorPastelYellow;
      break;
  }
#else
  border_color = GColorWhite;
  fill_color = GColorBlack;
#endif
  graphics_context_set_fill_color(ctx, fill_color);
  graphics_fill_rect(ctx, layer_get_bounds(layer), 8, GCornersAll);
  IF_B(graphics_context_set_stroke_width(ctx, 3)); 
  graphics_context_set_stroke_color(ctx, border_color);
  graphics_draw_round_rect(ctx, layer_get_bounds(layer), 8);
  graphics_context_set_text_color(ctx, COLOR_FALLBACK(GColorBlack, GColorWhite));
  GSize text_size = graphics_text_layout_get_content_size(s_onoff_text, s_res_gothic_18_bold, 
                                                          GRect(5, 5, bounds.size.w-10, bounds.size.h-10), 
                                                          GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter);
  graphics_draw_text(ctx, s_onoff_text, s_res_gothic_18_bold, 
                     GRect(5, ((bounds.size.h-text_size.h)/2)-4, bounds.size.w-10, text_size.h), 
                     GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
}
Beispiel #13
0
static void draw_row_callback(GContext *ctx, Layer *cell_layer, MenuIndex *idx, void *context) {
  GRect bounds = layer_get_bounds(cell_layer);

#if defined(PBL_ROUND)
  // get info of pixel row in the middle of menu row
  GBitmap *fb = graphics_capture_frame_buffer(ctx);
  GPoint sc_coord = layer_convert_point_to_screen(cell_layer, GPoint(0, bounds.size.h/2));
  GBitmapDataRowInfo info = gbitmap_get_data_row_info(fb, sc_coord.y);
  graphics_release_frame_buffer(ctx, fb);
  // adapt bounds for round displays
  bounds.origin.x = info.min_x + PADDING;
  bounds.size.w = info.max_x - info.min_x - PADDING;
#endif

  GRect frame = GRect(
      bounds.origin.x + ICON_SIZE + 3*PADDING,
      0,
      bounds.size.w - 2*ICON_SIZE - PADDING,
      bounds.size.h/2
      );

  // draw direction
  // expand frame width if countdown on the right is small
  if(deps_items[idx->row].countdown > 0 && deps_items[idx->row].countdown < 10) {
    frame.size.w += 10;
  }
  graphics_draw_text(ctx,
      deps_items[idx->row].direction,
      fonts_get_system_font(FONT_KEY_GOTHIC_14),
      frame,
      GTextOverflowModeTrailingEllipsis,
      GTextAlignmentLeft,
      NULL);

  // draw time of scheduled departure plus delay
  frame.origin.y += 12;
  graphics_draw_text(ctx,
      deps_items[idx->row].time,
      fonts_get_system_font(FONT_KEY_GOTHIC_18),
      frame,
      GTextOverflowModeTrailingEllipsis,
      GTextAlignmentLeft,
      NULL);

  // draw time until real time departure
  frame.origin.x = bounds.origin.x + bounds.size.w - ICON_SIZE - PADDING;
  frame.origin.y = 0;
  frame.size.w = ICON_SIZE;
  frame.size.h = ICON_SIZE;
  if(deps_items[idx->row].countdown == 0) {
    // draw icon if departure is imminent
    char* icon_number;
    if (strcmp(deps_items[idx->row].icon, "bus") == 0) {
      icon_number = "1";
    } else if (strcmp(deps_items[idx->row].icon, "tram") == 0) {
      icon_number = "2";
    } else if (strcmp(deps_items[idx->row].icon, "train") == 0) {
      icon_number = "3";
    } else if (strcmp(deps_items[idx->row].icon, "boat") == 0) {
      icon_number = "4";
    } else if (strcmp(deps_items[idx->row].icon, "funicular") == 0) {
      icon_number = "5";
    } else if (strcmp(deps_items[idx->row].icon, "cable_car") == 0) {
      icon_number = "6";
    } else {
      icon_number = "";
    }
    frame.origin.x = bounds.origin.x + bounds.size.w - ICON_SIZE;
    frame.origin.y = 0;
    frame.size.w = ICON_SIZE+2;
    frame.size.h = ICON_SIZE;
    graphics_draw_text(ctx,
        icon_number,
        s_icons,
        frame,
        GTextOverflowModeWordWrap,
        GTextAlignmentCenter,
        NULL);
  } else {
    static char s_buff[16];
    if(deps_items[idx->row].countdown > 60) {
      strncpy(s_buff, ">1h", 16);
    } else if(deps_items[idx->row].countdown > 0) {
      snprintf(s_buff, sizeof(s_buff), "%d'", deps_items[idx->row].countdown);
    }
    graphics_draw_text(ctx,
        s_buff,
        fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD),
        frame,
        GTextOverflowModeFill,
        GTextAlignmentRight,
        NULL);
  }

  // draw line icon with colors
  frame.origin.x = bounds.origin.x + PADDING;
  frame.origin.y = (bounds.size.h / 2) - (ICON_SIZE / 2);
  frame.size.w = ICON_SIZE;
  frame.size.h = ICON_SIZE;

  GColor color_bg;
  // correct some coloring
  switch(deps_items[idx->row].color_bg) {
    case 9090335 : color_bg = GColorSpringBud; break;
    case 12703135 : color_bg = GColorInchworm; break;
    default : color_bg = GColorFromHEX(deps_items[idx->row].color_bg);
  }
  GColor color_fg = GColorFromHEX(deps_items[idx->row].color_fg);
  graphics_context_set_fill_color(ctx, COLOR_FALLBACK(color_bg, GColorClear));
  graphics_fill_rect(ctx, frame, 3, GCornersAll);
  if(!gcolor_equal(color_bg, GColorWhite) || menu_cell_layer_is_highlighted(cell_layer)) {
    graphics_context_set_stroke_color(ctx, COLOR_FALLBACK(GColorWhite, GColorClear));
  }
  graphics_draw_round_rect(ctx, frame, 3);
  graphics_context_set_text_color(ctx, COLOR_FALLBACK(color_fg, GColorBlack));
  char * name = deps_items[idx->row].name;
  GFont font;
  if(strlen(name) == 1) {
    frame.origin.x += 1;
    frame.origin.y += 3;
    /*font = fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD);*/
    font = s_helvetic_bold;
  } else if(strlen(name) == 2) {
    // correct position if 2nd digit is "1"
    if (strstr(name+1, "1") != NULL) {
      frame.origin.x += 2;
    }
    frame.origin.y += 3;
    /*font = fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD);*/
    font = s_helvetic_bold;
    /*if(strlen(name) == 1) { frame.origin.x += 1; }*/
  } else if(strlen(name) == 3){
    frame.origin.y += 3;
    font = fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD);
  } else {
    frame.origin.y += 6;
    font = fonts_get_system_font(FONT_KEY_GOTHIC_14_BOLD);
  }

  graphics_draw_text(ctx,
      name,
      font,
      frame,
      GTextOverflowModeFill,
      GTextAlignmentCenter,
      NULL);
}
Beispiel #14
0
void updateMonth(Layer *layer, GContext *ctx) {
	static char numStr[3] = "";
	int i, x, s, numWeeks, dy, firstday, numDays, l=0, c=0, w;
	Date first, d;
	GFont f, fontNorm, fontBold;
	GRect rect, fillRect;
	
	first = Date(1, displayedMonth, displayedYear);
#if WEEK_STARTS_ON_SUNDAY
	firstday = dayOfWeek(&first);
#else
	firstday = (dayOfWeek(&first)+6)%7;
#endif
	numDays = numDaysInMonth(displayedMonth, displayedYear);
	
	numWeeks = (firstday+6+numDays)/7;
	
	dy = DY + DH*(6-numWeeks)/2;
	
	graphics_context_set_stroke_color(ctx, GColorBlack);
	graphics_context_set_fill_color(ctx, GColorBlack);
	
	// Calendar Grid
#if SHOW_WEEK_NUMBERS
	x = DX+DW;
#else
	x = DX;
#endif

	// Black Top Line with days of week
	graphics_fill_rect(ctx, GRect(x, dy, DW*7+1, DH), 4, GCornersTop);

#if SHOW_WEEK_NUMBERS
	// Black left column for week numbers
	graphics_fill_rect(ctx, GRect(DX, dy+DH, DW, numWeeks*DH+1), 4, GCornersLeft);
#endif

#if SHOW_WEEK_NUMBERS
	x = DX+DW;
	w = DW*7;
#else
	x = DX+1;
	w = DW*7-1;
#endif
	// Double line on the outside
	graphics_draw_round_rect(ctx, GRect(x, dy+DH, w, numWeeks*DH), 0);
	
	// Column(s) for the week-end or sunday
#if WEEK_STARTS_ON_SUNDAY
	x = DX+DW+1;
#else
	x = DX+5*DW+1;
#endif

#if SHOW_WEEK_NUMBERS
	x += DW;
#endif

	graphics_draw_line(ctx, GPoint(x, dy+DH), GPoint(x, dy+DH+numWeeks*DH-1));
	
#if SHOW_WEEK_NUMBERS
	x = 1;
#else
	x = 0;
#endif

	// Vertical lines
	for (i=x; i<=x+7; i++) {
		graphics_draw_line(ctx, GPoint(DX+DW*i,dy+DH), GPoint(DX+DW*i,dy+(numWeeks+1)*DH));
	}
	// Horizontal lines
	for (i=1; i<=(numWeeks+1); i++) {
		graphics_draw_line(ctx, GPoint(DX+x*DW,dy+DH*i), GPoint(DX+DW*(7+x),dy+DH*i));
	}
	
	fontNorm = fonts_get_system_font(FONT_KEY_GOTHIC_18);
	fontBold = fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD);
	f = fontNorm;
	
#if WEEK_STARTS_ON_SUNDAY
	s = 0;
#else
	s = 1;
#endif

#if SHOW_WEEK_NUMBERS
	x = 1;
#else
	x = 0;
#endif

	// Days of week
	graphics_context_set_text_color(ctx, GColorWhite);
	
	for (i=s; i<s+7; i++) {
		graphics_text_draw(ctx, weekDays[i%7], fonts_get_system_font(FONT_KEY_GOTHIC_14), GRect(DX+DW*(i+x-s), dy, DW+2, DH+1), GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
	}
	
#if SHOW_WEEK_NUMBERS
	// Week numbers
	for (i=0, d=first; i<=numWeeks; i++, d.day+=7) {
		xsprintf(numStr, "%d", weekNumber(&d));
		graphics_text_draw(ctx, numStr, fonts_get_system_font(FONT_KEY_GOTHIC_14), GRect(DX, dy+DH*(i+1), DW, DH+1), GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
	}
#endif
	
	// Day numbers
	graphics_context_set_text_color(ctx, GColorBlack);
	
	for (i=1; i<=numDays; i++) {
		c = (firstday - 1 + i)%7;
		if (c == 0 && i != 1) {
			l++;
		}
		
		xsprintf(numStr, "%d", i);

		if (isNonWorkingDay(&Date(i, displayedMonth, displayedYear))) {
			f = fontBold;
		} else {
			f = fontNorm;
		}
		
		fillRect = GRect(DX+DW*(c+x), dy+DH*(l+1), DW, DH);
		rect = GRect(DX+DW*(c+x), dy+DH*(l+1)-3, DW+1, DH+1);
		
		if (today.day == i && today.month == displayedMonth && today.year == displayedYear) {
			graphics_fill_rect(ctx, fillRect, 0, GCornerNone);
			graphics_context_set_text_color(ctx, GColorWhite);
			graphics_text_draw(ctx, numStr, f, rect, GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
		} else {
			graphics_context_set_text_color(ctx, GColorBlack);
			graphics_text_draw(ctx, numStr, f, rect, GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);
		}
	}
}
void draw_timeline(Layer *layer, GContext *ctx) {
  GRect bounds = layer_get_bounds(layer);
  GRect timeline_rect = GRect(bounds.size.w - sidebar_width - border, border, sidebar_width, bounds.size.h - 2 * border);
  graphics_draw_round_rect(ctx, timeline_rect, 2);  
}