From 84c61cc48c1b71a8512020be194286d69d8ed872 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 23 Dec 2019 11:14:39 -0300 Subject: [PATCH] Implementing move rows from one view to another. --- src/include/pw3270/actions.h | 1 + src/objects/actions/view.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/toolbar/settings.c | 40 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h index a125a28..84fbf16 100644 --- a/src/include/pw3270/actions.h +++ b/src/include/pw3270/actions.h @@ -262,6 +262,7 @@ Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); void pw3270_action_list_free(Pw3270ActionList *action_list); void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); + void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to); Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); diff --git a/src/objects/actions/view.c b/src/objects/actions/view.c index 2877ad1..d64c2d1 100644 --- a/src/objects/actions/view.c +++ b/src/objects/actions/view.c @@ -276,3 +276,51 @@ g_slist_free_full((GSList *) action_list, (GDestroyNotify) list_element_free); } + void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to) { + + size_t ix; + + // + // Get list of selected references. + // + GtkTreeModel * fromModel = gtk_tree_view_get_model(GTK_TREE_VIEW(from)); + GList * list = gtk_tree_selection_get_selected_rows( + gtk_tree_view_get_selection(GTK_TREE_VIEW(from)), + &fromModel); + + guint rowCount = g_list_length(list); + + g_autofree GtkTreeRowReference ** rows = g_new0(GtkTreeRowReference *,rowCount); + GList * item = list; + for(ix=0;ix < rowCount && item; ix++) { + rows[ix] = gtk_tree_row_reference_new(fromModel,(GtkTreePath *) item->data); + item = g_list_next(item); + } + + g_list_free_full(list, (GDestroyNotify) gtk_tree_path_free); + + // + // Move references + // + for(ix = 0; ix < rowCount && rows[ix]; ix++) { + + GtkTreePath * path = gtk_tree_row_reference_get_path(rows[ix]); + + if(path) { + GtkTreeIter iter; + + // Add on target widget. + + + // Remove from source widget. + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(fromModel), &iter, path)) { + gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter); + } + + } + + + } + + + } diff --git a/src/objects/toolbar/settings.c b/src/objects/toolbar/settings.c index 25c3593..6d89ae0 100644 --- a/src/objects/toolbar/settings.c +++ b/src/objects/toolbar/settings.c @@ -78,9 +78,24 @@ debug("%s",__FUNCTION__); } + static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { + gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0); + } + + void toolbar_insert(GtkButton G_GNUC_UNUSED(*button), ToolbarSettingsPage *settings) { + debug("%s(%p)",__FUNCTION__,settings); + pw3270_action_view_move_selected(settings->views[1],settings->views[0]); + } + + void toolbar_remove(GtkButton G_GNUC_UNUSED(*button), ToolbarSettingsPage *settings) { + debug("%s(%p)",__FUNCTION__,settings); + pw3270_action_view_move_selected(settings->views[0],settings->views[1]); + } + Pw3270SettingsPage * pw3270_toolbar_settings_new() { size_t ix; + GtkTreeSelection * selection; ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1); @@ -102,6 +117,9 @@ page->views[ix] = pw3270_action_view_new(); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + gtk_grid_attach( GTK_GRID(page->parent.widget), gtk_label_new(gettext(labels[ix])), @@ -140,17 +158,37 @@ gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE); gtk_widget_set_sensitive(page->buttons[ix],FALSE); + g_signal_connect( + gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])), + "changed", + G_CALLBACK(selection_changed), + page->buttons[ix] + ); + } gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0); + g_signal_connect( + page->buttons[0], + "clicked", + G_CALLBACK(toolbar_remove), + page + ); + + g_signal_connect( + page->buttons[1], + "clicked", + G_CALLBACK(toolbar_insert), + page + ); + gtk_grid_attach( GTK_GRID(page->parent.widget), box, 2,2,1,1 ); - return (Pw3270SettingsPage *) page; } -- libgit2 0.21.2