You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: progress_icon.rs
    path of file: ./repos/Kooha/src/window
    
    the code of the file until where you have to start completion: use std::{
    cell::Cell,
    f64::consts::{FRAC_PI_2, TAU},
};

use adw::prelude::*;
use gtk::{
    cairo,
    glib::{self, clone},
    graphene::Rect,
    subclass::prelude::*,
};

const LINE_WIDTH: f64 = 4.0;

const ANIMATION_DURATION_MS: u32 = 300;

mod imp {
    use std::cell::OnceCell;

    use super::*;

    #[derive(Default, glib::Properties)]
    #[properties(wrapper_type = super::ProgressIcon)]
    pub struct 
    
        fn snapshot(&self, snapshot: &gtk::Snapshot) {
            let obj = self.obj();

            let width = obj.width();
            let height = obj.height();
            let color = obj.color();

            let cx = width as f64 / 2.0;
            let cy = height as f64 / 2.0;
            let radius = width as f64 / 2.0 - LINE_WIDTH / 2.0;
            let arc_end = self.display_progress.get() * TAU - FRAC_PI_2;

            let ctx = snapshot.append_cairo(&Rect::new(0.0, 0.0, width as f32, height as f32));
            ctx.set_line_width(LINE_WIDTH);
            ctx.set_line_cap(cairo::LineCap::Round);

            ctx.set_source_color(&color);
            ctx.move_to(cx, cy - radius);
            ctx.arc(cx, cy, radius, -FRAC_PI_2, arc_end);
            ctx.stroke().unwrap();

            ctx.set_source_color(&color.with_alpha(color.alpha() * 0.15));
            ctx.move_to(cx + radius * arc_end.cos(), cy + radius * arc_end.sin());
            ctx.arc(cx, cy, radius, arc_end, 3.0 * FRAC_PI_2);
            ctx.stroke().unwrap();
        }