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}