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 dei componenti gb.desktop e gb.desktop.x11, 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 soluzione presuppone l'esistenza nel sistema delle librerie esterne libgtk-3.so.0.1000.8 e libgio-2.0.so.0.4002.0 .

Di seguito mostriamo due modalità legate a detta soluzione, delle quali saranno mostrati due esempi che richiedono entrambi:

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

Prima modalità:

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 library.
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


Seconda modalità:

Library "libgio-2.0:0.4002.0"

Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS

' GFile * g_file_new_for_path (const char *path)
' Constructs a GFile for a given path.
Private Extern g_file_new_for_path(path As String) As Pointer

' GFileInfo * g_file_query_info (GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error)
' Gets the requested information about specified file.
Private Extern g_file_query_info(GFile As Pointer, attributes As String, flags As Integer, cancellable As Pointer, GError As Pointer) As Pointer

' GIcon * g_file_info_get_icon (GFileInfo *info)
' Gets the icon for a file.
Private Extern g_file_info_get_icon(GFileInfo As Pointer) As Pointer

' gchar * g_icon_to_string (GIcon *icon)
' Generates a textual representation of icon that can be used for serialization.
Private Extern g_icon_to_string(GIcon As Pointer) As String


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 library.
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


Public Sub Form_Open()

 Dim percorso, ico, nomefile As String
 Dim gfl, gfi, gic, info As Pointer
 
  percorso = "/percorso/del/file"
  
  gfl = g_file_new_for_path(percorso)
  If IsNull(gfl) Then Error.Raise("Impossibile caricare il file !")
   
  gfi = g_file_query_info(gfl, "standard::icon", G_FILE_QUERY_INFO_NONE, 0, 0)
  If IsNull(gfi) Then Error.Raise("Impossibile richiedere informazioni sul file !")
   
  gic = g_file_info_get_icon(gfi)
  If IsNull(gic) Then Error.Raise("Impossibile ottenere l'icona del file caricato !")
   
  ico = g_icon_to_string(gic)
  Print "La rappresentazione testuale dell'icona del file è:", ico
   
  
  gtk_init(0, 0)
   
  info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), gic, 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