Mercurial > pidgin.yaz
comparison src/gtkstatus.c @ 10325:1657438d537b
[gaim-migrate @ 11532]
I wanted to get this out of my local tree. I don't know how much of this
we'll end up using, but I have a feeling we can use some of it.
I think it's hard to know what UI will work best without actually using
a few of them...
I'm going to try to get reading from status.xml working again
this week. I think we'll be able to use the same format, just extend
it a little bit. If anyone has done any work on that please let me know
so I don't duplicate anyone's work. I imagine I'll start by seeing
how much of the old status.xml-reading code is usable (I'm guessing
a lot of it).
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 07 Dec 2004 04:59:27 +0000 |
parents | |
children | 682201b69107 |
comparison
equal
deleted
inserted
replaced
10324:1034e77ff0ce | 10325:1657438d537b |
---|---|
1 /** | |
2 * @file gtkstatus.c GTK+ Status Editor UI | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 | |
26 #include "account.h" | |
27 #include "internal.h" | |
28 #include "status.h" | |
29 | |
30 #include "gtkblist.h" | |
31 #include "gtkgaim.h" | |
32 #include "gtkgaim-disclosure.h" | |
33 #include "gtkimhtml.h" | |
34 #include "gtkimhtmltoolbar.h" | |
35 #include "gtkstatus.h" | |
36 #include "gtkstock.h" | |
37 #include "gtkutils.h" | |
38 | |
39 enum | |
40 { | |
41 STATUS_EDITOR_COLUMN_CUSTOM_STATUS, | |
42 STATUS_EDITOR_COLUMN_ICON, | |
43 STATUS_EDITOR_COLUMN_SCREENNAME, | |
44 STATUS_EDITOR_NUM_COLUMNS | |
45 }; | |
46 | |
47 typedef struct | |
48 { | |
49 GtkWidget *window; | |
50 GtkListStore *model; | |
51 GtkWidget *treeview; | |
52 } StatusEditor; | |
53 | |
54 typedef struct | |
55 { | |
56 GtkWidget *window; | |
57 GtkListStore *model; | |
58 GtkWidget *treeview; | |
59 GtkWidget *modify_button; | |
60 GtkWidget *delete_button; | |
61 } StatusWindow; | |
62 | |
63 static StatusWindow *status_window = NULL; | |
64 | |
65 static gboolean | |
66 status_editor_destroy_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) | |
67 { | |
68 StatusWindow *dialog = user_data; | |
69 | |
70 g_free(dialog); | |
71 | |
72 return FALSE; | |
73 } | |
74 | |
75 static void | |
76 status_editor_cancel_cb(GtkButton *button, gpointer user_data) | |
77 { | |
78 StatusWindow *dialog = user_data; | |
79 | |
80 gtk_widget_destroy(dialog->window); | |
81 | |
82 g_free(dialog); | |
83 } | |
84 | |
85 static void | |
86 status_editor_save_cb(GtkButton *button, gpointer user_data) | |
87 { | |
88 /* TODO: Save the status */ | |
89 } | |
90 | |
91 /* TODO: Can this menu be created more automatically? */ | |
92 static GtkWidget * | |
93 create_status_type_menu() | |
94 { | |
95 GtkWidget *dropdown; | |
96 GtkWidget *menu; | |
97 GtkWidget *item; | |
98 | |
99 dropdown = gtk_option_menu_new(); | |
100 menu = gtk_menu_new(); | |
101 | |
102 /* GAIM_STATUS_AVAILABLE */ | |
103 item = gtk_menu_item_new_with_label(_("Available")); | |
104 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
105 gtk_widget_show(item); | |
106 | |
107 /* GAIM_STATUS_UNAVAILABLE */ | |
108 item = gtk_menu_item_new_with_label(_("Unavailable")); | |
109 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
110 gtk_widget_show(item); | |
111 | |
112 /* GAIM_STATUS_HIDDEN */ | |
113 item = gtk_menu_item_new_with_label(_("Hidden")); | |
114 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
115 gtk_widget_show(item); | |
116 | |
117 /* GAIM_STATUS_AWAY */ | |
118 item = gtk_menu_item_new_with_label(_("Away")); | |
119 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
120 gtk_widget_show(item); | |
121 | |
122 /* GAIM_STATUS_EXTENDED_AWAY */ | |
123 item = gtk_menu_item_new_with_label(_("Extended Away")); | |
124 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
125 gtk_widget_show(item); | |
126 | |
127 gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); | |
128 gtk_widget_show(menu); | |
129 | |
130 return dropdown; | |
131 } | |
132 | |
133 static void | |
134 status_editor_custom_status_cb(GtkCellRendererToggle *renderer, gchar *path_str, gpointer data) | |
135 { | |
136 /* StatusEditor *dialog = (StatusEditor *)data; */ | |
137 | |
138 /* TODO: Need to allow user to set a custom status for the highlighted account, somehow */ | |
139 } | |
140 | |
141 static void | |
142 status_editor_add_columns(StatusEditor *dialog) | |
143 { | |
144 GtkCellRenderer *renderer; | |
145 GtkTreeViewColumn *column; | |
146 | |
147 /* Custom status column */ | |
148 renderer = gtk_cell_renderer_toggle_new(); | |
149 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(dialog->treeview), | |
150 -1, _("Custom status"), | |
151 renderer, | |
152 "active", STATUS_EDITOR_COLUMN_CUSTOM_STATUS, | |
153 NULL); | |
154 column = gtk_tree_view_get_column(GTK_TREE_VIEW(dialog->treeview), 1); | |
155 g_signal_connect(G_OBJECT(renderer), "toggled", | |
156 G_CALLBACK(status_editor_custom_status_cb), dialog); | |
157 | |
158 /* Screen Name column */ | |
159 column = gtk_tree_view_column_new(); | |
160 gtk_tree_view_column_set_resizable(column, TRUE); | |
161 gtk_tree_view_column_set_title(column, _("Screen Name")); | |
162 gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); | |
163 gtk_tree_view_column_set_resizable(column, TRUE); | |
164 | |
165 /* Icon */ | |
166 renderer = gtk_cell_renderer_pixbuf_new(); | |
167 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
168 gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", | |
169 STATUS_EDITOR_COLUMN_ICON); | |
170 | |
171 /* Screen Name */ | |
172 renderer = gtk_cell_renderer_text_new(); | |
173 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
174 gtk_tree_view_column_add_attribute(column, renderer, "text", | |
175 STATUS_EDITOR_COLUMN_SCREENNAME); | |
176 } | |
177 | |
178 static void | |
179 status_editor_set_account(GtkListStore *store, GaimAccount *account, GtkTreeIter *iter) | |
180 { | |
181 GdkPixbuf *pixbuf; | |
182 GdkPixbuf *scale; | |
183 | |
184 scale = NULL; | |
185 | |
186 pixbuf = create_prpl_icon(account); | |
187 | |
188 if (pixbuf != NULL) | |
189 { | |
190 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
191 | |
192 if (!gaim_account_is_connected(account)) | |
193 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | |
194 } | |
195 | |
196 gtk_list_store_set(store, iter, | |
197 STATUS_EDITOR_COLUMN_ICON, scale, | |
198 STATUS_EDITOR_COLUMN_SCREENNAME, gaim_account_get_username(account), | |
199 -1); | |
200 | |
201 if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); | |
202 if (scale != NULL) g_object_unref(G_OBJECT(scale)); | |
203 } | |
204 | |
205 static void | |
206 status_editor_add_account(StatusEditor *dialog, GaimAccount *account) | |
207 { | |
208 GtkTreeIter iter; | |
209 | |
210 gtk_list_store_append(dialog->model, &iter); | |
211 | |
212 status_editor_set_account(dialog->model, account, &iter); | |
213 } | |
214 | |
215 static void | |
216 status_editor_populate_list(StatusEditor *dialog) | |
217 { | |
218 GList *l; | |
219 | |
220 gtk_list_store_clear(dialog->model); | |
221 | |
222 for (l = gaim_accounts_get_all(); l != NULL; l = l->next) | |
223 status_editor_add_account(dialog, (GaimAccount *)l->data); | |
224 } | |
225 | |
226 void | |
227 gaim_gtk_status_editor_show(void) | |
228 { | |
229 StatusEditor *dialog; | |
230 GtkSizeGroup *sg; | |
231 GtkWidget *bbox; | |
232 GtkWidget *button; | |
233 GtkWidget *dbox; | |
234 GtkWidget *disclosure; | |
235 GtkWidget *dropdown; | |
236 GtkWidget *entry; | |
237 GtkWidget *frame; | |
238 GtkWidget *hbox; | |
239 GtkWidget *label; | |
240 GtkWidget *sep; | |
241 GtkWidget *sw; | |
242 GtkWidget *text; | |
243 GtkWidget *toolbar; | |
244 GtkWidget *vbox; | |
245 GtkWidget *win; | |
246 | |
247 dialog = g_new0(StatusEditor, 1); | |
248 | |
249 dialog->window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
250 gtk_window_set_role(GTK_WINDOW(win), "status"); | |
251 gtk_window_set_title(GTK_WINDOW(win), _("Status")); | |
252 gtk_window_set_resizable(GTK_WINDOW(win), FALSE); | |
253 gtk_container_set_border_width(GTK_CONTAINER(win), 12); | |
254 | |
255 g_signal_connect(G_OBJECT(win), "delete_event", | |
256 G_CALLBACK(status_editor_destroy_cb), dialog); | |
257 | |
258 /* Setup the vbox */ | |
259 vbox = gtk_vbox_new(FALSE, 12); | |
260 gtk_container_add(GTK_CONTAINER(win), vbox); | |
261 gtk_widget_show(vbox); | |
262 | |
263 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
264 | |
265 /* Title */ | |
266 hbox = gtk_hbox_new(FALSE, 6); | |
267 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
268 gtk_widget_show(hbox); | |
269 | |
270 label = gtk_label_new_with_mnemonic(_("_Title:")); | |
271 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
272 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
273 gtk_widget_show(label); | |
274 gtk_size_group_add_widget(sg, label); | |
275 | |
276 entry = gtk_entry_new(); | |
277 gtk_entry_set_text(GTK_ENTRY(entry), _("Out of the office")); | |
278 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); | |
279 gtk_widget_show(entry); | |
280 | |
281 /* Status type */ | |
282 hbox = gtk_hbox_new(FALSE, 6); | |
283 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
284 gtk_widget_show(hbox); | |
285 | |
286 label = gtk_label_new_with_mnemonic(_("_Status:")); | |
287 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
288 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
289 gtk_widget_show(label); | |
290 gtk_size_group_add_widget(sg, label); | |
291 | |
292 dropdown = create_status_type_menu(); | |
293 gtk_box_pack_start(GTK_BOX(hbox), dropdown, TRUE, TRUE, 0); | |
294 gtk_widget_show(dropdown); | |
295 | |
296 /* Status message */ | |
297 hbox = gtk_hbox_new(FALSE, 6); | |
298 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
299 gtk_widget_show(hbox); | |
300 | |
301 label = gtk_label_new_with_mnemonic(_("_Message:")); | |
302 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
303 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
304 gtk_widget_show(label); | |
305 gtk_size_group_add_widget(sg, label); | |
306 | |
307 frame = gaim_gtk_create_imhtml(TRUE, &text, &toolbar); | |
308 gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); | |
309 gtk_widget_show(frame); | |
310 | |
311 /* Custom status message disclosure */ | |
312 disclosure = gaim_disclosure_new(_("Use a different status for some accounts"), | |
313 _("Use a different status for some accounts")); | |
314 gtk_box_pack_start(GTK_BOX(vbox), disclosure, FALSE, FALSE, 0); | |
315 gtk_widget_show(disclosure); | |
316 | |
317 /* Setup the box that the disclosure will cover */ | |
318 dbox = gtk_vbox_new(FALSE, 18); | |
319 gtk_box_pack_start(GTK_BOX(vbox), dbox, FALSE, FALSE, 0); | |
320 gaim_disclosure_set_container(GAIM_DISCLOSURE(disclosure), dbox); | |
321 | |
322 /* Custom status message treeview */ | |
323 sw = gtk_scrolled_window_new(NULL, NULL); | |
324 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
325 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
326 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
327 GTK_SHADOW_IN); | |
328 gtk_box_pack_start(GTK_BOX(dbox), sw, TRUE, TRUE, 0); | |
329 gtk_widget_show(sw); | |
330 | |
331 /* Create the list model */ | |
332 dialog->model = gtk_list_store_new(STATUS_EDITOR_NUM_COLUMNS, | |
333 G_TYPE_BOOLEAN, | |
334 GDK_TYPE_PIXBUF, G_TYPE_STRING); | |
335 | |
336 /* Create the treeview */ | |
337 dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); | |
338 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE); | |
339 gtk_widget_set_size_request(dialog->treeview, 400, 250); | |
340 gtk_container_add(GTK_CONTAINER(sw), dialog->treeview); | |
341 gtk_widget_show(dialog->treeview); | |
342 | |
343 /* Add columns */ | |
344 status_editor_add_columns(dialog); | |
345 | |
346 /* Populate list */ | |
347 status_editor_populate_list(dialog); | |
348 | |
349 /* Separator */ | |
350 sep = gtk_hseparator_new(); | |
351 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
352 gtk_widget_show(sep); | |
353 | |
354 /* Button box */ | |
355 bbox = gtk_hbutton_box_new(); | |
356 gtk_box_set_spacing(GTK_BOX(bbox), 6); | |
357 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
358 gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); | |
359 gtk_widget_show(bbox); | |
360 | |
361 /* Cancel button */ | |
362 button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); | |
363 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
364 gtk_widget_show(button); | |
365 | |
366 g_signal_connect(G_OBJECT(button), "clicked", | |
367 G_CALLBACK(status_editor_cancel_cb), dialog); | |
368 | |
369 /* Save button */ | |
370 /* TODO: This button needs to be made sensitive when the title box contains text */ | |
371 button = gtk_button_new_from_stock(GTK_STOCK_SAVE); | |
372 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
373 gtk_widget_set_sensitive(button, FALSE); | |
374 gtk_widget_show(button); | |
375 | |
376 g_signal_connect(G_OBJECT(button), "clicked", | |
377 G_CALLBACK(status_editor_save_cb), dialog); | |
378 | |
379 gtk_widget_show(win); | |
380 } | |
381 | |
382 static gboolean | |
383 status_window_destroy_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) | |
384 { | |
385 StatusWindow *dialog = user_data; | |
386 | |
387 dialog->window = NULL; | |
388 gaim_gtk_status_window_hide(); | |
389 | |
390 return FALSE; | |
391 } | |
392 | |
393 static void | |
394 status_window_add_cb(GtkButton *button, gpointer user_data) | |
395 { | |
396 gaim_gtk_status_editor_show(); | |
397 } | |
398 | |
399 static void | |
400 status_window_modify_cb(GtkButton *button, gpointer user_data) | |
401 { | |
402 /* TODO: Need to show a pre-populated status editor */ | |
403 } | |
404 | |
405 static void | |
406 status_window_delete_cb(GtkButton *button, gpointer user_data) | |
407 { | |
408 /* TODO: Need to delete a status from the list */ | |
409 } | |
410 | |
411 static void | |
412 status_window_close_cb(GtkButton *button, gpointer user_data) | |
413 { | |
414 gaim_gtk_status_window_hide(); | |
415 } | |
416 | |
417 /* | |
418 * TODO: This needs to use the user's saved statuses. | |
419 */ | |
420 static void | |
421 populate_saved_status_list(StatusWindow *dialog) | |
422 { | |
423 GtkTreeIter iter; | |
424 | |
425 gtk_list_store_clear(dialog->model); | |
426 | |
427 gtk_list_store_append(dialog->model, &iter); | |
428 gtk_list_store_set(dialog->model, &iter, 0, "Dinner time!", -1); | |
429 | |
430 gtk_list_store_append(dialog->model, &iter); | |
431 gtk_list_store_set(dialog->model, &iter, 0, "I am not here because I am cow tipping with Jimmy.", -1); | |
432 | |
433 gtk_list_store_append(dialog->model, &iter); | |
434 gtk_list_store_set(dialog->model, &iter, 0, "Picking up the kids from the zoo.", -1); | |
435 | |
436 gtk_list_store_append(dialog->model, &iter); | |
437 gtk_list_store_set(dialog->model, &iter, 0, "In a meeting discussing what to do when King Kong gets here.", -1); | |
438 } | |
439 | |
440 static GtkWidget * | |
441 create_saved_status_list(StatusWindow *dialog) | |
442 { | |
443 GtkWidget *sw; | |
444 GtkWidget *treeview; | |
445 GtkTreeViewColumn *column; | |
446 GtkCellRenderer *renderer; | |
447 | |
448 /* Create the scrolled window */ | |
449 sw = gtk_scrolled_window_new(0, 0); | |
450 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
451 GTK_POLICY_AUTOMATIC, | |
452 GTK_POLICY_ALWAYS); | |
453 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
454 GTK_SHADOW_IN); | |
455 gtk_widget_show(sw); | |
456 | |
457 /* Create the list model */ | |
458 dialog->model = gtk_list_store_new(1, G_TYPE_STRING); | |
459 | |
460 /* Create the treeview */ | |
461 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); | |
462 dialog->treeview = treeview; | |
463 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); | |
464 | |
465 gtk_container_add(GTK_CONTAINER(sw), treeview); | |
466 gtk_widget_show(treeview); | |
467 | |
468 /* Add columns */ | |
469 column = gtk_tree_view_column_new(); | |
470 gtk_tree_view_column_set_title(column, _("Title")); | |
471 gtk_tree_view_column_set_resizable(column, TRUE); | |
472 gtk_tree_view_column_set_sort_column_id(column, 0); | |
473 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); | |
474 renderer = gtk_cell_renderer_text_new(); | |
475 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
476 gtk_tree_view_column_add_attribute(column, renderer, "text", 0); | |
477 | |
478 /* Populate list */ | |
479 populate_saved_status_list(dialog); | |
480 | |
481 return sw; | |
482 } | |
483 | |
484 static gboolean | |
485 configure_cb(GtkWidget *widget, GdkEventConfigure *event, StatusWindow *dialog) | |
486 { | |
487 if (GTK_WIDGET_VISIBLE(widget)) { | |
488 gaim_prefs_set_int("/gaim/gtk/status/dialog/width", event->width); | |
489 gaim_prefs_set_int("/gaim/gtk/status/dialog/height", event->height); | |
490 } | |
491 | |
492 return FALSE; | |
493 } | |
494 | |
495 void | |
496 gaim_gtk_status_window_show(void) | |
497 { | |
498 StatusWindow *dialog; | |
499 GtkWidget *bbox; | |
500 GtkWidget *button; | |
501 GtkWidget *list; | |
502 GtkWidget *sep; | |
503 GtkWidget *vbox; | |
504 GtkWidget *win; | |
505 int width, height; | |
506 | |
507 if (status_window != NULL) { | |
508 gtk_window_present(GTK_WINDOW(status_window->window)); | |
509 return; | |
510 } | |
511 | |
512 status_window = dialog = g_new0(StatusWindow, 1); | |
513 | |
514 width = gaim_prefs_get_int("/gaim/gtk/status/dialog/width"); | |
515 height = gaim_prefs_get_int("/gaim/gtk/status/dialog/height"); | |
516 | |
517 dialog->window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
518 gtk_window_set_default_size(GTK_WINDOW(win), width, height); | |
519 gtk_window_set_role(GTK_WINDOW(win), "statuses"); | |
520 gtk_window_set_title(GTK_WINDOW(win), _("Saved Statuses")); | |
521 gtk_container_set_border_width(GTK_CONTAINER(win), 12); | |
522 | |
523 g_signal_connect(G_OBJECT(win), "delete_event", | |
524 G_CALLBACK(status_window_destroy_cb), dialog); | |
525 g_signal_connect(G_OBJECT(win), "configure_event", | |
526 G_CALLBACK(configure_cb), dialog); | |
527 | |
528 /* Setup the vbox */ | |
529 vbox = gtk_vbox_new(FALSE, 12); | |
530 gtk_container_add(GTK_CONTAINER(win), vbox); | |
531 gtk_widget_show(vbox); | |
532 | |
533 /* List of saved status states */ | |
534 list = create_saved_status_list(dialog); | |
535 gtk_box_pack_start(GTK_BOX(vbox), list, TRUE, TRUE, 0); | |
536 | |
537 /* Separator... */ | |
538 sep = gtk_hseparator_new(); | |
539 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
540 gtk_widget_show(sep); | |
541 | |
542 /* Button box. */ | |
543 bbox = gtk_hbutton_box_new(); | |
544 gtk_box_set_spacing(GTK_BOX(bbox), 6); | |
545 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
546 gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); | |
547 gtk_widget_show(bbox); | |
548 | |
549 /* Add button */ | |
550 button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
551 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
552 gtk_widget_show(button); | |
553 | |
554 g_signal_connect(G_OBJECT(button), "clicked", | |
555 G_CALLBACK(status_window_add_cb), dialog); | |
556 | |
557 /* Modify button */ | |
558 button = gtk_button_new_from_stock(GAIM_STOCK_MODIFY); | |
559 dialog->modify_button = button; | |
560 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
561 gtk_widget_set_sensitive(button, FALSE); | |
562 gtk_widget_show(button); | |
563 | |
564 g_signal_connect(G_OBJECT(button), "clicked", | |
565 G_CALLBACK(status_window_modify_cb), dialog); | |
566 | |
567 /* Delete button */ | |
568 button = gtk_button_new_from_stock(GTK_STOCK_DELETE); | |
569 dialog->delete_button = button; | |
570 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
571 gtk_widget_set_sensitive(button, FALSE); | |
572 gtk_widget_show(button); | |
573 | |
574 g_signal_connect(G_OBJECT(button), "clicked", | |
575 G_CALLBACK(status_window_delete_cb), dialog); | |
576 | |
577 /* Close button */ | |
578 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | |
579 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
580 gtk_widget_show(button); | |
581 | |
582 g_signal_connect(G_OBJECT(button), "clicked", | |
583 G_CALLBACK(status_window_close_cb), dialog); | |
584 | |
585 gtk_widget_show(win); | |
586 } | |
587 | |
588 void | |
589 gaim_gtk_status_window_hide(void) | |
590 { | |
591 if (status_window == NULL) | |
592 return; | |
593 | |
594 if (status_window->window != NULL) | |
595 gtk_widget_destroy(status_window->window); | |
596 | |
597 g_free(status_window); | |
598 status_window = NULL; | |
599 } | |
600 | |
601 void * | |
602 gaim_gtk_status_get_handle() | |
603 { | |
604 static int handle; | |
605 | |
606 return &handle; | |
607 } | |
608 | |
609 void | |
610 gaim_gtk_status_init(void) | |
611 { | |
612 gaim_prefs_add_none("/gaim/gtk/status"); | |
613 gaim_prefs_add_none("/gaim/gtk/status/dialog"); | |
614 gaim_prefs_add_int("/gaim/gtk/status/dialog/width", 550); | |
615 gaim_prefs_add_int("/gaim/gtk/status/dialog/height", 250); | |
616 } | |
617 | |
618 void | |
619 gaim_gtk_status_uninit(void) | |
620 { | |
621 gaim_gtk_status_window_hide(); | |
622 } |