Mercurial > pidgin
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 |