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 |