package Ġimg ui Ċ Ċ import Ġglm _. bool Ċ import Ġglm _. glm Ċ import Ġglm _. i Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. vec 4 . Vec 4 Ċ import Ġimg ui . ImGui . style Ċ import Ġimg ui . ImGui . calc List Cli pping Ċ import Ġimg ui . ImGui . color Convert H SV to RGB Ċ import Ġimg ui . ImGui . current Window Ċ import Ġimg ui . ImGui . current Window Read Ċ import Ġimg ui . ImGui . cursor Pos Y Ċ import Ġimg ui . ImGui . input Text Ċ import Ġimg ui . ImGui . pop Item Width Ċ import Ġimg ui . ImGui . push Item Width Ċ Ċ class ĠOnce Up on A Frame Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠText Filter ( default Filter : ĠString ? Ġ= Ġ"") Ġ{ ĊĊĠĠĠ Ġval Ġinput Buf Ġ= ĠChar Array ( 2 5 6 ) ĊĠĠĠ Ġval Ġfilters Ġ= ĠArrayList < String >() ĊĠĠĠ Ġvar Ġcount G rep Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Filter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Filter . toCharArray ( input Buf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠText Range ĊĊĠĠĠ Ġ/** ĠHelper Ġcalling ĠInput Text + Build ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw ( label : ĠString Ġ= Ġ" Filter Ġ( inc ,- exc )", Ġwidth : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ!= Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Item Width ( width ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Changed Ġ= Ġinput Text ( label , Ġinput Buf ) ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ!= Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpop Item Width () Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( value Changed ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠBuild () ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Changed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpass Filter ( text : ĠString , Ġtext End : ĠInt Ġ= Ġ 0 ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( filters . isEmpty ()) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġfilters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . isEmpty ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f [ 0 ] Ġ== Ġ'-') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSubtract ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . contains ( f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( text . contains ( f )) ĠĠ Ġ// ĠG rep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠImp licit Ġ* Ġgrep ĊĠĠĠĠĠĠĠ Ġreturn Ġcount G rep Ġ== Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠText Buffer Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠHelper : ĠSimple ĠKey -> value Ġstorage Ċ Typ ically Ġyou Ġdon 't Ġhave Ġto Ġworry Ġabout Ġthis Ġsince Ġa Ġstorage Ġis Ġheld Ġwithin Ġeach ĠWindow . Ċ We Ġuse Ġit Ġto Ġe . g . Ġstore Ġcollapse Ġstate Ġfor Ġa Ġtree Ġ( Int Ġ 0 / 1 ), Ġstore Ġcolor Ġedit Ġoptions . Ċ You Ġcan Ġuse Ġit Ġas Ġcustom Ġuser Ġstorage Ġfor Ġtemporary Ġvalues . Ċ Declare Ġyour Ġown Ġstorage Ġif : Ċ - ĠYou Ġwant Ġto Ġmanipulate Ġthe Ġopen / close Ġstate Ġof Ġa Ġparticular Ġsub - tree Ġin Ġyour Ġinterface Ġ( tree Ġnode Ġuses ĠInt Ġ 0 / 1 Ċ to Ġstore Ġtheir Ġstate ). Ċ - ĠYou Ġwant Ġto Ġstore Ġcustom Ġdebug Ġdata Ġeasily Ġwithout Ġadding Ġor Ġediting Ġstructures Ġin Ġyour Ġcode . Ċ Types Ġare ĠNOT Ġstored , Ġso Ġit Ġis Ġup Ġto Ġyou Ġto Ġmake Ġsure Ġyour ĠKey Ġdon 't Ġcol lide Ġwith Ġdifferent Ġtypes . Ġ Ġ*/ Ċ class ĠStorage Ġ{ ĊĊĠĠĠ Ġval Ġdata Ġ= ĠHashMap < Int , ĠInt >() ĊĊĠĠĠ Ġ// Ġ- ĠGet *** () Ġfunctions Ġfind Ġpair , Ġnever Ġadd / allocate . ĠPair s Ġare Ġsorted Ġso Ġa Ġquery Ġis ĠO ( log ĠN ) ĊĠĠĠ Ġ// Ġ- ĠSet *** () Ġfunctions Ġfind Ġpair , Ġinsertion Ġon Ġdemand Ġif Ġmissing . ĊĠĠĠ Ġ// Ġ- ĠSorted Ġinsertion Ġis Ġcost ly , Ġpaid Ġonce . ĠA Ġtypical Ġframe Ġshouldn 't Ġneed Ġto Ġinsert Ġany Ġnew Ġpair . ĊĊĠĠĠ Ġfun Ġclear () Ġ= Ġdata . clear () ĊĊĠĠĠ Ġfun Ġint ( key : ĠInt , Ġdefault Val : ĠInt Ġ= Ġ 0 ): ĠInt Ġ= Ġdata [ key ] Ġ?: Ġdefault Val Ġ// ĠTODO Ġrename Ġback ĊĊĠĠĠ Ġoperator Ġfun Ġset ( key : ĠInt , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ key ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbool ( key : ĠInt , Ġdefault Val : ĠBoolean Ġ= Ġfalse ) Ġ= Ġdata [ key ]?. bool Ġ?: Ġdefault Val ĊĠĠĠ Ġoperator Ġfun Ġset ( id : ĠInt , Ġvalue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ id ] Ġ= Ġvalue . i ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfloat ( key : ĠInt , Ġdefault Val : ĠFloat Ġ= Ġ 0 f ) Ġ= Ġdata [ key ]?. let Ġ{ Ġglm . int Bits To Float ( it ) Ġ} Ġ?: Ġdefault Val ĊĠĠĠ Ġoperator Ġfun Ġset ( key : ĠInt , Ġvalue : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ key ] Ġ= Ġglm . float Bits ToInt ( value ) ĊĠĠĠ Ġ} Ċ // ĠĠĠ ĠIM GUI _ API Ġvoid * ĠĠĠĠ ĠGet Void Ptr ( ImGui ID Ġkey ) Ġconst ; Ġ// Ġdefault _ val Ġis ĠNULL Ċ // ĠĠĠ ĠIM GUI _ API Ġvoid ĠĠĠĠĠ ĠSet Void Ptr ( ImGui ID Ġkey , Ġvoid * Ġval ); ĊĊĠĠĠ Ġ// Ġ- ĠGet *** Ref () Ġfunctions Ġfinds Ġpair , Ġinsert Ġon Ġdemand Ġif Ġmissing , Ġreturn Ġpointer . ĠUseful Ġif Ġyou Ġintend Ġto Ġdo ĠGet + Set . ĊĠĠĠ Ġ// Ġ- ĠReferences Ġare Ġonly Ġvalid Ġuntil Ġa Ġnew Ġvalue Ġis Ġadded Ġto Ġthe Ġstorage . ĠCalling Ġa ĠSet *** () Ġfunction Ġor Ġa ĠGet *** Ref () Ġfunction Ġinvalid ates Ġthe Ġpointer . ĊĠĠĠ Ġ// Ġ- ĠA Ġtypical Ġuse Ġcase Ġwhere Ġthis Ġis Ġconvenient Ġfor Ġquick Ġhack ing Ġ( e . g . Ġadd Ġstorage Ġduring Ġa Ġlive ĠEdit & Continue Ġsession Ġif Ġyou Ġcan 't Ġmodify Ġexisting Ġstruct ) ĊĠĠĠ Ġ// ĠĠĠĠĠ Ġfloat * Ġp var Ġ= ĠImGui :: Get Float Ref ( key ); ĠImGui :: Slider Float (" var ", Ġp var , Ġ 0 , Ġ 1 0 0 . 0 f ); Ġsome _ var Ġ+= Ġ* p var ; Ċ // ĠĠĠ ĠIM GUI _ API Ġint * ĠĠĠĠĠ ĠGet Int Ref ( ImGui ID Ġkey , Ġint Ġdefault _ val Ġ= Ġ 0 ); Ċ // ĠĠĠ ĠIM GUI _ API Ġbool * ĠĠĠĠ ĠGet Bool Ref ( ImGui ID Ġkey , Ġbool Ġdefault _ val Ġ= Ġfalse ); Ċ // ĠĠĠ ĠIM GUI _ API Ġfloat * ĠĠĠ ĠGet Float Ref ( ImGui ID Ġkey , Ġfloat Ġdefault _ val Ġ= Ġ 0 . 0 f ); Ċ // ĠĠĠ ĠIM GUI _ API Ġvoid ** ĠĠĠ ĠGet Void Ptr Ref ( ImGui ID Ġkey , Ġvoid * Ġdefault _ val Ġ= ĠNULL ); ĊĊĠĠĠ Ġ/** ĠUse Ġon Ġyour Ġown Ġstorage Ġif Ġyou Ġknow Ġonly Ġinteger Ġare Ġbeing Ġstored Ġ( open / close Ġall Ġtree Ġnodes ) ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset All Int ( value : ĠInt ) Ġ= Ġdata . replaceAll Ġ{ Ġ_, Ġ_ Ġ-> Ġvalue Ġ} Ċ } Ċ Ċ class ĠText Edit Callback Data Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSize Callback Data ( ĊĠĠĠĠĠĠĠ Ġ/** ĠRead - only . ĠĠ ĠWhat Ġuser Ġpassed Ġto ĠSet Next Window Size Constraints () Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar ĠuserData : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ/** ĠRead - only . ĠĠ ĠWindow Ġposition , Ġfor Ġreference . ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġpos : ĠVec 2 Ġ= ĠVec 2 (), ĊĠĠĠĠĠĠĠ Ġ/** ĠRead - only . ĠĠ ĠCurrent Ġwindow Ġsize . ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Size : ĠVec 2 Ġ= ĠVec 2 (), ĊĠĠĠĠĠĠĠ Ġ/** ĠRead - write . Ġ ĠDes ired Ġsize , Ġbased Ġon Ġuser 's Ġmouse Ġposition . ĠWrite Ġto Ġthis Ġfield Ġto Ġre str ain Ġres izing . ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġdesired Size : ĠVec 2 Ġ= ĠVec 2 ()) Ċ Ċ /** ĠData Ġpayload Ġfor ĠDrag Ġand ĠDrop Ġoperations Ġ*/ Ċ class ĠPayload Ġ{ ĊĠĠĠ Ġ// ĠMembers ĊĊĠĠĠ Ġ/** ĠData Ġ( copied Ġand Ġowned Ġby Ġde ar Ġimg ui ) Ġ*/ ĊĠĠĠ Ġvar Ġdata : ĠAny ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĠData Ġsize Ġ*/ ĊĠĠĠ Ġvar Ġdata Size Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġ[ Internal ] ĊĊĠĠĠ Ġ/** ĠSource Ġitem Ġid Ġ*/ ĊĠĠĠ Ġvar Ġsource Id Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠSource Ġparent Ġid Ġ( if Ġavailable ) Ġ*/ ĊĠĠĠ Ġvar Ġsource Parent Id Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠData Ġtimestamp Ġ*/ ĊĠĠĠ Ġvar Ġdata Frame Count Ġ= Ġ- 1 ĊĠĠĠ Ġ/** ĠData Ġtype Ġtag Ġ( short Ġuser - supp lied Ġstring , Ġ 1 2 Ġcharacters Ġmax ) Ġ*/ ĊĠĠĠ Ġvar ĠdataType Ġ= Ġ"" ĊĠĠĠ Ġ/** ĠSet Ġwhen ĠAccept Drag Drop Payload () Ġwas Ġcalled Ġand Ġmouse Ġhas Ġbeen Ġhover ing Ġthe Ġtarget Ġitem Ġ( nb : Ġhandle Ġoverlapping Ġdrag Ġtargets ) Ġ*/ ĊĠĠĠ Ġvar Ġpreview Ġ= Ġfalse ĊĠĠĠ Ġ/** ĠSet Ġwhen ĠAccept Drag Drop Payload () Ġwas Ġcalled Ġand Ġmouse Ġbutton Ġis Ġreleased Ġover Ġthe Ġtarget Ġitem . Ġ*/ ĊĠĠĠ Ġvar Ġdelivery Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġsource Parent Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġsource Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdata Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠdataType Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġdata Frame Count Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġdelivery Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpreview Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis DataType ( type : ĠString ) Ġ= Ġdata Frame Count Ġ!= Ġ- 1 Ġ&& Ġtype Ġ== ĠdataType Ċ } Ċ Ċ class ĠColor Ġ{ ĊĊĠĠĠ Ġval Ġvalue Ġ= ĠVec 4 () ĊĊĠĠĠ Ġconstructor ( r : ĠInt , Ġg : ĠInt , Ġb : ĠInt , Ġa : ĠInt Ġ= Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsc Ġ= Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġvalue . x Ġ= Ġr Ġ* Ġsc ĊĠĠĠĠĠĠĠ Ġvalue . y Ġ= Ġg Ġ* Ġsc ĊĠĠĠĠĠĠĠ Ġvalue . z Ġ= Ġb Ġ* Ġsc ĊĠĠĠĠĠĠĠ Ġvalue . w Ġ= Ġa Ġ* Ġsc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( rgba : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsc Ġ= Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġvalue . x Ġ= Ġ(( rgba Ġ ush r ĠCOL 3 2 _ R _ SHIFT ) Ġand Ġ 0 xFF ) Ġ* Ġsc ĊĠĠĠĠĠĠĠ Ġvalue . y Ġ= Ġ(( rgba Ġ ush r ĠCOL 3 2 _ G _ SHIFT ) Ġand Ġ 0 xFF ) Ġ* Ġsc ĊĠĠĠĠĠĠĠ Ġvalue . z Ġ= Ġ(( rgba Ġ ush r ĠCOL 3 2 _ B _ SHIFT ) Ġand Ġ 0 xFF ) Ġ* Ġsc ĊĠĠĠĠĠĠĠ Ġvalue . w Ġ= Ġ(( rgba Ġ ush r ĠCOL 3 2 _ A _ SHIFT ) Ġand Ġ 0 xFF ) Ġ* Ġsc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( r : ĠFloat , Ġg : ĠFloat , Ġb : ĠFloat , Ġa : ĠFloat Ġ= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . x Ġ= Ġr ĊĠĠĠĠĠĠĠ Ġvalue . y Ġ= Ġg ĊĠĠĠĠĠĠĠ Ġvalue . z Ġ= Ġb ĊĠĠĠĠĠĠĠ Ġvalue . w Ġ= Ġa ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( col : ĠVec 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġput Ġcol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġh sv ( h : ĠFloat , Ġs : ĠFloat , Ġv : ĠFloat , Ġa : ĠFloat Ġ= Ġ 1 f ): ĠVec 4 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( r , Ġg , Ġb ) Ġ= Ġcolor Convert H SV to RGB ( h , Ġs , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠColor ( r , Ġg , Ġb , Ġa ). value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠHelper : ĠMan ually Ġclip Ġlarge Ġlist Ġof Ġitems . Ċ Ġ* Ġ ĠIf Ġyou Ġare Ġsubmitting Ġlots Ġof Ġeven ly Ġsp aced Ġitems Ġand Ġyou Ġhave Ġa Ġrandom Ġaccess Ġto Ġthe Ġlist , Ġyou Ġcan Ġperform Ġco arse Ċ Ġ* Ġ Ġclipping Ġbased Ġon Ġvisibility Ġto Ġsave Ġyourself Ġfrom Ġprocessing Ġthose Ġitems Ġat Ġall . Ċ Ġ* Ġ ĠThe Ġclip per Ġcalculates Ġthe Ġrange Ġof Ġvisible Ġitems Ġand Ġadvance Ġthe Ġcursor Ġto Ġcomp ens ate Ġfor Ġthe Ġnon - visible Ġitems Ġwe Ċ Ġ* Ġ Ġhave Ġskipped . Ċ Ġ* Ġ ĠImGui Ġalready Ġclip Ġitems Ġbased Ġon Ġtheir Ġbounds Ġbut Ġit Ġneeds Ġto Ġmeasure Ġtext Ġsize Ġto Ġdo Ġso . ĠCo arse Ġclipping Ġbefore Ċ Ġ* Ġ Ġsubmission Ġmakes Ġthis Ġcost Ġand Ġyour Ġown Ġdata Ġfetching / submission Ġcost Ġnull . Ċ Ġ* Ġ ĠUsage : Ċ Ġ* ĠĠĠĠĠ ĠImGui List Clip per Ġclip per ( 1 0 0 0 ); Ġ Ġ// Ġwe Ġhave Ġ 1 0 0 0 Ġelements , Ġeven ly Ġsp aced . Ċ Ġ* ĠĠĠĠĠ Ġwhile Ġ( clip per . Step ()) Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġfor Ġ( int Ġi Ġ= Ġclip per . Display Start ; Ġi Ġ< Ġclip per . Display End ; Ġi ++) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImGui :: Text (" line Ġnumber Ġ% d ", Ġi ); Ċ Ġ* Ġ Ġ- ĠStep Ġ 0 : Ġthe Ġclip per Ġlet Ġyou Ġprocess Ġthe Ġfirst Ġelement , Ġregardless Ġof Ġit Ġbeing Ġvisible Ġor Ġnot , Ġso Ġwe Ġcan Ġmeasure Ċ Ġ* ĠĠĠĠĠ Ġthe Ġelement Ġheight Ġ( step Ġskipped Ġif Ġwe Ġpassed Ġa Ġknown Ġheight Ġas Ġsecond Ġarg Ġto Ġconstructor ). Ċ Ġ* Ġ Ġ- ĠStep Ġ 1 : Ġthe Ġclip per Ġinfer Ġheight Ġfrom Ġfirst Ġelement , Ġcalculate Ġthe Ġactual Ġrange Ġof Ġelements Ġto Ġdisplay , Ġand Ċ Ġ* ĠĠĠĠĠ Ġposition Ġthe Ġcursor Ġbefore Ġthe Ġfirst Ġelement . Ċ Ġ* Ġ Ġ- Ġ( Step Ġ 2 : Ġdummy Ġstep Ġonly Ġrequired Ġif Ġan Ġexplicit Ġitems _ height Ġwas Ġpassed Ġto Ġconstructor Ġor ĠBegin () Ġand Ġuser Ġcall Ċ Ġ* ĠĠĠĠĠ ĠStep (). ĠDoes Ġnothing Ġand Ġswitch Ġto ĠStep Ġ 3 .) Ċ Ġ* Ġ Ġ- ĠStep Ġ 3 : Ġthe Ġclip per Ġvalidate Ġthat Ġwe Ġhave Ġreached Ġthe Ġexpected ĠY Ġposition Ġ( corre sponding Ġto Ġelement ĠDisplay End ), Ċ Ġ* ĠĠĠĠĠ Ġadvance Ġthe Ġcursor Ġto Ġthe Ġend Ġof Ġthe Ġlist Ġand Ġthen Ġreturns Ġ' false ' Ġto Ġend Ġthe Ġloop . Ġ*/ Ċ class ĠList Clip per Ċ /** Ġ@ param Ġitems Count : Ġ ĠUse Ġ- 1 Ġto Ġignore Ġ( you Ġcan Ġcall Ġbegin () Ġlater ). ĠUse ĠInt . MAX _ VALUE Ġif Ġyou Ġdon 't Ġknow Ġhow Ġmany Ċ Ġ* Ġ Ġitems Ġyou Ġhave Ġ( in Ġwhich Ġcase Ġthe Ġcursor Ġwon 't Ġbe Ġadvanced Ġin Ġthe Ġfinal Ġstep ). Ċ Ġ* Ġ Ġ@ param Ġitems Height : ĠUse Ġ- 1 f Ġto Ġbe Ġcalculated Ġautomatically Ġon Ġfirst Ġstep . ĠOtherwise Ġpass Ġin Ġthe Ġdistance Ċ Ġ* Ġ Ġbetween Ġyour Ġitems , Ġtypically Ġtext Line Height With Spacing Ġor Ġframe Height With Spacing . Ċ Ġ* Ġ ĠIf Ġyou Ġdon 't Ġspecify Ġan Ġitems _ height , Ġyou ĠNE ED Ġto Ġcall Ġstep (). ĠIf Ġyou Ġspecify Ġitems Height Ġyou Ġmay Ġcall Ġthe Ġold Ċ Ġ* Ġ Ġbegin ()/ end () Ġapi Ġdirectly , Ġbut Ġprefer Ġcalling Ġstep (). ĠĠ Ġ*/ Ċ constructor ( items Count : ĠInt Ġ= Ġ- 1 , Ġitems Height : ĠFloat Ġ= Ġ- 1 f ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĠNB : ĠBegin () Ġinitialize Ġevery Ġfields Ġ( as Ġwe Ġallow Ġuser Ġto Ġcall ĠBegin / End Ġmultiple Ġtimes Ġon Ġa Ġsame Ġinstance Ġif ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthey Ġwant ). ĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġbegin ( items Count , Ġitems Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġstart Pos Y Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġitems Height Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġitems Count Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġstep No Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġdisplay Ġ= Ġ 0 .. 0 ĊĊĠĠĠ Ġ/** ĠCall Ġuntil Ġit Ġreturns Ġfalse . ĠThe ĠDisplay Start / Display End Ġfields Ġwill Ġbe Ġset Ġand Ġyou Ġcan Ġprocess / draw Ġthose ĊĠĠĠĠ Ġ* Ġ Ġitems . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġstep () Ġ= Ġwhen Ġ{ ĊĊĠĠĠĠĠĠĠ Ġitems Count Ġ== Ġ 0 Ġ|| Ġcurrent Window Read !!. skip Items Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Count Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/* Ġ ĠStep Ġ 0 : Ġthe Ġclip per Ġlet Ġyou Ġprocess Ġthe Ġfirst Ġelement , Ġregardless Ġof Ġit Ġbeing Ġvisible Ġor Ġnot , Ġso Ġwe Ġcan Ġmeasure ĊĠĠĠĠĠĠĠ Ġthe Ġelement Ġheight . ĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġstep No Ġ== Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Ġ= Ġ 0 .. 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Pos Y Ġ= Ġcursor Pos Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep No Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/* Ġ ĠStep Ġ 1 : Ġthe Ġclip per Ġinfer Ġheight Ġfrom Ġfirst Ġelement , Ġcalculate Ġthe Ġactual Ġrange Ġof Ġelements Ġto Ġdisplay , Ġand ĊĠĠĠĠĠĠĠ Ġposition Ġthe Ġcursor Ġbefore Ġthe Ġfirst Ġelement . ĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġstep No Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Count Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Height Ġ= Ġcursor Pos Y Ġ- Ġstart Pos Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( items Height Ġ> Ġ 0 f ) ĠĠ Ġ// ĠIf Ġthis Ġtriggers , Ġit Ġmeans ĠItem Ġ 0 Ġhasn 't Ġmoved Ġthe Ġcursor Ġvert ically ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin ( items Count Ġ- Ġ 1 , Ġitems Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Ġ= Ġdisplay . start Ġ+ Ġ 1 .. display . last Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep No Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/* Ġ ĠStep Ġ 2 : Ġdummy Ġstep Ġonly Ġrequired Ġif Ġan Ġexplicit Ġitems _ height Ġwas Ġpassed Ġto Ġconstructor Ġor ĠBegin () Ġand Ġuser Ġstill ĊĠĠĠĠĠĠĠ Ġcall ĠStep (). ĠDoes Ġnothing Ġand Ġswitch Ġto ĠStep Ġ 3 . ĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġstep No Ġ== Ġ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( display . start Ġ>= Ġ 0 Ġ&& Ġdisplay . last Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep No Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠStep Ġ 3 : Ġthe Ġclip per Ġvalidate Ġthat Ġwe Ġhave Ġreached Ġthe Ġexpected ĠY Ġposition Ġ( corre sponding Ġto Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisplay End ), Ġadvance Ġthe Ġcursor Ġto Ġthe Ġend Ġof Ġthe Ġlist Ġand Ġthen Ġreturns Ġ' false ' Ġto Ġend Ġthe Ġloop . ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step No Ġ== Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAutomatically Ġcalled Ġby Ġconstructor Ġif Ġyou Ġpassed Ġ' items _ count ' Ġor Ġby ĠStep () Ġin ĠStep Ġ 1 . ĊĠĠĠĠ Ġ* Ġ ĠUse Ġcase ĠA : ĠBegin () Ġcalled Ġfrom Ġconstructor Ġwith Ġitems _ height < 0 , Ġthen Ġcalled Ġagain Ġfrom ĠSync () Ġin ĠStep No Ġ 1 ĊĠĠĠĠ Ġ* Ġ ĠUse Ġcase ĠB : ĠBegin () Ġcalled Ġfrom Ġconstructor Ġwith Ġitems _ height > 0 ĊĠĠĠĠ Ġ* Ġ ĠFIXME - LEG ACY : ĠIde ally Ġwe Ġshould Ġremove Ġthe ĠBegin / End Ġfunctions Ġbut Ġthey Ġare Ġpart Ġof Ġthe Ġlegacy ĠAPI Ġwe Ġstill ĊĠĠĠĠ Ġ* Ġ Ġsupport . ĠThis Ġis Ġwhy Ġsome Ġof Ġthe Ġcode Ġin ĠStep () Ġcalling ĠBegin () Ġand Ġre assign Ġsome Ġfields , Ġsp ag he tti Ġstyle . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbegin ( items Count : ĠInt , Ġitems Height : ĠFloat Ġ= Ġ- 1 f ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġstart Pos Y Ġ= Ġcursor Pos Y ĊĠĠĠĠĠĠĠ Ġthis . items Height Ġ= Ġitems Height ĊĠĠĠĠĠĠĠ Ġthis . items Count Ġ= Ġitems Count ĊĠĠĠĠĠĠĠ Ġstep No Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdisplay Ġ= Ġ- 1 .. - 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( items Height Ġ> Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Ġ= Ġcalc List Cli pping ( items Count , Ġitems Height ) Ġ// Ġcalculate Ġhow Ġmany Ġto Ġclip / display ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( display . start Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Cursor Pos Y And Setup Dummy Prev Line ( start Pos Y Ġ+ Ġdisplay . start Ġ* Ġitems Height , Ġitems Height ) Ġ// Ġadvance Ġcursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep No Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAutomatically Ġcalled Ġon Ġthe Ġlast Ġcall Ġof ĠStep () Ġthat Ġreturns Ġfalse . Ġ*/ ĊĠĠĠ Ġfun Ġend () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( items Count Ġ< Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠIn Ġtheory Ġhere Ġwe Ġshould Ġassert Ġthat ĠImGui :: Get Cursor Pos Y () Ġ== ĠStart Pos Y Ġ+ ĠDisplay End Ġ* ĠItems Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbut Ġit Ġfeels Ġsan er Ġto Ġjust Ġseek Ġat Ġthe Ġend Ġand Ġnot Ġassert / crash Ġthe Ġuser . ĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( items Count Ġ< ĠInt . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Cursor Pos Y And Setup Dummy Prev Line ( start Pos Y Ġ+ Ġitems Count Ġ* Ġitems Height , Ġitems Height ) Ġ// Ġadvance Ġcursor ĊĠĠĠĠĠĠĠ Ġitems Count Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġstep No Ġ= Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Cursor Pos Y And Setup Dummy Prev Line ( pos Y : ĠFloat , Ġline Height : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠSet Ġcursor Ġposition Ġand Ġa Ġfew Ġother Ġthings Ġso Ġthat ĠSet Scroll Here () Ġand ĠColumns () Ġcan Ġwork Ġwhen Ġsee king ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFIXME : ĠIt Ġis Ġproblematic Ġthat Ġwe Ġhave Ġto Ġdo Ġthat Ġhere , Ġbecause Ġcustom / e quivalent Ġend - user Ġcode Ġwould Ġst umble ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġthe Ġsame Ġissue . ĠConsider Ġmoving Ġwithin ĠSet Cursor XXX Ġfunctions ? ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Pos Y Ġ= Ġpos Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= Ġcurrent Window ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( window . dc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetting Ġthose Ġfields Ġso Ġthat ĠSet Scroll Here () Ġcan Ġproperly Ġfunction Ġafter Ġthe Ġend Ġof Ġour Ġclip per Ġusage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Pos Prev Line . y Ġ= Ġcursor Pos . y Ġ- Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠIf Ġwe Ġend Ġup Ġneeding Ġmore Ġaccurate Ġdata Ġ( to Ġe . g . Ġuse ĠSame Line ) Ġwe Ġmay Ġas Ġwell Ġmake Ġthe Ġclip per Ġhave Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfourth Ġstep Ġto Ġlet Ġuser Ġprocess Ġand Ġdisplay Ġthe Ġlast Ġitem Ġin Ġtheir Ġlist . ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Line Height Ġ= Ġline Height Ġ- Ġstyle . item Spacing . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns Set ?. cell Min Y Ġ= Ġwindow . dc . cursor Pos . y Ġ// ĠSetting Ġthis Ġso Ġthat Ġcell ĠY Ġposition Ġare Ġset Ġproperly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }