Last active
February 27, 2021 08:53
-
-
Save lkmandy/0b8f73138ec2473c8b50c1a758472df8 to your computer and use it in GitHub Desktop.
Create a gtk spinner in C
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * "Upload file" dialog | |
| * | |
| */ | |
| void | |
| gtr_upload_file_dialog (GtkAction * action, GtrWindow * window) | |
| { | |
| GtrTab *tab; | |
| GtrPo *po; | |
| GtkWidget *dialog, *success_dialog; | |
| GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL; | |
| GMappedFile *mapped; | |
| GError *error = NULL; | |
| GtrProfileManager *pmanager = NULL; | |
| GtrNotebook *active_notebook; | |
| GtrProfile *profile; | |
| GtrHeader *header; | |
| g_autoptr (SoupMessage) msg = NULL; | |
| g_autoptr (SoupMultipart) mpart = NULL; | |
| g_autoptr (SoupBuffer) buffer = NULL; | |
| g_autoptr (SoupSession) session = NULL; | |
| const gchar *content = NULL; | |
| g_autofree gchar *mime_type = NULL; | |
| g_autofree gchar *filename = NULL; | |
| g_autofree gchar *upload_endpoint = NULL; | |
| const char *auth_token = NULL; | |
| g_autofree char *auth = NULL; | |
| gsize size; | |
| const gchar *selected_team; | |
| const gchar *selected_module; | |
| const gchar *selected_branch; | |
| const gchar *selected_domain; | |
| GtkWidget *spinner; | |
| GtkWidget *spinner_dialog; | |
| GtkWidget *dialog_area; | |
| GtkWidget *vbox; | |
| GtkWidget *fixed; | |
| spinner_dialog = gtk_dialog_new_with_buttons (_("Uploading to DL..."), | |
| GTK_WINDOW(window), | |
| GTK_DIALOG_DESTROY_WITH_PARENT, | |
| _("_Cancel"), | |
| GTK_RESPONSE_REJECT, | |
| NULL); | |
| dialog_area = gtk_dialog_get_content_area (GTK_DIALOG (spinner_dialog)); | |
| g_signal_connect (spinner_dialog, | |
| "response", | |
| G_CALLBACK (gtk_widget_destroy), | |
| spinner_dialog); | |
| g_signal_connect (spinner_dialog, | |
| "destroy", | |
| G_CALLBACK (gtk_widget_destroyed), | |
| &spinner_dialog); | |
| gtk_window_set_resizable (GTK_WINDOW (spinner_dialog), FALSE); | |
| gtk_widget_set_size_request (spinner_dialog, 300, 200); | |
| vbox = gtk_box_new (FALSE, 5); | |
| gtk_box_pack_start (GTK_BOX (dialog_area), vbox, TRUE, TRUE, 0); | |
| gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); | |
| spinner = gtk_spinner_new(); | |
| fixed = gtk_fixed_new(); | |
| gtk_container_add (GTK_CONTAINER (vbox), fixed); | |
| gtk_fixed_put (GTK_FIXED (fixed), spinner, 150, 100); | |
| gtk_spinner_start (GTK_SPINNER (spinner)); | |
| gtk_widget_show_all (spinner_dialog); | |
| gtk_dialog_run (GTK_DIALOG (spinner_dialog)); | |
| /* Get file content */ | |
| tab = gtr_window_get_active_tab (window); | |
| po = gtr_tab_get_po (tab); | |
| filename = g_file_get_path (gtr_po_get_location (po)); | |
| mapped = g_mapped_file_new (filename, FALSE, &error); | |
| if (error != NULL) { | |
| g_warning ("Error opening file %s: %s", filename, (error)->message); | |
| } | |
| content = g_mapped_file_get_contents (mapped); | |
| size = g_mapped_file_get_length (mapped); | |
| active_notebook = gtr_window_get_notebook (window); | |
| header = gtr_po_get_header (po); | |
| /* Check mimetype */ | |
| mime_type = g_strdup (g_content_type_get_mime_type(content)); | |
| /* Get the authentication token from the user profile */ | |
| pmanager = gtr_profile_manager_get_default (); | |
| profile = gtr_profile_manager_get_active_profile (pmanager); | |
| auth_token = gtr_profile_get_auth_token (profile); | |
| auth = g_strconcat ("Bearer ", auth_token, NULL); | |
| selected_module = gtr_po_get_dl_module (po); | |
| if (selected_module == NULL) | |
| selected_module = gtr_header_get_dl_module (header); | |
| selected_branch = gtr_po_get_dl_branch (po); | |
| if (selected_branch == NULL) | |
| selected_branch = gtr_header_get_dl_branch (header); | |
| selected_domain = gtr_po_get_dl_domain (po); | |
| if (selected_domain == NULL) | |
| selected_domain = gtr_header_get_dl_domain (header); | |
| selected_team = gtr_po_get_dl_team (po); | |
| if (selected_team == NULL) | |
| selected_team = gtr_header_get_dl_team (header); | |
| /* API endpoint: modules/[module]/branches/[branch]/domains/[domain]/languages/[team]/upload */ | |
| upload_endpoint = g_strconcat((const gchar *)API_URL, | |
| "modules/", selected_module, | |
| "/branches/", selected_branch, | |
| "/domains/", selected_domain, | |
| "/languages/", selected_team, | |
| "/upload", NULL); | |
| /* Init multipart container */ | |
| mpart = soup_multipart_new (SOUP_FORM_MIME_TYPE_MULTIPART); | |
| buffer = soup_buffer_new (SOUP_MEMORY_COPY, content, size); | |
| soup_multipart_append_form_string (mpart, "file", "txt"); | |
| soup_multipart_append_form_file (mpart, "file", filename, | |
| mime_type, buffer); | |
| /* Get the associated message */ | |
| msg = soup_form_request_new_from_multipart (upload_endpoint, mpart); | |
| /* Append the authentication header*/ | |
| soup_message_headers_append (msg->request_headers, "Authentication", auth); | |
| session = soup_session_new (); | |
| soup_session_send_message (session, msg); | |
| if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) | |
| { | |
| gtk_widget_destroy (spinner_dialog); | |
| dialog = gtk_message_dialog_new (GTK_WINDOW (window), | |
| flags, | |
| GTK_MESSAGE_WARNING, | |
| GTK_BUTTONS_CLOSE, | |
| _("An error occurred while uploading the file: %s"), | |
| soup_status_get_phrase (msg->status_code)); | |
| gtk_dialog_run (GTK_DIALOG (dialog)); | |
| gtk_widget_destroy (dialog); | |
| return; | |
| } | |
| success_dialog = gtk_message_dialog_new (GTK_WINDOW (window), | |
| flags, | |
| GTK_MESSAGE_INFO, | |
| GTK_BUTTONS_OK, | |
| _("The file '%s.%s.%s.%s' has been uploaded!"), | |
| selected_module, | |
| selected_branch, | |
| selected_team, | |
| selected_domain); | |
| gtk_widget_destroy (spinner_dialog); | |
| gtk_dialog_run (GTK_DIALOG (success_dialog)); | |
| gtk_widget_destroy (success_dialog); | |
| gtr_notebook_enable_upload (active_notebook, FALSE); | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment