diff options
Diffstat (limited to 'widgets/table')
-rw-r--r-- | widgets/table/e-table-selection-model.c | 74 | ||||
-rw-r--r-- | widgets/table/e-table-selection-model.h | 8 |
2 files changed, 51 insertions, 31 deletions
diff --git a/widgets/table/e-table-selection-model.c b/widgets/table/e-table-selection-model.c index faeb1fad31..f570a28176 100644 --- a/widgets/table/e-table-selection-model.c +++ b/widgets/table/e-table-selection-model.c @@ -15,11 +15,11 @@ #define ETSM_CLASS(e) ((ETableSelectionModelClass *)((GtkObject *)e)->klass) -#define PARENT_TYPE e_selection_model_get_type () +#define PARENT_TYPE e_selection_model_array_get_type () -static ESelectionModel *parent_class; +static ESelectionModelArray *parent_class; -static gint etsm_get_row_count (ESelectionModel *esm); +static gint etsm_get_row_count (ESelectionModelArray *esm); enum { ARG_0, @@ -61,7 +61,7 @@ model_pre_change (ETableModel *etm, ETableSelectionModel *etsm) free_hash(etsm); #if 0 - if (etsm->model && e_table_model_has_save_id(etsm->model)) { + if (etsm->model && (!etsm->hash) && e_table_model_has_save_id(etsm->model)) { gint cursor_row; etsm->hash = g_hash_table_new(g_str_hash, g_str_equal); e_selection_model_foreach(E_SELECTION_MODEL(etsm), save_to_hash, etsm); @@ -75,33 +75,45 @@ model_pre_change (ETableModel *etm, ETableSelectionModel *etsm) #endif } -static void -model_changed(ETableModel *etm, ETableSelectionModel *etsm) +#if 0 +static gint +model_changed_idle(ETableSelectionModel *etsm) { + ETableModel *etm = etsm->model; + e_selection_model_clear(E_SELECTION_MODEL(etsm)); -#if 0 - if (etm && e_table_model_has_save_id(etm)) { + if (etsm->hash && etm && e_table_model_has_save_id(etm)) { int row_count = e_table_model_row_count(etm); int i; - if (e_selection_model_confirm_row_count(E_SELECTION_MODEL(etsm))) { - for (i = 0; i < row_count; i++) { - char *save_id = e_table_model_get_save_id(etm, i); - if (g_hash_table_lookup(etsm->hash, save_id)) - e_selection_model_change_one_row(E_SELECTION_MODEL(etsm), i, TRUE); - if (etsm->cursor_id && !strcmp(etsm->cursor_id, save_id)) { - e_selection_model_change_cursor(E_SELECTION_MODEL(etsm), i); - g_free(etsm->cursor_id); - etsm->cursor_id = NULL; - } - g_free(save_id); + e_selection_model_array_confirm_row_count(E_SELECTION_MODEL_ARRAY(etsm)); + for (i = 0; i < row_count; i++) { + char *save_id = e_table_model_get_save_id(etm, i); + if (g_hash_table_lookup(etsm->hash, save_id)) + e_selection_model_change_one_row(E_SELECTION_MODEL(etsm), i, TRUE); + if (etsm->cursor_id && !strcmp(etsm->cursor_id, save_id)) { + e_selection_model_change_cursor(E_SELECTION_MODEL(etsm), i, e_selection_model_cursor_row(E_SELECTION_MODEL(etsm))); + g_free(etsm->cursor_id); + etsm->cursor_id = NULL; } + g_free(save_id); } + free_hash(etsm); } + etsm->model_changed_idle_id = 0; + return FALSE; +} #endif - if (etsm->hash) - free_hash(etsm); +static void +model_changed(ETableModel *etm, ETableSelectionModel *etsm) +{ + e_selection_model_clear(E_SELECTION_MODEL(etsm)); +#if 0 + if (!etsm->model_changed_idle_id && etm && e_table_model_has_save_id(etm)) { + etsm->model_changed_idle_id = g_idle_add_full(G_PRIORITY_HIGH, (GSourceFunc) model_changed_idle, etsm, NULL); + } +#endif } static void @@ -122,7 +134,7 @@ model_cell_changed(ETableModel *etm, int col, int row, ETableSelectionModel *ets static void model_rows_inserted(ETableModel *etm, int row, int count, ETableSelectionModel *etsm) { - e_selection_model_insert_rows(E_SELECTION_MODEL(etsm), row, count); + e_selection_model_array_insert_rows(E_SELECTION_MODEL_ARRAY(etsm), row, count); if (etsm->hash) free_hash(etsm); } @@ -130,7 +142,7 @@ model_rows_inserted(ETableModel *etm, int row, int count, ETableSelectionModel * static void model_rows_deleted(ETableModel *etm, int row, int count, ETableSelectionModel *etsm) { - e_selection_model_delete_rows(E_SELECTION_MODEL(etsm), row, count); + e_selection_model_array_delete_rows(E_SELECTION_MODEL_ARRAY(etsm), row, count); if (etsm->hash) free_hash(etsm); } @@ -187,6 +199,7 @@ drop_model(ETableSelectionModel *etsm) etsm->model_rows_inserted_id); gtk_signal_disconnect(GTK_OBJECT(etsm->model), etsm->model_rows_deleted_id); + gtk_object_unref(GTK_OBJECT(etsm->model)); } etsm->model = NULL; @@ -199,6 +212,9 @@ etsm_destroy (GtkObject *object) etsm = E_TABLE_SELECTION_MODEL (object); + if (etsm->model_changed_idle_id) { + g_source_remove(etsm->model_changed_idle_id); + } drop_model(etsm); free_hash(etsm); @@ -237,24 +253,26 @@ e_table_selection_model_init (ETableSelectionModel *selection) selection->model = NULL; selection->hash = NULL; selection->cursor_id = NULL; + + selection->model_changed_idle_id = 0; } static void e_table_selection_model_class_init (ETableSelectionModelClass *klass) { GtkObjectClass *object_class; - ESelectionModelClass *esm_class; + ESelectionModelArrayClass *esma_class; parent_class = gtk_type_class (PARENT_TYPE); object_class = GTK_OBJECT_CLASS(klass); - esm_class = E_SELECTION_MODEL_CLASS(klass); + esma_class = E_SELECTION_MODEL_ARRAY_CLASS(klass); object_class->destroy = etsm_destroy; object_class->get_arg = etsm_get_arg; object_class->set_arg = etsm_set_arg; - esm_class->get_row_count = etsm_get_row_count; + esma_class->get_row_count = etsm_get_row_count; gtk_object_add_arg_type ("ETableSelectionModel::model", GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_MODEL); @@ -277,9 +295,9 @@ e_table_selection_model_new (void) } static gint -etsm_get_row_count (ESelectionModel *esm) +etsm_get_row_count (ESelectionModelArray *esma) { - ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL(esm); + ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL(esma); return e_table_model_row_count (etsm->model); } diff --git a/widgets/table/e-table-selection-model.h b/widgets/table/e-table-selection-model.h index 02b1949257..94eaf2bb94 100644 --- a/widgets/table/e-table-selection-model.h +++ b/widgets/table/e-table-selection-model.h @@ -3,7 +3,7 @@ #define _E_TABLE_SELECTION_MODEL_H_ #include <gtk/gtkobject.h> -#include <gal/widgets/e-selection-model.h> +#include <gal/widgets/e-selection-model-array.h> #include <gal/e-table/e-table-model.h> #include <gal/e-table/e-table-defines.h> #include <gal/e-table/e-table-sorter.h> @@ -19,7 +19,7 @@ extern "C" { #define E_IS_TABLE_SELECTION_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_SELECTION_MODEL_TYPE)) typedef struct { - ESelectionModel base; + ESelectionModelArray base; ETableModel *model; @@ -30,6 +30,8 @@ typedef struct { guint model_rows_inserted_id; guint model_rows_deleted_id; + guint model_changed_idle_id; + guint frozen : 1; guint selection_model_changed : 1; guint group_info_changed : 1; @@ -39,7 +41,7 @@ typedef struct { } ETableSelectionModel; typedef struct { - ESelectionModelClass parent_class; + ESelectionModelArrayClass parent_class; } ETableSelectionModelClass; GtkType e_table_selection_model_get_type (void); |