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}