[gnumeric] Sheet Size: fix spin buttons used for prefs.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnumeric] Sheet Size: fix spin buttons used for prefs.
- Date: Sun, 10 May 2009 20:21:57 -0400 (EDT)
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]