| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | ! Copyright (C) 2009 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  | USING: sequences kernel accessors math math.vectors | 
					
						
							| 
									
										
										
										
											2009-09-08 17:23:02 -04:00
										 |  |  | math.rectangles math.order arrays locals fry | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  | combinators.short-circuit ;
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | IN: math.rectangles.positioning | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Some geometry code for positioning popups and menus | 
					
						
							|  |  |  | ! in a semi-intelligent manner | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-08 17:23:02 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : adjust-visible-rect ( visible-rect popup-dim screen-dim -- visible-rect' )
 | 
					
						
							|  |  |  |     [ drop clone ] dip '[ _ vmin ] change-loc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | : popup-x ( visible-rect popup-dim screen-dim -- x )
 | 
					
						
							| 
									
										
										
										
											2009-02-13 20:16:37 -05:00
										 |  |  |     [ loc>> first ] 2dip swap [ first ] bi@ - min 0 max ;
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : preferred-y ( visible-rect -- y )
 | 
					
						
							| 
									
										
										
										
											2011-10-15 22:19:44 -04:00
										 |  |  |     rect-bounds [ second ] bi@ + ;
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : alternate-y ( visible-rect popup-dim -- y )
 | 
					
						
							|  |  |  |     [ loc>> ] dip [ second ] bi@ - ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  | : preferred-fit? ( visible-rect popup-dim screen-dim -- ? )
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  |     [ [ preferred-y ] [ second ] bi* + ] dip second < ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  | : alternate-fit? ( visible-rect popup-dim -- ? )
 | 
					
						
							|  |  |  |     alternate-y 0 >= ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | : popup-y ( visible-rect popup-dim screen-dim -- y )
 | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  |     3dup { [ preferred-fit? not ] [ drop alternate-fit? ] } 3&& | 
					
						
							|  |  |  |     [ drop alternate-y ] [ 2drop preferred-y ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-02-12 22:46:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : popup-loc ( visible-rect popup-dim screen-dim -- loc )
 | 
					
						
							|  |  |  |     [ popup-x ] [ popup-y ] 3bi 2array ;
 | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | :: popup-dim ( loc popup-dim screen-dim -- dim )
 | 
					
						
							|  |  |  |     screen-dim loc v- popup-dim vmin ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-08 17:23:02 -04:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 00:14:47 -05:00
										 |  |  | : popup-rect ( visible-rect popup-dim screen-dim -- rect )
 | 
					
						
							| 
									
										
										
										
											2009-09-08 17:23:02 -04:00
										 |  |  |     [ adjust-visible-rect ] 2keep
 | 
					
						
							| 
									
										
										
										
											2011-10-15 22:19:44 -04:00
										 |  |  |     [ popup-loc dup ] 2keep popup-dim <rect> ;
 |