On Wed, 1 May 2002, Titus J. Anderson wrote:
> I was looking through the TODO file for dia and ran across the following:
>
> * If you hold down shift while moving the handle of an 'Element',
> scale while keeping same proportions.
>
> So, I thought I'd try my hand at it.
Excellent! Somebody is actually *reading* that list:)
> It only works for boxes right now, but shouldn't be too difficult to make
> it work for the other basic objects. Here's the patch for v0.88.1 (I'm
> not working with the CVS version at this point.)
Thank you! We may hold off on applying it until the shortly upcoming new
release, as we're trying to stabilize Dia.
[...]
> I don't know that this is the best way to do this, but it does work. The
> basic idea is in addition to the width and height, keep a copy of the
> aspect ratio of an element in the element object. Then, when resizing,
> if the shift key is pressed, call the element_move_handle_aspect function
> rather than element_move_handle. The element_move_handle function
> updates the aspect ratio when it's finished while
> element_move_handle_aspect does not, since it should be the same. That's
> about it. Just have to make sure that the aspect ratio is calculated
> anytime the height or width changes.
Putting the aspect ratio calculation into foo_update_data is probably the
safest way.
> The only real trouble comes when
> the height or width is 0. This is a little tricky and I used some ugly
> hacks to make it work. Oh, I have to keep track of the ratio in the
> element (I guess you could keep it in the box, but then it can't be used
> in other objects) because if an object ever gets a width or height of
> zero, you don't want to recalculate the ratio. Also, if you calculate
> the ratio everytime the move_handle method gets called, if the width goes
> to zero, the aspect ratio does as well, and then weird things start
> happening (I had what looked like 5 unconnected handles stuck to the side
> of the window.)
Here's a slightly alternative approach: Only keep the aspect ratio around
while resizing with ratio fixed. Initialize the aspect ratio to -1, then
if we move with Shift, calculate the aspect ratio. When changing the
coordinates, use the aspect ratio if != -1. When moving stops, reset the
ratio to -1. That should make sure that the aspect ratio is current
without needing changes all over.
-Lars
--
Lars Clausen (http://shasta.cs.uiuc.edu/~lrclause)| Hårdgrim of Numenor
"I do not agree with a word that you say, but I |----------------------------
will defend to the death your right to say it." | Where are we going, and
--Evelyn Beatrice Hall paraphrasing Voltaire | what's with the handbasket?