🏡 index : quine-global-labs/bazaar.git

defwidget "Transact Icon" {
  reference info : "BzTransactIconInfo";
  var progress : "gdouble";

  var icon-scale : "gdouble";

  var flag : "GtkFixed";
  var icon : "GtkImage";

  var start : "gdouble";
  var end : "gdouble";

  var path : "GskPath";
  var path-measure : "GskPathMeasure";
  var path-width : "gdouble";
  var path-opacity : "gdouble";

  init {
    set progress = #transition(info:tracker:progress, 1.1, 0.1, 10.0);

    set flag = #child/(""("transact-icon-flag") can-target = false;);
    allocate flag #eval(#(%width%)+#(path-width)*2.0),
                  #eval(#(%height%)+#(path-width)*2.0),
                  #(translate(#GraphenePoint(#eval(-#(path-width)), #eval(-#(path-width)))););

    set icon = #child/(""("icon-dropshadow")
      pixel-size = #ifelse(#<(%height%, 1), 1, %height%);
    );
    allocate icon %width%, %height%, #();

    set path = #GskPath(
      add-circle(
        #GraphenePoint(#eval(#(%width%)/2.0), #eval(#(%height%)/2.0)),
        #eval(#(%height%)/2.0),
      );
    );
    set path-measure = #measure-path(path);

    snapshot {
      save {
        move translate(#GraphenePoint(#eval((#(%width%)/2.0)*(1.0-#(icon-scale))),
                                      #eval((#(%height%)/2.0)*(1.0-#(icon-scale)))));
        move scale(icon-scale, icon-scale);
        do-child icon;
      }
      save {
        move translate(#GraphenePoint(0.0, %height%));
        move rotate(-90.0);
        with opacity(path-opacity) {
          with stroke(
            #GskPath(
              add-segment(
                path,
                #path-point(path-measure, #eval((#(start)%1.0)*#(#path-length(path-measure)))),
                #path-point(path-measure, #eval((#(end)%1.0)*#(#path-length(path-measure)))),
              );
            ),
            #GskStroke(path-width, round, round, 0.0),
          ) {
            move rotate(90.0);
            move translate(#GraphenePoint(0.0, #eval(-#(%height%))));
            do-child flag;
          }
        }
      }
    }
  }

  state-default "inactive" {
    set icon-scale = 1.0;
    transition-spring icon-scale 1.0, 0.1, 15.0;
    
    set start = 0.0;
    set end = 1.0;
    
    set path-opacity = 0.0;
    transition-spring path-opacity 1.0, 0.1, 10.0;

    set path-width = 3.0;
    transition-spring path-width 1.0, 0.1, 5.0;
  }
  
  state "pending" {
    set icon-scale = 0.6;
    transition-spring icon-scale 1.0, 0.1, 15.0;
    
    set start = #eval((#(%tick%)*0.5)%1.0);
    set end = #eval(#(start)+0.2);
    
    set path-opacity = 1.0;
    transition-spring path-opacity 1.0, 0.1, 5.0;

    set path-width = 3.0;
    transition-spring path-width 1.0, 0.1, 5.0;
  }

  state "fraction" {
    set icon-scale = 0.6;
    transition-spring icon-scale 1.0, 0.1, 15.0;
    
    set start = 0.0;
    set end = #eval(0.05+#(progress)*0.95);
    
    set path-opacity = 1.0;
    transition-spring path-opacity 1.0, 0.1, 5.0;

    set path-width = 3.0;
    transition-spring path-width 1.0, 0.1, 5.0;
  }
}