GUI: Scroll to correct datasheet position after deleting/inserting variables.
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 28 Apr 2019 15:24:36 +0000 (17:24 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 28 Apr 2019 15:41:33 +0000 (17:41 +0200)
* src/ui/gui/psppire-data-sheet.h (psppire_data_sheet_delete_variables,
  psppire_data_sheet_insert_new_variable_at_posn): New functions
* src/ui/gui/psppire-data-sheet.c: insert_new_variable ->
psppire_data_sheet_insert_new_variable_at_posn.
* src/ui/gui/psppire-data-sheet.c: delete_variables ->
psppire_data_sheet_delete_variables.
* src/ui/gui/psppire-data-editor.c:
(psppire_data_editor_data_delete_variables,
psppire_data_editor_insert_new_variable_at_posn): Reimplement.

src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-sheet.c
src/ui/gui/psppire-data-sheet.h

index 6e7a0369671ea715eda8f30e8cc124fb6b150ef7..7ddb0bff9c047ac000448ad30512aca6ca93bc9d 100644 (file)
@@ -1,6 +1,6 @@
 /* PSPPIRE - a graphical user interface for PSPP.
    Copyright (C) 2008, 2009, 2010, 2011, 2012, 2016,
-   2017 Free Software Foundation, Inc.
+   2017, 2019 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -437,12 +437,7 @@ static void set_font_recursively (GtkWidget *w, gpointer data);
 void
 psppire_data_editor_data_delete_variables (PsppireDataEditor *de)
 {
-  SswRange *range = SSW_SHEET(de->data_sheet)->selection;
-
-  psppire_dict_delete_variables (de->dict, range->start_x,
-                                (range->end_x - range->start_x + 1));
-
-  gtk_widget_queue_draw (GTK_WIDGET (de->data_sheet));
+  psppire_data_sheet_delete_variables (PSPPIRE_DATA_SHEET (de->data_sheet));
 }
 
 void
@@ -469,13 +464,7 @@ psppire_data_editor_insert_new_case_at_posn  (PsppireDataEditor *de, gint posn)
 void
 psppire_data_editor_insert_new_variable_at_posn (PsppireDataEditor *de, gint posn)
 {
-  g_return_if_fail (posn >= 0);
-  const struct variable *v = psppire_dict_insert_variable (de->dict, posn, NULL);
-  g_return_if_fail (v);
-  psppire_data_store_insert_value (de->data_store, var_get_width(v),
-                                  var_get_case_index (v));
-
-  gtk_widget_queue_draw (GTK_WIDGET (de));
+  psppire_data_sheet_insert_new_variable_at_posn (PSPPIRE_DATA_SHEET (de->data_sheet), posn);
 }
 
 static void
index 4b7df0dc287f5919b4b69a00e988976397ea9746..615ff98d792eff931f4d50a0a56f2ada4960de13 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2017  John Darrington
+   Copyright (C) 2017, 2019  John Darrington
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -206,25 +206,37 @@ show_cases_column_popup (PsppireDataSheet *sheet, int column, guint button, guin
   gtk_menu_popup_at_pointer (GTK_MENU (sheet->data_sheet_cases_column_popup), NULL);
 }
 
-static void
-insert_new_variable (PsppireDataSheet *sheet)
+void
+psppire_data_sheet_insert_new_variable_at_posn (PsppireDataSheet *sheet, gint posn)
 {
   PsppireDataStore *data_store = NULL;
   g_object_get (sheet, "data-model", &data_store, NULL);
 
-  gint posn = GPOINTER_TO_INT (g_object_get_data
-                               (G_OBJECT (sheet->data_sheet_cases_column_popup),
-                                "item"));
-
   const struct variable *v = psppire_dict_insert_variable (data_store->dict,
                                                           posn, NULL);
 
   psppire_data_store_insert_value (data_store, var_get_width(v),
                                   var_get_case_index (v));
 
+  ssw_sheet_scroll_to (SSW_SHEET (sheet), posn, -1);
+
   gtk_widget_queue_draw (GTK_WIDGET (sheet));
 }
 
+static void
+insert_new_variable (PsppireDataSheet *sheet)
+{
+  PsppireDataStore *data_store = NULL;
+  g_object_get (sheet, "data-model", &data_store, NULL);
+
+  gint posn = GPOINTER_TO_INT (g_object_get_data
+                               (G_OBJECT (sheet->data_sheet_cases_column_popup),
+                                "item"));
+
+  psppire_data_sheet_insert_new_variable_at_posn (sheet, posn);
+}
+
+
 static void
 set_menu_items_sensitivity (PsppireDataSheet *sheet, gpointer selection, gpointer p)
 {
@@ -251,8 +263,8 @@ set_menu_items_sensitivity (PsppireDataSheet *sheet, gpointer selection, gpointe
                            whole_column_selected);
 }
 
-static void
-delete_variables (PsppireDataSheet *sheet)
+void
+psppire_data_sheet_delete_variables (PsppireDataSheet *sheet)
 {
   SswRange *range = SSW_SHEET(sheet)->selection;
 
@@ -262,6 +274,8 @@ delete_variables (PsppireDataSheet *sheet)
   psppire_dict_delete_variables (data_store->dict, range->start_x,
                                 (range->end_x - range->start_x + 1));
 
+  ssw_sheet_scroll_to (SSW_SHEET (sheet), range->start_x, -1);
+
   gtk_widget_queue_draw (GTK_WIDGET (sheet));
 }
 
@@ -284,7 +298,7 @@ create_data_column_header_popup_menu (PsppireDataSheet *sheet)
   sheet->data_clear_variables_menu_item =
     gtk_menu_item_new_with_mnemonic  (_("Cl_ear Variables"));
   g_signal_connect_swapped (sheet->data_clear_variables_menu_item, "activate",
-                           G_CALLBACK (delete_variables),
+                           G_CALLBACK (psppire_data_sheet_delete_variables),
                            sheet);
   gtk_widget_set_sensitive (sheet->data_clear_variables_menu_item, FALSE);
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), sheet->data_clear_variables_menu_item);
index 49e7a1751c36a6c64b766bc11212c3bb1f4eb757..0e5cc175c8b8417dcd4bb0b14842bb6f73dcd574 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-    Copyright (C) 2017  John Darrington
+    Copyright (C) 2017, 2019  John Darrington
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -47,4 +47,9 @@ G_DECLARE_FINAL_TYPE (PsppireDataSheet, psppire_data_sheet, PSPPIRE, DATA_SHEET,
 
 GtkWidget *psppire_data_sheet_new (void);
 
+void psppire_data_sheet_delete_variables (PsppireDataSheet *sheet);
+
+void psppire_data_sheet_insert_new_variable_at_posn (PsppireDataSheet *sheet, gint posn);
+
+
 #endif