ARCADE FOREVER

[Proyecto] AdvMenu+, Modificando el codigo fuente del Advmenu

« Older   Newer »
  Share  
daesdae
view post Posted on 18/8/2014, 19:54 by: daesdae     +1   +1   -1




Buenas señores.

Este post se lo quiero dedicar a todos los toqueteadores/enredadores de código Plusero y en especial a VeS, aunque no entro de lleno al código como a el le gustaría ...

Acabo de subir al git lo ultimo, os cuento un poco en que ando...

Básicamente estoy refactorizando todo lo que tiene que ver con los layouts, por fin me he puesto a ello, está/estaba el código que daba asco, muy metido a calzador y no me permitía seguir desarrollando el tema layouts.

Estado del tema layouts:
Cuando lee el advmenu.rc genera una lista de emuladores con sus propiedades, entre ellas todas las de los layouts, unas 53 y eso que los layouts son muy básicos.
Esto hace que a poco que implemente algo las propiedades de los layouts aumenten mucho y con ello los emuladores, que cargan con ellas aunque no se les haya asignado un layout.
Y por si fuese poco, todas son del tipo string. (el porque de esto mas adelante)
:sick:
Bueno, pues directamente no vamos la funcion que pinta el modo del emulador. La encargada de ello es "menu.cc->run_menu_user(...)"
De origen esta funcion es quilometrica, en ella se determina las propiedades de los modos visuales (unos 12) y según cual sea pinta unas cosas mas allá o acá ..., vamos que ya en el advmenu original en esta funcion hay un lio tremendo (que funciona muy bien pero muy jodido de seguir para los que queremos modificar algo).
Pues bien, como en principio los layouts no iban a ser gran cosa, fuí metiendo ahí lo de pintar los layouts, un poquito de codigo por aquí, otro por allá, haciendo un uso mas que excesivo de comprobaciones "if(modo_custom) ... else ...".
:sick:
Bien, pues como dije al principo las propiedades de los layouts se guardan en los emuladores como strings, por lo tanto en algun momento habrá que: comprobar si ese dato está vacio, si es "none", ... para dado el caso coger el dato por defecto o seguir, luego transformar ese string en el tipo adecuado, por ejemplo la posicion y tamaño del listado irá en enteros y finalmente escalarlos segun la resolucion de pantalla... Vamos, preparar los datos para ser utilizados.
Pues bien, todo este jaleo, está metido en el peor sitio, en la función quilometrica (ahora aun muchísimo mas por el modo custom) "run_menu_user(...)".
Osea, cada vez que cambiamos de emulador pasa por esta función y vuelve a hacer todas las conversiones y demás en los datos.
scratch
y hasta aquí puedo leer, ahora a limpiar todo este estropicio, para dejarlo 100% reluciente y preparado para implementar lo nuevo.
suck_kr

Ahora, en el presente, pues gran parte del rollo de arriba ya está arreglado, aunque aun le queda mucho...
El lío lo he dividido en varios puntos:

Refactorizando Layouts:
- Reestructurar la obtención de datos de los layouts
- Tratamiento de datos
- Reestructurar la función de pintado
- Limpieza de código
- ...

Lo que acabo de subir al Git:

- Reestructurar la función de pintado
Aquí he dividido la funcion 'run_menu_user(...)' en dos:
- run_menu_user(...) -> para los modos no-custom, he quitado todo lo referente al modo_custom (layout) con todos sus puñeteros 'if(mode_custom)' para dejarlo practicamente como la funcion original, que funciona muy bien.
- run_menu_layout(...) -> para el modo custom (layout), una copia del anterior eliminado todo lo de los otros modos.
Simple y aunque aun hay que refactorizar bien el 'run_menu_layout(...)', joder, que gusto tener lo de pintar los layouts en su propia funcion, sin historias de andarse con cuidado por si lo nuevo estropea algo de los otros modos y ya se ve todo mas limpio.
Total:
Emulador en modo no-custom -> funcion de pintado como la original (advmenu)
Emulador en modo custom (con layout) -> funcion de pintado propia para el layout.

- Reestructurar la obtención de datos de los layouts
Aquí hay algo mas de cañita y mucho mas gonito y fermoso.
Ahora los layouts se cargan en una lista de layouts, para esto he creado la clase layout con sus propiedades...
Los emuladores se liberan de las propiedades de los layouts.
Ambas listas, emuladores y layouts, se relacionan mediante la propiedad 'custom_emulator_path' en el caso de los emudores y la propiedad 'name' de los layouts que guardan la ruta al layout.
:blink:
De paso tambien he toqueteado algunas cositas menores pero que mejoran mucho las cosas.
Esto de tener los layouts bien guardados en una lista hace que asignar un emulador a un layout u otro sea tan solo cambiar la propiedad "custom_emulator_path" para que apunte al layout que queremos (NOTA: ¿multilayout?).
Además abre el camino a cosas como que los layouts se puedan asignar a cualquier cosa, no solo a los emuladores. Sería muy facil implementar, por ejemplo, asignar layouts a los juegos, a las listas de favoritos, a los tipos, ... :woot:

Bueno, por ahora esto es lo que llevo, ya voy viendo todo mas entendible, limpito y en su sitio.
Ufff, ya empiezo a estar mas orgulloso del código, que gustazo y que fino lo voy a dejar.

Lo que queda:
- Tratamiento de datos de los layouts: empezaré mañana a estudiar la mejor forma de abordar el tema. Mas o menos lo tengo claro.
- Refactorizar bien la funcion de pintado (run_menu_layout(...)): pues eso, dejarla la funcion de pintado lo mas simple posible, llamadas a pinta el fondo, pinta el listado, pinta ... y que le llegen todos los datos ya preparados para esto.
- Limpieza/Revision general de todo lo hecho.
- Revisar la carga de fuentes, de los colores, ....
- ...

Esta semana espero tener listo los dos primeros puntos y estar por fin muy muy cerca de una versión del Plus Cojonudisima y preparada para subir de nivel en esto de jugar a enredar en el código.

Salu2 y perdonad la chapa.
 
Top
647 replies since 8/9/2009, 21:56   30302 views
  Share