diff --git a/test/GNUmakeinc.mk b/test/GNUmakeinc.mk index 1868dac8..179ee318 100644 --- a/test/GNUmakeinc.mk +++ b/test/GNUmakeinc.mk @@ -11,6 +11,7 @@ CFILES += \ test/page5.c \ test/page6.c \ test/page7.c \ + test/page8.c \ test/spaced.c HFILES += \ diff --git a/test/page8.c b/test/page8.c index cb4afc98..96085063 100644 --- a/test/page8.c +++ b/test/page8.c @@ -1,11 +1,80 @@ // 18 october 2015 #include "test.h" +// TODO manage the memory of the uiTableModel + +static intmax_t nColumns = 4; +static uiTableColumnType coltypes[] = { + uiTableColumnText, + uiTableColumnText, + uiTableColumnCheckbox, + uiTableColumnCheckbox, +}; + +static intmax_t nRows = 6; + +static intmax_t modelNumRows(uiTableModel *m, void *mData) +{ + return nRows; +} + +void *modelCellValue(uiTableModel *m, void *mData, intmax_t row, intmax_t column) +{ + char line[20]; + + line[0] = 'R'; + line[1] = 'o'; + line[2] = 'w'; + line[3] = ' '; + line[4] = row + '0'; + line[5] = '\0'; + switch (column) { + case 0: + case 1: + return uiTableModelFromString(line); + case 2: + return uiTableModelFromBool(row % 2 == 0); + case 3: + return uiTableModelFromBool(row % 3 == 0); + } + // TODO + return NULL; +} + +// TODO make this not need to be static +uiTableModelSpec spec; + +void modelSetCellValue(uiTableModel *m, void *mData, intmax_t row, intmax_t column, void *value) +{ + // TODO +} + uiBox *makePage8(void) { uiBox *page8; + uiTable *table; + uiTableModel *model; + uiTableColumnParams p; + intmax_t i; page8 = newVerticalBox(); + table = uiNewTable(); + uiBoxAppend(page8, uiControl(table), 1); + + spec.NumRows = modelNumRows; + spec.CellValue = modelCellValue; + spec.SetCellValue = modelSetCellValue; + model = uiNewTableModel(nColumns, coltypes, &spec, NULL); + uiTableSetModel(table, model); + + for (i = 0; i < nColumns; i++) { + p.Name = "Column"; + p.Type = coltypes[i]; + p.Mutable = i % 2 == 1; + p.ValueColumn = i; + uiTableAppendColumn(table, &p); + } + return page8; } diff --git a/ui.h b/ui.h index 205a1653..42629560 100644 --- a/ui.h +++ b/ui.h @@ -522,8 +522,8 @@ typedef struct uiTableColumnParams uiTableColumnParams; typedef enum uiTableColumnType uiTableColumnType; typedef enum uiTableNotification uiTableNotification; -_UI_EXTERN uintmax_t uiMenuItemType(void); -#define uiArea(this) ((uiArea *) uiIsA((this), uiAreaType(), 1)) +_UI_EXTERN uintmax_t uiTableType(void); +#define uiTable(this) ((uiTable *) uiIsA((this), uiTableType(), 1)) _UI_EXTERN void uiTableSetModel(uiTable *t, uiTableModel *m); _UI_EXTERN void uiTableAppendColumn(uiTable *t, uiTableColumnParams *p); _UI_EXTERN uiTable *uiNewTable(void); @@ -550,7 +550,7 @@ _UI_EXTERN uiTableModel *uiNewTableModel(uintmax_t nCols, uiTableColumnType *typ _UI_EXTERN void uiFreeTableModel(uiTableModel *m); _UI_EXTERN void uiTableModelNotify(uiTableModel *m, uiTableNotification notification, intmax_t row, intmax_t column); -#define uiTableModelFromBool(b) ((void *) (b)) +#define uiTableModelFromBool(b) ((void *) ((intptr_t) (b))) _UI_EXTERN void *uiTableModelFromString(const char *str); struct uiTableColumnParams { diff --git a/unix/table.c b/unix/table.c index 80656c93..ac0ccc62 100644 --- a/unix/table.c +++ b/unix/table.c @@ -20,7 +20,7 @@ uiUnixDefineControl( void uiTableSetModel(uiTable *t, uiTableModel *m) { t->model = m; - gtk_tree_view_set_model(t->treeview, GTK_TREE_MODEL(t->moel)); + gtk_tree_view_set_model(t->treeview, GTK_TREE_MODEL(t->model)); } void uiTableAppendColumn(uiTable *t, uiTableColumnParams *p) @@ -58,7 +58,7 @@ void uiTableAppendColumn(uiTable *t, uiTableColumnParams *p) NULL); // allow columns to be resized gtk_tree_view_column_set_resizable(col, TRUE); - gtk_tree_view_append_column(t->treeviw, col); + gtk_tree_view_append_column(t->treeview, col); } uiTable *uiNewTable(void) diff --git a/unix/tablemodel.c b/unix/tablemodel.c index a0a70ebf..02234657 100644 --- a/unix/tablemodel.c +++ b/unix/tablemodel.c @@ -25,7 +25,7 @@ struct uiTableModelClass { GObjectClass parent_class; }; -static void uiTableModel_treeModel_init(GtkTreeModel *); +static void uiTableModel_treeModel_init(GtkTreeModelIface *); G_DEFINE_TYPE_WITH_CODE(uiTableModel, uiTableModel, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, uiTableModel_treeModel_init)) @@ -115,8 +115,8 @@ void *uiTableModelFromString(const char *str) return g_strdup(str); } -#define toBool(v) ((int) (v)) -#define toStr(v) ((const char *) (v)) +#define toBool(v) ((int) ((intptr_t) (v))) +#define toStr(v) ((char *) (v)) static void uiTableModel_get_value(GtkTreeModel *mb, GtkTreeIter *iter, gint column, GValue *value) { @@ -178,11 +178,11 @@ static gboolean uiTableModel_iter_children(GtkTreeModel *mb, GtkTreeIter *iter, uiTableModel *m = uiTableModel(mb); if (parent == NULL && numRows(m) > 0) { - child->stamp = GOOD_STAMP; - child->user_data = 0; + iter->stamp = GOOD_STAMP; + iter->user_data = 0; return TRUE; } - child->stamp = BAD_STAMP; + iter->stamp = BAD_STAMP; return FALSE; } @@ -205,17 +205,17 @@ static gboolean uiTableModel_iter_nth_child(GtkTreeModel *mb, GtkTreeIter *iter, uiTableModel *m = uiTableModel(mb); if (parent == NULL && n >= 0 && n < numRows(m)) { - child->stamp = GOOD_STAMP; - child->user_data = TO(n); + iter->stamp = GOOD_STAMP; + iter->user_data = TO(n); return TRUE; } - child->stamp = BAD_STAMP; + iter->stamp = BAD_STAMP; return FALSE; } static gboolean uiTableModel_iter_parent(GtkTreeModel *mb, GtkTreeIter *iter, GtkTreeIter *child) { - parent->stamp = BAD_STAMP; + iter->stamp = BAD_STAMP; return FALSE; } @@ -225,7 +225,7 @@ static void uiTableModel_class_init(uiTableModelClass *class) G_OBJECT_CLASS(class)->finalize = uiTableModel_finalize; } -static void uiTableModel_treeModel_init(GtkTreeModel *iface) +static void uiTableModel_treeModel_init(GtkTreeModelIface *iface) { iface->get_flags = uiTableModel_get_flags; iface->get_n_columns = uiTableModel_get_n_columns; @@ -246,6 +246,7 @@ static void uiTableModel_treeModel_init(GtkTreeModel *iface) uiTableModel *uiNewTableModel(uintmax_t nCols, uiTableColumnType *types, uiTableModelSpec *spec, void *mData) { uiTableModel *m; + intmax_t i; m = uiTableModel(g_object_new(uiTableModelType, NULL)); m->spec = spec;