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

defwidget "Install Button" {
  reference state : "BzTransactionEntryTracker";
  var progress : "gdouble";

  var lbl-install : "GtkLabel";
  var lbl-cancel : "GtkLabel";
  var lbl-cancelling : "GtkLabel";
  var stack : "GtkStack";
  var btn : "GtkButton";
  var flag : "GtkFixed";

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

  var corner : "gdouble";
  var outline : "GskPath";
  var outline-measure : "GskPathMeasure";
  var outline-width : "gdouble";
  var outline-opacity : "gdouble";

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

    set stack = #(
      transition-type = crossfade;
      transition-duration = 200;
      %set lbl-install = #child/GtkLabel(""()
        label = C_("Install Controls", "Install");
      );
      %set lbl-cancel = #child/GtkLabel(""()
        label = C_("Install Controls", "Cancel");
      );
      %set lbl-cancelling = #child/GtkLabel(""()
        label = C_("Install Controls", "Cancelling");
      );
    );
    allocate stack %width%, %height%, #();
    
    set btn = #child/(""("pill")
      child = stack;
      margin-start = 4;
      margin-end = 4;
      margin-top = 4;
      margin-bottom = 4;
    );
    allocate btn %width%, %height%, #();

    set flag = #child/(""("install-button-indicator")
      can-target = false;
    );
    allocate flag %width%, %height%, #();

    set corner = #eval(#(%height%)/2.0);
    set outline = #GskPath(
      move-to(#eval(#(%width%)/2.0), 0.0);
      
      rel-line-to(#eval(#(%width%)/2.0-#(corner)), 0.0);
      rel-arc-to(corner, 0.0, corner, corner);

      rel-line-to(0.0, #eval(#(%height%)-#(corner)*2.0));
      rel-arc-to(0.0, corner, #eval(-#(corner)), corner);

      rel-line-to(#eval(-(#(%width%)-#(corner)*2.0)), 0.0);
      rel-arc-to(#eval(-#(corner)), 0.0, #eval(-#(corner)), #eval(-#(corner)));

      rel-line-to(0.0, #eval(-(#(%height%)-#(corner)*2.0)));
      rel-arc-to(0.0, #eval(-#(corner)), corner, #eval(-#(corner)));

      rel-line-to(#eval(#(%width%)/2.0-#(corner)), 0.0);

      close();
    );
    set outline-measure = #measure-path(outline);

    snapshot {
      do-child btn;

      with opacity(outline-opacity) {
        with stroke(
          #GskPath(
            add-segment(
              outline,
              #path-point(outline-measure, #eval((#(start)%1.0)*#(#path-length(outline-measure)))),
              #path-point(outline-measure, #eval((#(end)%1.0)*#(#path-length(outline-measure)))),
            );
          ),
          #GskStroke(outline-width, butt, round, 0.0),
        ) {
          do-child flag;
        }
      }
    }
  }

  state-default "inactive" {
    set btn:sensitive = true;
    set stack:visible-child = lbl-install;

    set start = 0.0;
    set end = 0.001;
    set outline-width = 5.0;
    set outline-opacity = 0.0;
    
    transition-spring outline-width 1.0, 0.1, 15.0;
    transition-spring outline-opacity 1.0, 0.1, 100.0;
  }
  
  state "pending" {
    set btn:sensitive = true;
    set stack:visible-child = lbl-cancel;
    
    set start = #eval((#(%tick%)/3.0)%1.0);
    set end = #eval((#(start)+0.2)%1.0);
    set outline-width = 5.0;
    set outline-opacity = 1.0;

    transition-spring outline-width 1.0, 0.1, 10.0;
    transition-spring outline-opacity 1.0, 0.1, 10.0;
  }

  state "fraction" {
    set btn:sensitive = true;
    set stack:visible-child = lbl-cancel;
    
    set start = 0.0;
    set end = #eval(0.05+#(progress)*0.95);
    set outline-width = 5.0;
    set outline-opacity = 1.0;

    transition-spring outline-width 1.1, 0.1, 10.0;
    transition-spring outline-opacity 1.1, 0.1, 10.0;
  }

  state "cancelling" {
    set btn:sensitive = false;
    set stack:visible-child = lbl-cancelling;
    
    set start = 0.0;
    set end = 0.001;
    set outline-width = 0.0;
    set outline-opacity = 1.0;

    transition-spring outline-width 1.0, 0.1, 10.0;
    transition-spring outline-opacity 1.0, 0.1, 10.0;
  }
}