⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsegyfileview.c

📁 segy 显示程序!希望能给正在做这部分朋友提供一部分资料
💻 C
📖 第 1 页 / 共 2 页
字号:
        gtk_widget_set_sensitive (private->add_view_button, TRUE);}GtkWidget* g_segy_file_view_get_main_widget (GSEGYFileView *self) {    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    if (NULL == private->expander) {        private->expander = gtk_expander_new ("Filename");        private->fileview_tips = gtk_tooltips_new ();        g_object_ref (G_OBJECT (private->fileview_tips));        gtk_object_sink (GTK_OBJECT (private->fileview_tips));        private->hbox = gtk_hbox_new (FALSE, 0);        gtk_container_add (GTK_CONTAINER (private->expander), private->hbox);        private->padding_label = gtk_label_new (NULL);        gtk_box_pack_start (GTK_BOX (private->hbox), private->padding_label, FALSE, FALSE, 10);        private->vbox = gtk_vbox_new (FALSE, 3);        gtk_box_pack_start (GTK_BOX (private->hbox), private->vbox, FALSE, FALSE, 0);        private->title_hbox = gtk_hbox_new (FALSE, 3);        gtk_box_pack_start (GTK_BOX (private->vbox), private->title_hbox, FALSE, FALSE, 0);        private->close_file_button = gtk_button_new ();        private->close_file_icon = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU);        gtk_container_add (GTK_CONTAINER (private->close_file_button), private->close_file_icon);        gtk_box_pack_start (GTK_BOX (private->title_hbox), private->close_file_button, FALSE, FALSE, 0);        gtk_signal_connect (GTK_OBJECT (private->close_file_button), "clicked",                            GTK_SIGNAL_FUNC (g_segy_file_view_close_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->fileview_tips), private->close_file_button,                              _("Close file"),                              _("This button closes the file"                                "associated with it."));        private->pref_button = gtk_button_new ();        private->pref_icon = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);        gtk_container_add (GTK_CONTAINER (private->pref_button), private->pref_icon);        gtk_box_pack_start (GTK_BOX (private->title_hbox), private->pref_button, FALSE, FALSE, 0);        gtk_widget_set_sensitive (private->pref_button, FALSE);        gtk_signal_connect (GTK_OBJECT (private->pref_button), "clicked",                            GTK_SIGNAL_FUNC (g_segy_file_view_preferences_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->fileview_tips), private->pref_button,                              _("View preferences"),                              _("This button shows the preferences dialog"                                "with settings for the new data views."));        private->info_button = gtk_button_new ();        private->info_icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_MENU);        gtk_container_add (GTK_CONTAINER (private->info_button), private->info_icon);        gtk_box_pack_start (GTK_BOX (private->title_hbox), private->info_button, FALSE, FALSE, 0);        gtk_widget_set_sensitive (private->info_button, FALSE);        gtk_signal_connect (GTK_OBJECT (private->info_button), "clicked",                            GTK_SIGNAL_FUNC (g_segy_file_view_file_info_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->fileview_tips), private->info_button,                              _("File info"),                              _("This button shows the information"                                "about the file associated with it."));        GtkWidget *event_box_one = gtk_event_box_new ();        gtk_box_pack_start (GTK_BOX (private->title_hbox), event_box_one, FALSE, FALSE, 0);        private->combo_sort_one = gtk_combo_box_new_text  ();        gtk_container_add (GTK_CONTAINER (event_box_one), private->combo_sort_one);        gtk_signal_connect (GTK_OBJECT (private->combo_sort_one), "changed",                            GTK_SIGNAL_FUNC (g_segy_file_view_combo_one_changed_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->fileview_tips), event_box_one,                              _("First sorting key"),                              _("This combo box defines the first"                                "sorting key to use in a data view."));        GtkWidget *event_box_two = gtk_event_box_new ();        gtk_box_pack_start (GTK_BOX (private->title_hbox), event_box_two, FALSE, FALSE, 0);        private->combo_sort_two = gtk_combo_box_new_text  ();        gtk_container_add (GTK_CONTAINER (event_box_two), private->combo_sort_two);        gtk_signal_connect (GTK_OBJECT (private->combo_sort_two), "changed",                            GTK_SIGNAL_FUNC (g_segy_file_view_combo_two_changed_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->fileview_tips), event_box_two,                              _("Second sorting key"),                              _("This combo box defines the second"                                "sorting key to use in a data view."));        private->add_view_button = gtk_button_new ();        private->add_view_icon = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);        gtk_container_add (GTK_CONTAINER (private->add_view_button), private->add_view_icon);        gtk_box_pack_start (GTK_BOX (private->title_hbox), private->add_view_button, FALSE, FALSE, 0);        gtk_widget_set_sensitive (private->add_view_button, FALSE);        gtk_signal_connect (GTK_OBJECT (private->add_view_button), "clicked",                            GTK_SIGNAL_FUNC (g_segy_file_view_sort_view_add_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->fileview_tips), private->add_view_button,                              _("Add data view"),                              _("This button adds a new data view"                                "according to the sorting keys."));        private->label = gtk_label_new ("Ready to read a file");        gtk_box_pack_start (GTK_BOX (private->title_hbox), private->label, FALSE, FALSE, 2);        private->progress_bar = gtk_progress_bar_new ();        gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (private->progress_bar), GTK_PROGRESS_LEFT_TO_RIGHT);        gtk_progress_bar_set_bar_style  (GTK_PROGRESS_BAR (private->progress_bar), GTK_PROGRESS_CONTINUOUS);        gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (private->progress_bar), 0.01);        gtk_box_pack_start (GTK_BOX (private->title_hbox), private->progress_bar, FALSE, FALSE, 0);        private->hsep = gtk_hseparator_new ();        gtk_box_pack_start (GTK_BOX (private->vbox), private->hsep, FALSE, FALSE, 0);        gtk_expander_set_expanded (GTK_EXPANDER (private->expander), TRUE);        private->preferences = g_segy_preferences_new ();    }    return private->expander;}GSEGYFileView* g_segy_file_view_new (void) {    return g_object_new (G_SEGY_TYPE_FILE_VIEW, NULL);}static gboolean g_segy_file_view_update_progress_bar (gpointer data) {    GSEGYFileView *self = (GSEGYFileView*)data;    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    gdk_threads_enter ();    if (private->fraction >= 2.0)        gtk_progress_bar_pulse (GTK_PROGRESS_BAR (private->progress_bar));    else        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (private->progress_bar), private->fraction);    gdk_threads_leave ();    return FALSE;}static gboolean g_segy_file_view_scan_fraction_handler (GSEGYFile *segy_file, gfloat fraction,                                                        GSEGYFileError *file_error, gpointer data) {    GSEGYFileView *self = (GSEGYFileView*)data;    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    if (file_error && file_error->id != G_SEGY_FILE_NO_ERROR)        return FALSE;    if (g_async_queue_try_pop (private->scan_progress)) {#ifdef DEBUG        g_printf ("The thread is requested to stop while scanning\n");#endif        return FALSE;    }/*#ifdef DEBUG    g_printf ("Scan fraction handler: %f %f\n", fraction, (((gint)fraction) % 11) / 10.0);#endif*/    private->fraction = fraction;    g_idle_add ((GSourceFunc)g_segy_file_view_update_progress_bar, (gpointer)self);    return TRUE;}static gboolean g_segy_file_view_show_error (gpointer data) {    GSEGYFileView *self = G_SEGY_FILE_VIEW (data);    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    GtkWidget *error_dialog;    gboolean gdk_lock = (private->scanning_thread != NULL);    if (G_SEGY_FILE_NO_ERROR == private->file_error.id)        return FALSE;    const gchar *error_message = gsegy_view_get_file_error_message (&private->file_error);#ifdef DEBUG    g_printf ("Error id = %d, message - %s\n", private->file_error.id, error_message);#endif    if (gdk_lock)        gdk_threads_enter ();    if (private->file_error.id < G_SEGY_FILE_DOES_NOT_EXIST && private->file_error.gerror) {        gchar *full_error_message = g_strconcat (error_message, " : ", private->file_error.gerror->message, NULL);        error_dialog = gtk_message_dialog_new (NULL,                                               GTK_DIALOG_MODAL,                                               GTK_MESSAGE_ERROR,                                               GTK_BUTTONS_OK,                                               full_error_message);        g_free (full_error_message);    } else        error_dialog = gtk_message_dialog_new (NULL,                                               GTK_DIALOG_MODAL,                                               GTK_MESSAGE_ERROR,                                               GTK_BUTTONS_OK,                                               error_message);    if (private->file_error.gerror) {        g_error_free (private->file_error.gerror);        private->file_error.gerror = NULL;    }    gtk_dialog_run (GTK_DIALOG (error_dialog));    gtk_widget_destroy (error_dialog);    if (gdk_lock)        gdk_threads_leave ();    return FALSE;}static gboolean g_segy_file_view_set_format_completed (GSEGYFileView *self) {    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    if (private->scanning_thread)        gdk_threads_enter ();    gtk_widget_hide (GTK_WIDGET (private->label));    gtk_widget_hide (GTK_WIDGET (private->progress_bar));    gtk_widget_show (GTK_WIDGET (private->pref_button));    gtk_widget_show (GTK_WIDGET (private->info_button));    gtk_widget_show (GTK_WIDGET (private->combo_sort_one));    gtk_widget_show (GTK_WIDGET (private->combo_sort_two));    gtk_widget_show (GTK_WIDGET (private->add_view_button));    gtk_widget_set_sensitive (private->pref_button, TRUE);    gtk_widget_set_sensitive (private->info_button, TRUE);    if (private->scanning_thread) {        gdk_threads_leave ();        g_thread_join (private->scanning_thread);        private->scanning_thread = NULL;    }    return FALSE;}static void *g_segy_file_view_set_format_thread (void *args) {    GSEGYFileView *self = (GSEGYFileView*)args;    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    g_async_queue_ref (private->scan_progress);    g_mutex_lock (private->file_mutex);    gulong scan_fraction_signal_id = g_signal_connect (G_OBJECT (private->segy_file), "scan_fraction",                                                       (GCallback)g_segy_file_view_scan_fraction_handler, (gpointer)self);    g_segy_file_set_format (private->segy_file, private->format_wizard, &private->file_error);    g_signal_handler_disconnect (G_OBJECT (private->segy_file), scan_fraction_signal_id);    if (private->file_error.id != G_SEGY_FILE_NO_ERROR) {        if (private->file_error.id != G_SEGY_FILE_INTERRUPTED_BY_USER) {            g_idle_add ((GSourceFunc)g_segy_file_view_show_error, (gpointer)(self));            g_idle_add ((GSourceFunc)g_segy_file_view_close_signal_thread, (gpointer)self);        }    } else {        g_idle_add ((GSourceFunc)g_segy_file_view_set_format_completed, (gpointer)self);    }    g_mutex_unlock (private->file_mutex);    g_async_queue_unref (private->scan_progress);    return NULL;}gboolean g_segy_file_view_set_file (GSEGYFileView *self, const gchar *filename, GSEGYFormatWizard *format_wizard) {    GSEGYFileViewPrivate *private = G_SEGY_FILE_VIEW_GET_PRIVATE (self);    if (private->segy_file && private->format_wizard)        return FALSE;    if (private->scanning_thread) {        g_thread_join (private->scanning_thread);        private->scanning_thread = NULL;    }    private->file_error.id = G_SEGY_FILE_NO_ERROR;    private->format_wizard = format_wizard;    g_object_ref (G_OBJECT (private->format_wizard));    gtk_widget_hide (GTK_WIDGET (private->combo_sort_one));    gtk_widget_hide (GTK_WIDGET (private->combo_sort_two));    gtk_widget_hide (GTK_WIDGET (private->pref_button));    gtk_widget_hide (GTK_WIDGET (private->info_button));    gtk_widget_hide (GTK_WIDGET (private->add_view_button));    GPtrArray* sorting_names = g_segy_format_wizard_get_sorting_fields_names (format_wizard);    guint i;    gtk_combo_box_append_text (GTK_COMBO_BOX (private->combo_sort_two), _("None"));    for (i = 0; i < sorting_names->len - 1; i++) {         gtk_combo_box_append_text (GTK_COMBO_BOX (private->combo_sort_one),                                    g_ptr_array_index (sorting_names, i));         gtk_combo_box_append_text (GTK_COMBO_BOX (private->combo_sort_two),                                    g_ptr_array_index (sorting_names, i));    }    if (private->expander) {        gtk_widget_show (private->progress_bar);        private->short_filename = g_path_get_basename (filename);        gtk_expander_set_label (GTK_EXPANDER (private->expander), private->short_filename);        gtk_label_set_text (GTK_LABEL (private->label), _("Checking format conformity:"));        private->segy_file = g_segy_file_new (filename);        GSEGYFileError *file_error = g_segy_file_get_error (private->segy_file);        if (file_error && file_error->id != G_SEGY_FILE_NO_ERROR) {            private->file_error.id = file_error->id;            private->file_error.gerror = file_error->gerror;            file_error->gerror = NULL;            g_segy_file_view_show_error ((gpointer)self);            g_segy_file_view_close_signal (self);            return FALSE;        }        private->scanning_thread = g_thread_create (g_segy_file_view_set_format_thread, self, TRUE, &private->file_error.gerror);        if (FALSE == private->scanning_thread) {#ifdef DEBUG            if (private->file_error.gerror)                g_printf ("Failed to create thread: %s\n", private->file_error.gerror->message);            else                g_printf ("Failed to create thread, no reason given\n");#endif            if (private->file_error.gerror) {                g_error_free (private->file_error.gerror);                private->file_error.gerror = NULL;            }            g_mutex_lock (private->file_mutex);            if (FALSE == g_segy_file_set_format (private->segy_file, format_wizard, &private->file_error)) {                g_mutex_unlock (private->file_mutex);                g_segy_file_view_show_error ((gpointer)self);                g_segy_file_view_close_signal (self);                return FALSE;            }            g_mutex_unlock (private->file_mutex);            g_segy_file_view_set_format_completed (self);        }        return TRUE;    } else {        private->segy_file = g_segy_file_new (filename);        GSEGYFileError *file_error = g_segy_file_get_error (private->segy_file);        if (file_error && file_error->id != G_SEGY_FILE_NO_ERROR) {            private->file_error.id = file_error->id;            private->file_error.gerror = file_error->gerror;            file_error->gerror = NULL;        } else if (g_segy_file_set_format (private->segy_file, format_wizard, &private->file_error)) {            g_segy_file_view_set_format_completed (self);            return TRUE;        }        g_segy_file_view_show_error ((gpointer)self);        g_segy_file_view_close_signal (self);        return FALSE;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -