Andreas Köhler's patch to convert the account types list in the

account edit dialog to a GtkTreeView/GtkListStore.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13259 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
David Hampton
2006-02-13 23:45:18 +00:00
parent f4ee1b4226
commit b3e92f5c24
3 changed files with 141 additions and 124 deletions
+5
View File
@@ -1,5 +1,10 @@
2006-02-13 David Hampton <hampton@employees.org>
* src/gnome-utils/dialog-account.c:
* src/gnome/glade/account.glade: Andreas Köhler's patch to convert
the account types list in the account edit dialog to a
GtkTreeView/GtkListStore.
* src/gnome/gnc-plugin-page-register.c: Andreas Köhler's patch to
prevent crash when voiding a transaction.
+102 -77
View File
@@ -56,6 +56,12 @@ typedef enum
EDIT_ACCOUNT
} AccountDialogType;
typedef enum
{
COL_TYPE_TEXT,
COL_TYPE_ID,
NUM_TYPE_COLUMNS
} AccountTypeColumns;
typedef struct _AccountWindow
{
@@ -84,7 +90,7 @@ typedef struct _AccountWindow
GtkWidget * account_scu;
GList * valid_types;
GtkWidget * type_list;
GtkWidget * type_view;
GtkTreeView * parent_tree;
GtkWidget * opening_balance_edit;
@@ -1077,82 +1083,71 @@ gnc_account_window_destroy_cb (GtkObject *object, gpointer data)
LEAVE(" ");
}
static void
gnc_type_list_select_cb(GtkCList * type_list, gint row, gint column,
GdkEventButton * event, gpointer data)
static void
gnc_account_type_changed_cb (GtkTreeSelection *selection, gpointer data)
{
AccountWindow * aw = data;
AccountWindow *aw = data;
GtkTreeModel *model;
GtkTreeIter iter;
gboolean sensitive;
guint type_id;
if (aw == NULL)
return;
g_return_if_fail (aw != NULL);
if (!gtk_clist_get_selectable(type_list, row))
{
gtk_clist_unselect_row(type_list, row, 0);
return;
sensitive = FALSE;
if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
aw->type = BAD_TYPE;
} else {
gtk_tree_model_get (model, &iter, COL_TYPE_ID, &type_id, -1);
aw->type = type_id;
last_used_account_type = aw->type;
gnc_account_commodity_from_type (aw, TRUE);
sensitive = (aw->type != EQUITY &&
aw->type != CURRENCY &&
aw->type != STOCK &&
aw->type != MUTUAL);
}
aw->type = (GNCAccountType)gtk_clist_get_row_data(type_list, row);
gtk_widget_set_sensitive (aw->opening_balance_page, sensitive);
last_used_account_type = aw->type;
sensitive = (aw->type != EQUITY &&
aw->type != CURRENCY &&
aw->type != STOCK &&
aw->type != MUTUAL);
gnc_account_commodity_from_type (aw, TRUE);
gtk_widget_set_sensitive(aw->opening_balance_page, sensitive);
if (!sensitive)
{
gtk_notebook_set_current_page (GTK_NOTEBOOK (aw->notebook), 0);
if (!sensitive) {
gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (aw->opening_balance_edit),
gnc_numeric_zero ());
}
}
static void
gnc_type_list_unselect_cb(GtkCList * type_list, gint row, gint column,
GdkEventButton * event, gpointer data)
{
AccountWindow * aw = data;
aw->type = BAD_TYPE;
}
static void
gnc_account_list_fill(GtkCList *type_list, GList *types)
gnc_account_type_store_fill (GtkListStore *store, GList *types)
{
gint row, acct_type;
gchar *text[2] = { NULL, NULL };
GtkTreeIter iter;
gint acct_type;
gchar *text;
gtk_clist_freeze(type_list);
gtk_clist_clear(type_list);
gtk_list_store_clear (store);
if (types == NULL)
{
for (acct_type = 0; acct_type < NUM_ACCOUNT_TYPES; acct_type++)
{
text[0] = (gchar *) xaccAccountGetTypeStr(acct_type);
row = gtk_clist_append(type_list, text);
gtk_clist_set_row_data(type_list, row, GINT_TO_POINTER(acct_type));
if (types == NULL) {
for (acct_type = 0; acct_type < NUM_ACCOUNT_TYPES; acct_type++) {
text = (gchar *) xaccAccountGetTypeStr (acct_type);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COL_TYPE_TEXT, text,
COL_TYPE_ID, GINT_TO_POINTER(acct_type),
-1);
}
} else {
for ( ; types != NULL; types = types->next ) {
text = (gchar *) xaccAccountGetTypeStr ((GNCAccountType) (types->data));
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COL_TYPE_TEXT, text,
COL_TYPE_ID, types->data,
-1);
}
}
else
{
for ( ; types != NULL; types = types->next )
{
text[0] = (gchar *) xaccAccountGetTypeStr
((GNCAccountType) (types->data));
row = gtk_clist_append (type_list, text);
gtk_clist_set_row_data(type_list, row, (gpointer)types->data);
}
}
gtk_clist_thaw(type_list);
}
static GNCAccountType
@@ -1168,25 +1163,41 @@ gnc_account_choose_new_acct_type (AccountWindow *aw)
return ((GNCAccountType)(aw->valid_types->data));
}
static void
gnc_account_type_list_create(AccountWindow *aw)
static gboolean
gnc_account_type_get_iter (GtkTreeModel *model, GtkTreeIter *iter, GNCAccountType type)
{
int row;
guint type_id;
gnc_account_list_fill(GTK_CLIST(aw->type_list), aw->valid_types);
gtk_tree_model_get_iter_first (model, iter);
gtk_clist_columns_autosize(GTK_CLIST(aw->type_list));
do {
gtk_tree_model_get (model, iter, COL_TYPE_ID, &type_id, -1);
if (type == type_id)
return TRUE;
} while (gtk_tree_model_iter_next (model, iter));
gtk_clist_sort(GTK_CLIST(aw->type_list));
return FALSE;
}
g_signal_connect(GTK_OBJECT(aw->type_list), "select-row",
G_CALLBACK(gnc_type_list_select_cb), aw);
static void
gnc_account_type_view_create (AccountWindow *aw)
{
GtkTreeModel *model;
GtkTreeSelection *selection;
GtkTreeIter iter;
GtkTreePath *path;
GtkCellRenderer *renderer;
GtkTreeView *view;
g_signal_connect(GTK_OBJECT(aw->type_list), "unselect-row",
G_CALLBACK(gnc_type_list_unselect_cb), aw);
model = GTK_TREE_MODEL (gtk_list_store_new (NUM_TYPE_COLUMNS,
G_TYPE_STRING,
G_TYPE_UINT));
gnc_account_type_store_fill (GTK_LIST_STORE (model), aw->valid_types);
switch (aw->dialog_type)
{
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
COL_TYPE_TEXT, GTK_SORT_ASCENDING);
switch (aw->dialog_type) {
case NEW_ACCOUNT:
aw->type = gnc_account_choose_new_acct_type (aw);
break;
@@ -1195,10 +1206,24 @@ gnc_account_type_list_create(AccountWindow *aw)
break;
}
row = gtk_clist_find_row_from_data(GTK_CLIST(aw->type_list),
(gpointer)aw->type);
gtk_clist_select_row(GTK_CLIST(aw->type_list), row, 0);
gtk_clist_moveto(GTK_CLIST(aw->type_list), row, 0, 0.5, 0);
view = GTK_TREE_VIEW (aw->type_view);
gtk_tree_view_set_model (view, model);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_attributes (view, -1, NULL,
renderer, "text", COL_TYPE_TEXT,
NULL);
selection = gtk_tree_view_get_selection (view);
g_signal_connect (G_OBJECT (selection), "changed",
G_CALLBACK (gnc_account_type_changed_cb), aw);
if (gnc_account_type_get_iter (model, &iter, aw->type)) {
gtk_tree_selection_select_iter (selection, &iter);
path = gtk_tree_model_get_path (model, &iter);
gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0.0, 0.0);
gtk_tree_path_free (path);
}
}
static void
@@ -1381,8 +1406,8 @@ gnc_account_window_create(AccountWindow *aw)
gtk_label_set_mnemonic_widget (GTK_LABEL(label), aw->transfer_tree);
/* This goes at the end so the select callback has good data. */
aw->type_list = glade_xml_get_widget (xml, "type_list");
gnc_account_type_list_create (aw);
aw->type_view = glade_xml_get_widget (xml, "type_view");
gnc_account_type_view_create (aw);
gnc_restore_window_size (GCONF_SECTION, GTK_WINDOW(aw->dialog));
+34 -47
View File
@@ -91,7 +91,7 @@
<child>
<widget class="GtkVBox" id="vbox75">
<property name="border_width">12</property>
<property name="border_width">6</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">18</property>
@@ -591,7 +591,7 @@
<property name="column_spacing">0</property>
<child>
<widget class="GtkLabel" id="label">
<widget class="GtkLabel" id="type_label">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Acco_unt Type&lt;/b&gt;</property>
<property name="use_underline">True</property>
@@ -603,7 +603,7 @@
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="mnemonic_widget">type_list</property>
<property name="mnemonic_widget">type_view</property>
</widget>
<packing>
<property name="left_attach">0</property>
@@ -711,6 +711,36 @@
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow32">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkTreeView" id="type_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="rules_hint">False</property>
<property name="reorderable">False</property>
<property name="enable_search">True</property>
<property name="fixed_height_mode">False</property>
</widget>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="parent_scroll">
<property name="visible">True</property>
@@ -731,50 +761,6 @@
<property name="y_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow7">
<property name="visible">True</property>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkCList" id="type_list">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="n_columns">1</property>
<property name="column_widths">80</property>
<property name="selection_mode">GTK_SELECTION_SINGLE</property>
<property name="show_titles">False</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
<widget class="GtkLabel" id="label8477401">
<property name="label" translatable="yes"></property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
@@ -810,6 +796,7 @@
<child>
<widget class="GtkVBox" id="vbox118">
<property name="border_width">6</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>