Harpo   Ayer, 21:57
#1
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():
  1. Si tiene el icono en el tamaño solicitado en caché lo devuelve.
  2. Busca en Stock (iconos Gambas) si tiene el mimetype y si existe lo devuelve. De ahí que no devuelva iconos del sistema por defecto.
  3. 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.
  4. Busca en "/usr/share/pixmaps"
  5. Vuelve a buscar en Stock, pero lo hace por el icono genérico asociado al mimetype.
  6. 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:
  1. Si tiene el icono en el tamaño solicitado en caché lo devuelve.
  2. Busca el icono del mimetype en el directorio de iconos por defecto por tamaño y tipo.
  3. Busca el icono genérico asociado al mimetype.
  4. Busca el icono genérico asociado a la subclase del mimetype.
  5. 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.
  6. 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:

[Imagen: J0vEms1l.png]
  • 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.   Angel
  • 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.

[Imagen: OYPdyXwl.png]

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.

[Imagen: QxWegrAl.png]

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.

.gz
CMimetypes-1.0.tar.gz (Tamaño: 27.18 KB Descargas: 1)
Shordi   Hace 1 hora
#2
Muy bueno, ¡Gracias!

No podemos regresar
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.