1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
10 #include "liblj/livejournal.h"
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
);
27 mood_tree_free(MoodTree
*mt
) {
28 g_slist_foreach(mt
->children
, (GFunc
)mood_tree_free
, NULL
);
29 g_slist_free(mt
->children
);
34 build_mood_tree(LJServer
*server
) {
35 GSList
*moodsleft
, *cur
;
36 GHashTable
*moodtrees
;
37 LJMood nullmood
= { 0 };
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
);
49 MoodTree
*mtparent
= NULL
, *mtnew
;
52 /* find mood that has a parent in the tree. */
53 for (cur
= moodsleft
; cur
; last
= cur
, cur
= cur
->next
) {
55 mtparent
= g_hash_table_lookup(moodtrees
, &mood
->parentid
);
61 mood
= moodsleft
->data
;
62 g_warning("nowhere to attach mood %d (%s) to %d?\n",
63 mood
->id
, mood
->name
, mood
->parentid
);
68 if (last
) last
->next
= cur
->next
;
69 else moodsleft
= cur
->next
;
72 mtnew
= g_new0(MoodTree
, 1);
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
);
85 populate_mood_list(GtkTreeStore
*store
, MoodTree
*mtbase
, GtkTreeIter
*parent
) {
90 for (l
= mtbase
->children
; l
; l
= l
->next
) {
93 gtk_tree_store_insert(store
, &iter
, parent
, -1);
94 gtk_tree_store_set(store
, &iter
,
98 populate_mood_list(store
, mt
, &iter
);
103 make_mood_picker(MoodTree
*mt
) {
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
));
127 mood_picker_run(GtkWindow
*parent
, JamHostLJ
*host
, int *moodid
, char *moodtext
) {
128 GtkWidget
*dlg
, *vbox
, *hbox
;
129 GtkWidget
*textentry
, *textpicker
, *scroll
;
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
,
137 GTK_STOCK_OK
, GTK_RESPONSE_OK
,
138 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
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:")),
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:")),
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
);