package Ġdev . the code war ri or . bit font . font editor . j img ui . utils . extensions Ċ Ċ // object ĠImGui Dr ags Ġ{ Ċ // ĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ċ // ĠĠĠ Ġfun Ġ< T : ĠNumber > Ġdrag Scalar ( Ċ // ĠĠĠĠĠĠĠ Ġlabel : ĠString , Ġvalue : ĠK Mutable Property 0 < T >, Ċ // ĠĠĠĠĠĠĠ Ġspeed : ĠDouble Ġ= Ġ 1 . 0 , Ġpower : ĠDouble Ġ= Ġ 1 . 0 , Ġmin Value : ĠT , ĠmaxValue : ĠT , Ċ // ĠĠĠĠĠĠĠ Ġvalue To Display : Ġ( T ) Ġ-> ĠString , Ġcorrect : Ġ( Double ) Ġ-> ĠT , Ġvalue ToString : Ġ( T ) Ġ-> ĠString , Ġstring To Value : Ġ( T , ĠString ) Ġ-> ĠPair < T , ĠString > Ċ // ĠĠĠ Ġ): ĠBoolean Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= ĠImGui . current Window Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( window . skip Items ) Ġreturn Ġfalse Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġwindow . getId ( label ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġw Ġ= ĠImGui . calc Item Width () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġlabel Size Ġ= ĠImGui . calc Text Size ( label , Ġ 0 , Ġtrue ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġframe Bb Ġ= ĠRect ( window . dc . cursor Pos , Ġwindow . dc . cursor Pos Ġ+ ĠVec 2 ( w , Ġlabel Size . y Ġ+ ĠImGui . style . frame Padding . y Ġ* Ġ 2 f )) Ċ // ĠĠĠĠĠĠĠ Ġval Ġinner Bb Ġ= ĠRect ( frame Bb . min Ġ+ ĠImGui . style . frame Padding , Ġframe Bb . max Ġ- ĠImGui . style . frame Padding ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġtotal Bb Ġ= ĠRect ( frame Bb . min , Ġframe Bb . max Ġ+ ĠVec 2 ( if Ġ( label Size . x Ġ> Ġ 0 f ) ĠImGui . style . item Inner Spacing . x Ġ+ Ġlabel Size . x Ġelse Ġ 0 f , Ġ 0 f )) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠNB - Ġwe Ġdon 't Ġcall ĠItem Size () Ġyet Ġbecause Ġwe Ġmay Ġturn Ġinto Ġa Ġtext Ġedit Ġbox Ġbelow Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! ImGui . item Add ( total Bb , Ġid , Ġframe Bb )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . item Size ( total Bb , ĠImGui . style . frame Padding . y ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġhover ed Ġ= ĠImGui . item Hover able ( frame Bb , Ġid ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠTab bing Ġor ĠCTRL - click ing Ġon ĠDrag Ġturns Ġit Ġinto Ġan Ġinput Ġbox Ċ // ĠĠĠĠĠĠĠ Ġvar Ġstart TextInput Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġval Ġtab Focus Requested Ġ= ĠImGui . focus able Item Register ( window , Ġid ) Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( tab Focus Requested Ġ|| Ġ( hover ed Ġ&& Ġ( ImGui . io . mouse Clicked [ 0 ] Ġ|| ĠImGui . io . mouse Double Clicked [ 0 ]) Ġ|| Ġg . nav Activate Id Ġ== Ġid Ġ|| Ġ( g . nav Input Id Ġ== Ġid Ġ&& Ġg . scalar As Input Text Id Ġ!= Ġid ))) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . setActive Id ( id , Ġwindow ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . set Focus Id ( id , Ġwindow ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . focus () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġg . active Id Allow Nav Dir Flags Ġ= Ġ( 1 Ġshl ĠDir . Up . i ) Ġor Ġ( 1 Ġshl ĠDir . Down . i ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tab Focus Requested Ġ|| ĠImGui . io . key Ctrl Ġ|| ĠImGui . io . mouse Double Clicked [ 0 ] Ġ|| Ġg . nav Input Id Ġ== Ġid ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart TextInput Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . scalar As Input Text Id Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( start TextInput Ġ|| Ġ( g . active Id Ġ== Ġid Ġ&& Ġg . scalar As Input Text Id Ġ== Ġid )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinput Scalar As Widget Replacement ( frame Bb , Ġid , Ġlabel , Ġvalue , Ġvalue ToString , Ġstring To Value ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠActual Ġdrag Ġbehavior Ċ // ĠĠĠĠĠĠĠ ĠImGui . item Size ( total Bb , ĠImGui . style . frame Padding . y ) Ċ // ĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġdrag Behavior ( id , Ġvalue (). toDouble (), Ġspeed , Ġmin Value . toDouble (), ĠmaxValue . toDouble (), Ġpower ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġvalue Changed Ġ= Ġvalue () Ġ!= ĠnewValue Ċ // ĠĠĠĠĠĠĠ Ġif ( value Changed ) Ġvalue . set ( correct ( newValue )) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠDraw Ġframe Ċ // ĠĠĠĠĠĠĠ Ġval Ġframe Col Ġ= Ġwhen Ġ( g . active Id ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ-> ĠCol . Frame Bg Active Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( g . hover ed Id ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ-> ĠCol . Frame Bg Hover ed Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCol . Frame Bg Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ ĠImGui . render Nav Highlight ( frame Bb , Ġid ) Ċ // ĠĠĠĠĠĠĠ ĠImGui . render Frame ( frame Bb . min , Ġframe Bb . max , Ġframe Col . u 3 2 , Ġtrue , ĠImGui . style . frame Round ing ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġvalue Ġusing Ġuser - provided Ġdisplay Ġformat Ġso Ġuser Ġcan Ġadd Ġprefix / suffix / decor ations Ġto Ġthe Ġvalue . Ċ // ĠĠĠĠĠĠĠ Ġval Ġvalue String Ġ= Ġvalue To Display ( value ()) Ċ // ĠĠĠĠĠĠĠ ĠImGui . render Text Cli pped ( frame Bb . min , Ġframe Bb . max , Ġvalue String , Ġvalue String . length , Ġnull , ĠVec 2 ( 0 . 5 f )) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( label Size . x Ġ> Ġ 0 f ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . render Text ( Vec 2 ( frame Bb . max . x Ġ+ ĠImGui . style . item Inner Spacing . x , Ġinner Bb . min . y ), Ġlabel ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġvalue Changed Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġfun Ġdrag Behavior ( id : ĠID , Ġvalue : ĠDouble , Ġv Speed : ĠDouble , Ġv Min : ĠDouble , Ġv Max : ĠDouble , Ġpower : ĠDouble ): ĠDouble Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( g . active Id Ġ== Ġid ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . active Id Source Ġ== ĠInput Source . Mouse Ġ&& Ġ! ImGui . io . mouse Down [ 0 ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . clear Active Id () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( g . active Id Source Ġ== ĠInput Source . Nav Ġ&& Ġg . nav Activate Pressed Id Ġ== Ġid Ġ&& Ġ! g . active Id Is Just Activated ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui . clear Active Id () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( g . active Id ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ-> Ġdrag Behavior T ( value , Ġv Speed , Ġv Min , Ġv Max , Ġpower ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġfun Ġdrag Behavior T ( current Value : ĠDouble , Ġv Speed _: ĠDouble , Ġv Min : ĠDouble , Ġv Max : ĠDouble , Ġpower : ĠDouble ): ĠDouble Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġcurrent Value Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠDefault Ġtweak Ġspeed Ċ // ĠĠĠĠĠĠĠ Ġval Ġhas MinMax Ġ= Ġv Min Ġ!= Ġv Max Ċ // ĠĠĠĠĠĠĠ Ġvar Ġv Speed Ġ= Ġv Speed _ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( v Speed Ġ== Ġ 0 . 0 Ġ&& Ġhas MinMax ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġv Speed Ġ= Ġ( v Max Ġ- Ġv Min ) Ġ* Ġg . drag Speed Default Ratio Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠInputs Ġacc umul ates Ġinto Ġg . Drag Current Accum , Ġwhich Ġis Ġfl ushed Ġinto Ġthe Ġcurrent Ġvalue Ġas Ġsoon Ġas Ġit Ġmakes Ġa Ġdifference Ġwith Ġour Ġprecision Ġsettings Ċ // ĠĠĠĠĠĠĠ Ġvar Ġadjust Delta Ġ= Ġ 0 . 0 Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( g . active Id Source Ġ== ĠInput Source . Mouse Ġ&& ĠImGui . is Mouse Pos Valid () Ġ&& ĠImGui . io . mouse Drag Max Distance S qr [ 0 ] Ġ> Ġ 1 . 0 Ġ* Ġ 1 . 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Delta Ġ= ĠImGui . io . mouse Delta . x . toDouble () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . io . key Alt ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Delta Ġ*= Ġ 1 . 0 Ġ/ Ġ 1 0 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ImGui . io . key Shift ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Delta Ġ*= Ġ 1 0 . 0 Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( g . active Id Source Ġ== ĠInput Source . Nav ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Delta Ġ= ĠImGui . get Nav Input Amount 2 d ( Nav Dir Source Flag . Keyboard Ġor ĠNav Dir Source Flag . Pad DP ad , ĠInput Read Mode . Repeat Fast , Ġ 1 f Ġ/ Ġ 1 0 f , Ġ 1 0 f ). x . toDouble () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġadjust Delta Ġ*= Ġv Speed Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ/* Ġ ĠClear Ġcurrent Ġvalue Ġon Ġactivation Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠAvoid Ġalter ing Ġvalues Ġand Ġclamp ing Ġwhen Ġwe Ġare Ġ_ already _ Ġpast Ġthe Ġlimits Ġand Ġheading Ġin Ġthe Ġsame Ġdirection , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġso Ġe . g . Ġif Ġrange Ġis Ġ 0 .. 2 5 5 , Ġcurrent Ġvalue Ġis Ġ 3 0 0 Ġand Ġwe Ġare Ġpushing Ġto Ġthe Ġright Ġside , Ġkeep Ġthe Ġ 3 0 0 . ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ Ċ // ĠĠĠĠĠĠĠ Ġval Ġis Just Activated Ġ= Ġg . active Id Is Just Activated Ċ // ĠĠĠĠĠĠĠ Ġval Ġis Already Past Limits And Push ing Out ward Ġ= Ġhas MinMax Ġ&& Ġ(( value Ġ>= Ġv Max Ġ&& Ġadjust Delta Ġ> Ġ 0 f ) Ġ|| Ġ( value Ġ<= Ġv Min Ġ&& Ġadjust Delta Ġ< Ġ 0 f )) Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( is Just Activated Ġ|| Ġis Already Past Limits And Push ing Out ward ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġg . drag Current Accum Ġ= Ġ 0 f Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġg . drag Current Accum Dirty Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( adjust Delta Ġ!= Ġ 0 . 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġg . drag Current Accum Ġ+= Ġadjust Delta . toFloat () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġg . drag Current Accum Dirty Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! g . drag Current Accum Dirty ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Value Ċ // Ċ // ĠĠĠĠĠĠĠ Ġvar Ġv Old Ref For Accum Remain der Ġ= Ġ 0 . 0 Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġis Power Ġ= Ġpower Ġ!= Ġ 1 . 0 Ġ&& Ġhas MinMax Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( is Power ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOffset Ġ+ Ġround Ġto Ġuser Ġdesired Ġprecision , Ġwith Ġa Ġcurve Ġon Ġthe Ġv _ min .. v _ max Ġrange Ġto Ġget Ġmore Ġprecision Ġon Ġone Ġside Ġof Ġthe Ġrange Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Old Norm Cur ved Ġ= Ġglm . pow (( value Ġ- Ġv Min ) Ġ/ Ġ( v Max Ġ- Ġv Min ), Ġ 1 . 0 Ġ/ Ġpower ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv New Norm Cur ved Ġ= Ġv Old Norm Cur ved Ġ+ Ġg . drag Current Accum Ġ/ Ġ( v Max Ġ- Ġv Min ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġv Min Ġ+ Ġglm . pow ( v New Norm Cur ved . clamp ( 0 . 0 , Ġ 1 . 0 ), Ġpower ) Ġ* Ġ( v Max Ġ- Ġv Min ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġv Old Ref For Accum Remain der Ġ= Ġv Old Norm Cur ved Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġvalue Ġ+= Ġg . drag Current Accum Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠPre serve Ġremainder Ġafter Ġrounding Ġhas Ġbeen Ġapplied . ĠThis Ġalso Ġallow Ġslow Ġt we aking Ġof Ġvalues . Ċ // ĠĠĠĠĠĠĠ Ġg . drag Current Accum Dirty Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġg . drag Current Accum Ġ-= Ġwhen Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġis Power Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Cur Norm Cur ved Ġ= Ġglm . pow (( value Ġ- Ġv Min ) Ġ/ Ġ( v Max Ġ- Ġv Min ), Ġ 1 . 0 Ġ/ Ġpower ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Cur Norm Cur ved Ġ- Ġv Old Ref For Accum Remain der Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( value Ġ- Ġcurrent Value ) Ċ // ĠĠĠĠĠĠĠ Ġ}. toFloat () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠL ose Ġzero Ġsign Ġfor Ġfloat / double Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ- 0 . 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 . 0 Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠCl amp Ġvalues Ġ( handle Ġoverflow / wrap - around ) Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġcurrent Value Ġ&& Ġhas MinMax ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ< Ġv Min Ġ|| Ġ( value Ġ> Ġcurrent Value Ġ&& Ġadjust Delta Ġ< Ġ 0 f )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġv Min Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġv Max Ġ|| Ġ( value Ġ< Ġcurrent Value Ġ&& Ġadjust Delta Ġ> Ġ 0 f )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġv Max Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġvalue Ċ // ĠĠĠ Ġ} Ċ //}