package Ġimg ui . internal . api Ċ Ċ import Ġgli _. has nt Ċ import Ġglm _. f Ċ import Ġglm _. func . common . max Ċ import Ġglm _. func . common . min Ċ import Ġglm _. glm Ċ import Ġglm _. i Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. wo Ċ import Ġimg ui .* Ċ import Ġimg ui . ImGui . clear Active ID Ċ import Ġimg ui . ImGui . current Window Ċ import Ġimg ui . ImGui . foreground Draw List Ċ import Ġimg ui . ImGui . hover ed Id Ċ import Ġimg ui . ImGui . io Ċ import Ġimg ui . ImGui . isActive Id Using Key Ċ import Ġimg ui . ImGui . is Mouse Hover ing Rect Ċ import Ġimg ui . ImGui . same Line Ċ import Ġimg ui . ImGui . style Ċ import Ġimg ui . api . g Ċ import Ġimg ui . internal . api . internal . Companion . shrink Width Item Comparer Ċ import Ġimg ui . internal . classes . Rect Ċ import Ġimg ui . internal . classes . Shrink Width Item Ċ import Ġimg ui . internal . classes . Window Ċ import Ġimg ui . internal . floor Ċ import Ġimg ui . internal . sections .* Ċ import Ġimg ui . static s . nav Process Item Ċ import Ġjava . util .* Ċ Ċ //----------------------------------------------------------------------------- Ċ // Ġ[ SECTION ] ĠLAY OUT Ċ //----------------------------------------------------------------------------- Ċ // Ġ- ĠItem Size () Ċ // Ġ- ĠItem Add () Ċ // Ġ- ĠSame Line () Ċ // Ġ- ĠInd ent () Ċ // Ġ- ĠUn indent () Ċ // Ġ- ĠBegin Group () Ċ // Ġ- ĠEnd Group () Ċ // ĠAlso Ġsee Ġin Ġimg ui _ widgets : Ġtab Ġbars , Ġcolumns . Ċ //----------------------------------------------------------------------------- Ċ Ċ /** ĠBasic ĠHelpers Ġfor Ġwidget Ġcode Ġ*/ Ċ internal Ġinterface Ġbasic Helpers For Widget Code Ġ{ ĊĊĠĠĠ Ġ/** ĠAdv ance Ġcursor Ġgiven Ġitem Ġsize Ġfor Ġlayout . ĊĠĠĠĠ Ġ* Ġ ĠRegister Ġminimum Ġneeded Ġsize Ġso Ġit Ġcan Ġextend Ġthe Ġbounding Ġbox Ġused Ġfor Ġauto - fit Ġcalculation . ĊĠĠĠĠ Ġ* Ġ ĠSee Ġcomments Ġin ĠItem Add () Ġabout Ġhow / why Ġthe Ġsize Ġprovided Ġto ĠItem Size () Ġvs ĠItem Add () Ġmay Ġoften Ġdifferent . Ġ*/ ĊĠĠĠ Ġfun Ġitem Size ( size : ĠVec 2 , Ġtext Baseline Y : ĠFloat Ġ= Ġ- 1 f ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġcurrent Window ĊĠĠĠĠĠĠĠ Ġif Ġ( window . skip Items ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġincrease Ġthe Ġheight Ġin Ġthis Ġfunction Ġto Ġac commod ate Ġfor Ġbaseline Ġoffset . ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġtheory Ġwe Ġshould Ġbe Ġoffset ting Ġthe Ġstarting Ġposition Ġ( window -> DC . Cursor Pos ), Ġthat Ġwill Ġbe Ġthe Ġtopic Ġof Ġa Ġlarger Ġrefactor , ĊĠĠĠĠĠĠĠ Ġ// Ġbut Ġsince ĠItem Size () Ġis Ġnot Ġyet Ġan ĠAPI Ġthat Ġmoves Ġthe Ġcursor Ġ( to Ġhandle Ġe . g . Ġwrapping ) Ġen l arging Ġthe Ġheight Ġhas Ġthe Ġsame Ġeffect . ĊĠĠĠĠĠĠĠ Ġval Ġoffset To Match Baseline Y Ġ= Ġif Ġ( text Baseline Y Ġ>= Ġ 0 f ) Ġ 0 f Ġmax Ġ( window . dc . curr Line Text Base Offset Ġ- Ġtext Baseline Y ) Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= Ġwindow . dc . curr Line Size . y Ġmax Ġ( size . y Ġ+ Ġoffset To Match Baseline Y ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġalign Ġourselves Ġon Ġpixel Ġboundaries ĊĠĠĠĠĠĠĠ Ġwindow . dc . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( io . key Alt ) Ġwindow . draw List . add Rect ( window . dc . cursor Pos , Ġwindow . dc . cursor Pos Ġ+ ĠVec 2 ( size . x , Ġline Height ), ĠCOL 3 2 ( 2 5 5 , 0 , 0 , 2 0 0 )); Ġ// Ġ[ DEBUG ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Pos Prev Line . put ( cursor Pos . x Ġ+ Ġsize . x , Ġcursor Pos . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Pos . x Ġ= Ġfloor ( window . pos . x Ġ+ Ġindent Ġ+ Ġcolumns Offset ) ĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Pos . y Ġ= Ġfloor ( cursor Pos . y Ġ+ Ġline Height Ġ+ Ġstyle . item Spacing . y ) Ġ Ġ// ĠNext Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Max Pos . x Ġ= Ġcursor Max Pos . x Ġmax Ġcursor Pos Prev Line . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Max Pos . y Ġ= Ġcursor Max Pos . y Ġmax Ġ( cursor Pos . y Ġ- Ġstyle . item Spacing . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( io . key Alt ) Ġwindow . draw List . add Circle ( window . dc . cursor Max Pos , Ġ 3 f , ĠCOL 3 2 ( 2 5 5 , 0 , 0 , 2 5 5 ), Ġ 4 ); Ġ// Ġ[ DEBUG ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Line Size . y Ġ= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Line Size . y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Line Text Base Offset Ġ= Ġcurr Line Text Base Offset Ġmax Ġtext Baseline Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Line Text Base Offset Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHorizontal Ġlayout Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Type Ġ== ĠLayout Type . Horizontal ) Ġsame Line () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġitem Size ( bb : ĠRect , Ġtext Baseline Y : ĠFloat Ġ= Ġ- 1 f ) Ġ= Ġitem Size ( bb . size , Ġtext Baseline Y ) ĊĊĠĠĠ Ġ/** ĠDeclare Ġitem Ġbounding Ġbox Ġfor Ġclipping Ġand Ġinteraction . ĊĠĠĠĠ Ġ* Ġ ĠNote Ġthat Ġthe Ġsize Ġcan Ġbe Ġdifferent Ġthan Ġthe Ġone Ġprovided Ġto ĠItem Size (). ĠTypically , Ġwidgets Ġthat Ġspread Ġover Ġavailable Ġsurface ĊĠĠĠĠ Ġ* Ġ Ġdeclare Ġtheir Ġminimum Ġsize Ġrequirement Ġto ĠItem Size () Ġand Ġprovide Ġa Ġlarger Ġregion Ġto ĠItem Add () Ġwhich Ġis Ġused Ġdrawing / interaction . Ġ*/ ĊĠĠĠ Ġfun Ġitem Add ( bb : ĠRect , Ġid : ĠID , Ġnav Bb Arg : ĠRect ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNavigation Ġprocessing Ġruns Ġprior Ġto Ġclipping Ġearly - out ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ( a ) ĠSo Ġthat ĠNav Init Request Ġcan Ġbe Ġhon ored , Ġfor Ġnewly Ġopened Ġwindows Ġto Ġselect Ġa Ġdefault Ġwidget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ( b ) ĠSo Ġthat Ġwe Ġcan Ġscroll Ġup / down Ġpast Ġcli pped Ġitems . ĠThis Ġadds Ġa Ġsmall ĠO ( N ) Ġcost Ġto Ġregular Ġnavigation Ġrequests ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġunfortunately , Ġbut Ġit Ġis Ġstill Ġlimited Ġto Ġone Ġwindow . ĠIt Ġmay Ġnot Ġscale Ġvery Ġwell Ġfor Ġwindows Ġwith Ġten Ġof ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġthousands Ġof Ġitem , Ġbut Ġat Ġleast ĠNav Move Request Ġis Ġonly Ġset Ġon Ġuser Ġinteraction , Ġa ka Ġmaximum Ġonce Ġa Ġframe . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ ĠWe Ġcould Ġearly Ġout Ġwith Ġ" if Ġ( is _ cli pped Ġ&& Ġ! g . Nav Init Request ) Ġreturn Ġfalse ;" Ġbut Ġwhen Ġwe Ġwouldn 't Ġbe Ġable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġto Ġreach Ġun cli pped Ġwidgets . ĠThis Ġwould Ġwork Ġif Ġuser Ġhad Ġexplicit Ġscrolling Ġcontrol Ġ( e . g . Ġmapped Ġon Ġa Ġstick ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġintention ally Ġdon 't Ġcheck Ġif Ġg . Nav Window Ġ!= ĠNULL Ġbecause Ġg . Nav Any Request Ġshould Ġonly Ġbe Ġset Ġwhen Ġit Ġis Ġnon Ġnull . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġcrash Ġon Ġa ĠNULL Ġg . Nav Window Ġwe Ġneed Ġto Ġfix Ġthe Ġbug Ġelsewhere . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . dc . nav Layer Active Mask Next Ġ= Ġwindow . dc . nav Layer Active Mask Next Ġor Ġ( 1 Ġshl Ġwindow . dc . nav Layer Current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . nav Id Ġ== Ġid Ġ|| Ġg . nav Any Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . nav Window !!. root Window For Nav Ġ=== Ġwindow . root Window For Nav ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window Ġ== Ġg . nav Window Ġ|| Ġ( window . flags Ġor Ġg . nav Window !!. flags ) Ġhas ĠWindow Flag ._ Nav Flatten ed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Process Item ( window , Ġnav Bb Arg Ġ?: Ġbb , Ġid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ[ DEBUG ] ĠItem ĠP icker Ġtool , Ġwhen Ġenabling Ġthe Ġ" extended " Ġversion Ġwe Ġperform Ġthe Ġcheck Ġin ĠItem Add () ĊĠĠĠĠĠĠĠ Ġif Ġ( IM GUI _ DEBUG _ TOOL _ ITEM _ P ICK ER _ EX Ġ&& Ġid Ġ== Ġg . debug Item Picker Break Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIM _ DEBUG _ BREAK () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . debug Item Picker Break Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠE quivalent Ġto Ġcalling ĠSet Last Item Data () ĊĠĠĠĠĠĠĠ Ġval Ġdc Ġ= Ġg . current Window !!. dc . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast ItemId Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Item Rect Ġ= Ġbb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Item Status Flags Ġ= ĠItem Status Flag . None . i ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġg . next Item Data . flags Ġ= ĠNext Item Data Flag . None . i ĊĊĠĠĠĠĠĠĠ Ġif Ġ( IM GUI _ ENABLE _ TEST _ ENGINE Ġ&& Ġid Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIM GUI _ TEST _ ENGINE _ ITEM _ ADD ( nav Bb Arg Ġ?: Ġbb , Ġid ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCli pping Ġtest ĊĠĠĠĠĠĠĠ Ġif Ġ( is Cli pped Ex ( bb , Ġid , Ġfalse )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ// if Ġ( g . io . Key Alt ) Ġwindow -> Draw List -> Add Rect ( bb . Min , Ġbb . Max , ĠIM _ COL 3 2 ( 2 5 5 , 2 5 5 , 0 , 1 2 0 )); Ġ// Ġ[ DEBUG ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġcalculate Ġthis Ġnow Ġto Ġtake Ġaccount Ġof Ġthe Ġcurrent Ġclipping Ġrectangle Ġ( as Ġitems Ġlike ĠSelect able Ġmay Ġchange Ġthem ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Mouse Hover ing Rect ( bb )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdc . last Item Status Flags Ġ= Ġdc . last Item Status Flags Ġor ĠItem Status Flag . Hover ed Rect ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠInternal Ġfacing ĠItem Hover able () Ġused Ġwhen Ġsubmitting Ġwidgets . ĠDiff ers Ġslightly Ġfrom ĠIs Item Hover ed (). ĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġitem Hover able ( bb : ĠRect , Ġid : ĠID ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . hover ed Id Ġ!= Ġ 0 Ġ&& Ġg . hover ed Id Ġ!= Ġid Ġ&& Ġ! g . hover ed Id Allow Overlap Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . hover ed Window Ġ!== Ġwindow Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . active Id Ġ!= Ġ 0 Ġ&& Ġg . active Id Ġ!= Ġid Ġ&& Ġ! g . active Id Allow Overlap Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Mouse Hover ing Rect ( bb ) Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . nav Disable Mouse Hover Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! window . is Content Hover able ( Hover ed Flag . None ) Ġ|| Ġwindow . dc . item Flags Ġhas ĠItem Flag . Disabled Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . hover ed Id Disabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġexception ally Ġallow Ġthis Ġfunction Ġto Ġbe Ġcalled Ġwith Ġid == 0 Ġto Ġallow Ġusing Ġit Ġfor Ġeasy Ġhigh - level ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhover Ġtest Ġin Ġwidgets Ġcode . ĠWe Ġcould Ġalso Ġdecide Ġto Ġsplit Ġthis Ġfunction Ġis Ġtwo . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhover ed Id Ġ= Ġid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ[ DEBUG ] ĠItem ĠP icker Ġtool ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġperform Ġthe Ġcheck Ġhere Ġbecause ĠSet Hover ed ID () Ġis Ġnot Ġfrequently Ġcalled Ġ( 1 ~ Ġtime Ġa Ġframe ), Ġmaking ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcost Ġof Ġthis Ġtool Ġnear - zero . ĠWe Ġcan Ġget Ġslightly Ġbetter Ġcall - stack Ġand Ġsupport Ġpicking Ġnon - hover ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġitems Ġif Ġwe Ġperform Ġthe Ġtest Ġin ĠItem Add (), Ġbut Ġthat Ġwould Ġin cur Ġa Ġsmall Ġruntime Ġcost . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ# define ĠIM GUI _ DEBUG _ TOOL _ ITEM _ P ICK ER _ EX Ġin Ġim config . h Ġif Ġyou Ġwant Ġthis Ġcheck Ġto Ġalso Ġbe Ġperformed Ġin ĠItem Add (). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . debug Item Picker Active Ġ&& Ġg . hover ed Id Previous Frame Ġ== Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Draw List . add Rect ( bb . min , Ġbb . max , ĠCOL 3 2 ( 2 5 5 , Ġ 2 5 5 , Ġ 0 , Ġ 2 5 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . debug Item Picker Break Id Ġ== Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIM _ DEBUG _ BREAK () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Cli pped Ex ( bb : ĠRect , Ġid : ĠID , Ġclip Even When Logged : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġif Ġ(!( bb Ġoverlap s Ġwindow . clip Rect )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġ 0 Ġ|| Ġ( id Ġ!= Ġg . active Id Ġ&& Ġid Ġ!= Ġg . nav Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clip Even When Logged Ġ|| Ġ! g . log Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThis Ġis Ġalso Ġin lined Ġin ĠItem Add () ĊĠĠĠĠ Ġ* Ġ ĠNote : Ġif ĠImGui Item Status Flags _ Has Display Rect Ġis Ġset , Ġuser Ġneeds Ġto Ġset Ġwindow -> DC . Last Item Display Rect ! Ġ*/ ĊĠĠĠ Ġfun Ġset Last Item Data ( window : ĠWindow , ĠitemId : ĠID , Ġitem Flags : ĠItem Status Flags , Ġitem Rect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . dc . last ItemId Ġ= ĠitemId ĊĠĠĠĠĠĠĠ Ġwindow . dc . last Item Status Flags Ġ= Ġitem Flags ĊĠĠĠĠĠĠĠ Ġwindow . dc . last Item Rect Ġput Ġitem Rect ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturn Ġtrue Ġif Ġfocus Ġis Ġrequested ĊĠĠĠĠ Ġ* Ġ ĠProcess ĠTAB / Shift + TAB . ĠBe Ġmind ful Ġthat Ġthis Ġfunction Ġmay Ġ_ clear _ Ġthe ĠActive ID Ġwhen Ġtab bing Ġout . Ġ*/ ĊĠĠĠ Ġ// ĠTODO Ġmove Ġboth Ġmethods Ġinto ĠWindow Ġclass ? ĊĠĠĠ Ġfun Ġfocus able Item Register ( window : ĠWindow , Ġid : ĠID ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠIncrement Ġcounters ĊĠĠĠĠĠĠĠ Ġval Ġis Tab Stop Ġ= Ġwindow . dc . item Flags Ġhas nt Ġ( Item Flag . No Tab Stop Ġor ĠItem Flag . Disabled ) ĊĠĠĠĠĠĠĠ Ġwindow . dc . focus Counter Regular ++ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Tab Stop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . dc . focus Counter Tab Stop ++ ĊĊĠĠĠĠĠĠĠ Ġ// ĠProcess ĠTAB / Shift - TAB Ġto Ġtab Ġ* OUT * Ġof Ġthe Ġcurrently Ġfocused Ġitem . ĊĠĠĠĠĠĠĠ Ġ// Ġ( Note Ġthat Ġwe Ġcan Ġalways ĠTAB Ġout Ġof Ġa Ġwidget Ġthat Ġdoesn 't Ġallow Ġtab bing Ġin ) ĊĠĠĠĠĠĠĠ Ġif Ġ( g . active Id Ġ== Ġid Ġ&& Ġg . focus Tab Pressed Ġ&& Ġ! isActive Id Using Key ( Key . Tab ) Ġ&& Ġg . focus Request Next Window Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . focus Request Next Window Ġ= Ġwindow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . focus Request Next Counter Tab Stop Ġ= Ġwindow . dc . focus Counter Tab Stop Ġ+ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMod ulo Ġon Ġindex Ġwill Ġbe Ġapplied Ġat Ġthe Ġend Ġof Ġframe Ġonce Ġwe 've Ġgot Ġthe Ġtotal Ġcounter Ġof Ġitems . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio . key Shift Ġ-> Ġif Ġ( is Tab Stop ) Ġ- 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ+ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġfocus Ġrequests ĊĠĠĠĠĠĠĠ Ġif Ġ( g . focus Request Curr Window Ġ=== Ġwindow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window . dc . focus Counter Regular Ġ== Ġg . focus Request Curr Counter Regular ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Tab Stop Ġ&& Ġwindow . dc . focus Counter Tab Stop Ġ== Ġg . focus Request Curr Counter Tab Stop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . nav Just Tabbed Id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġanother Ġitem Ġis Ġabout Ġto Ġbe Ġfocused , Ġwe Ġclear Ġour Ġown Ġactive Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . active Id Ġ== Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Active ID () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfocus able Item Unregister ( window : ĠWindow ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . dc . focus Counter Regular -- ĊĠĠĠĠĠĠĠ Ġwindow . dc . focus Counter Tab Stop -- ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ[ Internal ] ĠCalculate Ġfull Ġitem Ġsize Ġgiven Ġuser Ġprovided Ġ' size ' Ġparameter Ġand Ġdefault Ġwidth / height . ĠDefault Ġwidth Ġis Ġoften Ġ== ĠCalc Item Width (). ĊĠĠĠĠ Ġ* Ġ ĠThose Ġtwo Ġfunctions ĠCalc Item Width Ġvs ĠCalc Item Size Ġare Ġawk ward ly Ġnamed Ġbecause Ġthey Ġare Ġnot Ġfully Ġsym metr ical . ĊĠĠĠĠ Ġ* Ġ ĠNote Ġthat Ġonly ĠCalc Item Width () Ġis Ġpublicly Ġexposed . ĊĠĠĠĠ Ġ* Ġ ĠThe Ġ 4 . 0 f Ġhere Ġmay Ġbe Ġchanged Ġto Ġmatch ĠCalc Item Width () Ġand / or ĠBegin Child () Ġ( right Ġnow Ġwe Ġhave Ġa Ġmismatch Ġwhich Ġis Ġharm less Ġbut Ġun des irable ) Ġ*/ ĊĠĠĠ Ġfun Ġcalc Item Size ( size _: ĠVec 2 , Ġdefault W : ĠFloat , Ġdefault H : ĠFloat ): ĠVec 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĊĠĠĠĠĠĠĠ Ġval Ġregion Max Ġ= Ġif Ġ( size _ Ġany LessThan Ġ 0 f ) Ġcontent Region Max Abs Ġelse ĠVec 2 () ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠVec 2 ( size _) ĊĠĠĠĠĠĠĠ Ġif Ġ( size . x Ġ== Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize . x Ġ= Ġdefault W ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( size . x Ġ< Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize . x Ġ= Ġ 4 f Ġmax Ġ( region Max . x Ġ- Ġwindow . dc . cursor Pos . x Ġ+ Ġsize . x ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size . y Ġ== Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize . y Ġ= Ġdefault H ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( size . y Ġ< Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize . y Ġ= Ġ 4 f Ġmax Ġ( region Max . y Ġ- Ġwindow . dc . cursor Pos . y Ġ+ Ġsize . y ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalc Wrap Width For Pos ( pos : ĠVec 2 , Ġwrap Pos X _: ĠFloat ): ĠFloat Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( wrap Pos X _ Ġ< Ġ 0 f ) Ġreturn Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġvar Ġwrap Pos X Ġ= Ġwrap Pos X _ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġif Ġ( wrap Pos X Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcould Ġdecide Ġto Ġsetup Ġa Ġdefault Ġwrapping Ġmax Ġpoint Ġfor Ġauto - res izing Ġwindows , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġor Ġhave Ġauto - wrap Ġ( with Ġunspecified Ġwrapping Ġpos ) Ġbehave Ġas Ġa ĠContent Size Ġextending Ġfunction ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( window -> Hidden Ġ&& Ġ( window -> Flags Ġ& ĠImGui Window Flags _ Always Auto Resize )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġwrap _ pos _ x Ġ= ĠIm Max ( window -> Work Rect . Min . x Ġ+ Ġg . FontSize Ġ* Ġ 1 0 . 0 f , Ġwindow -> Work Rect . Max . x ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// else ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Pos X Ġ= Ġwindow . work Rect . max . x ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( wrap Pos X Ġ> Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Pos X Ġ+= Ġwindow . pos . x Ġ- Ġwindow . scroll . x Ġ// Ġwrap _ pos _ x Ġis Ġprovided Ġis Ġwindow Ġlocal Ġspace ĊĊĠĠĠĠĠĠĠ Ġreturn Ġglm . max ( wrap Pos X Ġ- Ġpos . x , Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpush Multi Items Widths ( components : ĠInt , Ġw Full : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġcurrent Window ĊĠĠĠĠĠĠĠ Ġval Ġw Item One Ġ= Ġ 1 f Ġmax Ġfloor (( w Full Ġ- Ġ( style . item Inner Spacing . x ) Ġ* Ġ( components Ġ- Ġ 1 )) Ġ/ Ġcomponents . f ) ĊĠĠĠĠĠĠĠ Ġval Ġw Item Last Ġ= Ġ 1 f Ġmax Ġfloor ( w Full Ġ- Ġ( w Item One Ġ+ Ġstyle . item Inner Spacing . x ) Ġ* Ġ( components Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġwindow . dc . item Width Stack . push ( w Item Last ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcomponents Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . dc . item Width Stack . push ( w Item One ) ĊĠĠĠĠĠĠĠ Ġwindow . dc . item Width Ġ= Ġwindow . dc . item Width Stack . last () ĊĠĠĠĠĠĠĠ Ġg . next Item Data . flags Ġ= Ġg . next Item Data . flags Ġwo ĠNext Item Data Flag . Has Width ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġallow Ġfoc using Ġusing ĠTAB / Shift - TAB , Ġenabled Ġby Ġdefault Ġbut Ġyou Ġcan Ġdisable Ġit Ġfor Ġcertain Ġwidgets ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġoption Ġ= ĠItem Flag ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpush Item Flag ( option : ĠItem Flags , Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġvar Ġitem Flags Ġ= Ġwindow . dc . item Flags ĊĠĠĠĠĠĠĠ Ġassert ( item Flags Ġ== Ġg . item Flags Stack . last ()) ĊĠĠĠĠĠĠĠ Ġitem Flags Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ-> Ġitem Flags Ġor Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġitem Flags Ġwo Ġoption ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwindow . dc . item Flags Ġ= Ġitem Flags ĊĠĠĠĠĠĠĠ Ġg . item Flags Stack Ġ+= Ġitem Flags ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop Item Flag () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠ Ġassert ( g . item Flags Stack . size Ġ> Ġ 1 ) Ġ{ Ġ" Too Ġmany Ġcalls Ġto ĠPop Item Flag () Ġ- Ġwe Ġalways Ġleave Ġa Ġ 0 Ġat Ġthe Ġbottom Ġof Ġthe Ġstack ." Ġ} ĊĠĠĠĠĠĠĠ Ġg . item Flags Stack . pop () ĊĠĠĠĠĠĠĠ Ġwindow . dc . item Flags Ġ= Ġg . item Flags Stack . last () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠWas Ġthe Ġlast Ġitem Ġselection Ġtoggle d ? Ġ( after ĠSelect able (), ĠTreeNode () Ġetc . ĠWe Ġonly Ġreturns Ġtoggle Ġ_ event _ Ġin Ġorder Ġto Ġhandle Ġclipping Ġcorrectly ) Ġ*/ ĊĠĠĠ Ġval Ġis Item Toggle d Selection : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġg . current Window !!. dc . last Item Status Flags Ġhas ĠItem Status Flag . Toggle d Selection ĊĊĠĠĠ Ġ/** Ġ[ Internal ] ĠAbsolute Ġcoordinate . ĠSan er . ĠThis Ġis Ġnot Ġexposed Ġuntil Ġwe Ġfinish ing Ġrefactoring Ġwork Ġrect Ġfeatures . ĊĠĠĠĠ Ġ* Ġ Ġ~ Get Content Region Max Abs Ġ*/ ĊĠĠĠ Ġval Ġcontent Region Max Abs : ĠVec 2 ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġg . current Window !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmx Ġ= Ġwindow . content Region Rect . max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window . dc . current Columns Ġ!= Ġnull Ġ|| Ġg . current Table Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmx . x Ġ= Ġwindow . work Rect . max . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmx ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSh rink Ġexcess Ġwidth Ġfrom Ġa Ġset Ġof Ġitem , Ġby Ġremoving Ġwidth Ġfrom Ġthe Ġlarger Ġitems Ġfirst . ĊĠĠĠĠ Ġ* Ġ ĠSet Ġitems ĠWidth Ġto Ġ- 1 . 0 f Ġto Ġdisable Ġshrink ing Ġthis Ġitem . Ġ*/ ĊĠĠĠ Ġfun Ġshrink Widths ( items : ĠArrayList < Shrink Width Item >, Ġptr : ĠInt , Ġcount : ĠInt , Ġwidth Ex cess _: ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Ex cess Ġ= Ġwidth Ex cess _ ĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items [ ptr ]. width Ġ>= Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ ptr ]. width Ġ= Ġ( items [ ptr ]. width Ġ- Ġwidth Ex cess ) Ġmax Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġitems . sub List ( ptr , Ġptr Ġ+ Ġcount ). sort With ( shrink Width Item Comparer ) ĊĠĠĠĠĠĠĠ Ġvar Ġcount Same Width Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( width Ex cess Ġ> Ġ 0 f Ġ&& Ġcount Same Width Ġ< Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( count Same Width Ġ< Ġcount Ġ&& Ġitems [ ptr ]. width Ġ<= Ġitems [ count Same Width ]. width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Same Width ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxWidth ToRemove Per Item Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Same Width Ġ< Ġcount Ġ&& Ġitems [ ptr Ġ+ Ġcount Same Width ]. width Ġ>= Ġ 0 f Ġ-> Ġitems [ ptr ]. width Ġ- Ġitems [ ptr Ġ+ Ġcount Same Width ]. width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġitems [ ptr ]. width Ġ- Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maxWidth ToRemove Per Item Ġ<= Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth ToRemove Per Item Ġ= Ġ( width Ex cess Ġ/ Ġcount Same Width ) Ġmin ĠmaxWidth ToRemove Per Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item N Ġin Ġ 0 Ġuntil Ġcount Same Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ ptr Ġ+ Ġitem N ]. width Ġ-= Ġwidth ToRemove Per Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ex cess Ġ-= Ġwidth ToRemove Per Item Ġ* Ġcount Same Width ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRound Ġwidth Ġand Ġredistribute Ġremainder Ġleft - to - right Ġ( could Ġmake Ġit Ġan Ġoption Ġof Ġthe Ġfunction ?) ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġe . g . Ġthe Ġright - most Ġtab Ġof Ġa Ġsh run k Ġtab - bar Ġalways Ġreaches Ġexactly Ġat Ġthe Ġsame Ġdistance Ġfrom Ġthe Ġright - most Ġedge Ġof Ġthe Ġtab Ġbar Ġseparator . ĊĠĠĠĠĠĠĠ Ġwidth Ex cess Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Rounded Ġ= Ġfloor ( items [ it ]. width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ex cess Ġ+= Ġitems [ it ]. width Ġ- Ġwidth Rounded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ it ]. width Ġ= Ġwidth Rounded ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ex cess Ġ> Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items [ n ]. index Ġ< Ġ( width Ex cess Ġ+ Ġ 0 . 0 1 f ). i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ n ]. width Ġ+= Ġ 1 f ĊĠĠĠ Ġ} Ċ }