VisualDesigner: Bloqueado con la redimensión :S

Chavales, me he quedado frito cuando he llegado al snapping con la redimensión de elementos en el lienzo. Resulta que el snapping (alineación y ajuste) conforme vas moviendo o redimensionando los elementos es más chungo de lo que pensaba. El problema está en que el uso de deltas para movimiento y tamaño es complejísimo. Me explico: si un sistema de snapping se basa en movimientos relativos en vez de absolutos es muy difícil de programar, incluso mentalmente requiere una complejidad adicional bastante dura. ¿Cómo sabríamos si un objeto está junto a otro si solamente sabemos que la posición se ha incrementado en, por ejemplo, 3 píxeles?

Además, la dificultad añadida de tomar un punto de referencia para calcular los desplazamientos (tanto al mover como al redimensionar). Se me daba la situación de que al realizar un snap, la posición se fuerza, con lo que si tomamos como referencia el elemento al que vamos a forzar, la siguiente medida que hagamos será falsa. Para que me entendáis (aunque es chungo), si la posición de entrada real (deseada) es x=7, y=4 y forzamos a que la posición sean múltiplo de 5 para ambas coordenadas, la posición final (efectiva) sería x=5, y=5. Por tanto, si estamos usando la posición efectiva (5, 5), que va a saltos, en vez de la deseada, las medidas también fluctúan bruscamente debido a los saltos. Es decir, deberíamos tener por un lado la medida real intacta de la posición y basándonos en ella, posicionar el objeto.

He terminando decidiendo que todas las transformaciones usarán coordenadas absolutas (bueno, en realidad relativas al padre que contiene al objeto que está siendo modificado). De esta manera, al mover un objeto, la posición inicial queda almacenada durante la operación y se va calculando la final conforme se mueve el ratón.

De esta manera, hacer snapping es mucho más fácil. Creo que podré avanzar un poco más.

Otro tema que me ha tenido muy entretenido ha sido la redimensión. Quería hacerla sin condicionales y al final me ha salido más o menos, ¡pero telita lo que me ha costado! Llegué a plantear el uso de elipses para calcular las posiciones de los puntos de redimensión (los puntos que salen en las esquinas para cambiar el tamaño de los objetos en casi todos los programas de dibujo y diseño).

Así es que voy al lío, que todavía me falta un poquín para que se quede aceptable.

Stay tuned!

Anuncios

Introducing VisualDesigner, my library for developing visual designers in .NET

Hi friends! I’m developing a personal project just for fun. Its goal is to serve as a starting point to make any visual designer with the best user interaction possible. Drag operations, resize, grouping, snapping, copy&paste…

The code is really abstract, decoupled and following the best software engineering principles I know to make it pure Clean Code. In fact, I have made a big effort to include almost all the code in a Portable Class Library (PCL).

For the moment, it supports basic drag (move), resize, multi-selection and SNAPPING!

I hope you go there and try it. I think it’s really interesting. The main application is WPF demo application, but the main functionality is almost totally platform-agnostic.

The project site in GitHub is this: https://github.com/SuperJMN/VisualDesigner

Feel free to collaborate or suggest anything. Maybe we can learn a lot sharing thoughts or even code 🙂

Thanks.