comparison console/gntstatus.c @ 14132:2c85b0f97dd0

[gaim-migrate @ 16774] Add a new custom status dialog, and a corresponding entry in the status-selector in the buddylist. But you cannot set any per-account status yet. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Tue, 15 Aug 2006 20:23:58 +0000
parents b71bfeaaed58
children 789d80a6b9d9
comparison
equal deleted inserted replaced
14131:db2311999862 14132:2c85b0f97dd0
1 #include <gnt.h> 1 #include <gnt.h>
2 #include <gntbox.h> 2 #include <gntbox.h>
3 #include <gntbutton.h> 3 #include <gntbutton.h>
4 #include <gntcombobox.h>
4 #include <gntentry.h> 5 #include <gntentry.h>
5 #include <gntlabel.h> 6 #include <gntlabel.h>
6 #include <gnttree.h> 7 #include <gnttree.h>
7 8
9 #include <notify.h>
8 #include <request.h> 10 #include <request.h>
9 11
10 #include "gntgaim.h" 12 #include "gntgaim.h"
11 #include "gntstatus.h" 13 #include "gntstatus.h"
12 14
14 { 16 {
15 GntWidget *window; 17 GntWidget *window;
16 GntWidget *tree; 18 GntWidget *tree;
17 } statuses; 19 } statuses;
18 20
21 typedef struct
22 {
23 GaimSavedStatus *saved;
24 GntWidget *window;
25 GntWidget *title;
26 GntWidget *type;
27 GntWidget *message;
28 /* XXX: Stuff needed for per-account statuses */
29 } EditStatus;
30
31 static GList *edits; /* List of opened edit-status dialogs */
32
19 static void 33 static void
20 reset_status_window(GntWidget *widget, gpointer null) 34 reset_status_window(GntWidget *widget, gpointer null)
21 { 35 {
22 statuses.window = NULL; 36 statuses.window = NULL;
23 statuses.tree = NULL; 37 statuses.tree = NULL;
46 } 60 }
47 61
48 static void 62 static void
49 really_delete_status(GaimSavedStatus *saved) 63 really_delete_status(GaimSavedStatus *saved)
50 { 64 {
51 /* XXX: Close any modify dialog opened for the savedstatus */ 65 GList *iter;
66
67 for (iter = edits; iter; iter = iter->next)
68 {
69 EditStatus *edit = iter->data;
70 if (edit->saved == saved)
71 {
72 gnt_widget_destroy(edit->window);
73 break;
74 }
75 }
76
52 if (statuses.tree) 77 if (statuses.tree)
53 gnt_tree_remove(GNT_TREE(statuses.tree), saved); 78 gnt_tree_remove(GNT_TREE(statuses.tree), saved);
54 79
55 gaim_savedstatus_delete(gaim_savedstatus_get_title(saved)); 80 gaim_savedstatus_delete(gaim_savedstatus_get_title(saved));
56 } 81 }
76 use_savedstatus_cb(GntWidget *widget, gpointer null) 101 use_savedstatus_cb(GntWidget *widget, gpointer null)
77 { 102 {
78 g_return_if_fail(statuses.tree != NULL); 103 g_return_if_fail(statuses.tree != NULL);
79 104
80 gaim_savedstatus_activate(gnt_tree_get_selection_data(GNT_TREE(statuses.tree))); 105 gaim_savedstatus_activate(gnt_tree_get_selection_data(GNT_TREE(statuses.tree)));
106 }
107
108 static void
109 edit_savedstatus_cb(GntWidget *widget, gpointer null)
110 {
111 g_return_if_fail(statuses.tree != NULL);
112
113 gg_savedstatus_edit(gnt_tree_get_selection_data(GNT_TREE(statuses.tree)));
81 } 114 }
82 115
83 void gg_savedstatus_show_all() 116 void gg_savedstatus_show_all()
84 { 117 {
85 GntWidget *window, *tree, *box, *button; 118 GntWidget *window, *tree, *box, *button;
112 g_signal_connect(G_OBJECT(button), "activate", 145 g_signal_connect(G_OBJECT(button), "activate",
113 G_CALLBACK(use_savedstatus_cb), NULL); 146 G_CALLBACK(use_savedstatus_cb), NULL);
114 147
115 button = gnt_button_new(_("Add")); 148 button = gnt_button_new(_("Add"));
116 gnt_box_add_widget(GNT_BOX(box), button); 149 gnt_box_add_widget(GNT_BOX(box), button);
150 g_signal_connect_swapped(G_OBJECT(button), "activate",
151 G_CALLBACK(gg_savedstatus_edit), NULL);
117 152
118 button = gnt_button_new(_("Edit")); 153 button = gnt_button_new(_("Edit"));
119 gnt_box_add_widget(GNT_BOX(box), button); 154 gnt_box_add_widget(GNT_BOX(box), button);
155 g_signal_connect(G_OBJECT(button), "activate",
156 G_CALLBACK(edit_savedstatus_cb), NULL);
120 157
121 button = gnt_button_new(_("Delete")); 158 button = gnt_button_new(_("Delete"));
122 gnt_box_add_widget(GNT_BOX(box), button); 159 gnt_box_add_widget(GNT_BOX(box), button);
123 g_signal_connect(G_OBJECT(button), "activate", 160 g_signal_connect(G_OBJECT(button), "activate",
124 G_CALLBACK(ask_before_delete), NULL); 161 G_CALLBACK(ask_before_delete), NULL);
131 g_signal_connect(G_OBJECT(window), "destroy", 168 g_signal_connect(G_OBJECT(window), "destroy",
132 G_CALLBACK(reset_status_window), NULL); 169 G_CALLBACK(reset_status_window), NULL);
133 gnt_widget_show(window); 170 gnt_widget_show(window);
134 } 171 }
135 172
173 static void
174 update_edit_list(GntWidget *widget, EditStatus *edit)
175 {
176 edits = g_list_remove(edits, edit);
177 gaim_notify_close_with_handle(edit);
178 g_free(edit);
179 }
180
181 static void
182 save_savedstatus_cb(GntWidget *button, EditStatus *edit)
183 {
184 const char *title, *message;
185 GaimStatusPrimitive prim;
186 GaimSavedStatus *find;
187
188 title = gnt_entry_get_text(GNT_ENTRY(edit->title));
189 message = gnt_entry_get_text(GNT_ENTRY(edit->message));
190 if (!message || !*message)
191 message = NULL;
192
193 prim = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(edit->type)));
194
195 if (!title || !*title)
196 {
197 gaim_notify_error(edit, _("Error"), _("Invalid title"),
198 _("Please enter a non-empty title for the status."));
199 return;
200 }
201
202 find = gaim_savedstatus_find(title);
203 if (find && find != edit->saved)
204 {
205 gaim_notify_error(edit, _("Error"), _("Duplicate title"),
206 _("Please enter a different title for the status."));
207 return;
208 }
209
210 if (edit->saved == NULL)
211 {
212 edit->saved = gaim_savedstatus_new(title, prim);
213 gaim_savedstatus_set_message(edit->saved, message);
214 if (statuses.tree)
215 gnt_tree_add_row_last(GNT_TREE(statuses.tree), edit->saved,
216 gnt_tree_create_row(GNT_TREE(statuses.tree), title,
217 gaim_primitive_get_name_from_type(prim), message), NULL);
218 }
219 else
220 {
221 gaim_savedstatus_set_title(edit->saved, title);
222 gaim_savedstatus_set_type(edit->saved, prim);
223 gaim_savedstatus_set_message(edit->saved, message);
224 if (statuses.tree)
225 {
226 gnt_tree_change_text(GNT_TREE(statuses.tree), edit->saved, 0, title);
227 gnt_tree_change_text(GNT_TREE(statuses.tree), edit->saved, 1,
228 gaim_primitive_get_name_from_type(prim));
229 gnt_tree_change_text(GNT_TREE(statuses.tree), edit->saved, 2, message);
230 }
231 }
232
233 if (g_object_get_data(G_OBJECT(button), "use"))
234 gaim_savedstatus_activate(edit->saved);
235
236 gnt_widget_destroy(edit->window);
237 }
238
136 void gg_savedstatus_edit(GaimSavedStatus *saved) 239 void gg_savedstatus_edit(GaimSavedStatus *saved)
137 { 240 {
138 } 241 EditStatus *edit;
139 242 GntWidget *window, *box, *button, *entry, *combo, *label;
243 GaimStatusPrimitive prims[] = {GAIM_STATUS_AVAILABLE, GAIM_STATUS_AWAY,
244 GAIM_STATUS_INVISIBLE, GAIM_STATUS_OFFLINE, GAIM_STATUS_UNSET}, current;
245 int i;
246
247 if (saved)
248 {
249 GList *iter;
250 for (iter = edits; iter; iter = iter->next)
251 {
252 edit = iter->data;
253 if (edit->saved == saved)
254 return;
255 }
256 }
257
258 edit = g_new0(EditStatus, 1);
259 edit->saved = saved;
260 edit->window = window = gnt_vbox_new(FALSE);
261 gnt_box_set_toplevel(GNT_BOX(window), TRUE);
262 gnt_box_set_title(GNT_BOX(window), _("Edit Status"));
263 gnt_box_set_fill(GNT_BOX(window), TRUE);
264 gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_LEFT);
265 gnt_box_set_pad(GNT_BOX(window), 0);
266
267 edits = g_list_append(edits, edit);
268
269 /* Title */
270 box = gnt_hbox_new(FALSE);
271 gnt_box_add_widget(GNT_BOX(window), box);
272 gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Title")));
273
274 edit->title = entry = gnt_entry_new(saved ? gaim_savedstatus_get_title(saved) : NULL);
275 gnt_box_add_widget(GNT_BOX(box), entry);
276
277 /* Type */
278 box = gnt_hbox_new(FALSE);
279 gnt_box_add_widget(GNT_BOX(window), box);
280 gnt_box_add_widget(GNT_BOX(box), label = gnt_label_new(_("Status")));
281 gnt_widget_set_size(label, 0, 1);
282
283 edit->type = combo = gnt_combo_box_new();
284 gnt_box_add_widget(GNT_BOX(box), combo);
285 current = saved ? gaim_savedstatus_get_type(saved) : GAIM_STATUS_UNSET;
286 for (i = 0; prims[i] != GAIM_STATUS_UNSET; i++)
287 {
288 gnt_combo_box_add_data(GNT_COMBO_BOX(combo), GINT_TO_POINTER(prims[i]),
289 gaim_primitive_get_name_from_type(prims[i]));
290 if (prims[i] == current)
291 gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), GINT_TO_POINTER(current));
292 }
293
294 /* Message */
295 box = gnt_hbox_new(FALSE);
296 gnt_box_add_widget(GNT_BOX(window), box);
297 gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Message")));
298
299 edit->message = entry = gnt_entry_new(saved ? gaim_savedstatus_get_message(saved) : NULL);
300 gnt_box_add_widget(GNT_BOX(box), entry);
301
302 /* The buttons */
303 box = gnt_hbox_new(FALSE);
304 gnt_box_add_widget(GNT_BOX(window), box);
305
306 /* Save */
307 button = gnt_button_new(_("Save"));
308 gnt_box_add_widget(GNT_BOX(box), button);
309 g_object_set_data(G_OBJECT(button), "use", NULL);
310 g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit);
311
312 /* Save & Use */
313 button = gnt_button_new(_("Save & Use"));
314 gnt_box_add_widget(GNT_BOX(box), button);
315 g_object_set_data(G_OBJECT(button), "use", GINT_TO_POINTER(TRUE));
316 g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit);
317
318 /* Cancel */
319 button = gnt_button_new(_("Cancel"));
320 gnt_box_add_widget(GNT_BOX(box), button);
321 g_signal_connect_swapped(G_OBJECT(button), "activate",
322 G_CALLBACK(gnt_widget_destroy), window);
323
324 g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(update_edit_list), edit);
325
326 gnt_widget_show(window);
327 }
328