[gnumeric] Sheet Size: fix spin buttons used for prefs.



commit 56e97e6a567e76e236a5192a3222e63e8f5ac1db
Author: Morten Welinder <terra gnome org>
Date:   Sun May 10 20:21:45 2009 -0400

    Sheet Size: fix spin buttons used for prefs.
---
 src/dialogs/ChangeLog            |    6 ++++
 src/dialogs/dialog-preferences.c |   48 ++++++++++++++++++++++++++++++++-----
 src/gnumeric-gconf.c             |   30 ++++++++++++++---------
 3 files changed, 65 insertions(+), 19 deletions(-)

diff --git a/src/dialogs/ChangeLog b/src/dialogs/ChangeLog
index f5b3149..62c33bf 100644
--- a/src/dialogs/ChangeLog
+++ b/src/dialogs/ChangeLog
@@ -1,3 +1,9 @@
+2009-05-10  Morten Welinder  <terra gnome org>
+
+	* dialog-preferences.c (power_of_2_handlers): New function.
+	(pref_window_page_initializer): Set up handlers to make sure sheet
+	sizes are powers of two.
+
 2009-05-06  Morten Welinder <terra gnome org>
 
 	* Release 1.9.7
diff --git a/src/dialogs/dialog-preferences.c b/src/dialogs/dialog-preferences.c
index 46fb45e..6767779 100644
--- a/src/dialogs/dialog-preferences.c
+++ b/src/dialogs/dialog-preferences.c
@@ -300,7 +300,8 @@ int_pref_conf_to_widget (GOConfNode *node, char const *key, GtkSpinButton *butto
 	if (val_in_conf != val_in_button)
 		gtk_spin_button_set_value (button, (gdouble) val_in_conf);
 }
-static void
+
+static GtkWidget *
 int_pref_create_widget (GOConfNode *node, char const *key, GtkWidget *table,
 			gint row, gint val, gint from, gint to, gint step, 
 			gint_conf_setter_t setter, char const *default_label)
@@ -320,6 +321,33 @@ int_pref_create_widget (GOConfNode *node, char const *key, GtkWidget *table,
 
 	pref_create_label (node, key, table, row, default_label, w);
 	set_tip (node, key, w);
+	return w;
+}
+
+static gboolean
+powerof2 (int i)
+{
+	return i > 0 && (i & (i - 1)) == 0;
+}
+
+static void
+cb_power_of_2 (GtkAdjustment *adj)
+{
+	int val = (int)adj->value;
+
+	if (powerof2 (val - 1))
+		gtk_adjustment_set_value (adj, (val - 1) * 2);
+	else if (powerof2 (val + 1))
+		gtk_adjustment_set_value (adj, (val + 1) / 2);
+}
+
+static void
+power_of_2_handlers (GtkWidget *w)
+{
+	GtkSpinButton *spin = GTK_SPIN_BUTTON (w);
+	GtkAdjustment *adj = gtk_spin_button_get_adjustment (spin);
+	g_signal_connect (G_OBJECT (adj), "value_changed",
+			  G_CALLBACK (cb_power_of_2), NULL);
 }
 
 /*************************************************************************/
@@ -577,7 +605,8 @@ pref_window_page_initializer (PrefState *state,
 	GtkWidget *page = gtk_table_new (7, 2, FALSE);
 	gint row = 0;
 	GOConfNode *node;
-	
+	GtkWidget *w;
+
 	node = go_conf_get_node (state->root, GNM_CONF_GUI_DIR);
 	double_pref_create_widget (node, GNM_CONF_GUI_WINDOW_Y,
 				   page, row++, 0.75, 0.25, 1, 0.05, 2, 
@@ -596,14 +625,19 @@ pref_window_page_initializer (PrefState *state,
 				gnm_gconf_set_workbook_nsheets,
 				_("Default Number of Sheets"));
 
-	int_pref_create_widget (state->root, GNM_CONF_WORKBOOK_NROWS,
-				page, row++, GNM_DEFAULT_ROWS, GNM_MIN_ROWS, GNM_MAX_ROWS, GNM_MIN_ROWS, 
-				gnm_gconf_set_workbook_nrows,
+	w = int_pref_create_widget (state->root, GNM_CONF_WORKBOOK_NROWS,
+				    page, row++,
+				    GNM_DEFAULT_ROWS, GNM_MIN_ROWS, GNM_MAX_ROWS, 1, 
+				    gnm_gconf_set_workbook_nrows,
 				_("Default Number of Rows in a Sheet"));
-	int_pref_create_widget (state->root, GNM_CONF_WORKBOOK_NCOLS,
-				page, row++, GNM_DEFAULT_COLS, GNM_MIN_COLS, GNM_MAX_COLS, GNM_MIN_COLS, 
+	power_of_2_handlers (w);
+
+	w = int_pref_create_widget (state->root, GNM_CONF_WORKBOOK_NCOLS,
+				    page, row++,
+				    GNM_DEFAULT_COLS, GNM_MIN_COLS, GNM_MAX_COLS, 1, 
 				gnm_gconf_set_workbook_ncols,
 				_("Default Number of Columns in a Sheet"));
+	power_of_2_handlers (w);
 
 	bool_pref_create_widget (node, GNM_CONF_GUI_ED_LIVESCROLLING,
 				 page, row++, 
diff --git a/src/gnumeric-gconf.c b/src/gnumeric-gconf.c
index d629c59..6bb446a 100644
--- a/src/gnumeric-gconf.c
+++ b/src/gnumeric-gconf.c
@@ -857,27 +857,33 @@ gnm_gconf_set_workbook_autosave_time (gint val)
 void
 gnm_gconf_set_workbook_nrows (gint val)
 {
-	int n = GNM_DEFAULT_ROWS;
-	while (n < val && n < GNM_MAX_ROWS)
-		n <<= 1;
-	prefs.row_number = n;
+	int old_cols = prefs.col_number;
+	int old_rows = prefs.row_number;
+
+	prefs.row_number = CLAMP (val, GNM_MIN_ROWS, GNM_MAX_ROWS);	
 	if (!gnm_sheet_valid_size (prefs.col_number, prefs.row_number))
 		gnm_sheet_suggest_size (&prefs.col_number, &prefs.row_number);
-	go_conf_set_int (root, GNM_CONF_WORKBOOK_NROWS, prefs.row_number);
-	go_conf_set_int (root, GNM_CONF_WORKBOOK_NCOLS, prefs.col_number);
+
+	if (prefs.row_number != old_rows)
+		go_conf_set_int (root, GNM_CONF_WORKBOOK_NROWS, prefs.row_number);
+	if (prefs.col_number != old_cols)
+		go_conf_set_int (root, GNM_CONF_WORKBOOK_NCOLS, prefs.col_number);
 }
 
 void
 gnm_gconf_set_workbook_ncols (gint val)
 {
-	int n = GNM_DEFAULT_COLS;
-	while (n < val && n < GNM_MAX_COLS)
-		n <<= 1;
-	prefs.col_number = n;
+	int old_cols = prefs.col_number;
+	int old_rows = prefs.row_number;
+
+	prefs.col_number = CLAMP (val, GNM_MIN_ROWS, GNM_MAX_ROWS);	
 	if (!gnm_sheet_valid_size (prefs.col_number, prefs.row_number))
 		gnm_sheet_suggest_size (&prefs.col_number, &prefs.row_number);
-	go_conf_set_int (root, GNM_CONF_WORKBOOK_NROWS, prefs.row_number);
-	go_conf_set_int (root, GNM_CONF_WORKBOOK_NCOLS, prefs.col_number);
+
+	if (prefs.row_number != old_rows)
+		go_conf_set_int (root, GNM_CONF_WORKBOOK_NROWS, prefs.row_number);
+	if (prefs.col_number != old_cols)
+		go_conf_set_int (root, GNM_CONF_WORKBOOK_NCOLS, prefs.col_number);
 }
 
 void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]