mirror of
https://github.com/google/pebble.git
synced 2025-05-01 07:41:41 -04:00
84 lines
3.1 KiB
C
84 lines
3.1 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "progress_layer.h"
|
|
|
|
#include "system/passert.h"
|
|
#include "applib/graphics/gtypes.h"
|
|
#include "applib/graphics/graphics.h"
|
|
#include "applib/ui/layer.h"
|
|
#include "util/math.h"
|
|
|
|
#include <string.h>
|
|
|
|
static int16_t scale_progress_bar_width_px(unsigned int progress_percent, int16_t rect_width_px) {
|
|
return ((progress_percent * (rect_width_px)) / 100);
|
|
}
|
|
|
|
void progress_layer_set_progress(ProgressLayer* progress_layer, unsigned int progress_percent) {
|
|
// Can't use the clip macro here because it fails with uints
|
|
progress_layer->progress_percent = MIN(100, progress_percent);
|
|
layer_mark_dirty(&progress_layer->layer);
|
|
}
|
|
|
|
void progress_layer_update_proc(ProgressLayer* progress_layer, GContext* ctx) {
|
|
const GRect *bounds = &progress_layer->layer.bounds;
|
|
|
|
int16_t progress_bar_width_px = scale_progress_bar_width_px(progress_layer->progress_percent,
|
|
bounds->size.w);
|
|
const GRect progress_bar = GRect(bounds->origin.x, bounds->origin.y, progress_bar_width_px,
|
|
bounds->size.h);
|
|
|
|
|
|
const int16_t corner_radius = progress_layer->corner_radius;
|
|
graphics_context_set_fill_color(ctx, progress_layer->background_color);
|
|
graphics_fill_round_rect(ctx, bounds, corner_radius, GCornersAll);
|
|
|
|
// Draw the progress bar
|
|
graphics_context_set_fill_color(ctx, progress_layer->foreground_color);
|
|
graphics_fill_round_rect(ctx, &progress_bar, corner_radius, GCornersAll);
|
|
|
|
#if SCREEN_COLOR_DEPTH_BITS == 1
|
|
graphics_context_set_stroke_color(ctx, progress_layer->foreground_color);
|
|
graphics_draw_round_rect(ctx, bounds, corner_radius);
|
|
#endif
|
|
}
|
|
|
|
void progress_layer_init(ProgressLayer* progress_layer, const GRect *frame) {
|
|
*progress_layer = (ProgressLayer){};
|
|
|
|
layer_init(&progress_layer->layer, frame);
|
|
progress_layer->layer.update_proc = (LayerUpdateProc) progress_layer_update_proc;
|
|
progress_layer->foreground_color = GColorBlack;
|
|
progress_layer->background_color = GColorWhite;
|
|
progress_layer->corner_radius = 1;
|
|
}
|
|
|
|
void progress_layer_deinit(ProgressLayer* progress_layer) {
|
|
layer_deinit(&progress_layer->layer);
|
|
}
|
|
|
|
void progress_layer_set_foreground_color(ProgressLayer* progress_layer, GColor color) {
|
|
progress_layer->foreground_color = color;
|
|
}
|
|
|
|
void progress_layer_set_background_color(ProgressLayer* progress_layer, GColor color) {
|
|
progress_layer->background_color = color;
|
|
}
|
|
|
|
void progress_layer_set_corner_radius(ProgressLayer* progress_layer, uint16_t corner_radius) {
|
|
progress_layer->corner_radius = corner_radius;
|
|
}
|