package Ġimg ui . internal . api Ċ Ċ import Ġglm _. glm Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġimg ui .* Ċ import Ġimg ui . ImGui . begin Ċ import Ġimg ui . ImGui . content Region Avail Ċ import Ġimg ui . ImGui . end Popup Ċ import Ġimg ui . ImGui . find Window ByName Ċ import Ġimg ui . ImGui . focus Top Most Window Under One Ċ import Ġimg ui . ImGui . focus Window Ċ import Ġimg ui . ImGui . io Ċ import Ġimg ui . ImGui . is Mouse Pos Valid Ċ import Ġimg ui . ImGui . nav Init Window Ċ import Ġimg ui . ImGui . setActive ID Ċ import Ġimg ui . ImGui . set Next Window Bg Alpha Ċ import Ġimg ui . ImGui . set Next Window Pos Ċ import Ġimg ui . ImGui . set Next Window Size Ċ import Ġimg ui . ImGui . style Ċ import Ġimg ui . api . g Ċ import Ġimg ui . has Ċ import Ġimg ui . internal . classes . Popup Data Ċ import Ġimg ui . internal . classes . Rect Ċ import Ġimg ui . internal . classes . Window Ċ import Ġimg ui . internal . floor Ċ import Ġimg ui . internal . sections .* Ċ import Ġimg ui . static . nav Calc Preferred Ref Pos Ċ import Ġimg ui . static . nav Restore Last Child Nav Window Ċ import Ġuno . kotlin . getValue Ċ import Ġuno . kotlin . setValue Ċ import Ġkotlin . reflect . K Mutable Property 0 Ċ import Ġimg ui . Window Flag Ġas ĠW f Ċ Ċ /** ĠPop ups , ĠMod als , ĠTool tips Ġ*/ Ċ internal Ġinterface ĠPop ups Mod als Tooltip s Ġ{ ĊĊĠĠĠ Ġfun Ġbegin Child Ex ( name : ĠString , Ġid : ĠID , Ġsize Arg : ĠVec 2 , Ġborder : ĠBoolean , Ġflags _: ĠWindow Flags ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Window Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġvar Ġflags Ġ= Ġflags _ Ġor ĠW f . No Title Bar Ġor ĠW f . No Resize Ġor ĠW f . No Saved Settings Ġor ĠW f ._ Child Window ĊĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags Ġor Ġ( parent Window . flags Ġand ĠW f . No Move . i ) Ġ Ġ// ĠInherit Ġthe ĠNo Move Ġflag ĊĊĠĠĠĠĠĠĠ Ġ// ĠSize ĊĠĠĠĠĠĠĠ Ġval Ġcontent Avail Ġ= Ġcontent Region Avail ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġfloor ( size Arg ) ĊĠĠĠĠĠĠĠ Ġval Ġauto Fit Axes Ġ= Ġ( if Ġ( size . x Ġ== Ġ 0 f ) Ġ 1 Ġshl ĠAxis . X Ġelse Ġ 0 x 0 0 ) Ġor Ġ( if Ġ( size . y Ġ== Ġ 0 f ) Ġ 1 Ġshl ĠAxis . Y Ġelse Ġ 0 x 0 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( size . x Ġ<= Ġ 0 f ) ĠĠ Ġ// ĠAr bitrary Ġminimum Ġchild Ġsize Ġ( 0 . 0 f Ġcausing Ġtoo Ġmuch Ġissues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize . x Ġ= Ġglm . max ( content Avail . x Ġ+ Ġsize . x , Ġ 4 f ) ĊĠĠĠĠĠĠĠ Ġif Ġ( size . y Ġ<= Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize . y Ġ= Ġglm . max ( content Avail . y Ġ+ Ġsize . y , Ġ 4 f ) ĊĠĠĠĠĠĠĠ Ġset Next Window Size ( size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġup Ġname . ĠIf Ġyou Ġneed Ġto Ġappend Ġto Ġa Ġsame Ġchild Ġfrom Ġmultiple Ġlocation Ġin Ġthe ĠID Ġstack , Ġuse ĠBegin Child ( ImGui ID Ġid ) Ġwith Ġa Ġstable Ġvalue . ĊĠĠĠĠĠĠĠ Ġval Ġpostfix Ġ= Ġif Ġ( name . isEmpty ()) Ġ"" Ġelse Ġ"_" ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġ"${ parent Window . name }/ $ name $ postfix % 0 8 X ". format ( style . locale , Ġid ) ĊĠĠĠĠĠĠĠ Ġval Ġbackup Border Size Ġ= Ġstyle . child Border Size ĊĠĠĠĠĠĠĠ Ġif Ġ(! border ) Ġstyle . child Border Size Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġbegin ( title , Ġnull , Ġflags ) ĊĠĠĠĠĠĠĠ Ġstyle . child Border Size Ġ= Ġbackup Border Size ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Window Ġ= Ġg . current Window !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Fit Child Axes Ġ= Ġauto Fit Axes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġcursor Ġto Ġhandle Ġcase Ġwhere Ġthe Ġuser Ġcalled ĠSet Next Window Pos ()+ Begin Child () Ġmanually . ĊĠĠĠĠĠĠĠ Ġ// ĠWhile Ġthis Ġis Ġnot Ġreally Ġdocumented / defined , Ġit Ġseems Ġthat Ġthe Ġexpected Ġthing Ġto Ġdo . ĊĠĠĠĠĠĠĠ Ġif Ġ( child Window . begin Count Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Window . dc . cursor Pos Ġput Ġchild Window . pos ĊĊĠĠĠĠĠĠĠ Ġ// ĠProcess Ġnavigation - in Ġimmediately Ġso ĠNav Init Ġcan Ġrun Ġon Ġfirst Ġframe ĊĠĠĠĠĠĠĠ Ġif Ġ( g . nav Activate Id Ġ== Ġid Ġ&& Ġflags Ġhas nt ĠW f ._ Nav Flatten ed Ġ&& Ġ( child Window . dc . nav Layer Active Mask Ġ!= Ġ 0 Ġ|| Ġchild Window . dc . nav Has Scroll )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Window ( child Window ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Init Window ( child Window , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Active ID ( id Ġ+ Ġ 1 , Ġchild Window ) Ġ// ĠSte al ĠActive Id Ġwith Ġa Ġdummy Ġid Ġso Ġthat Ġkey - press Ġwon 't Ġactivate Ġchild Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . active Id Source Ġ= ĠInput Source . Nav ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠMark Ġpopup Ġas Ġopen Ġ( toggle Ġtoward Ġopen Ġstate ). ĊĠĠĠĠ Ġ* Ġ ĠPop ups Ġare Ġclosed Ġwhen Ġuser Ġclick Ġoutside , Ġor Ġactivate Ġa Ġpress able Ġitem , Ġor ĠClose Current Popup () Ġis Ġcalled Ġwithin ĊĠĠĠĠ Ġ* Ġ Ġa ĠBegin Popup ()/ End Popup () Ġblock . ĊĠĠĠĠ Ġ* Ġ ĠPopup Ġidentifiers Ġare Ġrelative Ġto Ġthe Ġcurrent ĠID - stack Ġ( so ĠOpen Popup Ġand ĠBegin Popup Ġneeds Ġto Ġbe Ġat Ġthe Ġsame ĊĠĠĠĠ Ġ* Ġ Ġlevel ). ĊĠĠĠĠ Ġ* Ġ ĠOne Ġopen Ġpopup Ġper Ġlevel Ġof Ġthe Ġpopup Ġhierarchy Ġ( NB : Ġwhen Ġassigning Ġwe Ġreset Ġthe ĠWindow Ġmember Ġof ĠImGui Popup Ref ĊĠĠĠĠ Ġ* Ġ Ġto ĠNULL ) ĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġopen Popup Ex ( id : ĠID , Ġpopup Flags : ĠPopup Flags Ġ= ĠPopup Flag . None . i ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Window Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Stack Size Ġ= Ġg . begin Popup Stack . size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( popup Flags Ġhas ĠPopup Flag . No Open Over Existing Popup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Popup Open ( 0 , ĠPopup Flag . Any Popup Id . i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠTag ged Ġas Ġnew Ġref Ġas ĠWindow Ġwill Ġbe Ġset Ġback Ġto ĠNULL Ġif Ġwe Ġwrite Ġthis Ġinto ĠOpen Popup Stack . ĊĠĠĠĠĠĠĠ Ġval Ġopen Popup Pos Ġ= Ġnav Calc Preferred Ref Pos () ĊĠĠĠĠĠĠĠ Ġval Ġpopup Ref Ġ= ĠPopup Data ( popup Id Ġ= Ġid , Ġwindow Ġ= Ġnull , Ġsource Window Ġ= Ġg . nav Window , Ġopen Frame Count Ġ= Ġg . frame Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Parent Id Ġ= Ġparent Window . id Stack . last (), Ġopen Popup Pos Ġ= Ġopen Popup Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Mouse Pos Ġ= Ġif Ġ( is Mouse Pos Valid ( io . mouse Pos )) ĠVec 2 ( io . mouse Pos ) Ġelse ĠVec 2 ( open Popup Pos )) Ċ // ĠĠĠĠĠĠĠ Ġprintln ("" Ġ+ Ġg . open Popup Stack . size Ġ+ ", Ġ"+ current Stack Size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( g . open Popup Stack . size Ġ< Ġcurrent Stack Size Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . open Popup Stack Ġ+= Ġpopup Ref ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠG ently Ġhandle Ġthe Ġuser Ġmist aken ly Ġcalling ĠOpen Popup () Ġevery Ġframe . ĠIt Ġis Ġa Ġprogramming Ġmistake ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHowever , Ġif Ġwe Ġwere Ġto Ġrun Ġthe Ġregular Ġcode Ġpath , Ġthe Ġui Ġwould Ġbecome Ġcompletely Ġun usable Ġbecause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġpopup Ġwill Ġalways Ġbe Ġin Ġhidden - while - calcul ating - size Ġstate Ġ_ while _ Ġclaim ing Ġfocus . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWhich Ġwould Ġbe Ġa Ġvery Ġconfusing Ġsituation Ġfor Ġthe Ġprogrammer . ĠInstead , Ġwe Ġsilently Ġallow Ġthe Ġpopup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġproceed , Ġit Ġwill Ġkeep Ġre appear ing Ġand Ġthe Ġprogramming Ġerror Ġwill Ġbe Ġmore Ġobvious Ġto Ġunderstand . Ġ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . open Popup Stack [ current Stack Size ]. popup Id Ġ== Ġid Ġ&& Ġg . open Popup Stack [ current Stack Size ]. open Frame Count Ġ== Ġg . frame Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . open Popup Stack [ current Stack Size ]. open Frame Count Ġ= Ġpopup Ref . open Frame Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClose Ġchild Ġpop ups Ġif Ġany , Ġthen Ġflag Ġpopup Ġfor Ġopen / re open ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Popup To Level ( current Stack Size , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . open Popup Stack Ġ+= Ġpopup Ref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWhen Ġreopen ing Ġa Ġpopup Ġwe Ġfirst Ġref ocus Ġits Ġparent , Ġotherwise Ġif Ġits Ġparent Ġis Ġitself Ġa Ġpopup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġwould Ġget Ġclosed Ġby Ġclose Pop ups Over Window (). Ġ ĠThis Ġis Ġequivalent Ġto Ġwhat ĠClose Popup To Level () Ġdoes . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( g . open Popup Stack [ current Stack Size ]. popup Id Ġ== Ġid ) Ġsource Window . focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Popup To Level ( remaining : ĠInt , Ġrestore Focus To Window Under Popup : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġassert ( remaining Ġ>= Ġ 0 Ġ&& Ġremaining Ġ< Ġg . open Popup Stack . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrim Ġopen Ġpopup Ġstack ĊĠĠĠĠĠĠĠ Ġvar Ġfocus Window Ġ= Ġg . open Popup Stack [ remaining ]. source Window ĊĠĠĠĠĠĠĠ Ġval Ġpopup Window Ġ= Ġg . open Popup Stack [ remaining ]. window ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġremaining Ġuntil Ġg . open Popup Stack . size ) Ġ// Ġresize ( remaining ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . open Popup Stack . pop () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( restore Focus To Window Under Popup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( focus Window ?. was Active Ġ== Ġfalse Ġ&& Ġpopup Window Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Top Most Window Under One ( popup Window ) ĠĠ Ġ// ĠF allback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . nav Layer Ġ== ĠNav Layer . Main Ġ&& Ġfocus Window Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Window Ġ= Ġnav Restore Last Child Nav Window ( focus Window ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Window ( focus Window ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Pop ups Over Window ( ref Window : ĠWindow ?, Ġrestore Focus To Window Under Popup : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( g . open Popup Stack . empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠWhen Ġpop ups Ġare Ġstack ed , Ġclicking Ġon Ġa Ġlower Ġlevel Ġpop ups Ġputs Ġfocus Ġback Ġto Ġit Ġand Ġclose Ġpop ups Ġabove Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDon 't Ġclose Ġour Ġown Ġchild Ġpopup Ġwindows Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġpopup Count To Keep Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( ref Window Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġhighest Ġpopup Ġwhich Ġis Ġa Ġdesc endant Ġof Ġthe Ġreference Ġwindow Ġ( gener ally Ġreference Ġwindow Ġ= ĠNav Window ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( popup Count To Keep Ġ< Ġg . open Popup Stack . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpopup Ġ= Ġg . open Popup Stack [ popup Count To Keep ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup . window Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Count To Keep ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( popup . window !!. flags Ġhas ĠW f ._ Popup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup . window !!. flags Ġhas ĠW f ._ Child Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Count To Keep ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrim Ġthe Ġstack Ġwhen Ġpop ups Ġare Ġnot Ġdirect Ġdesc endant Ġof Ġthe Ġreference Ġwindow Ġ( the Ġreference Ġwindow Ġis Ġoften Ġthe ĠNav Window ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpopup Or Desc end ent Is Ref Window Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm Ġ= Ġpopup Count To Keep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( m Ġ< Ġg . open Popup Stack . size Ġ&& Ġ! popup Or Desc end ent Is Ref Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . open Popup Stack [ m ]. window ?. let Ġ{ Ġpopup Window Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup Window . root Window Ġ=== Ġref Window . root Window ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Or Desc end ent Is Ref Window Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! popup Or Desc end ent Is Ref Window ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Count To Keep ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( popup Count To Keep Ġ< Ġg . open Popup Stack . size ) Ġ{ Ġ// ĠThis Ġtest Ġis Ġnot Ġrequired Ġbut Ġit Ġallows Ġto Ġset Ġa Ġconvenient Ġbreakpoint Ġon Ġthe Ġstatement Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// IM GUI _ DEBUG _ LOG (" Close Pop ups Over Window (% s ) Ġ-> ĠClose Popup To Level (% d )\ n ", Ġref _ window -> Name , Ġpopup _ count _ to _ keep ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Popup To Level ( popup Count To Keep , Ġrestore Focus To Window Under Popup ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSupported Ġflags : ĠImGui Popup Flags _ Any Popup Id , ĠImGui Popup Flags _ Any Popup Level ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ĠTest Ġfor Ġid Ġat Ġthe Ġcurrent ĠBegin Popup () Ġlevel Ġof Ġthe Ġpopup Ġstack Ġ( this Ġdoesn 't Ġscan Ġthe Ġwhole Ġpopup Ġstack !) Ġ*/ ĊĠĠĠ Ġfun Ġis Popup Open ( id : ĠID , Ġpopup Flags : ĠPopup Flags Ġ= ĠPopup Flag . None . i ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġpopup Flags Ġhas ĠPopup Flag . Any Popup Id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġtrue Ġif Ġany Ġpopup Ġis Ġopen Ġat Ġthe Ġcurrent ĠBegin Popup () Ġlevel Ġof Ġthe Ġpopup Ġstack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmay Ġbe Ġused Ġto Ġe . g . Ġtest Ġfor Ġanother Ġpop ups Ġalready Ġopened Ġto Ġhandle Ġpop ups Ġprior ities Ġat Ġthe Ġsame Ġlevel . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( id Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Flags Ġhas ĠPopup Flag . Any Popup Level Ġ-> Ġg . open Popup Stack . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġg . open Popup Stack . size Ġ> Ġg . begin Popup Stack . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġtrue Ġif Ġthe Ġpopup Ġis Ġopen Ġanywhere Ġin Ġthe Ġpopup Ġstack ĊĠĠĠĠĠĠĠ Ġpopup Flags Ġhas ĠPopup Flag . Any Popup Level Ġ-> Ġg . open Popup Stack . any Ġ{ Ġit . popup Id Ġ== Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġtrue Ġif Ġthe Ġpopup Ġis Ġopen Ġat Ġthe Ġcurrent ĠBegin Popup () Ġlevel Ġof Ġthe Ġpopup Ġstack Ġ( this Ġis Ġthe Ġmost - common Ġquery ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġg . open Popup Stack . size Ġ> Ġg . begin Popup Stack . size Ġ&& Ġg . open Popup Stack [ g . begin Popup Stack . size ]. popup Id Ġ== Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAtt ention ! ĠBegin Popup () Ġadds Ġdefault Ġflags Ġwhich ĠBegin Popup Ex () ! Ġ*/ ĊĠĠĠ Ġfun Ġbegin Popup Ex ( id : ĠID , Ġflags _: ĠWindow Flags ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Popup Open ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . next Window Data . clear Flags () Ġ// ĠWe Ġbehave Ġlike ĠBegin () Ġand Ġneed Ġto Ġconsume Ġthose Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġflags Ġ= Ġflags _ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġhas ĠW f ._ Child Menu Ġ-> Ġ" ## Menu _% 0 2 d ". format ( style . locale , Ġg . begin Popup Stack . size ) ĠĠĠ Ġ// ĠRe cycle Ġwindows Ġbased Ġon Ġdepth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" ## Popup _% 0 8 x ". format ( style . locale , Ġid ) ĠĠĠĠ Ġ// ĠNot Ġre cycl ing , Ġso Ġwe Ġcan Ġclose / open Ġduring Ġthe Ġsame Ġframe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags Ġor ĠW f ._ Popup ĊĠĠĠĠĠĠĠ Ġval ĠisOpen Ġ= Ġbegin ( name , Ġnull , Ġflags ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! isOpen ) Ġ// ĠNB : ĠBegin Ġcan Ġreturn Ġfalse Ġwhen Ġthe Ġpopup Ġis Ġcompletely Ġcli pped Ġ( e . g . Ġzero Ġsize Ġdisplay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Popup () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠisOpen ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠNot Ġexposed Ġpublicly Ġas ĠBegin Tooltip () Ġbecause Ġbool Ġparameters Ġare Ġev il . ĠLet 's Ġsee Ġif Ġother Ġneeds Ġar ise Ġfirst . ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġextra Flags ĠWindow Flag ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbegin Tooltip Ex ( extra Flags : ĠWindow Flags , Ġtooltip Flags _: ĠTooltip Flags ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtooltip Flags Ġ= Ġtooltip Flags _ ĊĠĠĠĠĠĠĠ Ġif Ġ( g . drag Drop Within Source Ġ|| Ġg . drag Drop Within Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġdefault Ġtooltip Ġposition Ġis Ġa Ġlittle Ġoffset Ġto Ġgive Ġspace Ġto Ġsee Ġthe Ġcontext Ġmenu Ġ( it 's Ġalso Ġclamp ed Ġwithin Ġthe Ġcurrent Ġviewport / monitor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthe Ġcontext Ġof Ġa Ġdragging Ġtooltip Ġwe Ġtry Ġto Ġreduce Ġthat Ġoffset Ġand Ġwe Ġenforce Ġfollowing Ġthe Ġcursor . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWh atever Ġwe Ġdo Ġwe Ġwant Ġto Ġcall ĠSet Next Window Pos () Ġto Ġenforce Ġa Ġtooltip Ġposition Ġand Ġdisable Ġclipping Ġthe Ġtooltip Ġwithout Ġour Ġdisplay Ġarea , Ġlike Ġregular Ġtooltip Ġdo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Im Vec 2 Ġtooltip _ pos Ġ= Ġg . IO . Mouse Pos Ġ- Ġg . Active Id Click Offset Ġ- Ġg . Style . Window Padding ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtooltip Pos Ġ= Ġio . mouse Pos Ġ+ ĠVec 2 ( 1 6 Ġ* Ġstyle . mouse Cursor Scale , Ġ 8 Ġ* Ġstyle . mouse Cursor Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Next Window Pos ( tooltip Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Next Window Bg Alpha ( style . colors [ Col . Popup Bg ]. w Ġ* Ġ 0 . 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Push Style Var ( ImGui Style Var _ Alpha , Ġg . Style . Alpha Ġ* Ġ 0 . 6 0 f ); Ġ// ĠThis Ġwould Ġbe Ġnice Ġbut Ġe . g ĠColor Button Ġwith Ġcheck board Ġhas Ġissue Ġwith Ġtransparent Ġcolors Ġ:( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Flags Ġ= Ġtooltip Flags Ġor ĠTooltip Flag . Override Previous Tooltip ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġwindow Name Ġ= Ġ" ## Tooltip _% 0 2 d ". format ( g . tooltip Override Count ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tooltip Flags Ġhas ĠTooltip Flag . Override Previous Tooltip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Window ByName ( window Name )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHide Ġprevious Ġtooltip Ġfrom Ġbeing Ġdisplayed . ĠWe Ġcan 't Ġeasily Ġ" reset " Ġthe Ġcontent Ġof Ġa Ġwindow Ġso Ġwe Ġcreate Ġa Ġnew Ġone . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . hidden Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . hidden Frames Can Skip Items Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Name Ġ= Ġ" ## Tooltip _% 0 2 d ". format ( ++ g . tooltip Override Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġflags Ġ= ĠW f ._ Tooltip Ġor ĠW f . No Mouse Inputs Ġor ĠW f . No Title Bar Ġor ĠW f . No Move Ġor ĠW f . No Resize Ġor ĠW f . No Saved Settings Ġor ĠW f . Always Auto Resize ĊĠĠĠĠĠĠĠ Ġbegin ( window Name , Ġnull , Ġflags Ġor Ġextra Flags ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ~ Get Top Most Popup Modal Ġ*/ ĊĠĠĠ Ġval Ġtop Most Popup Modal : ĠWindow ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġg . open Popup Stack . size Ġ- Ġ 1 Ġdown To Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . open Popup Stack [ n ]. window ?. let Ġ{ Ġif Ġ( it . flags Ġhas ĠW f ._ Modal ) Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Best Window Pos For Popup ( window : ĠWindow ): ĠVec 2 Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġr Outer Ġ= Ġwindow . get Allowed Extent Rect () ĊĠĠĠĠĠĠĠ Ġif Ġ( window . flags Ġhas ĠW f ._ Child Menu ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠChild Ġmenus Ġtypically Ġrequest Ġ_ any _ Ġposition Ġwithin Ġthe Ġparent Ġmenu Ġitem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġthen Ġwe Ġmove Ġthe Ġnew Ġmenu Ġoutside Ġthe Ġparent Ġbounds . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġis Ġhow Ġwe Ġend Ġup Ġwith Ġchild Ġmenus Ġappearing Ġ( most - common ly ) Ġon Ġthe Ġright Ġof Ġthe Ġparent Ġmenu . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( g . current Window Ġ=== Ġwindow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Window Ġ= Ġg . current Window Stack [ g . current Window Stack . size Ġ- Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġsome Ġoverlap Ġto Ġcon vey Ġthe Ġrelative Ġdepth Ġof Ġeach Ġmenu Ġ( currently Ġthe Ġamount Ġof Ġoverlap Ġis Ġhard - coded Ġto Ġstyle . Item Spacing . x ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhorizontal Overlap Ġ= Ġstyle . item Inner Spacing . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Avoid Ġ= Ġparent Window . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . menu Bar App ending Ġ-> ĠRect (- Float . MAX _ VALUE , Ġclip Rect . min . y , ĠFloat . MAX _ VALUE , Ġclip Rect . max . y ) Ġ// ĠAvoid Ġparent Ġmenu - bar . ĠIf Ġwe Ġwanted Ġmulti - line Ġmenu - bar , Ġwe Ġmay Ġinstead Ġwant Ġto Ġhave Ġthe Ġcalling Ġwindow Ġsetup Ġe . g . Ġa ĠNext Window Data . Pos Constraint Avoid Rect Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRect ( pos . x Ġ+ Ġhorizontal Overlap , Ġ- Float . MAX _ VALUE , Ġpos . x Ġ+ Ġsize . x Ġ- Ġhorizontal Overlap Ġ- Ġscrollbar Sizes . x , ĠFloat . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Best Window Pos For Popup Ex ( Vec 2 ( window . pos ), Ġwindow . size , Ġwindow :: auto Pos Last Direction , Ġr Outer , Ġr Avoid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( window . flags Ġhas ĠW f ._ Popup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Avoid Ġ= ĠRect ( window . pos . x Ġ- Ġ 1 , Ġwindow . pos . y Ġ- Ġ 1 , Ġwindow . pos . x Ġ+ Ġ 1 , Ġwindow . pos . y Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Best Window Pos For Popup Ex ( Vec 2 ( window . pos ), Ġwindow . size , Ġwindow :: auto Pos Last Direction , Ġr Outer , Ġr Avoid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( window . flags Ġhas ĠW f ._ Tooltip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPosition Ġtooltip Ġ( always Ġfollows Ġmouse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsc Ġ= Ġstyle . mouse Cursor Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Pos Ġ= Ġnav Calc Preferred Ref Pos () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Avoid Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! g . nav Disable Highlight Ġ&& Ġg . nav Disable Mouse Hover Ġ&& Ġ!( io . config Flags Ġhas ĠConfig Flag . Nav Enable Set Mouse Pos ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ref Pos . x Ġ- Ġ 1 6 , Ġref Pos . y Ġ- Ġ 8 , Ġref Pos . x Ġ+ Ġ 1 6 , Ġref Pos . y Ġ+ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRect ( ref Pos . x Ġ- Ġ 1 6 , Ġref Pos . y Ġ- Ġ 8 , Ġref Pos . x Ġ+ Ġ 2 4 Ġ* Ġsc , Ġref Pos . y Ġ+ Ġ 2 4 Ġ* Ġsc ) Ġ// ĠFIXME : ĠHard - coded Ġbased Ġon Ġmouse Ġcursor Ġshape Ġexpectation . ĠExact Ġdimension Ġnot Ġvery Ġimportant . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġfind Best Window Pos For Popup Ex ( ref Pos , Ġwindow . size , Ġwindow :: auto Pos Last Direction , Ġr Outer , Ġr Avoid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window . auto Pos Last Direction Ġ== ĠDir . None ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere 's Ġnot Ġenough Ġroom , Ġfor Ġtooltip Ġwe Ġprefer Ġavoid ing Ġthe Ġcursor Ġat Ġall Ġcost Ġeven Ġif Ġit Ġmeans Ġthat Ġpart Ġof Ġthe Ġtooltip Ġwon 't Ġbe Ġvisible . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos ( ref Pos Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpos ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( false ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVec 2 ( window . pos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġr Avoid Ġ= Ġthe Ġrectangle Ġto Ġavoid Ġ( e . g . Ġfor Ġtooltip Ġit Ġis Ġa Ġrectangle Ġaround Ġthe Ġmouse Ġcursor Ġwhich Ġwe Ġwant Ġto Ġavoid . Ġfor Ġpop ups Ġit 's Ġa Ġsmall Ġpoint Ġaround Ġthe Ġcursor .) ĊĠĠĠĠ Ġ* Ġ Ġr Outer Ġ= Ġthe Ġvisible Ġarea Ġrectangle , Ġminus Ġsafe Ġarea Ġpadding . ĠIf Ġour Ġpopup Ġsize Ġwon 't Ġfit Ġbecause Ġof Ġsafe Ġarea Ġpadding Ġwe Ġignore Ġit . Ġ*/ ĊĠĠĠ Ġfun Ġfind Best Window Pos For Popup Ex ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref Pos : ĠVec 2 , Ġsize : ĠVec 2 , Ġlast Dir Ptr : ĠK Mutable Property 0 < Dir >, Ġr Outer : ĠRect , Ġr Avoid : ĠRect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy : ĠPopup Position Policy Ġ= ĠPopup Position Policy . Default , ĊĠĠĠ Ġ): ĠVec 2 Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġlast Dir Ġby Ġlast Dir Ptr ĊĠĠĠĠĠĠĠ Ġval Ġbase Pos Clamp ed Ġ= Ġglm . clamp ( ref Pos , Ġr Outer . min , Ġr Outer . max Ġ- Ġsize ) ĊĠĠĠĠĠĠĠ Ġ// G ImGui -> Overlay Draw List . Add Rect ( r _ avoid . Min , Ġr _ avoid . Max , ĠIM _ COL 3 2 ( 2 5 5 , 0 , 0 , 2 5 5 )); ĊĠĠĠĠĠĠĠ Ġ// G ImGui -> Overlay Draw List . Add Rect ( r Outer . Min , Ġr Outer . Max , ĠIM _ COL 3 2 ( 0 , 2 5 5 , 0 , 2 5 5 )); ĊĊĠĠĠĠĠĠĠ Ġ// ĠCombo ĠBox Ġpolicy Ġ( we Ġwant Ġa Ġconnecting Ġedge ) ĊĠĠĠĠĠĠĠ Ġif Ġ( policy Ġ== ĠPopup Position Policy . ComboBox ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Prefer ed Order Ġ= ĠarrayOf ( Dir . Down , ĠDir . Right , ĠDir . Left , ĠDir . Up ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ( if Ġ( last Dir Ġ!= ĠDir . None ) Ġ- 1 Ġelse Ġ 0 ) Ġuntil ĠDir . COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġif Ġ( n Ġ== Ġ- 1 ) Ġlast Dir Ġelse Ġdir Prefer ed Order [ n ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ!= Ġ- 1 Ġ&& Ġdir Ġ== Ġlast Dir ) Ġcontinue Ġ// ĠAlready Ġtried Ġthis Ġdirection ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠVec 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== ĠDir . Down ) Ġpos . put ( r Avoid . min . x , Ġr Avoid . max . y ) ĠĠĠĠĠĠĠĠĠ Ġ// ĠBelow , ĠT ow ard ĠRight Ġ( default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== ĠDir . Right ) Ġpos . put ( r Avoid . min . x , Ġr Avoid . min . y Ġ- Ġsize . y ) Ġ// ĠA bove , ĠT ow ard ĠRight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== ĠDir . Left ) Ġpos . put ( r Avoid . max . x Ġ- Ġsize . x , Ġr Avoid . max . y ) Ġ// ĠBelow , ĠT ow ard ĠLeft ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== ĠDir . Up ) Ġpos . put ( r Avoid . max . x Ġ- Ġsize . x , Ġr Avoid . min . y Ġ- Ġsize . y ) Ġ// ĠA bove , ĠT ow ard ĠLeft ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Rect ( pos , Ġpos Ġ+ Ġsize ) Ġ! in Ġr Outer ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Dir Ġ= Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDefault Ġpopup Ġpolicy ĊĠĠĠĠĠĠĠ Ġval Ġdir Preferred Order Ġ= ĠarrayOf ( Dir . Right , ĠDir . Down , ĠDir . Up , ĠDir . Left ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ( if Ġ( last Dir Ġ!= ĠDir . None ) Ġ- 1 Ġelse Ġ 0 ) Ġuntil ĠDir . COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġif Ġ( n Ġ== Ġ- 1 ) Ġlast Dir Ġelse Ġdir Preferred Order [ n ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ!= Ġ- 1 Ġ&& Ġdir Ġ== Ġlast Dir ) Ġcontinue Ġ Ġ// ĠAlready Ġtried Ġthis Ġdirection ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavail W Ġ= Ġ( if Ġ( dir Ġ== ĠDir . Left ) Ġr Avoid . min . x Ġelse Ġr Outer . max . x ) Ġ- Ġif Ġ( dir Ġ== ĠDir . Right ) Ġr Avoid . max . x Ġelse Ġr Outer . min . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavail H Ġ= Ġ( if Ġ( dir Ġ== ĠDir . Up ) Ġr Avoid . min . y Ġelse Ġr Outer . max . y ) Ġ- Ġif Ġ( dir Ġ== ĠDir . Down ) Ġr Avoid . max . y Ġelse Ġr Outer . min . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( avail W Ġ< Ġsize . x Ġ|| Ġavail H Ġ< Ġsize . y ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠVec 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== ĠDir . Left ) Ġr Avoid . min . x Ġ- Ġsize . x Ġelse Ġif Ġ( dir Ġ== ĠDir . Right ) Ġr Avoid . max . x Ġelse Ġbase Pos Clamp ed . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== ĠDir . Up ) Ġr Avoid . min . y Ġ- Ġsize . y Ġelse Ġif Ġ( dir Ġ== ĠDir . Down ) Ġr Avoid . max . y Ġelse Ġbase Pos Clamp ed . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Dir Ġ= Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpos ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠF allback , Ġtry Ġto Ġkeep Ġwithin Ġdisplay ĊĠĠĠĠĠĠĠ Ġlast Dir Ġ= ĠDir . None ĊĠĠĠĠĠĠĠ Ġreturn ĠVec 2 ( ref Pos ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġkotlin . math . max ( kotlin . math . min ( x Ġ+ Ġsize . x , Ġr Outer . max . x ) Ġ- Ġsize . x , Ġr Outer . min . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġkotlin . math . max ( kotlin . math . min ( y Ġ+ Ġsize . y , Ġr Outer . max . y ) Ġ- Ġsize . y , Ġr Outer . min . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }