📄 swfedit_token.c
字号:
static gintswfedit_token_get_n_columns (GtkTreeModel *tree_model){ SwfeditToken *token = SWFEDIT_TOKEN (tree_model); REPORT; return token->tokens->len;}static GTypeswfedit_token_get_column_type (GtkTreeModel *tree_model, gint index_){ REPORT; switch (index_) { case SWFEDIT_COLUMN_NAME: return G_TYPE_STRING; case SWFEDIT_COLUMN_VALUE_VISIBLE: return G_TYPE_BOOLEAN; case SWFEDIT_COLUMN_VALUE_EDITABLE: return G_TYPE_BOOLEAN; case SWFEDIT_COLUMN_VALUE: return G_TYPE_STRING; default: break; } g_assert_not_reached (); return G_TYPE_NONE;}static gbooleanswfedit_token_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path){ SwfeditToken *token = SWFEDIT_TOKEN (tree_model); guint i = gtk_tree_path_get_indices (path)[0]; SwfeditTokenEntry *entry; REPORT; if (i > token->tokens->len) return FALSE; entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); if (gtk_tree_path_get_depth (path) > 1) { GtkTreePath *new; int j; int *indices; gboolean ret; if (entry->type != SWFEDIT_TOKEN_OBJECT) return FALSE; new = gtk_tree_path_new (); indices = gtk_tree_path_get_indices (path); for (j = 1; j < gtk_tree_path_get_depth (path); j++) { gtk_tree_path_append_index (new, indices[j]); } ret = swfedit_token_get_iter (GTK_TREE_MODEL (entry->value), iter, new); gtk_tree_path_free (new); return ret; } else { iter->stamp = 0; /* FIXME */ iter->user_data = token; iter->user_data2 = GINT_TO_POINTER (i); return TRUE; }}static GtkTreePath *swfedit_token_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter){ SwfeditToken *token = SWFEDIT_TOKEN (iter->user_data); GtkTreePath *path = gtk_tree_path_new_from_indices (GPOINTER_TO_INT (iter->user_data2), -1); REPORT; while (token->parent) { guint i; SwfeditToken *parent = token->parent; for (i = 0; i < parent->tokens->len; i++) { SwfeditTokenEntry *entry = &g_array_index (parent->tokens, SwfeditTokenEntry, i); if (entry->type != SWFEDIT_TOKEN_OBJECT) continue; if (entry->value == token) break; } gtk_tree_path_prepend_index (path, i); token = parent; } return path;}static void swfedit_token_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value){ SwfeditToken *token = SWFEDIT_TOKEN (iter->user_data); SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, GPOINTER_TO_INT (iter->user_data2)); REPORT; switch (column) { case SWFEDIT_COLUMN_NAME: g_value_init (value, G_TYPE_STRING); g_value_set_string (value, entry->name); return; case SWFEDIT_COLUMN_VALUE_VISIBLE: g_value_init (value, G_TYPE_BOOLEAN); g_value_set_boolean (value, converters[entry->type].to_string != NULL); return; case SWFEDIT_COLUMN_VALUE_EDITABLE: g_value_init (value, G_TYPE_BOOLEAN); g_value_set_boolean (value, entry->visible); return; case SWFEDIT_COLUMN_VALUE: g_value_init (value, G_TYPE_STRING); if (converters[entry->type].to_string) g_value_take_string (value, converters[entry->type].to_string (entry->value)); return; default: break; } g_assert_not_reached ();}static gbooleanswfedit_token_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter){ SwfeditToken *token = SWFEDIT_TOKEN (iter->user_data); REPORT; if ((guint) GPOINTER_TO_INT (iter->user_data2) + 1 >= token->tokens->len) return FALSE; iter->user_data2++; return TRUE;}static gbooleanswfedit_token_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent){ SwfeditToken *token; SwfeditTokenEntry *entry; REPORT; if (parent) { token = SWFEDIT_TOKEN (parent->user_data); entry = &g_array_index (token->tokens, SwfeditTokenEntry, GPOINTER_TO_INT (parent->user_data2)); if (entry->type != SWFEDIT_TOKEN_OBJECT) return FALSE; token = entry->value; } else { token = SWFEDIT_TOKEN (tree_model); } if (token->tokens->len == 0) return FALSE; iter->stamp = 0; /* FIXME */ iter->user_data = token; iter->user_data2 = GINT_TO_POINTER (0); return TRUE;}static gbooleanswfedit_token_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter){ SwfeditToken *token = SWFEDIT_TOKEN (iter->user_data); SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, GPOINTER_TO_INT (iter->user_data2)); REPORT; return entry->type == SWFEDIT_TOKEN_OBJECT && SWFEDIT_TOKEN (entry->value)->tokens->len > 0;}static gintswfedit_token_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter){ SwfeditToken *token = SWFEDIT_TOKEN (iter->user_data); SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, GPOINTER_TO_INT (iter->user_data2)); REPORT; if (entry->type != SWFEDIT_TOKEN_OBJECT) return 0; token = entry->value; return token->tokens->len;}static gbooleanswfedit_token_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n){ SwfeditToken *token; SwfeditTokenEntry *entry; REPORT; if (parent) { token = SWFEDIT_TOKEN (parent->user_data); entry = &g_array_index (token->tokens, SwfeditTokenEntry, GPOINTER_TO_INT (parent->user_data2)); if (entry->type != SWFEDIT_TOKEN_OBJECT) return FALSE; token = entry->value; } else { token = SWFEDIT_TOKEN (tree_model); } if ((guint) n >= token->tokens->len) return FALSE; iter->stamp = 0; /* FIXME */ iter->user_data = token; iter->user_data2 = GINT_TO_POINTER (n); return TRUE;}static gbooleanswfedit_token_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child){ guint i; SwfeditToken *token = SWFEDIT_TOKEN (child->user_data); SwfeditToken *parent = token->parent; REPORT; if (parent == NULL) return FALSE; for (i = 0; i < parent->tokens->len; i++) { SwfeditTokenEntry *entry = &g_array_index (parent->tokens, SwfeditTokenEntry, i); if (entry->type != SWFEDIT_TOKEN_OBJECT) continue; if (entry->value == token) break; } iter->stamp = 0; /* FIXME */ iter->user_data = parent; iter->user_data2 = GINT_TO_POINTER (i); return TRUE;}static voidswfedit_token_tree_model_init (GtkTreeModelIface *iface){ iface->get_flags = swfedit_token_get_flags; iface->get_n_columns = swfedit_token_get_n_columns; iface->get_column_type = swfedit_token_get_column_type; iface->get_iter = swfedit_token_get_iter; iface->get_path = swfedit_token_get_path; iface->get_value = swfedit_token_get_value; iface->iter_next = swfedit_token_iter_next; iface->iter_children = swfedit_token_iter_children; iface->iter_has_child = swfedit_token_iter_has_child; iface->iter_n_children = swfedit_token_iter_n_children; iface->iter_nth_child = swfedit_token_iter_nth_child; iface->iter_parent = swfedit_token_iter_parent;}/*** SWFEDIT_TOKEN ***/G_DEFINE_TYPE_WITH_CODE (SwfeditToken, swfedit_token, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, swfedit_token_tree_model_init))static voidswfedit_token_dispose (GObject *object){ SwfeditToken *token = SWFEDIT_TOKEN (object); guint i; for (i = 0; i < token->tokens->len; i++) { SwfeditTokenEntry *entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); g_free (entry->name); if (converters[entry->type].free) converters[entry->type].free (entry->value); } g_array_free (token->tokens, TRUE); G_OBJECT_CLASS (swfedit_token_parent_class)->dispose (object);}static voidswfedit_token_class_init (SwfeditTokenClass *class){ GObjectClass *object_class = G_OBJECT_CLASS (class); object_class->dispose = swfedit_token_dispose;}static voidswfedit_token_init (SwfeditToken *token){ token->tokens = g_array_new (FALSE, FALSE, sizeof (SwfeditTokenEntry));}SwfeditToken *swfedit_token_new (void){ SwfeditToken *token; token = g_object_new (SWFEDIT_TYPE_TOKEN, NULL); return token;}voidswfedit_token_add (SwfeditToken *token, const char *name, SwfeditTokenType type, gpointer value){ SwfeditTokenEntry entry = { NULL, type, value, TRUE }; g_return_if_fail (SWFEDIT_IS_TOKEN (token)); g_return_if_fail (name != NULL); g_return_if_fail (type < SWFEDIT_N_TOKENS); g_assert (type != SWFEDIT_TOKEN_OBJECT || value != NULL); entry.name = g_strdup (name); g_array_append_val (token->tokens, entry);}voidswfedit_token_set (SwfeditToken *token, guint i, gpointer value){ SwfeditTokenClass *klass; SwfeditTokenEntry *entry; GtkTreePath *path; SwfeditToken *model; GtkTreeIter iter; g_return_if_fail (SWFEDIT_IS_TOKEN (token)); g_return_if_fail (i < token->tokens->len); entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); if (converters[entry->type].free != NULL) converters[entry->type].free (entry->value); entry->value = value; klass = SWFEDIT_TOKEN_GET_CLASS (token); if (klass->changed) klass->changed (token, i); model = token; while (model->parent) model = model->parent; iter.user_data = token; iter.user_data2 = GUINT_TO_POINTER (i); path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter); gtk_tree_path_free (path);}voidswfedit_token_set_iter (SwfeditToken *token, GtkTreeIter *iter, const char *value){ SwfeditTokenClass *klass; GtkTreeModel *model; SwfeditTokenEntry *entry; guint i; gpointer new; GtkTreePath *path; g_return_if_fail (SWFEDIT_IS_TOKEN (token)); g_return_if_fail (iter != NULL); g_return_if_fail (value != NULL); model = GTK_TREE_MODEL (token); token = iter->user_data; i = GPOINTER_TO_UINT (iter->user_data2); entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); if (converters[entry->type].from_string == NULL) return; if (!converters[entry->type].from_string (value, &new)) return; if (converters[entry->type].free != NULL) converters[entry->type].free (entry->value); entry->value = new; klass = SWFEDIT_TOKEN_GET_CLASS (token); if (klass->changed) klass->changed (token, i); path = gtk_tree_model_get_path (model, iter); gtk_tree_model_row_changed (model, path, iter); gtk_tree_path_free (path);}voidswfedit_token_set_visible (SwfeditToken *token, guint i, gboolean visible){ SwfeditTokenEntry *entry; GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; g_return_if_fail (SWFEDIT_IS_TOKEN (token)); g_return_if_fail (i < token->tokens->len); entry = &g_array_index (token->tokens, SwfeditTokenEntry, i); if (entry->visible == visible) return; entry->visible = visible; iter.stamp = 0; /* FIXME */ iter.user_data = token; iter.user_data2 = GINT_TO_POINTER (i); while (token->parent) token = token->parent; model = GTK_TREE_MODEL (token); path = gtk_tree_model_get_path (model, &iter); gtk_tree_model_row_changed (model, path, &iter); gtk_tree_path_free (path);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -