diff src/prpl.c @ 3730:a20bf3d247ff

[gaim-migrate @ 3868] Pretty do_ask_dialog. I also "fixed" the "hitting yes calls the 'no' function anyway" behavior. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 17 Oct 2002 21:29:53 +0000
parents e941bfbacf7c
children 6767b4b1ce31
line wrap: on
line diff
--- a/src/prpl.c	Thu Oct 17 21:23:09 2002 +0000
+++ b/src/prpl.c	Thu Oct 17 21:29:53 2002 +0000
@@ -137,45 +137,68 @@
 	gtk_widget_destroy(b);
 }
 
-void do_ask_dialog(const char *text, void *data, void *doit, void *dont)
+struct doaskstruct {
+	void (*yesfunc)(gpointer);
+	void (*nofunc)(gpointer);
+	gpointer data;
+};
+
+static void do_ask_callback(GtkDialog *d, gint resp, struct doaskstruct *doask)
+{
+	switch (resp) 
+		{
+		case GTK_RESPONSE_YES:
+			if (doask->yesfunc)
+				doask->yesfunc(doask->data);
+			break;
+		case GTK_RESPONSE_NO:
+		case GTK_RESPONSE_DELETE_EVENT:
+			if (doask->nofunc)
+				doask->nofunc(doask->data);
+			break;
+		}
+	g_free(doask);
+}
+
+
+void do_ask_dialog(const char *prim, const char *sec, void *data, char *yestext, void *doit, char *notext, void *dont)
 {
 	GtkWidget *window;
-	GtkWidget *vbox;
+	GtkWidget *hbox;
 	GtkWidget *label;
-	GtkWidget *hbox;
-	GtkWidget *button;
+	char labeltext[1024 * 2];
+	char filename = g_build_filename(DATADIR, "pixmaps", "gaim", "dialogs", "gaim_question.png", NULL);
+	GtkWidget *img = gtk_image_new_from_file(filename);
+	struct doaskstruct *doask = g_new0(struct doaskstruct, 1);
 
-	GAIM_DIALOG(window);
-	gtk_window_set_wmclass(GTK_WINDOW(window), "accept", "Gaim");
-	gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, TRUE);
-	gtk_window_set_title(GTK_WINDOW(window), _("Accept?"));
-	gtk_widget_realize(window);
-	if (dont)
-		gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(dont), data);
+	doask->yesfunc = doit;
+	doask->nofunc  = dont;
+	doask->data    = data;
 
-	vbox = gtk_vbox_new(FALSE, 5);
-	gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
-	gtk_container_add(GTK_CONTAINER(window), vbox);
+	g_free(filename);
+	gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
 
-	label = gtk_label_new(text);
-	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
-
-	hbox = gtk_hbox_new(FALSE, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+	window = gtk_dialog_new_with_buttons("", NULL, GTK_DIALOG_MODAL, yestext, GTK_RESPONSE_YES, notext, GTK_RESPONSE_NO, NULL);
+	gtk_dialog_set_default_response (GTK_DIALOG(window), GTK_RESPONSE_YES);
+	g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(do_ask_callback), doask);
+	
+	gtk_container_set_border_width (GTK_CONTAINER(window), 6);
+	gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+	gtk_dialog_set_has_separator(GTK_DIALOG(window), FALSE);
+	gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(window)->vbox), 12);
+	gtk_container_set_border_width (GTK_CONTAINER(GTK_DIALOG(window)->vbox), 6);
 
-	button = picture_button(window, _("Cancel"), cancel_xpm);
-	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(des_win), window);
-
-	button = picture_button(window, _("Accept"), ok_xpm);
-	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-	if (dont)
-		gtk_object_set_user_data(GTK_OBJECT(button), data);
-	if (doit)
-		gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(doit), data);
-	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(rem_win), window);
-
+	hbox = gtk_hbox_new(FALSE, 12);
+	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), hbox);
+	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+	
+	g_snprintf(labeltext, sizeof(labeltext), "<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s", prim, sec ? sec : "");
+	label = gtk_label_new(NULL);
+	gtk_label_set_markup(GTK_LABEL(label), labeltext);
+	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	
 	gtk_widget_show_all(window);
 }
 
@@ -562,7 +585,7 @@
 	char *alias;
 };
 
-static void dont_add(gpointer x, struct got_add *ga)
+static void dont_add(struct got_add *ga)
 {
 	g_free(ga->who);
 	if (ga->alias)
@@ -570,10 +593,11 @@
 	g_free(ga);
 }
 
-static void do_add(gpointer x, struct got_add *ga)
+static void do_add(struct got_add *ga)
 {
 	if (g_slist_find(connections, ga->gc))
 		show_add_buddy(ga->gc, ga->who, NULL, ga->alias);
+	dont_add(ga);
 }
 
 void show_got_added(struct gaim_connection *gc, const char *id,
@@ -598,7 +622,7 @@
 	if (find_buddy(gc, ga->who))
 		do_error_dialog(buf, NULL, GAIM_INFO);
 	else
-		do_ask_dialog(buf, ga, do_add, dont_add);
+		do_ask_dialog(buf, NULL, ga, _("Add"), do_add, _("Cancel"), dont_add);
 }
 
 static GtkWidget *regdlg = NULL;