package Ġcom . github . gr ish berg . android . layout inspector . ui . layout Ċ Ċ import Ġcom . github . gr ish berg . android . layout inspector . domain . Meta Repository Ċ import Ġjava . awt . Shape Ċ import Ġjava . awt . geom . Line 2 D Ċ import Ġjava . awt . geom . Rectangle 2 D Ċ import Ġkotlin . math . abs Ċ Ċ enum Ġclass ĠDistance Type Ġ{ ĊĠĠĠ ĠLEFT , ĊĠĠĠ ĠTOP , ĊĠĠĠ ĠRIGHT , ĊĠĠĠ ĠBOTTOM Ċ } Ċ Ċ data Ġclass ĠDistance Data ( val Ġdistance : ĠMap < Distance Type , ĠDouble >, Ġval Ġlines : ĠList < Shape >) Ċ Ċ class ĠDistance Between Two Shape ( ĊĠĠĠ Ġprivate Ġval Ġmeta : ĠMeta Repository Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġsize In Dp Enabled Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġcalculate Distance ( ĊĠĠĠĠĠĠĠ Ġselected Bounds : ĠRectangle 2 D , ĊĠĠĠĠĠĠĠ Ġtarget Bounds : ĠRectangle 2 D ĊĠĠĠ Ġ): ĠDistance Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Left Ġ= Ġselected Bounds . x ĊĠĠĠĠĠĠĠ Ġval Ġselected Right Ġ= Ġselected Bounds . x Ġ+ Ġselected Bounds . width ĊĠĠĠĠĠĠĠ Ġval Ġselected Top Ġ= Ġselected Bounds . y ĊĠĠĠĠĠĠĠ Ġval Ġselected Bottom Ġ= Ġselected Bounds . y Ġ+ Ġselected Bounds . height ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Left Ġ= Ġtarget Bounds . x ĊĠĠĠĠĠĠĠ Ġval Ġtarget Right Ġ= Ġtarget Bounds . x Ġ+ Ġtarget Bounds . width ĊĠĠĠĠĠĠĠ Ġval Ġtarget Top Ġ= Ġtarget Bounds . y ĊĠĠĠĠĠĠĠ Ġval Ġtarget Bottom Ġ= Ġtarget Bounds . y Ġ+ Ġtarget Bounds . height ĊĊĠĠĠĠĠĠĠ Ġval Ġsel Left To Target Left Ġ= Ġselected Left Ġ- Ġtarget Left ĊĠĠĠĠĠĠĠ Ġval Ġsel Left To Target Right Ġ= Ġselected Left Ġ- Ġtarget Right ĊĠĠĠĠĠĠĠ Ġval Ġsel Right To Target Right Ġ= Ġselected Right Ġ- Ġtarget Right ĊĠĠĠĠĠĠĠ Ġval Ġsel Right To Target Left Ġ= Ġselected Right Ġ- Ġtarget Left ĊĊĠĠĠĠĠĠĠ Ġval Ġsel Top To Target Top Ġ= Ġselected Top Ġ- Ġtarget Top ĊĠĠĠĠĠĠĠ Ġval Ġsel Top To Target Bottom Ġ= Ġselected Top Ġ- Ġtarget Bottom ĊĠĠĠĠĠĠĠ Ġval Ġsel Bottom To Target Bottom Ġ= Ġselected Bottom Ġ- Ġtarget Bottom ĊĠĠĠĠĠĠĠ Ġval Ġsel Bottom To Target Top Ġ= Ġselected Bottom Ġ- Ġtarget Top ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Distance Type , ĠDouble >() ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġmutable ListOf < Shape >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( selected Bounds . contains ( target Bounds ) Ġ|| Ġtarget Bounds . contains ( selected Bounds )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertical Line X : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhorizontal Line Y : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Bounds . contains ( target Bounds )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Line X Ġ= Ġtarget Bounds . center X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Line Y Ġ= Ġtarget Bounds . center Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Line X Ġ= Ġselected Bounds . center X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Line Y Ġ= Ġselected Bounds . center Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( selected Left , Ġhorizontal Line Y , Ġtarget Left , Ġhorizontal Line Y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( selected Right , Ġhorizontal Line Y , Ġtarget Right , Ġhorizontal Line Y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( vertical Line X , Ġselected Top , Ġvertical Line X , Ġtarget Top )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( vertical Line X , Ġselected Bottom , Ġvertical Line X , Ġtarget Bottom )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . LEFT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Left To Target Left )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . RIGHT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Right To Target Right )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . TOP ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Top To Target Top )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . BOTTOM ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Bottom To Target Bottom )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDistance Data ( result , Ġlines ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( selected Bounds . intersect s ( target Bounds ) Ġ|| Ġtarget Bounds . intersect s ( selected Bounds )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Left Ġ> Ġtarget Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . LEFT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Left To Target Right )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . RIGHT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Left To Target Left )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . RIGHT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Right To Target Left )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . LEFT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Left To Target Left )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Top Ġ> Ġtarget Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . BOTTOM ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Top To Target Top )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . TOP ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Top To Target Bottom )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . TOP ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Top To Target Top )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . BOTTOM ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Bottom To Target Top )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDistance Data ( result , Ġlines ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvertical Line X Ġ= Ġselected Bounds . center X ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Line Y Ġ= Ġselected Bounds . center Y ĊĊĠĠĠĠĠĠĠ Ġif Ġ( selected Bounds . min X Ġ>= Ġtarget Bounds . max X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( selected Left , Ġhorizontal Line Y , Ġtarget Right , Ġhorizontal Line Y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . LEFT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Left To Target Right )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( selected Bounds . max X Ġ<= Ġtarget Bounds . min X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( target Left , Ġhorizontal Line Y , Ġselected Right , Ġhorizontal Line Y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . RIGHT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Right To Target Left )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Bounds . min Y Ġ>= Ġtarget Bounds . max Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( vertical Line X , Ġselected Top , Ġvertical Line X , Ġtarget Bottom )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . TOP ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Top To Target Bottom )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( selected Bounds . max Y Ġ<= Ġtarget Bounds . min Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( Line 2 D . Double ( vertical Line X , Ġselected Bottom , Ġvertical Line X , Ġtarget Top )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Distance Type . BOTTOM ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( sel Bottom To Target Top )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDistance Data ( result , Ġlines ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Distance ( r uler Bounds : ĠRectangle 2 D ): ĠDistance Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Distance Type , ĠDouble >() ĊĠĠĠĠĠĠĠ Ġresult [ Distance Type . LEFT ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( r uler Bounds . width )) ĊĠĠĠĠĠĠĠ Ġresult [ Distance Type . TOP ] Ġ= Ġabs ( convert Value To Dp IfNeeded ( r uler Bounds . height )) ĊĠĠĠĠĠĠĠ Ġreturn ĠDistance Data ( result , Ġempty List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Value To Dp IfNeeded ( value : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size In Dp Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġ/ Ġmeta . dp Per Pixels ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ