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