Lines 78-85
create_tag_string (GtkTreeModel *model,
Link Here
|
78 |
return FALSE; |
78 |
return FALSE; |
79 |
} |
79 |
} |
80 |
|
80 |
|
|
|
81 |
static void |
82 |
tags_set_fg(GtkTreeViewColumn *column, GtkCellRenderer *cell, |
83 |
GtkTreeModel *model, GtkTreeIter *iter, gpointer data) |
84 |
{ |
85 |
GSList *prev = (GSList *) data; |
86 |
gchar *text; |
87 |
|
88 |
gtk_tree_model_get(model, iter, 1, &text, -1); |
89 |
if (prev && g_slist_find_custom(prev, text, g_utf8_collate)) |
90 |
g_object_set(G_OBJECT(cell), "foreground", "Red", NULL); |
91 |
else |
92 |
g_object_set(G_OBJECT(cell), "foreground", "Black", NULL); |
93 |
g_free(text); |
94 |
} |
95 |
|
81 |
GtkWidget* |
96 |
GtkWidget* |
82 |
taglist_create (GSList *l) |
97 |
taglist_create (GSList *l, GSList **head) |
83 |
{ |
98 |
{ |
84 |
GtkWidget *treeview; |
99 |
GtkWidget *treeview; |
85 |
GtkListStore *store; |
100 |
GtkListStore *store; |
Lines 87-106
taglist_create (GSList *l)
Link Here
|
87 |
GtkCellRenderer *renderer; |
102 |
GtkCellRenderer *renderer; |
88 |
GtkTreeViewColumn *column; |
103 |
GtkTreeViewColumn *column; |
89 |
guint i; |
104 |
guint i; |
|
|
105 |
GSList *prev = *head, *p; |
90 |
|
106 |
|
91 |
/* create model */ |
107 |
/* create model */ |
92 |
store = gtk_list_store_new (2, G_TYPE_BOOLEAN, G_TYPE_STRING); |
108 |
store = gtk_list_store_new (2, G_TYPE_BOOLEAN, G_TYPE_STRING); |
93 |
for (i = 0; i < g_slist_length (l); i++) |
109 |
for (i = 0; i < g_slist_length (l); i++) |
94 |
{ |
110 |
{ |
95 |
LJTag *t = (LJTag *) g_slist_nth_data (l, i); |
111 |
LJTag *t = (LJTag *) g_slist_nth_data (l, i); |
|
|
112 |
gboolean check = FALSE; |
96 |
|
113 |
|
|
|
114 |
if (prev && (p = g_slist_find_custom(prev, t->tag, g_utf8_collate)) != NULL) { |
115 |
check = TRUE; |
116 |
prev = g_slist_remove_link(prev, p); |
117 |
g_free(p->data); |
118 |
g_slist_free1(p); |
119 |
} |
97 |
gtk_list_store_append (store, &iter); |
120 |
gtk_list_store_append (store, &iter); |
98 |
gtk_list_store_set (store, &iter, |
121 |
gtk_list_store_set (store, &iter, |
99 |
0, FALSE, |
122 |
0, check, |
100 |
1, t->tag, |
123 |
1, t->tag, |
101 |
-1); |
124 |
-1); |
102 |
} |
125 |
} |
103 |
|
126 |
|
|
|
127 |
/* rest of the typed tags */ |
128 |
for (p = prev; p; p = g_slist_next(p)) { |
129 |
gtk_list_store_append(store, &iter); |
130 |
gtk_list_store_set(store, &iter, |
131 |
0, TRUE, |
132 |
1, p->data, |
133 |
-1); |
134 |
} |
135 |
|
104 |
/* create treeview */ |
136 |
/* create treeview */ |
105 |
treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); |
137 |
treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); |
106 |
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); |
138 |
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); |
Lines 120-139
taglist_create (GSList *l)
Link Here
|
120 |
column = gtk_tree_view_column_new_with_attributes (_("Tag name"), |
152 |
column = gtk_tree_view_column_new_with_attributes (_("Tag name"), |
121 |
renderer, "text", 1, |
153 |
renderer, "text", 1, |
122 |
NULL); |
154 |
NULL); |
|
|
155 |
|
156 |
gtk_tree_view_column_set_cell_data_func(column, renderer, tags_set_fg, |
157 |
prev, NULL); |
158 |
|
123 |
gtk_tree_view_column_set_sort_column_id (column, 1); |
159 |
gtk_tree_view_column_set_sort_column_id (column, 1); |
124 |
gtk_tree_view_append_column (treeview, column); |
160 |
gtk_tree_view_append_column (treeview, column); |
125 |
|
161 |
|
|
|
162 |
/* update head of the prev list */ |
163 |
*head = prev; |
126 |
g_object_unref (store); |
164 |
g_object_unref (store); |
127 |
|
165 |
|
128 |
return treeview; |
166 |
return treeview; |
129 |
} |
167 |
} |
130 |
|
168 |
|
|
|
169 |
static GSList * |
170 |
tags_split(gchar *typed) { |
171 |
GSList *head = NULL; |
172 |
gchar **result, **p; |
173 |
|
174 |
if (typed == NULL || *typed == '\0') |
175 |
return NULL; |
176 |
|
177 |
for (p = result = g_strsplit(typed, ",", 0); *p; p++) { |
178 |
gchar *token = g_strstrip(*p); |
179 |
if (*token) |
180 |
head = g_slist_prepend(head, g_utf8_strdown(token, -1)); |
181 |
} |
182 |
g_strfreev(result); |
183 |
return head; |
184 |
} |
185 |
|
131 |
gchar* |
186 |
gchar* |
132 |
tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal) |
187 |
tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal, gchar *typed) |
133 |
{ |
188 |
{ |
134 |
GtkWidget *dlg, *sw, *tv; |
189 |
GtkWidget *dlg, *sw, *tv; |
135 |
GSList *list = NULL; |
190 |
GSList *list = NULL; |
136 |
gchar *taglist = NULL; |
191 |
gchar *taglist = NULL; |
|
|
192 |
GSList *prev; |
137 |
|
193 |
|
138 |
if (acc == NULL) return NULL; |
194 |
if (acc == NULL) return NULL; |
139 |
|
195 |
|
Lines 156-162
tags_dialog (GtkWidget *win, JamAccountL
Link Here
|
156 |
GTK_POLICY_AUTOMATIC); |
212 |
GTK_POLICY_AUTOMATIC); |
157 |
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), sw, TRUE, TRUE, 0); |
213 |
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), sw, TRUE, TRUE, 0); |
158 |
|
214 |
|
159 |
tv = taglist_create (list); |
215 |
prev = tags_split(typed); |
|
|
216 |
tv = taglist_create (list, &prev); |
160 |
gtk_container_add (GTK_CONTAINER (sw), tv); |
217 |
gtk_container_add (GTK_CONTAINER (sw), tv); |
161 |
|
218 |
|
162 |
gtk_window_resize(dlg, 60, 210); |
219 |
gtk_window_resize(dlg, 60, 210); |
Lines 177-181
tags_dialog (GtkWidget *win, JamAccountL
Link Here
|
177 |
|
234 |
|
178 |
gtk_widget_destroy (dlg); |
235 |
gtk_widget_destroy (dlg); |
179 |
|
236 |
|
|
|
237 |
/* free rest of prev list */ |
238 |
if (prev) { |
239 |
GSList *p; |
240 |
for (p = prev; p; p = g_slist_next(p)) { |
241 |
g_free(p->data); |
242 |
} |
243 |
g_slist_free(prev); |
244 |
} |
245 |
|
180 |
return taglist; |
246 |
return taglist; |
181 |
} |
247 |
} |