📄 gsegyfileview.c
字号:
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 + -