diff options
-rw-r--r-- | filter/ChangeLog | 6 | ||||
-rw-r--r-- | filter/filter.glade | 8 | ||||
-rw-r--r-- | filter/rule-editor.c | 120 | ||||
-rw-r--r-- | filter/rule-editor.h | 4 | ||||
-rw-r--r-- | filter/vfolder-rule.c | 83 |
5 files changed, 141 insertions, 80 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog index 815481e7a7..cb0d1991e0 100644 --- a/filter/ChangeLog +++ b/filter/ChangeLog @@ -1,3 +1,9 @@ +2002-11-18 Jeffrey Stedfast <fejj@ximian.com> + + * rule-editor.c: Updated to use GtkTreeView. + + * vfolder-rule.c: Same. + 2002-11-13 Not Zed <NotZed@Ximian.com> * rule-context.c (load): Get the root node properly. diff --git a/filter/filter.glade b/filter/filter.glade index 079510db25..1c02f13dcc 100644 --- a/filter/filter.glade +++ b/filter/filter.glade @@ -330,9 +330,9 @@ <child> <widget class="GtkTreeView" id="rule_list"> <property name="visible">True</property> - <property name="headers_visible">True</property> + <property name="headers_visible">False</property> <property name="rules_hint">False</property> - <property name="reorderable">False</property> + <property name="reorderable">True</property> <property name="enable_search">True</property> </widget> </child> @@ -781,9 +781,9 @@ <child> <widget class="GtkTreeView" id="rule_list"> <property name="visible">True</property> - <property name="headers_visible">True</property> + <property name="headers_visible">False</property> <property name="rules_hint">False</property> - <property name="reorderable">False</property> + <property name="reorderable">True</property> <property name="enable_search">True</property> </widget> </child> diff --git a/filter/rule-editor.c b/filter/rule-editor.c index b1f465eab3..60ffa7762d 100644 --- a/filter/rule-editor.c +++ b/filter/rule-editor.c @@ -224,8 +224,9 @@ editor_destroy (RuleEditor *re, GObject *deadbeef) static void add_editor_response (GtkWidget *dialog, int button, RuleEditor *re) { - GtkWidget *item; - GList *l = NULL; + GtkTreeSelection *selection; + GtkTreePath *path; + GtkTreeIter iter; if (button == GTK_RESPONSE_ACCEPT) { if (!filter_rule_validate (re->edit)) { @@ -246,15 +247,11 @@ add_editor_response (GtkWidget *dialog, int button, RuleEditor *re) } g_object_ref (re->edit); - item = gtk_list_item_new_with_label (re->edit->name); - g_object_set_data ((GObject *) item, "rule", re->edit); - gtk_widget_show (item); - - l = g_list_append (l, GTK_LIST_ITEM (item)); - - gtk_list_append_items (re->list, l); - gtk_list_select_child (re->list, item); + gtk_list_store_append (re->model, &iter); + gtk_list_store_set (re->model, &iter, 0, re->edit->name, 1, re->edit, -1); + selection = gtk_tree_view_get_selection (re->list); + gtk_tree_selection_select_iter (selection, &iter); re->current = re->edit; rule_context_add_rule (re->context, re->current); @@ -302,7 +299,8 @@ static void edit_editor_response (GtkWidget *dialog, int button, RuleEditor *re) { FilterRule *rule; - GtkWidget *item; + GtkTreePath *path; + GtkTreeIter iter; int pos; if (button == GTK_RESPONSE_ACCEPT) { @@ -326,8 +324,12 @@ edit_editor_response (GtkWidget *dialog, int button, RuleEditor *re) pos = rule_context_get_rank_rule (re->context, re->current, re->source); if (pos != -1) { - item = g_list_nth_data (GTK_LIST (re->list)->children, pos); - gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), re->edit->name); + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, pos); + gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); + gtk_tree_path_free (path); + + gtk_list_store_set (re->model, &iter, 0, re->edit->name, -1); rule_editor_add_undo (re, RULE_EDITOR_LOG_EDIT, filter_rule_clone (re->current), pos, 0); @@ -373,23 +375,23 @@ rule_edit (GtkWidget *widget, RuleEditor *re) static void rule_delete (GtkWidget *widget, RuleEditor *re) { - int pos; - GList *l; - GtkListItem *item; + GtkTreeSelection *selection; + GtkTreePath *path; + GtkTreeIter iter; + int pos, len; d(printf ("delete rule\n")); pos = rule_context_get_rank_rule (re->context, re->current, re->source); if (pos != -1) { - int len; - rule_context_remove_rule (re->context, re->current); - item = g_list_nth_data (GTK_LIST (re->list)->children, pos); - l = g_list_append (NULL, item); - gtk_list_remove_items (re->list, l); - g_list_free (l); + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, pos); + gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); + gtk_list_store_remove (re->model, &iter); + gtk_tree_path_free (path); - rule_editor_add_undo( re, RULE_EDITOR_LOG_REMOVE, re->current, + rule_editor_add_undo (re, RULE_EDITOR_LOG_REMOVE, re->current, rule_context_get_rank_rule (re->context, re->current, re->current->source), 0); #if 0 g_object_unref (re->current); @@ -397,9 +399,16 @@ rule_delete (GtkWidget *widget, RuleEditor *re) re->current = NULL; /* now select the next rule */ - len = g_list_length (GTK_LIST (re->list)->children); + len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (re->model), NULL); pos = pos >= len ? len - 1 : pos; - gtk_list_select_item (GTK_LIST (re->list), pos); + + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, pos); + gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); + gtk_tree_path_free (path); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (re->list)); + gtk_tree_selection_select_iter (selection, &iter); } rule_editor_set_sensitive (re); @@ -408,8 +417,10 @@ rule_delete (GtkWidget *widget, RuleEditor *re) static void rule_move (RuleEditor *re, int from, int to) { - GList *l; - GtkListItem *item; + GtkTreeSelection *selection; + GtkTreePath *path; + GtkTreeIter iter; + FilterRule *rule; g_object_ref (re->current); rule_editor_add_undo (re, RULE_EDITOR_LOG_RANK, re->current, @@ -418,11 +429,18 @@ rule_move (RuleEditor *re, int from, int to) d(printf ("moving %d to %d\n", from, to)); rule_context_rank_rule (re->context, re->current, to); - item = g_list_nth_data (re->list->children, from); - l = g_list_append (NULL, item); - gtk_list_remove_items_no_unref (re->list, l); - gtk_list_insert_items (re->list, l, to); - gtk_list_select_child (re->list, GTK_WIDGET (item)); + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, from); + gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); + gtk_tree_path_free (path); + + gtk_tree_model_get (GTK_TREE_MODEL (re->model), &iter, 1, &rule, -1); + g_assert (rule != NULL); + + gtk_list_store_remove (re->model, &iter); + gtk_list_store_insert (re->model, &iter, to); + + gtk_list_store_set (re->model, &iter, 0, rule->name, 1, rule, -1); rule_editor_set_sensitive (re); } @@ -484,9 +502,17 @@ set_sensitive (RuleEditor *re) static void -select_rule (GtkWidget *w, GtkWidget *child, RuleEditor *re) +cursor_changed (GtkWidget *list, RuleEditor *re) { - re->current = g_object_get_data ((GObject *) child, "rule"); + GtkTreeViewColumn *column; + GtkTreePath *path; + GtkTreeIter iter; + + gtk_tree_view_get_cursor (re->list, &path, &column); + gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); + gtk_tree_path_free (path); + + gtk_tree_model_get (GTK_TREE_MODEL (re->model), &iter, 1, &re->current, -1); g_assert (re->current); @@ -506,22 +532,16 @@ static void set_source (RuleEditor *re, const char *source) { FilterRule *rule = NULL; - GList *newitems = NULL; + GtkTreeIter iter; - gtk_list_clear_items (GTK_LIST (re->list), 0, -1); + gtk_list_store_clear (re->model); d(printf("Checking for rules that are of type %s\n", source?source:"<nil>")); while ((rule = rule_context_next_rule (re->context, rule, source)) != NULL) { - GtkWidget *item; - - d(printf(" hit %s(%s)\n", rule->name, source ? source : "<nil>")); - item = gtk_list_item_new_with_label (rule->name); - g_object_set_data ((GObject *) item, "rule", rule); - gtk_widget_show (GTK_WIDGET (item)); - newitems = g_list_append (newitems, item); + gtk_list_store_append (re->model, &iter); + gtk_list_store_set (re->model, &iter, 0, rule->name, 1, rule, -1); } - gtk_list_append_items (re->list, newitems); g_free (re->source); re->source = g_strdup (source); re->current = NULL; @@ -619,6 +639,7 @@ editor_clicked (GtkWidget *dialog, int button, RuleEditor *re) void rule_editor_construct (RuleEditor *re, RuleContext *context, GladeXML *gui, const char *source) { + GtkTreeSelection *selection; GtkWidget *w; int i; @@ -635,9 +656,14 @@ rule_editor_construct (RuleEditor *re, RuleContext *context, GladeXML *gui, cons g_signal_connect (w, "clicked", edit_buttons[i].func, re); } - re->list = (GtkList *) w = glade_xml_get_widget (gui, "rule_list"); - g_signal_connect (w, "select_child", GTK_SIGNAL_FUNC (select_rule), re); - g_signal_connect (w, "button_press_event", GTK_SIGNAL_FUNC (double_click), re); + re->model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); + re->list = (GtkTreeView *) glade_xml_get_widget (gui, "rule_list"); + gtk_tree_view_set_model (re->list, (GtkTreeModel *) re->model); + selection = gtk_tree_view_get_selection (re->list); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + + g_signal_connect (re->list, "cursor-changed", GTK_SIGNAL_FUNC (cursor_changed), re); + g_signal_connect (re->list, "button_press_event", GTK_SIGNAL_FUNC (double_click), re); g_signal_connect (re, "clicked", GTK_SIGNAL_FUNC (editor_clicked), re); rule_editor_set_source (re, source); diff --git a/filter/rule-editor.h b/filter/rule-editor.h index a184b81c16..60185f965e 100644 --- a/filter/rule-editor.h +++ b/filter/rule-editor.h @@ -44,7 +44,9 @@ typedef struct _RuleEditorUndo RuleEditorUndo; struct _RuleEditor { GtkDialog parent_object; - GtkList *list; + GtkListStore *model; + GtkTreeView *list; + RuleContext *context; FilterRule *current; FilterRule *edit; /* for editing/adding rules, so we only do 1 at a time */ diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c index ad31490188..923f24a55b 100644 --- a/filter/vfolder-rule.c +++ b/filter/vfolder-rule.c @@ -254,9 +254,9 @@ vfolder_eq (FilterRule *fr, FilterRule *cm) static xmlNodePtr xml_encode (FilterRule *fr) { + VfolderRule *vr = (VfolderRule *) fr; xmlNodePtr node, set, work; GList *l; - VfolderRule *vr = (VfolderRule *)fr; node = FILTER_RULE_CLASS (parent_class)->xml_encode (fr); g_assert(node != NULL); @@ -342,7 +342,8 @@ struct _source_data { RuleContext *rc; VfolderRule *vr; const char *current; - GtkList *list; + GtkListStore *model; + GtkTreeView *list; GtkButton *buttons[BUTTON_LAST]; }; @@ -365,9 +366,18 @@ set_sensitive (struct _source_data *data) } static void -select_source (GtkWidget *widget, GtkWidget *child, struct _source_data *data) +select_source (GtkWidget *list, struct _source_data *data) { - data->current = g_object_get_data ((GObject *) child, "source"); + GtkTreeViewColumn *column; + GtkTreePath *path; + GtkTreeIter iter; + + gtk_tree_view_get_cursor (data->list, &path, &column); + gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path); + gtk_tree_path_free (path); + + gtk_tree_model_get (GTK_TREE_MODEL (data->model), &iter, 0, &data->current, -1); + set_sensitive (data); } @@ -384,7 +394,8 @@ source_add (GtkWidget *widget, struct _source_data *data) { static const char *allowed_types[] = { "mail/*", NULL }; GNOME_Evolution_Folder *folder; - GtkListItem *item; + GtkTreeSelection *selection; + GtkTreeIter iter; char *def, *uri; GList *l; @@ -408,13 +419,10 @@ source_add (GtkWidget *widget, struct _source_data *data) uri = g_strdup (folder->physicalUri); data->vr->sources = g_list_append (data->vr->sources, uri); - l = NULL; - item = (GtkListItem *)gtk_list_item_new_with_label (uri); - g_object_set_data ((GObject *) item, "source", uri); - gtk_widget_show ((GtkWidget *) item); - l = g_list_append (NULL, item); - gtk_list_append_items (data->list, l); - gtk_list_select_child (data->list, (GtkWidget *) item); + gtk_list_store_append (data->model, &iter); + gtk_list_store_set (data->model, &iter, 0, uri, -1); + selection = gtk_tree_view_get_selection (data->list); + gtk_tree_selection_select_iter (selection, &iter); data->current = uri; } @@ -425,24 +433,44 @@ source_add (GtkWidget *widget, struct _source_data *data) static void source_remove (GtkWidget *widget, struct _source_data *data) { + GtkTreeSelection *selection; const char *source; + GtkTreePath *path; + GtkTreeIter iter; int index = 0; GList *l; - GtkListItem *item; + int len; source = NULL; while ((source = vfolder_rule_next_source (data->vr, source))) { if (data->current == source) { vfolder_rule_remove_source (data->vr, source); - item = g_list_nth_data (data->list->children, index); - l = g_list_append (NULL, item); - gtk_list_remove_items (data->list, l); - g_list_free (l); + + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, index); + gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path); + gtk_list_store_remove (data->model, &iter); + gtk_tree_path_free (path); + data->current = NULL; + + /* now select the next rule */ + len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (data->model), NULL); + index = index >= len ? len - 1 : index; + + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, index); + gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path); + gtk_tree_path_free (path); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->list)); + gtk_tree_selection_select_iter (selection, &iter); + break; } index++; } + set_sensitive (data); } @@ -458,10 +486,12 @@ static GtkWidget * get_widget (FilterRule *fr, RuleContext *rc) { VfolderRule *vr = (VfolderRule *) fr; + GtkTreeSelection *selection; struct _source_data *data; GtkWidget *widget, *frame; GtkOptionMenu *omenu; const char *source; + GtkTreeIter iter; GladeXML *gui; int i, row; GList *l; @@ -483,22 +513,19 @@ get_widget (FilterRule *fr, RuleContext *rc) g_signal_connect (data->buttons[i], "clicked", edit_buttons[i].func, data); } - data->list = (GtkList *) glade_xml_get_widget (gui, "source_list"); + data->model = gtk_list_store_new (1, G_TYPE_STRING); + data->list = (GtkTreeView *) glade_xml_get_widget (gui, "source_list"); + gtk_tree_view_set_model (data->list, (GtkTreeModel *) data->model); + selection = gtk_tree_view_get_selection (data->list); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - l = NULL; source = NULL; while ((source = vfolder_rule_next_source (vr, source))) { - GtkListItem *item; - - item = (GtkListItem *) gtk_list_item_new_with_label (source); - g_object_set_data ((GObject *) item, "source", (void *) source); - gtk_widget_show (GTK_WIDGET (item)); - l = g_list_append (l, item); + gtk_list_store_append (data->model, &iter); + gtk_list_store_set (data->model, &iter, 0, source, -1); } - gtk_list_append_items (data->list, l); - - g_signal_connect (data->list, "select_child", GTK_SIGNAL_FUNC (select_source), data); + g_signal_connect (data->list, "cursor-changed", GTK_SIGNAL_FUNC (select_source), data); omenu = (GtkOptionMenu *) glade_xml_get_widget (gui, "source_option"); l = GTK_MENU_SHELL (omenu->menu)->children; |