pebble/src/fw/applib/ui/progress_layer.c
2025-01-27 11:38:16 -08:00

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;
}