/* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠDe fl ated Pick le Ġunder Ġthe ĠMIT Ġlicense Ġ*/ Ċ Ċ package Ġcom . def lated pickle . raw ky . util Ċ Ċ import Ġcom . def lated pickle . raw ky . component . Action History Ċ import Ġcom . def lated pickle . raw ky . component . Pixel Grid Ċ import Ġjava . awt . Graphics 2 D Ċ Ċ class ĠAction Stack Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpush ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . current Widget . action Stack . push ( action ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . refresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġundo () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Action History . current Widget . action Stack . undo ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġredo () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Action History . current Widget . action Stack . redo ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpop ( index : ĠInt ): ĠAction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . list Model . remove ( index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop Ġ= ĠAction History . current Widget . action Stack . pop ( index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . list . selectedIndex Ġ= ĠAction History . list Model . size () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction History . refresh () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpop ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġundo Queue : ĠMutable List < Action > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠAction History . current Widget . action Stack . undo Queue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠAction ( val Ġname : ĠString , Ġvar Ġcan Merge : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġcheck Ġto Ġsee Ġif Ġthe Ġaction Ġshould Ġhappen ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġcheck (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġmouse Down () Ġ{} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPer formed Ġon Ġredo ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġperform () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPer formed Ġon Ġundo ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġcleanup () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDraw s Ġan Ġoutline Ġaround Ġthis Ġaction ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġoutline ( g 2 D : ĠGraphics 2 D ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMulti Action ( name : ĠString ) Ġ: ĠAction ( name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġmutable ListOf < Action >() ĊĠĠĠĠĠĠĠ Ġvar Ġactive Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġperform () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġthis . stack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . perform () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġthis . stack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . cleanup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġoutline ( g 2 D : ĠGraphics 2 D ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġthis . stack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . outline ( g 2 D ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġundo Queue Ġ= Ġmutable ListOf < Action >() ĊĠĠĠ Ġval Ġredo Queue Ġ= Ġmutable ListOf < Action >() ĊĊĠĠĠ Ġfun Ġpush ( it : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( redo Queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredo Queue . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit . perform () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( undo Queue . isNotEmpty () Ġ&& Ġundo Queue . last () Ġis ĠMulti Action Ġ&& Ġ( undo Queue . last () Ġas ĠMulti Action ). active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( undo Queue . last () Ġas ĠMulti Action ). stack . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġundo Queue . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( undo Queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredo Queue . add ( undo Queue . last (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġundo Queue . remove ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPixel Grid . rep aint With Children () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġundo Queue . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġredo (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( redo Queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġundo Queue . add ( redo Queue . last (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredo Queue . remove ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPixel Grid . rep aint With Children () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġredo Queue . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpop ( index : ĠInt ): ĠAction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġundo Queue . elementAt ( index ) ĊĠĠĠĠĠĠĠ Ġundo Queue . remove ( item ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġitem ĊĠĠĠ Ġ} Ċ } Ċ