jueves, 31 de agosto de 2017

Más cambios (y más demoras en ZinjaI)

Hace ya al menos tres semanas que estoy "a punto de" publicar una nueva versión. Pero como últimamente cada vez que cambio algo refactorizo una buena parte para arreglar o esconder errores del pasado, siempre termino con mucho código nuevo por probar y un ZinjaI inestable. Entonces se demora la release, pero durante la demora agrego algo más, y se hace un círculo vicioso. Finalmente, decidí cortar. Falta testing, pero [creo que] no voy a agregar nada más. Hoy les cuento qué hay de nuevo y qué queda para después.

Las novedades más importantes ya fueron comentadas (por fuera) en posts anteriores: la herencia de proyectos, y el mini-mapa. También hay: una actualización grande de mingw (ahora basado en gcc 6.3) y, en consecuencia, de todos los complementos para Windows (gracias a los scripts que armé para la actualización anterior); una mejora sensible en el tiempo de preparación previo a la compilación/ejecución de un proyecto; la consideración de las sugerencias que dan clang 4 y gcc 7 en los mensajes de error para mostrar a modo de autocompletado; una actualización/limpieza en el tema de íconos; y varias correcciones más no tan visibles.

Aspecto inicial del nuevo tema de íconos. Todavía faltan más cambios,
pero mientras tanto probablemente en la próxima release se publique así.

Para implementar la herencia, primero hice alguna limpieza en el código que gestiona la lista de archivos de un proyecto; y luego en el código que lee el archivo de proyecto. Ese archivo tiene un formato (similar a los viejos .ini de Windows), y ZinjaI lee y graba con ese formato varias cosas. Además, como la clase que contiene estas cosas está muy atada a la interfaz y pensada para operar como un Singleton, entonces no se podía reutilizar para leer temporalmente las lista de archivos de los proyectos padres. Igual, no habría sido muy eficiente, ya que la lectura del archivo de proyecto involucra mucho más que esa lista. Así que me hice una clase nueva cuya única responsabilidad es abrir y parsear ese tipo de archivos, y luego busqué casi todos los lugares donde ZinjaI los lee y reemplacé las lecturas por este nuevo y más prolijo mecanismo. Resultado, muchos cambios internos, mucho código nuevo que probar.

Con el mini-mapa pasó algo similar porque tuve que agregar un nuevo panel. El aui de wx (advance user interface, un conjunto de clases) me facilita crear paneles, hacerlos flotantes o dockearlos, arrastrarlos, etc. Pero no hace, por ejemplo, que sean "auto-ocultables", o que se puedan agrupar en una notebook como cuando se agrupan los tres árboles de la izquierda en un solo panel. Todo esto era código mio, agregado por sobre la aui de wx, pero implementado ad-hoc para cada caso, cada panel, cada grupo, etc. De igual forma sucede con los mecanismos para cambiar el conjunto de paneles al pasar de la vista normal a la pantalla completa, o al iniciar/finalizar la depuración. Wx provee algo para eso pero no calzaba perfectamente.

Agregar un panel más con la misma filosofía era volver a copiar y pegar código oootra vez. Y ya eran demasiadas copias, hacía rato que se venía necesitando un cambio. Finalmente encaré la tarea de abstraer estos detalles de presentación, esconderlos en mi propia versión extendida del aui-manager, y hacer que a la lógica de la ventana principal le dé lo mismo una configuración u otra. Esto simplifica muchísimas cosas, y además hace mucho más directo agregar nuevos paneles, como el del mini-mapa.

Por el momento, el resultado casi no se verá. Algunas acciones en la interfaz serán más coherentes, y algunas configuraciones se aplicarán ahora sin necesidad de reiniciar ZinjaI, pero no mucho más. Pero a nivel de código la cosa quedó mucho más configurable que antes. En alguna release posterior agregaré la interfaz necesaria para aprovechar toda esta nueva flexibilidad.

Estadísticas de tres de las últimas versiones de ZinjaI, cubriendo aproximadamente un año de
desarrollo. Se puede ver que el tamaño, [mal] medido en lineas de código, crece muy lentamente,
mucho menos que las funcionalidades. Indicador indirecto de la mejora en el código.

En conclusión, varias de estas cosas llevan a un código mejor y más prolijo, que aunque ahora representa mucho trabajo extra, hará que sea más fácil agregar o corregir cosas en el futuro. Entre los demás cambios que quedaron pendientes para una siguiente (y, espero, cercana) actualización están por ejemplo: algunas ideas para solucionar el problema de los acentos en Mac OS y facilitar la migración a wx3, más trabajo sobre el mini-mapa, más opciones para la herencia de proyectos, extender la nueva filosofía de la aui a la gestión de las barras de herramientas, completar la lavada de cara del tema de íconos, algunas ideas para mejorar las macros de gdb que inspeccionan contenedores stl, etc, etc, etc. Pero por ahora, espero publicar lo que ya hay en menos de una semana y no volver a demorarme con nada nuevo.

No hay comentarios:

Publicar un comentario