|
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 |
} |