Buenas!
Les traigo un sustituto para
DeskTopMime. En el último código que subí al foro,
GCompress, había una clase interna para gestionar mimetypes. Y puliendo esta última le he dado una vuelta:
CMimeTypes.
¿Porqué un sustituto de
DesktopMime?.
Básicamente, porque, en mi humilde opinión, no está bien resuelto el tema. Utilizando el componente estándar no me devolvía los iconos por defecto del sistema, y si el fichero a buscar tiene una extensión poco común devolvía un icono estándar.
El mótivo de esto es en cómo hace el proceso de carga de los iconos, y busca el icono asociado a la extensión del fichero, la función
GetIcon():
- Si tiene el icono en el tamaño solicitado en caché lo devuelve.
- Busca en Stock (iconos Gambas) si tiene el mimetype y si existe lo devuelve. De ahí que no devuelva iconos del sistema por defecto.
- Busca en el tema hicolor si existe el icono. Este tema es el "padre" de prácticamente todos los temas de iconos, es muy completo pero casi nunca tiene el mismo icono que los otros temas.
- Busca en "/usr/share/pixmaps"
- Vuelve a buscar en Stock, pero lo hace por el icono genérico asociado al mimetype.
- Por último, si nada de lo anterior ha dado resultado, devuelve un icono genérico.
Cómo funciona
CMimeType:
La clase carga la base de datos de mimetypes del sistema, como
DesktopMime. Además añade la información del mimetype genérico asociado, como
DesktopMime, pero esta última no lo hace correctamente y se pierde esa información. Por último carga la subclase asociada al mimetype. Y además utiliza una clase auxiliar,
CTheme, que analiza los temas de iconos del sistema.
Y busca el icono asociado a la extensión de fichero:
- Si tiene el icono en el tamaño solicitado en caché lo devuelve.
- Busca el icono del mimetype en el directorio de iconos por defecto por tamaño y tipo.
- Busca el icono genérico asociado al mimetype.
- Busca el icono genérico asociado a la subclase del mimetype.
- Los temas de iconos tienen "herencia", temas de iconos padre. La clase repite el proceso por todo el arbol de herencia del tema por defecto.
- Por último, si nada de lo anterior ha dado resultado, devuelve un icono genérico. Aquí tengo pendiente añadir la búsqueda en Stock por si sonara la flauta.
Un ejemplo de la información interna que manejan ambas clases para el mismo mimetype:
- Pattern es la extensión de fichero: json.
- Type es el mimetype asociado a json.
- GenericIcon, el icono genérico asociado al mimetype, como comentaba antes DesktopMime no lo hace correctamente.
- SubClass, la subclase del mimetype.
Ventajas de
DesktopMime:
- Es rápido, tanto en la búsqueda del mimetype asociado al fichero como en la búsqueda del icono, aunque el icono que devuelve en muchos casos es el icono de Stock. Si la extensión de fichero es poco habitual, es más lento.
- Cumple su función, permite salir del paso con solvencia.
Ventajas de
CMimeType:
- Aunque es mucho más lento hay que ponerlo en contexto: uno son 0,028 msec y el otro 0,059 msec (de media). El proceso de carga completo en mi ordenador, con 22 temas de iconos, tarda 75 msec. Un parpadeo dura 300 msec. Y yo solo he instalado uno de los temas, los demás venían por defecto.

- La tasa de acierto, recuperar el icono del sistema asociado al mimetype, es mucho más alta. Que es lo que yo buscaba.
- Permite cambiar el tema por defecto que se utiliza en las búsquedas. Y de paso visualizar los temas de iconos.
Hay un par de formularios para probar. Como dato curioso, están embebidos dentro de un control
Wizard, he descubierto que es muy cómodo para cosas rápidas y de prueba, así me ahorro el añadir el control
gb.form.mdi y usar un
WorkSpace. Con los botones de arriba se cambia de formulario y se cierra la aplicación.
Este es el formulario para buscar mimetypes, basta pulsar sobre un fichero y a la derecha salen los iconos que devuelven
CMimeType y
DesktopMime. El que devuelve este último es un icono de
Stock, no del sistema. También se ve que el control
FileChooser, que usa
DesktopMime, no encuentra varios ficheros y devuelve el icono estándar.
Arriba a la derecha se puede seleccionar el tema de iconos y el tamaño. El botón
Home vuelve a poner el tema por defecto en el
ComboBox. Se visualiza el mimetype asociado al fichero, el icono y la descripción asociada al mimetype.
Este es para explorar los temas de iconos que tenemos en el sistema y qué información guarda la clase
CTheme:
- El directorio donde están los iconos.
- El nombre interno del tema.
- La descripción del tema.
- Si es el tema por defecto del sistema.
- Si está marcado como oculto.
- Si es "Dark mode"
- La estructura interna de los directorios. Se usa para facilitar la búsqueda, según el tema la estructura puede ser "mimetypes/16" o "16/mimetypes". En la búsqueda se sustituye esta cadena por tamaño y directorio.
- El formato del directorio de tamaños. Algunos son "16x16" y otros, como la imagen, solo "16".
- El directorio por defecto donde el tema almacena los mimetypes.
- La extensión por defecto de los ficheros en ese tema, suele ser svg o png.
- Y por último la herencia, que ya he comentado antes. Estos son los temas de los que hereda el tema seleccionado. Si la clase no encuentra el icono en el tema por defecto lo búscara en toda su cadena de herencia.
Y nada más, como siempre son bienvenidos los comentarios y las sugerencias.
Un saludo, Harpo.