001package polaris.sdk.ui.controls; 002import polaris.sdk.ui.*; 003 004/** Divider ratio covers the full 0..1 travel; both child layout and handle use the shown ratio. */ 005public class SplitPane extends Panel { 006 private float ratio=.5f,shown=.5f,grab;private boolean vertical,dragging; 007 public SplitPane(){glass=false;w=400;h=170;} 008 public SplitPane ratio(float r){if(!Float.isFinite(r))throw new IllegalArgumentException("ratio");ratio=Math.max(0,Math.min(1,r));return this;} 009 public float ratio(){return ratio;}public SplitPane vertical(boolean v){vertical=v;return this;} 010 private float travel(){return Math.max(0,(vertical?h:w)-8);} 011 @Override protected void layoutChildren(){shown=MotionValue.clamp(follow("divider",ratio,72));float split=travel()*shown; 012 if(children.size()>0)children.get(0).bounds(0,0,vertical?w:split,vertical?split:h); 013 if(children.size()>1)children.get(1).bounds(vertical?0:split+8,vertical?split+8:0,vertical?w:travel()-split,vertical?travel()-split:h); 014 } 015 @Override protected void paintOverlay(Painter p){float a=.44f+pressAmount()*.20f; 016 if(vertical)p.fill(ax,ay+travel()*shown+1,w,6,3,Theme.alpha(theme().accent,a)); 017 else p.fill(ax+travel()*shown+1,ay,6,h,3,Theme.alpha(theme().accent,a)); 018 } 019 @Override public void event(UiEvent e){float coord=vertical?e.y-ay:e.x-ax; 020 if(e.type==UiEvent.Type.DOWN&&e.button==1){dragging=true;pressed=true;grab=coord-travel()*shown;e.handled=true;} 021 else if((e.type==UiEvent.Type.MOVE||e.type==UiEvent.Type.UP&&e.button==1)&&dragging){float old=ratio;ratio(travel()>0?(coord-grab)/travel():0);if(old!=ratio)changed();e.handled=true;} 022 if(e.type==UiEvent.Type.UP||e.type==UiEvent.Type.BLUR){dragging=false;pressed=false;} 023 } 024}