View discussion [11 posts] | View script | License |
Download script | History | Other scripts by: luce80 |
30-Apr 18:53 UTC
[0.06] 15.522k
[0.06] 15.522k
Archive version of: simple-vid-resizing.r ... version: 1 ... luce80 15-Aug-2013Amendment note: new script || Publicly available? Yes REBOL [ Title: "Simplified VID resizing" Date: 15-08-2013 Version: 1.0.0 File: %simple-vid-resizing.r Author: "Marco Antoniazzi" Rights: "Copyright (C) 2013 Marco Antoniazzi" Purpose: "Helps create resizing VID guis" eMail: [luce80 AT libero DOT it] History: [ 1.0.0 [15-08-2013 "First version"] ] Help: { I have noticed that in many of my resizable guis there are only a few widgets that move or change size when the window is resized and they move or change size only to "follow" the window borders. In this situations the resizing algorithm is very simple and so I have created this "patch" to let you create resizable guis in a very simple way. Use the words: move-x, move-y, move-xy, resize-x, resize-y, resize-xy in a layout block to let a widget movement or dimensioning "follow" the window borders. Use: resize [<offset/x> <offset/y> <size/x> <size/y>] to set multiple values. Note that you can use any number inside the block } Category: [util vid view] library: [ level: 'intermediate platform: 'all type: 'how-to domain: [gui vid] tested-under: [View 2.7.8.3.1] support: none license: 'BSD see-also: none ] comment: "2-Sep-2012 GUI automatically generated by VID_build. Author: Marco Antoniazzi" ] resizer-ctx: context [ set 'view func [ "Displays a window face." view-face [object!] /new "Creates a new window and returns immediately" /offset xy [pair!] "Offset of window on screen" /options opts [block! word!] "Window options [no-title no-border resize]" /title text [string!] "Window bar title" /local scr-face ][ scr-face: system/view/screen-face ; reduces path overhead if find scr-face/pane view-face [return view-face] ; should bring to top !!! either any [new empty? scr-face/pane][ view-face/text: any [ view-face/text all [system/script/header system/script/title] copy "" ] new: all [not new empty? scr-face/pane] append scr-face/pane view-face ][change scr-face/pane view-face] ; Use window-feel, not default feel, unless the user ; has set their own feel (keep user's feel) if all [ system/view/vid view-face/feel = system/view/vid/vid-face/feel ][ view-face/feel: system/view/window-feel ] if offset [view-face/offset: xy] if options [view-face/options: opts] if title [view-face/text: text] ;;;;;;;;;;;; patch view-face/user-data: reduce ['size view-face/size] ;;;;;;;;;;;; show scr-face ;show view-face if new [do-events] view-face ] ; resize-deep: func [face [object!] siz [pair!]] [ either block? get in face 'pane [ foreach face face/pane [resize-deep face siz] ][ if attempt [face/feel/resizer][ face/offset: face/offset + as-pair (siz/x * face/feel/resizer/1) (siz/y * face/feel/resizer/2) either in face 'resize [ face/resize face/size + as-pair (siz/x * face/feel/resizer/3) (siz/y * face/feel/resizer/4) ][ face/size: face/size + as-pair (siz/x * face/feel/resizer/3) (siz/y * face/feel/resizer/4) ] ] ] ] ; insert-event-func func [face event /local siz][ if event/type = 'resize [ face: event/face siz: face/size - face/user-data/size ; compute size difference face/user-data/size: face/size ; store new size resize-deep face siz show face ] event ] ; VID new facets insert tail svv/facet-words reduce [ 'move-x 'move-y 'move-xy 'resize-x 'resize-y 'resize-xy func [new args][ if none? new/feel [new/feel: make face/feel [resizer: copy [0 0 0 0]]] if not in new/feel 'resizer [new/feel: make new/feel [resizer: copy [0 0 0 0]]] case/all [ 'move-x = first args [new/feel/resizer/1: 1] 'move-y = first args [new/feel/resizer/2: 1] 'move-xy = first args [new/feel/resizer/1: 1 new/feel/resizer/2: 1] 'resize-x = first args [new/feel/resizer/3: 1] 'resize-y = first args [new/feel/resizer/4: 1] 'resize-xy = first args [new/feel/resizer/3: 1 new/feel/resizer/4: 1] ] args ] 'resize func [new args][ if none? new/feel [new/feel: make face/feel [resizer: none]] if not in new/feel 'resizer [new/feel: make new/feel [resizer: none]] new/feel/resizer: copy second args next args ] ] ] do ; just comment this line to avoid executing examples [ req-win: layout [ do [sp: 4x4] origin sp space sp Across style text text black feel none style btn btn 24x24 btn "<" btn ">" btn "^^" field 365 resize-x pad (sp * -1x0) arrow down white 24x24 move-x btn "+" 252.223.44 move-x return text-list 500x200 resize-xy return field 336 resize [0 1 1 0] pad 0x2 text "Filter:" move-xy pad 0x-2 choice "All files (*.*)" "Rebol files (*.r)" 120 move-xy return pad 0x10 check-line "Show hidden files" move-y pad 172x0 btn "Select" 100 resize [0 1 .5 0] btn "Cancel" 100 resize [.5 1 .5 0] #"^(esc)" [unview] ] view/options req-win 'resize ; A final note: this patch gives the opportunity to think about an other kind of sizing behaviour for guis. ; Normally in complex gui frameworks the widgets have: min-size, def-size, max-size and sometimes even ; hard-min-size and hard-max-size. These covers almost 100% of situations. ; But we could have a different situation (that I already use in many of my scripts) ; You build the gui in its minimum size, then you open the window in some default size (there is not a max size). ; This, with a resizing algorithm as the one presented here, covers 80% of situations. ] Notes
|