001package polaris.sdk.ui.controls;
002import polaris.sdk.ui.*;
003
004public class Accordion extends Panel {
005 private boolean expanded=true;private float expandedHeight=160;private boolean initialized;private float progress=1;
006 public Accordion(){this("Accordion");}public Accordion(String s){super(s);h=expandedHeight;focusable=true;}
007 public boolean expanded(){return expanded;}public Accordion expanded(boolean e){expanded=e;return this;}
008 @Override protected float contentTop(){return 36+gap;}
009 @Override protected Rect childClip(){return clip.intersect(rect());}
010 @Override public Widget hit(float px,float py){if(!expanded)return contains(px,py)?this:null;return super.hit(px,py);}
011 @Override protected void layoutChildren(){if(!initialized){expandedHeight=Math.max(36,h);initialized=true;}progress=MotionValue.clamp(motion("expansion",expanded?1:0,23,.96f));h=36+(expandedHeight-36)*progress;for(Widget c:children)c.visible(progress>.003f);super.layoutChildren();}
012 @Override protected void paint(Painter p){super.paint(p);float midX=ax+21,midY=ay+18,tilt=motion("arrow",expanded?1:0,23,.85f);p.line(midX-4,midY-2+4*tilt,midX,midY+2-4*tilt,1.4f,theme().text);p.line(midX,midY+2-4*tilt,midX+4,midY-2+4*tilt,1.4f,theme().text);p.textWeight(text,ax+39,ay+11,14,ink(),500);}
013 @Override public void event(UiEvent e){if(e.type==UiEvent.Type.DOWN)pressed=true;if(e.type==UiEvent.Type.UP){if(pressed&&e.y<ay+36){expanded=!expanded;changed();}pressed=false;}else if(e.type==UiEvent.Type.KEY&&(e.key==10||e.key==32)){expanded=!expanded;changed();e.handled=true;}}
014}