Keep stack proportions when resizing

Devin Asay devin_asay at byu.edu
Fri Oct 8 16:56:36 EDT 2021


Peter,

I asked this question several years ago and what I gathered is that it’s not easy because window resizing is under the control of the operating system, and LiveCode can’t really override it.

My attempts were not completely satisfactory:

I have a stack that I want to constrain to a 4:3 ratio when resizing, with a minimum stack size of 800 X 600. A search of the archives didn't yield any relevant results.

If I do this (in the resizeStack handler):

 put the topLeft of this stack into tAnchorPnt
 set the height of this stack to (pNewWdth * 3) div 4
 set the topLeft of this stack to tAnchorPnt

it works as long as my drag on the resize gadget has a horizontal component.

Likewise, this works:

 put the topLeft of this stack into tAnchorPnt
 set the width of this stack to (pNewHgt * 4) div 3
 set the topLeft of this stack to tAnchorPnt

as long as there is a vertical component to the drag.

This:

 put the topLeft of this stack into tAnchorPnt
 if pNewWdth <> pOldWdth then
   set the height of this stack to (pNewWdth * 3) div 4
 else
   set the width of this stack to (pNewHgt * 4) div 3
 end if
 set the topLeft of this stack to tAnchorPnt

Just produces bizarre results.

After I posted about it,I did get a few workarounds.

Scott Rossi suggested that you create your own resize handle instead of using the one built-in to the window:

One way to do this is to use a dedicated object for the resizer and to
calculate the new dimensions before resizing the stack.

Execute this in your message box:
go url "http://www.tactilemedia.com/download/constrained.livecode"

This demonstrates one way to do a 4 x 3 ratio stack.  I'm not sure if it's
possible to get the window refresh to completely sync with the location of
the resizer, but maybe this will get you close.

Roger Eller and Berndt Niggeman suggested that you can’t do it in real time, but you could “snap” it to the correct size after resizing:

I am with Roger on this.

here is a little code snippet that does constrain the aspect after resizing

-----------------------------------------------------------
on resizeStack pNewWidth, pNewHeight, pOldWidth, pOldHeight

  -- block repeat loop if you want to have all the changes occur after last
resize, kind of animation
  repeat for each line aMessage in the pendingMessages
     if aMessage contains "adjustRatio" then cancel item 1 of aMessage
  end repeat

  send "adJustRatio pNewWidth, pNewHeight, pOldWidth, pOldHeight" to me in
0 milliseconds
end resizeStack

on adJustRatio pNewWidth, pNewHeight, pOldWidth, pOldHeight
  put round (pNewWidth / 2) into tNewHeight
  put the rect of me into tRect
  put item 2 of tRect + tNewHeight into item 4 of tRect
  set the rect of me to tRect
end adJustRatio
-----------------------------------------------------------


Dunbarx suggested trapping the resizeStack handler, but that doesn’t seem to work just right, probably because the message is sent *after* the resize, not before.

Hope this helps.

- Devin


On Oct 8, 2021, at 1:18 PM, Peter Bogdanoff via use-livecode <use-livecode at lists.runrev.com<mailto:use-livecode at lists.runrev.com>> wrote:

Does anyone have a script to keep a stack’s proportions constant when the user is changing the stack size by dragging the lower right corner? This is a stack with a control containing a video or image. I’ve used the geometry manager for the objects within the stack but the stack itself needs to be shaped correctly.

Peter Bogdanoff
_______________________________________________
use-livecode mailing list
use-livecode at lists.runrev.com<mailto:use-livecode at lists.runrev.com>
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Devin Asay
Director
Office of Digital Humanities
Brigham Young University



More information about the use-livecode mailing list