Estrarre l'icona di un tipo di file

Da Gambas-it.org - Wikipedia.

Quando un tipo di file è associato ad una determinata icona, tutti i file appartenenti a quel tipo saranno mostrati sul desktop con quell'icona.

Per estrarre l'icona associata ad un tipo di file, si potranno utilizzare due modalità: una con le funzioni proprie di Gambas, l'altra con le funzioni esterne delle librerie di GTK-3 e di GIO.


Uso delle funzioni di Gambas

L'uso delle funzioni di Gambas prevede l'attivazione del componente gb.desktop, con il quale si potranno utilizzare due suoi metodi.


Uso del metodo Desktop.GetFileIcon()

Il metodo Desktop.GetFileIcon() ritorna l'icona, come Picture, associata ad un tipo di file.

Nel seguente semplice esempio poniamo sul Form dell'applicazione una PictureBox, nella quale verrà mostrata liconda associata al tipo di file prescelto:

Public Sub Form_Open()

  PictureBox1.Picture = Desktop.GetFileIcon("/percorso/del/file", 48)

End

Il secondo parametro, che nell'esempio abbiamo posto con valore 48, rappresenta la dimensione espressa in pixel, con la quale sarà mostrata l'icona nella PictureBox.


Uso della Classe DesktopMime

Della la Classe DesktopMime useremo i metodi .FromFile() e .GetIcon().

Nel semplice esempio seguente attiviamo il componente gb.desktop e poniamo sul Form dell'applicazione un Button ed una PictureBox, nella quale sarà mostrata l'icona del tipo di file individuato:

Public Sub Button1_Click()
     
 Dim percorso As String
 Dim i as Image


  percorso = "/percorso/del/file"

  i = DesktopMime.FromFile(percorso).GetIcon(48)
  PictureBox1.Picture = i.Picture
 
End

Anche in quest'altro caso il valore richiesto dal metodo .GetIcon(), che nell'esempio abbiamo posto con valore 48, rappresenta la dimensione espressa in pixel, con la quale sarà mostrata l'icona nella PictureBox.


Uso delle librerie esterne di GTK-3 e di GIO

Quest'altra modalità presuppone l'esistenza nel sistema delle librerie esterne libgtk-3.so.0.1000.8 e libgio-2.0.so.0.4002.0 .


L'esempio pratico, mostrato di seguito, richiede che:

  • sia attivato comunque il componente gb.gtk3 (servirà per mostrare l'icona associata al tipo del file);
  • sia posta sul Form una PictureBox.
Library "libgtk-3:0.1000.8"

Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
             GTK_ICON_LOOKUP_FORCE_SVG = 2,
             GTK_ICON_LOOKUP_USE_BUILTIN = 4,
             GTK_ICON_LOOKUP_GENERIC_FALLBACK = 8,
             GTK_ICON_LOOKUP_FORCE_SIZE = 16

' void gtk_init(int * argc, utf8 * argv)
' Initializes GTK librry.
Private Extern gtk_init(argc As Pointer, argv As Pointer)

' GtkIconTheme* gtk_icon_theme_get_default (void)
' Gets the icon theme for the default screen.
Private Extern gtk_icon_theme_get_default() As Pointer

' GtkIconInfo* gtk_icon_theme_lookup_by_gicon (GtkIconTheme *self, GIcon* icon, gint size, GtkIconLookupFlags flags)
' Looks up an icon and returns a structure containing information such as the filename of the icon.
Private Extern gtk_icon_theme_lookup_by_gicon(self As Pointer, icon As Pointer, size As Integer, flags As Integer) As Pointer

' const gchar* gtk_icon_info_get_filename (GtkIconInfo * icon_info)
' Gets the filename for the icon.
Private Extern gtk_icon_info_get_filename(icon_info As Pointer) As String


Library "libgio-2.0:0.4002.0"

' gchar * g_content_type_guess (const gchar *filename, const guchar *data, gsize data_size, gboolean *result_uncertain)
' Guesses the content type based on example data.
Private Extern g_content_type_guess(filename As String, data As Pointer, data_size As Integer, result_uncertain As Pointer) As Pointer

' GIcon * g_content_type_get_icon (const gchar *type)
' Gets the icon for a content type.
Private Extern g_content_type_get_icon(gtype As Pointer) As Pointer


Public Sub Form_Open()

 Dim tipo, bo, ico, info As Pointer
 Dim nomefile As String

  tipo = g_content_type_guess("/percorso/del/file", 0, 0, bo)
  Print "Il mime-type del file è: "; String@(tipo)
 
  gtk_init(0, 0)
  ico = g_content_type_get_icon(tipo)
  If IsNull(ico) Then Error.Raise("Impossibile ottenere l'icona del mime-type !")
 
  info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), ico, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)
 
  nomefile = gtk_icon_info_get_filename(info)
  Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile
 
  With PictureBox1
    .W = ImageStat(nomefile).Width
    .H = ImageStat(nomefile).Height
    .Picture = Picture[nomefile]
  End With

End


Riferimenti