Merge 5d79460d4a
into fea45b2d5b
This commit is contained in:
commit
39bb8255e8
|
@ -11,6 +11,7 @@
|
||||||
typedef struct uiTableModelClass uiTableModelClass;
|
typedef struct uiTableModelClass uiTableModelClass;
|
||||||
struct uiTableModel {
|
struct uiTableModel {
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
gint stamp;
|
||||||
uiTableModelHandler *mh;
|
uiTableModelHandler *mh;
|
||||||
};
|
};
|
||||||
struct uiTableModelClass {
|
struct uiTableModelClass {
|
||||||
|
|
|
@ -52,9 +52,6 @@ static GType uiTableModel_get_column_type(GtkTreeModel *mm, gint index)
|
||||||
return G_TYPE_INVALID;
|
return G_TYPE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STAMP_GOOD 0x1234
|
|
||||||
#define STAMP_BAD 0x5678
|
|
||||||
|
|
||||||
static gboolean uiTableModel_get_iter(GtkTreeModel *mm, GtkTreeIter *iter, GtkTreePath *path)
|
static gboolean uiTableModel_get_iter(GtkTreeModel *mm, GtkTreeIter *iter, GtkTreePath *path)
|
||||||
{
|
{
|
||||||
uiTableModel *m = uiTableModel(mm);
|
uiTableModel *m = uiTableModel(mm);
|
||||||
|
@ -67,21 +64,22 @@ static gboolean uiTableModel_get_iter(GtkTreeModel *mm, GtkTreeIter *iter, GtkTr
|
||||||
goto bad;
|
goto bad;
|
||||||
if (row >= uiprivTableModelNumRows(m))
|
if (row >= uiprivTableModelNumRows(m))
|
||||||
goto bad;
|
goto bad;
|
||||||
iter->stamp = STAMP_GOOD;
|
iter->stamp = m->stamp;
|
||||||
iter->user_data = GINT_TO_POINTER(row);
|
iter->user_data = GINT_TO_POINTER(row);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
bad:
|
bad:
|
||||||
iter->stamp = STAMP_BAD;
|
iter->stamp = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// GtkListStore returns NULL on error; let's do that too
|
// GtkListStore returns NULL on error; let's do that too
|
||||||
static GtkTreePath *uiTableModel_get_path(GtkTreeModel *mm, GtkTreeIter *iter)
|
static GtkTreePath *uiTableModel_get_path(GtkTreeModel *mm, GtkTreeIter *iter)
|
||||||
{
|
{
|
||||||
|
uiTableModel *m = uiTableModel(mm);
|
||||||
gint row;
|
gint row;
|
||||||
|
|
||||||
if (iter->stamp != STAMP_GOOD)
|
g_return_val_if_fail(iter->stamp == m->stamp, NULL);
|
||||||
return NULL;
|
|
||||||
row = GPOINTER_TO_INT(iter->user_data);
|
row = GPOINTER_TO_INT(iter->user_data);
|
||||||
return gtk_tree_path_new_from_indices(row, -1);
|
return gtk_tree_path_new_from_indices(row, -1);
|
||||||
}
|
}
|
||||||
|
@ -95,8 +93,8 @@ static void uiTableModel_get_value(GtkTreeModel *mm, GtkTreeIter *iter, gint col
|
||||||
double r, g, b, a;
|
double r, g, b, a;
|
||||||
GdkRGBA rgba;
|
GdkRGBA rgba;
|
||||||
|
|
||||||
if (iter->stamp != STAMP_GOOD)
|
g_return_if_fail(iter->stamp == m->stamp);
|
||||||
return;
|
|
||||||
row = GPOINTER_TO_INT(iter->user_data);
|
row = GPOINTER_TO_INT(iter->user_data);
|
||||||
tvalue = uiprivTableModelCellValue(m, row, column);
|
tvalue = uiprivTableModelCellValue(m, row, column);
|
||||||
switch (uiprivTableModelColumnType(m, column)) {
|
switch (uiprivTableModelColumnType(m, column)) {
|
||||||
|
@ -138,12 +136,12 @@ static gboolean uiTableModel_iter_next(GtkTreeModel *mm, GtkTreeIter *iter)
|
||||||
uiTableModel *m = uiTableModel(mm);
|
uiTableModel *m = uiTableModel(mm);
|
||||||
gint row;
|
gint row;
|
||||||
|
|
||||||
if (iter->stamp != STAMP_GOOD)
|
g_return_val_if_fail(iter->stamp == m->stamp, FALSE);
|
||||||
return FALSE;
|
|
||||||
row = GPOINTER_TO_INT(iter->user_data);
|
row = GPOINTER_TO_INT(iter->user_data);
|
||||||
row++;
|
row++;
|
||||||
if (row >= uiprivTableModelNumRows(m)) {
|
if (row >= uiprivTableModelNumRows(m)) {
|
||||||
iter->stamp = STAMP_BAD;
|
iter->stamp = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
iter->user_data = GINT_TO_POINTER(row);
|
iter->user_data = GINT_TO_POINTER(row);
|
||||||
|
@ -152,14 +150,15 @@ static gboolean uiTableModel_iter_next(GtkTreeModel *mm, GtkTreeIter *iter)
|
||||||
|
|
||||||
static gboolean uiTableModel_iter_previous(GtkTreeModel *mm, GtkTreeIter *iter)
|
static gboolean uiTableModel_iter_previous(GtkTreeModel *mm, GtkTreeIter *iter)
|
||||||
{
|
{
|
||||||
|
uiTableModel *m = uiTableModel(mm);
|
||||||
gint row;
|
gint row;
|
||||||
|
|
||||||
if (iter->stamp != STAMP_GOOD)
|
g_return_val_if_fail(iter->stamp == m->stamp, FALSE);
|
||||||
return FALSE;
|
|
||||||
row = GPOINTER_TO_INT(iter->user_data);
|
row = GPOINTER_TO_INT(iter->user_data);
|
||||||
row--;
|
row--;
|
||||||
if (row < 0) {
|
if (row < 0) {
|
||||||
iter->stamp = STAMP_BAD;
|
iter->stamp = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
iter->user_data = GINT_TO_POINTER(row);
|
iter->user_data = GINT_TO_POINTER(row);
|
||||||
|
@ -189,25 +188,20 @@ static gboolean uiTableModel_iter_nth_child(GtkTreeModel *mm, GtkTreeIter *iter,
|
||||||
{
|
{
|
||||||
uiTableModel *m = uiTableModel(mm);
|
uiTableModel *m = uiTableModel(mm);
|
||||||
|
|
||||||
if (iter->stamp != STAMP_GOOD)
|
if (parent != NULL || n < 0 || n >= uiprivTableModelNumRows(m)) {
|
||||||
|
iter->stamp = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (parent != NULL)
|
}
|
||||||
goto bad;
|
|
||||||
if (n < 0)
|
iter->stamp = m->stamp;
|
||||||
goto bad;
|
|
||||||
if (n >= uiprivTableModelNumRows(m))
|
|
||||||
goto bad;
|
|
||||||
iter->stamp = STAMP_GOOD;
|
|
||||||
iter->user_data = GINT_TO_POINTER(n);
|
iter->user_data = GINT_TO_POINTER(n);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
bad:
|
|
||||||
iter->stamp = STAMP_BAD;
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean uiTableModel_iter_parent(GtkTreeModel *mm, GtkTreeIter *iter, GtkTreeIter *child)
|
gboolean uiTableModel_iter_parent(GtkTreeModel *mm, GtkTreeIter *iter, GtkTreeIter *child)
|
||||||
{
|
{
|
||||||
iter->stamp = STAMP_BAD;
|
iter->stamp = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,6 +234,9 @@ uiTableModel *uiNewTableModel(uiTableModelHandler *mh)
|
||||||
uiTableModel *m;
|
uiTableModel *m;
|
||||||
|
|
||||||
m = uiTableModel(g_object_new(uiTableModelType, NULL));
|
m = uiTableModel(g_object_new(uiTableModelType, NULL));
|
||||||
|
while ((m->stamp = g_random_int()) == 0) {
|
||||||
|
//iter of 0 means invalid
|
||||||
|
}
|
||||||
m->mh = mh;
|
m->mh = mh;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
@ -255,7 +252,7 @@ void uiTableModelRowInserted(uiTableModel *m, int newIndex)
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
|
||||||
path = gtk_tree_path_new_from_indices(newIndex, -1);
|
path = gtk_tree_path_new_from_indices(newIndex, -1);
|
||||||
iter.stamp = STAMP_GOOD;
|
iter.stamp = m->stamp;
|
||||||
iter.user_data = GINT_TO_POINTER(newIndex);
|
iter.user_data = GINT_TO_POINTER(newIndex);
|
||||||
gtk_tree_model_row_inserted(GTK_TREE_MODEL(m), path, &iter);
|
gtk_tree_model_row_inserted(GTK_TREE_MODEL(m), path, &iter);
|
||||||
gtk_tree_path_free(path);
|
gtk_tree_path_free(path);
|
||||||
|
@ -267,7 +264,7 @@ void uiTableModelRowChanged(uiTableModel *m, int index)
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
|
||||||
path = gtk_tree_path_new_from_indices(index, -1);
|
path = gtk_tree_path_new_from_indices(index, -1);
|
||||||
iter.stamp = STAMP_GOOD;
|
iter.stamp = m->stamp;
|
||||||
iter.user_data = GINT_TO_POINTER(index);
|
iter.user_data = GINT_TO_POINTER(index);
|
||||||
gtk_tree_model_row_changed(GTK_TREE_MODEL(m), path, &iter);
|
gtk_tree_model_row_changed(GTK_TREE_MODEL(m), path, &iter);
|
||||||
gtk_tree_path_free(path);
|
gtk_tree_path_free(path);
|
||||||
|
|
Loading…
Reference in New Issue