talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit c0f8f599db4f7eb4c7a6b72d8344bf060fba3a6b
parent 2489540208a09f6795082944e8c8c3c3facbc933
Author: wwp <subscript@free.fr>
Date:   Fri, 20 Aug 2021 12:08:49 +0200

Add top/bottom buttons to the actions list. Simplify existing code of up/down callbacks.

Diffstat:
Msrc/prefs_actions.c | 143+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 86 insertions(+), 57 deletions(-)

diff --git a/src/prefs_actions.c b/src/prefs_actions.c @@ -98,8 +98,10 @@ static void prefs_actions_delete_cb (gpointer gtk_action, gpointer data); static void prefs_actions_delete_all_cb (gpointer gtk_action, gpointer data); static void prefs_actions_clear_cb (gpointer gtk_action, gpointer data); static void prefs_actions_duplicate_cb (gpointer gtk_action, gpointer data); +static void prefs_actions_top_cb (GtkWidget *w, gpointer data); static void prefs_actions_up_cb (GtkWidget *w, gpointer data); static void prefs_actions_down_cb (GtkWidget *w, gpointer data); +static void prefs_actions_bottom_cb (GtkWidget *w, gpointer data); static gint prefs_actions_deleted (GtkWidget *widget, GdkEventAny *event, gpointer *data); @@ -195,8 +197,11 @@ static void prefs_actions_create(MainWindow *mainwin) GtkWidget *info_btn; GtkWidget *btn_vbox; + GtkWidget *spc_vbox; + GtkWidget *top_btn; GtkWidget *up_btn; GtkWidget *down_btn; + GtkWidget *bottom_btn; static GdkGeometry geometry; debug_print("Creating actions configuration window...\n"); @@ -385,6 +390,16 @@ static void prefs_actions_create(MainWindow *mainwin) gtk_widget_show(btn_vbox); gtk_box_pack_start(GTK_BOX(cond_hbox), btn_vbox, FALSE, FALSE, 0); + top_btn = gtk_button_new_from_stock(GTK_STOCK_GOTO_TOP); + gtk_widget_show(top_btn); + gtk_box_pack_start(GTK_BOX(btn_vbox), top_btn, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(top_btn), "clicked", + G_CALLBACK(prefs_actions_top_cb), NULL); + CLAWS_SET_TIP(top_btn, + _("Move the selected action to the top")); + + PACK_SPACER(btn_vbox, spc_vbox, VSPACING_NARROW_2); + up_btn = gtk_button_new_from_stock(GTK_STOCK_GO_UP); gtk_widget_show(up_btn); gtk_box_pack_start(GTK_BOX(btn_vbox), up_btn, FALSE, FALSE, 0); @@ -401,6 +416,16 @@ static void prefs_actions_create(MainWindow *mainwin) CLAWS_SET_TIP(down_btn, _("Move selected action down")); + PACK_SPACER(btn_vbox, spc_vbox, VSPACING_NARROW_2); + + bottom_btn = gtk_button_new_from_stock(GTK_STOCK_GOTO_BOTTOM); + gtk_widget_show(bottom_btn); + gtk_box_pack_start(GTK_BOX(btn_vbox), bottom_btn, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(bottom_btn), "clicked", + G_CALLBACK(prefs_actions_bottom_cb), NULL); + CLAWS_SET_TIP(bottom_btn, + _("Move the selected action to the bottom")); + if (!geometry.min_height) { geometry.min_width = 486; geometry.min_height = 322; @@ -761,83 +786,87 @@ static void prefs_actions_duplicate_cb(gpointer gtk_action, gpointer data) modified_list = !prefs_actions_clist_set_row(-row-2); } -static void prefs_actions_up_cb(GtkWidget *w, gpointer data) +static void prefs_actions_top_cb(GtkWidget *w, gpointer data) { - GtkTreePath *prev, *sel, *try; - GtkTreeIter isel; - GtkListStore *store = NULL; - GtkTreeModel *model = NULL; - GtkTreeIter iprev; - - if (!gtk_tree_selection_get_selected - (gtk_tree_view_get_selection - (GTK_TREE_VIEW(actions.actions_list_view)), - &model, - &isel)) - return; - store = (GtkListStore *)model; - sel = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &isel); - if (!sel) + gint row; + GtkTreeIter top, sel; + GtkTreeModel *model; + + row = gtkut_list_view_get_selected_row(actions.actions_list_view); + if (row <= 1) return; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(actions.actions_list_view)); - /* no move if we're at row 0 or 1, looks phony, but other - * solutions are more convoluted... */ - try = gtk_tree_path_copy(sel); - if (!gtk_tree_path_prev(try) || !gtk_tree_path_prev(try)) { - gtk_tree_path_free(try); - gtk_tree_path_free(sel); + if (!gtk_tree_model_iter_nth_child(model, &top, NULL, 0) + || !gtk_tree_model_iter_nth_child(model, &sel, NULL, row)) return; - } - gtk_tree_path_free(try); - prev = gtk_tree_path_copy(sel); - if (!gtk_tree_path_prev(prev)) { - gtk_tree_path_free(prev); - gtk_tree_path_free(sel); + gtk_list_store_move_after(GTK_LIST_STORE(model), &sel, &top); + gtkut_list_view_select_row(actions.actions_list_view, 1); + modified_list = TRUE; +} + +static void prefs_actions_up_cb(GtkWidget *w, gpointer data) +{ + gint row; + GtkTreeIter top, sel; + GtkTreeModel *model; + + row = gtkut_list_view_get_selected_row(actions.actions_list_view); + if (row <= 1) return; - } + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(actions.actions_list_view)); - gtk_tree_model_get_iter(GTK_TREE_MODEL(store), - &iprev, prev); - gtk_tree_path_free(sel); - gtk_tree_path_free(prev); + if (!gtk_tree_model_iter_nth_child(model, &top, NULL, row - 1) + || !gtk_tree_model_iter_nth_child(model, &sel, NULL, row)) + return; - gtk_list_store_swap(store, &iprev, &isel); - prefs_actions_set_list(); + gtk_list_store_swap(GTK_LIST_STORE(model), &top, &sel); + gtkut_list_view_select_row(actions.actions_list_view, row - 1); modified_list = TRUE; } static void prefs_actions_down_cb(GtkWidget *w, gpointer data) { - GtkListStore *store = NULL; - GtkTreeModel *model = NULL; - GtkTreeIter next, sel; - GtkTreePath *try; - - if (!gtk_tree_selection_get_selected - (gtk_tree_view_get_selection - (GTK_TREE_VIEW(actions.actions_list_view)), - &model, - &sel)) + gint row, n_rows; + GtkTreeIter top, sel; + GtkTreeModel *model; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(actions.actions_list_view)); + n_rows = gtk_tree_model_iter_n_children(model, NULL); + row = gtkut_list_view_get_selected_row(actions.actions_list_view); + if (row < 1 || row >= n_rows - 1) return; - store = (GtkListStore *)model; - try = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &sel); - if (!try) + + if (!gtk_tree_model_iter_nth_child(model, &top, NULL, row) + || !gtk_tree_model_iter_nth_child(model, &sel, NULL, row + 1)) return; + + gtk_list_store_swap(GTK_LIST_STORE(model), &top, &sel); + gtkut_list_view_select_row(actions.actions_list_view, row + 1); + modified_list = TRUE; +} + +static void prefs_actions_bottom_cb(GtkWidget *w, gpointer data) +{ + gint row, n_rows; + GtkTreeIter top, sel; + GtkTreeModel *model; - /* no move when we're at row 0 */ - if (!gtk_tree_path_prev(try)) { - gtk_tree_path_free(try); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(actions.actions_list_view)); + n_rows = gtk_tree_model_iter_n_children(model, NULL); + row = gtkut_list_view_get_selected_row(actions.actions_list_view); + if (row < 1 || row >= n_rows - 1) return; - } - gtk_tree_path_free(try); - next = sel; - if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &next)) + if (!gtk_tree_model_iter_nth_child(model, &top, NULL, row) + || !gtk_tree_model_iter_nth_child(model, &sel, NULL, n_rows - 1)) return; - gtk_list_store_swap(store, &next, &sel); - prefs_actions_set_list(); + gtk_list_store_move_after(GTK_LIST_STORE(model), &top, &sel); + gtkut_list_view_select_row(actions.actions_list_view, n_rows - 1); modified_list = TRUE; }