Estrarre l'icona di un tipo di file
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.
Indice
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