Commit 84c61cc48c1b71a8512020be194286d69d8ed872

Authored by Perry Werneck
1 parent dce631b2

Implementing move rows from one view to another.

src/include/pw3270/actions.h
@@ -262,6 +262,7 @@ @@ -262,6 +262,7 @@
262 Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); 262 Pw3270ActionList * pw3270_action_list_new(GtkApplication *application);
263 void pw3270_action_list_free(Pw3270ActionList *action_list); 263 void pw3270_action_list_free(Pw3270ActionList *action_list);
264 void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); 264 void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list);
  265 + void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to);
265 266
266 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); 267 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view);
267 268
src/objects/actions/view.c
@@ -276,3 +276,51 @@ @@ -276,3 +276,51 @@
276 g_slist_free_full((GSList *) action_list, (GDestroyNotify) list_element_free); 276 g_slist_free_full((GSList *) action_list, (GDestroyNotify) list_element_free);
277 } 277 }
278 278
  279 + void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to) {
  280 +
  281 + size_t ix;
  282 +
  283 + //
  284 + // Get list of selected references.
  285 + //
  286 + GtkTreeModel * fromModel = gtk_tree_view_get_model(GTK_TREE_VIEW(from));
  287 + GList * list = gtk_tree_selection_get_selected_rows(
  288 + gtk_tree_view_get_selection(GTK_TREE_VIEW(from)),
  289 + &fromModel);
  290 +
  291 + guint rowCount = g_list_length(list);
  292 +
  293 + g_autofree GtkTreeRowReference ** rows = g_new0(GtkTreeRowReference *,rowCount);
  294 + GList * item = list;
  295 + for(ix=0;ix < rowCount && item; ix++) {
  296 + rows[ix] = gtk_tree_row_reference_new(fromModel,(GtkTreePath *) item->data);
  297 + item = g_list_next(item);
  298 + }
  299 +
  300 + g_list_free_full(list, (GDestroyNotify) gtk_tree_path_free);
  301 +
  302 + //
  303 + // Move references
  304 + //
  305 + for(ix = 0; ix < rowCount && rows[ix]; ix++) {
  306 +
  307 + GtkTreePath * path = gtk_tree_row_reference_get_path(rows[ix]);
  308 +
  309 + if(path) {
  310 + GtkTreeIter iter;
  311 +
  312 + // Add on target widget.
  313 +
  314 +
  315 + // Remove from source widget.
  316 + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(fromModel), &iter, path)) {
  317 + gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter);
  318 + }
  319 +
  320 + }
  321 +
  322 +
  323 + }
  324 +
  325 +
  326 + }
src/objects/toolbar/settings.c
@@ -78,9 +78,24 @@ @@ -78,9 +78,24 @@
78 debug("%s",__FUNCTION__); 78 debug("%s",__FUNCTION__);
79 } 79 }
80 80
  81 + static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) {
  82 + gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0);
  83 + }
  84 +
  85 + void toolbar_insert(GtkButton G_GNUC_UNUSED(*button), ToolbarSettingsPage *settings) {
  86 + debug("%s(%p)",__FUNCTION__,settings);
  87 + pw3270_action_view_move_selected(settings->views[1],settings->views[0]);
  88 + }
  89 +
  90 + void toolbar_remove(GtkButton G_GNUC_UNUSED(*button), ToolbarSettingsPage *settings) {
  91 + debug("%s(%p)",__FUNCTION__,settings);
  92 + pw3270_action_view_move_selected(settings->views[0],settings->views[1]);
  93 + }
  94 +
81 Pw3270SettingsPage * pw3270_toolbar_settings_new() { 95 Pw3270SettingsPage * pw3270_toolbar_settings_new() {
82 96
83 size_t ix; 97 size_t ix;
  98 + GtkTreeSelection * selection;
84 99
85 ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1); 100 ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1);
86 101
@@ -102,6 +117,9 @@ @@ -102,6 +117,9 @@
102 117
103 page->views[ix] = pw3270_action_view_new(); 118 page->views[ix] = pw3270_action_view_new();
104 119
  120 + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix]));
  121 + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
  122 +
105 gtk_grid_attach( 123 gtk_grid_attach(
106 GTK_GRID(page->parent.widget), 124 GTK_GRID(page->parent.widget),
107 gtk_label_new(gettext(labels[ix])), 125 gtk_label_new(gettext(labels[ix])),
@@ -140,17 +158,37 @@ @@ -140,17 +158,37 @@
140 gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE); 158 gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE);
141 gtk_widget_set_sensitive(page->buttons[ix],FALSE); 159 gtk_widget_set_sensitive(page->buttons[ix],FALSE);
142 160
  161 + g_signal_connect(
  162 + gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])),
  163 + "changed",
  164 + G_CALLBACK(selection_changed),
  165 + page->buttons[ix]
  166 + );
  167 +
143 } 168 }
144 169
145 gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0); 170 gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0);
146 gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0); 171 gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0);
147 172
  173 + g_signal_connect(
  174 + page->buttons[0],
  175 + "clicked",
  176 + G_CALLBACK(toolbar_remove),
  177 + page
  178 + );
  179 +
  180 + g_signal_connect(
  181 + page->buttons[1],
  182 + "clicked",
  183 + G_CALLBACK(toolbar_insert),
  184 + page
  185 + );
  186 +
148 gtk_grid_attach( 187 gtk_grid_attach(
149 GTK_GRID(page->parent.widget), 188 GTK_GRID(page->parent.widget),
150 box, 189 box,
151 2,2,1,1 190 2,2,1,1
152 ); 191 );
153 192
154 -  
155 return (Pw3270SettingsPage *) page; 193 return (Pw3270SettingsPage *) page;
156 } 194 }