53 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (c) 2012 Anonymous
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors timers calendar fonts kernel models sequences ui
							 | 
						||
| 
								 | 
							
								ui.gadgets ui.gadgets.labels ui.gestures ;
							 | 
						||
| 
								 | 
							
								FROM: models => change-model ;
							 | 
						||
| 
								 | 
							
								IN: rosetta-code.animation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! http://rosettacode.org/wiki/Animation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Animation is the foundation of a great many parts of graphical
							 | 
						||
| 
								 | 
							
								! user interfaces, including both the fancy effects when things
							 | 
						||
| 
								 | 
							
								! change used in window managers, and of course games. The core of
							 | 
						||
| 
								 | 
							
								! any animation system is a scheme for periodically changing the
							 | 
						||
| 
								 | 
							
								! display while still remaining responsive to the user. This task
							 | 
						||
| 
								 | 
							
								! demonstrates this.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Create a window containing the string "Hello World! " (the
							 | 
						||
| 
								 | 
							
								! trailing space is significant). Make the text appear to be
							 | 
						||
| 
								 | 
							
								! rotating right by periodically removing one letter from the end
							 | 
						||
| 
								 | 
							
								! of the string and attaching it to the front. When the user
							 | 
						||
| 
								 | 
							
								! clicks on the text, it should reverse its direction.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CONSTANT: sentence "Hello World! "
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: animated-label < label-control reversed alarm ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <animated-label> ( model -- <animated-model> )
							 | 
						||
| 
								 | 
							
								    sentence animated-label new-label swap >>model 
							 | 
						||
| 
								 | 
							
								    monospace-font >>font ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: update-string ( str reverse -- str )
							 | 
						||
| 
								 | 
							
								    [ unclip-last prefix ] [ unclip suffix ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: update-model ( model reversed? -- )
							 | 
						||
| 
								 | 
							
								    [ update-string ] curry change-model ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								animated-label
							 | 
						||
| 
								 | 
							
								    H{
							 | 
						||
| 
								 | 
							
								        { T{ button-down } [ [ not ] change-reversed drop ] }
							 | 
						||
| 
								 | 
							
								     } set-gestures
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: animated-label graft*
							 | 
						||
| 
								 | 
							
								  [ [ [ model>> ] [ reversed>> ] bi update-model ] curry 400 milliseconds every ] keep
							 | 
						||
| 
								 | 
							
								  alarm<< ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: animated-label ungraft*
							 | 
						||
| 
								 | 
							
								    alarm>> stop-timer ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: animated-main ( -- )
							 | 
						||
| 
								 | 
							
								   [ sentence <model> <animated-label> "Rosetta" open-window ] with-ui ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MAIN: animated-main
							 |