コード例 #1
0
static gboolean
gwy_app_file_chooser_do_full_preview(gpointer user_data)
{
    GtkFileChooser *fchooser;
    GtkTreeModel *model;
    GtkListStore *store;
    GwyAppFileChooser *chooser;
    GSList *channel_ids, *l;
    GdkPixbuf *pixbuf;
    GtkTreeIter iter;
    GString *str;
    gint id;

    chooser = GWY_APP_FILE_CHOOSER(user_data);
    chooser->full_preview_id = 0;

    /* Always no-op here? */
    gwy_app_file_chooser_free_preview(chooser);

    fchooser = GTK_FILE_CHOOSER(chooser);
    chooser->preview_name_sys = gtk_file_chooser_get_preview_filename(fchooser);
    /* We should not be called when gtk_file_chooser_get_preview_filename()
     * returns NULL preview file name */
    if (!chooser->preview_name_sys) {
        g_warning("Full preview invoked with NULL preview file name");
        return FALSE;
    }

    model = gtk_icon_view_get_model(GTK_ICON_VIEW(chooser->preview));
    store = GTK_LIST_STORE(model);

    chooser->preview_data = gwy_file_load(chooser->preview_name_sys,
                                          GWY_RUN_NONINTERACTIVE, NULL);
    if (!chooser->preview_data) {
        gwy_app_file_chooser_free_preview(chooser);
        gtk_tree_model_get_iter_first(model, &iter);
        gtk_list_store_set(store, &iter,
                           COLUMN_FILEINFO, _("Cannot preview"),
                           -1);

        return FALSE;
    }

    channel_ids = NULL;
    gwy_container_foreach(chooser->preview_data, NULL,
                          add_channel_id, &channel_ids);
    channel_ids = g_slist_sort(channel_ids, compare_ids);
    if (!channel_ids) {
        gwy_app_file_chooser_free_preview(chooser);
        return FALSE;
    }

    g_object_set(chooser->renderer_fileinfo,
                 "ellipsize", PANGO_ELLIPSIZE_END,
                 "wrap-width", -1,
                 NULL);

    gtk_list_store_clear(store);
    str = g_string_new(NULL);
    for (l = channel_ids; l; l = g_slist_next(l)) {
        id = GPOINTER_TO_INT(l->data);
        pixbuf = gwy_app_get_channel_thumbnail(chooser->preview_data, id,
                                               TMS_NORMAL_THUMB_SIZE,
                                               TMS_NORMAL_THUMB_SIZE);
        if (!pixbuf) {
            g_warning("Cannot make a pixbuf of channel %d", id);
            continue;
        }

        if (chooser->make_thumbnail) {
            _gwy_app_recent_file_write_thumbnail(chooser->preview_name_sys,
                                                 chooser->preview_data,
                                                 id, pixbuf);
            chooser->make_thumbnail = FALSE;
        }

        gwy_app_file_chooser_describe_channel(chooser->preview_data, id, str);
        gtk_list_store_insert_with_values(store, &iter, -1,
                                          COLUMN_PIXBUF, pixbuf,
                                          COLUMN_FILEINFO, str->str,
                                          -1);
        g_object_unref(pixbuf);
    }

    g_string_free(str, TRUE);

    return FALSE;
}
コード例 #2
0
static gboolean
gwy_app_file_chooser_do_full_preview(gpointer user_data)
{
    GtkFileChooser *fchooser;
    GtkTreeModel *model;
    GtkListStore *store;
    GwyAppFileChooser *chooser;
    FileInfoData filedata;
    GwyContainer *data, *settings;
    GdkPixbuf *pixbuf;
    GtkTreeIter iter;
    const gchar *name;
    gboolean row_level = FALSE, plane_level = FALSE;
    GString *str;
    GSList *l;
    gint id;

    chooser = GWY_APP_FILE_CHOOSER(user_data);
    chooser->full_preview_id = 0;

    /* Always no-op here? */
    gwy_app_file_chooser_free_preview(chooser);

    fchooser = GTK_FILE_CHOOSER(chooser);
    chooser->preview_name_sys = gtk_file_chooser_get_preview_filename(fchooser);
    /* We should not be called when gtk_file_chooser_get_preview_filename()
     * returns NULL preview file name */
    if (!chooser->preview_name_sys) {
        g_warning("Full preview invoked with NULL preview file name");
        return FALSE;
    }

    model = gtk_icon_view_get_model(GTK_ICON_VIEW(chooser->preview));
    store = GTK_LIST_STORE(model);

    data = gwy_file_load(chooser->preview_name_sys,
                         GWY_RUN_NONINTERACTIVE, NULL);
    if (!data) {
        gwy_app_file_chooser_free_preview(chooser);
        gtk_list_store_clear(store);
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter,
                           COLUMN_FILEINFO, _("Cannot preview"),
                           -1);

        return FALSE;
    }

    gwy_data_validate(data,
                      GWY_DATA_VALIDATE_CORRECT | GWY_DATA_VALIDATE_NO_REPORT);

    memset(&filedata, 0, sizeof(FileInfoData));
    gwy_container_foreach(data, NULL, add_object_id, &filedata);
    filedata.channels = g_slist_sort(filedata.channels, compare_ids);
    filedata.graphs = g_slist_sort(filedata.graphs, compare_ids);
    filedata.spectra = g_slist_sort(filedata.spectra, compare_ids);

    str = g_string_new(NULL);
    if (gwy_file_get_data_info(data, &name, NULL)) {
        /* FIXME: Make this translatable */
        g_string_printf(str, "<small>%s", name);
        if (filedata.nchannels)
            g_string_append_printf(str, ", %d ch", filedata.nchannels);
        if (filedata.graphs)
            g_string_append_printf(str, ", %d gr", filedata.ngraphs);
        if (filedata.spectra)
            g_string_append_printf(str, ", %d sps", filedata.nspectra);
        g_string_append(str, "</small>");
        gtk_label_set_markup(GTK_LABEL(chooser->preview_type), str->str);
    }

    if (!filedata.channels) {
        g_string_free(str, TRUE);
        g_slist_free(filedata.channels);
        g_slist_free(filedata.graphs);
        g_slist_free(filedata.spectra);
        g_object_unref(data);
        gwy_app_file_chooser_free_preview(chooser);
        return FALSE;
    }

    g_object_set(chooser->renderer_fileinfo,
                 "ellipsize", PANGO_ELLIPSIZE_END,
                 "wrap-width", -1,
                 NULL);
    settings = gwy_app_settings_get();
    gwy_container_gis_boolean_by_name(settings, "/app/file/preview/plane-level",
                                      &plane_level);
    gwy_container_gis_boolean_by_name(settings, "/app/file/preview/row-level",
                                      &row_level);

    gtk_list_store_clear(store);
    for (l = filedata.channels; l; l = g_slist_next(l)) {
        id = GPOINTER_TO_INT(l->data);
        modify_channel_for_preview(data, id, plane_level, row_level);
        pixbuf = gwy_app_get_channel_thumbnail(data, id,
                                               TMS_NORMAL_THUMB_SIZE,
                                               TMS_NORMAL_THUMB_SIZE);
        if (!pixbuf) {
            g_warning("Cannot make a pixbuf of channel %d", id);
            continue;
        }

        if (chooser->make_thumbnail) {
            _gwy_app_recent_file_write_thumbnail(chooser->preview_name_sys,
                                                 data,
                                                 id, pixbuf);
            chooser->make_thumbnail = FALSE;
        }

        gwy_app_file_chooser_describe_channel(data, id, str);
        gtk_list_store_insert_with_values(store, &iter, -1,
                                          COLUMN_PIXBUF, pixbuf,
                                          COLUMN_FILEINFO, str->str,
                                          -1);
        g_object_unref(pixbuf);
    }

    g_slist_free(filedata.channels);
    g_slist_free(filedata.graphs);
    g_slist_free(filedata.spectra);
    g_string_free(str, TRUE);
    g_object_unref(data);

    return FALSE;
}