about.c: cosmetix
[k8lowj.git] / src / moodpicker.c
blob3a942ab311e0a74266f28d5ad52b048f652c8df9
1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5 */
7 #include "gtk-all.h"
8 #include <stdlib.h>
10 #include "liblj/livejournal.h"
12 #include "util-gtk.h"
13 #include "account.h"
15 typedef struct {
16 LJMood *mood;
17 GSList *children;
18 } MoodTree;
20 static gint
21 mood_tree_compare(gconstpointer a, gconstpointer b) {
22 const MoodTree *mta = a, *mtb = b;
23 return g_ascii_strcasecmp(mta->mood->name, mtb->mood->name);
26 static void
27 mood_tree_free(MoodTree *mt) {
28 g_slist_foreach(mt->children, (GFunc)mood_tree_free, NULL);
29 g_slist_free(mt->children);
30 g_free(mt);
33 static MoodTree*
34 build_mood_tree(LJServer *server) {
35 GSList *moodsleft, *cur;
36 GHashTable *moodtrees;
37 LJMood nullmood = { 0 };
38 MoodTree *mtbase;
40 moodtrees = g_hash_table_new(g_int_hash, g_int_equal);
41 moodsleft = g_slist_copy(server->moods);
43 mtbase = g_new0(MoodTree, 1);
44 mtbase->mood = &nullmood;
45 g_hash_table_insert(moodtrees, &mtbase->mood->id, mtbase);
47 while (moodsleft) {
48 LJMood *mood = NULL;
49 MoodTree *mtparent = NULL, *mtnew;
50 GSList *last = NULL;
52 /* find mood that has a parent in the tree. */
53 for (cur = moodsleft; cur; last = cur, cur = cur->next) {
54 mood = cur->data;
55 mtparent = g_hash_table_lookup(moodtrees, &mood->parentid);
56 if (mtparent)
57 break;
59 if (!cur) {
60 if (moodsleft) {
61 mood = moodsleft->data;
62 g_warning("nowhere to attach mood %d (%s) to %d?\n",
63 mood->id, mood->name, mood->parentid);
65 break;
68 if (last) last->next = cur->next;
69 else moodsleft = cur->next;
70 g_slist_free_1(cur);
72 mtnew = g_new0(MoodTree, 1);
73 mtnew->mood = mood;
74 mtparent->children = g_slist_insert_sorted(
75 mtparent->children, mtnew, mood_tree_compare);
76 g_hash_table_insert(moodtrees, &mtnew->mood->id, mtnew);
79 g_hash_table_destroy(moodtrees);
80 mtbase->mood = NULL;
81 return mtbase;
84 static void
85 populate_mood_list(GtkTreeStore *store, MoodTree *mtbase, GtkTreeIter *parent) {
86 GSList *l;
87 GtkTreeIter iter;
88 MoodTree *mt;
90 for (l = mtbase->children; l; l = l->next) {
91 mt = l->data;
93 gtk_tree_store_insert(store, &iter, parent, -1);
94 gtk_tree_store_set(store, &iter,
95 0, mt->mood->name,
96 1, mt->mood->id,
97 -1);
98 populate_mood_list(store, mt, &iter);
102 static GtkWidget*
103 make_mood_picker(MoodTree *mt) {
104 GtkTreeStore *store;
105 GtkWidget *tree;
106 GtkTreeViewColumn *column;
107 GtkCellRenderer *renderer;
109 store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
110 populate_mood_list(store, mt, NULL);
112 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
113 g_object_unref(G_OBJECT(store));
115 renderer = gtk_cell_renderer_text_new();
116 column = gtk_tree_view_column_new_with_attributes(
117 _("Mood"), renderer, "text", 0, NULL);
118 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
120 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
121 gtk_tree_view_expand_all(GTK_TREE_VIEW(tree));
123 return tree;
126 gboolean
127 mood_picker_run(GtkWindow *parent, JamHostLJ *host, int *moodid, char *moodtext) {
128 GtkWidget *dlg, *vbox, *hbox;
129 GtkWidget *textentry, *textpicker, *scroll;
130 MoodTree *mt;
132 mt = NULL; // XXX blogger build_mood_tree(host->server);
133 build_mood_tree(NULL);
135 dlg = gtk_dialog_new_with_buttons(_("Current Mood"), parent,
136 GTK_DIALOG_MODAL,
137 GTK_STOCK_OK, GTK_RESPONSE_OK,
138 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
139 NULL);
141 vbox = gtk_vbox_new(FALSE, 6);
142 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
144 hbox = gtk_hbox_new(FALSE, 6);
145 gtk_box_pack_start(GTK_BOX(hbox),
146 gtk_label_new_with_mnemonic(_("Mood _Text:")),
147 FALSE, FALSE, 0);
149 GtkWidget *vbox;
150 vbox = gtk_vbox_new(FALSE, 6);
151 textentry = gtk_entry_new();
152 gtk_box_pack_start(GTK_BOX(vbox), textentry, FALSE, FALSE, 0);
154 textpicker = make_mood_picker(mt);
155 scroll = scroll_wrap(textpicker);
156 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
157 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
158 gtk_box_pack_start(GTK_BOX(vbox), scroll, TRUE, TRUE, 0);
160 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
162 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
164 hbox = gtk_hbox_new(FALSE, 6);
165 gtk_box_pack_start(GTK_BOX(hbox),
166 gtk_label_new_with_mnemonic(_("Mood _Icon:")),
167 FALSE, FALSE, 0);
169 GtkWidget *vbox, *check;
170 vbox = gtk_vbox_new(FALSE, 6);
171 check = gtk_check_button_new_with_mnemonic(_("_Match Text"));
172 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
174 /*iconpicker = make_mood_picker(mt);
175 scroll = scroll_wrap(iconpicker);
176 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
177 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
178 gtk_box_pack_start(GTK_BOX(vbox), scroll, TRUE, TRUE, 0);*/
180 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
182 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
184 gtk_widget_show_all(vbox);
185 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox),
186 vbox, TRUE, TRUE, 0);
188 gtk_dialog_run(GTK_DIALOG(dlg));
189 gtk_widget_destroy(dlg);
191 mood_tree_free(mt);
193 return FALSE;