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