diff options
author | Jakob Bornecrantz <jakob@vmware.com> | 2009-06-04 17:53:01 +0100 |
---|---|---|
committer | Jakob Bornecrantz <jakob@vmware.com> | 2009-06-04 17:53:01 +0100 |
commit | ea8763c234dfaa5fef7cc1b4dc954402f2fd7e9e (patch) | |
tree | cbd69bf67b1490a797e0eb3d7e8d633050d12686 | |
parent | a0680699199e18db090cf19bca23d28632ca5c9f (diff) |
Create a viewed concept
This allows us to select object but view another one
-rw-r--r-- | src/main.c | 60 | ||||
-rw-r--r-- | src/program.h | 12 | ||||
-rw-r--r-- | src/shader.c | 46 | ||||
-rw-r--r-- | src/texture.c | 28 |
4 files changed, 120 insertions, 26 deletions
@@ -235,6 +235,66 @@ static void icon_setup(struct program *p) icon_add("res/shader_off_replaced.png", "shader_off_replaced", p); } +void main_set_viewed(GtkTreeIter *iter, struct program *p) +{ + GtkTreeModel *model = GTK_TREE_MODEL(p->main.treestore); + GtkTreeIter parent; + enum types old_type; + uint64_t old_id; + GValue typename; + GValue type; + GValue id; + + old_id = p->viewed.id; + old_type = p->viewed.type; + + if (iter) { + memset(&id, 0, sizeof(id)); + memset(&type, 0, sizeof(type)); + memset(&typename, 0, sizeof(typename)); + + gtk_tree_model_get_value(model, iter, COLUMN_ID, &id); + gtk_tree_model_get_value(model, iter, COLUMN_TYPE, &type); + gtk_tree_model_get_value(model, iter, COLUMN_TYPENAME, &typename); + + g_assert(G_VALUE_HOLDS_UINT64(&id)); + g_assert(G_VALUE_HOLDS_INT(&type)); + g_assert(G_VALUE_HOLDS_STRING(&typename)); + + p->viewed.iter = *iter; + p->viewed.id = g_value_get_uint64(&id); + p->viewed.type = g_value_get_int(&type); + + if (gtk_tree_model_iter_parent(model, &parent, iter)) { + g_value_unset(&id); + gtk_tree_model_get_value(model, &parent, COLUMN_ID, &id); + g_assert(G_VALUE_HOLDS_UINT64(&id)); + p->viewed.parent = g_value_get_uint64(&id); + } else { + /* Everything else then the screen must have a parent */ + g_assert(p->viewed.id != 0); + } + } else { + memset(&p->viewed, 0, sizeof(p->viewed)); + } + + if (p->viewed.id != old_id || + p->viewed.type != old_type) { + if (old_id) { + if (old_type == TYPE_SHADER) + shader_unviewed(p); + else if (old_type == TYPE_TEXTURE) + texture_unviewed(p); + } + if (p->viewed.id) { + if (p->viewed.type == TYPE_SHADER) + shader_viewed(p); + else if (p->selected.type == TYPE_TEXTURE) + texture_viewed(p); + } + } +} + void main_window_create(struct program *p) { GtkBuilder *builder; diff --git a/src/program.h b/src/program.h index 41ef9df..aa38d8a 100644 --- a/src/program.h +++ b/src/program.h @@ -85,6 +85,13 @@ struct program } selected; struct { + GtkTreeIter iter; + enum types type; + guint64 parent; + guint64 id; + } viewed; + + struct { GtkWidget *back; GtkWidget *forward; GtkWidget *background; @@ -146,6 +153,7 @@ gboolean ask_connect(struct program *p); /* src/main.c */ void main_window_create(struct program *p); void main_quit(struct program *p); +void main_set_viewed(GtkTreeIter *iter, struct program *p); void icon_add(const char *filename, const char *name, struct program *p); GdkPixbuf* icon_get(const char *name, struct program *p); @@ -165,6 +173,8 @@ void context_list(GtkTreeStore *store, void texture_list(GtkTreeStore *store, GtkTreeIter *parent, struct program *p); void texture_unselected(struct program *p); void texture_selected(struct program *p); +void texture_unviewed(struct program *p); +void texture_viewed(struct program *p); void texture_refresh(struct program *p); void texture_draw(struct program *p); @@ -172,6 +182,8 @@ void texture_draw(struct program *p); /* src/shader.c */ void shader_unselected(struct program *p); void shader_selected(struct program *p); +void shader_unviewed(struct program *p); +void shader_viewed(struct program *p); void shader_list(GtkTreeStore *store, GtkTreeIter *parent, rbug_context_t ctx, diff --git a/src/shader.c b/src/shader.c index a81a28a..79fc91d 100644 --- a/src/shader.c +++ b/src/shader.c @@ -56,16 +56,16 @@ static void disable(GtkWidget *widget, struct program *p) struct rbug_connection *con = p->rbug.con; (void)widget; - g_assert(p->selected.type == TYPE_SHADER); + g_assert(p->viewed.type == TYPE_SHADER); rbug_finish_and_emit_events(p); - rbug_send_shader_disable(con, p->selected.parent, p->selected.id, true, NULL); + rbug_send_shader_disable(con, p->viewed.parent, p->viewed.id, true, NULL); rbug_finish_and_emit_events(p); gtk_widget_hide(p->tool.disable); gtk_widget_show(p->tool.enable); - shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p); + shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p); } static void enable(GtkWidget *widget, struct program *p) @@ -73,16 +73,16 @@ static void enable(GtkWidget *widget, struct program *p) struct rbug_connection *con = p->rbug.con; (void)widget; - g_assert(p->selected.type == TYPE_SHADER); + g_assert(p->viewed.type == TYPE_SHADER); rbug_finish_and_emit_events(p); - rbug_send_shader_disable(con, p->selected.parent, p->selected.id, false, NULL); + rbug_send_shader_disable(con, p->viewed.parent, p->viewed.id, false, NULL); rbug_finish_and_emit_events(p); gtk_widget_show(p->tool.disable); gtk_widget_hide(p->tool.enable); - shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p); + shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p); } static void update_text(struct rbug_proto_shader_info_reply *info, struct program *p) @@ -110,13 +110,13 @@ static void revert(GtkWidget *widget, struct program *p) struct rbug_connection *con = p->rbug.con; (void)widget; - g_assert(p->selected.type == TYPE_SHADER); + g_assert(p->viewed.type == TYPE_SHADER); rbug_finish_and_emit_events(p); - rbug_send_shader_replace(con, p->selected.parent, p->selected.id, NULL, 0, NULL); + rbug_send_shader_replace(con, p->viewed.parent, p->viewed.id, NULL, 0, NULL); rbug_finish_and_emit_events(p); - shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p); + shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p); } static void save(GtkWidget *widget, struct program *p) @@ -131,7 +131,7 @@ static void save(GtkWidget *widget, struct program *p) unsigned num; (void)widget; - g_assert(p->selected.type == TYPE_SHADER); + g_assert(p->viewed.type == TYPE_SHADER); g_assert(sizeof(struct tgsi_token) == 4); rbug_finish_and_emit_events(p); @@ -148,22 +148,22 @@ static void save(GtkWidget *widget, struct program *p) num = tgsi_num_tokens(tokens); - rbug_send_shader_replace(con, p->selected.parent, p->selected.id, + rbug_send_shader_replace(con, p->viewed.parent, p->viewed.id, (uint32_t*)tokens, num, NULL); gtk_widget_show(p->tool.revert); rbug_finish_and_emit_events(p); - shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p); + shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p); out: g_free(text); } -void shader_selected(struct program *p) +void shader_viewed(struct program *p) { - g_assert(p->selected.type == TYPE_SHADER); + g_assert(p->viewed.type == TYPE_SHADER); p->shader.id[0] = g_signal_connect(p->tool.save, "clicked", G_CALLBACK(save), p); p->shader.id[1] = g_signal_connect(p->tool.revert, "clicked", G_CALLBACK(revert), p); @@ -176,10 +176,10 @@ void shader_selected(struct program *p) if (p->shader.info) shader_stop_info_action(p->shader.info, p); - shader_start_info_action(p->selected.parent, p->selected.id, &p->selected.iter, p); + shader_start_info_action(p->viewed.parent, p->viewed.id, &p->viewed.iter, p); } -void shader_unselected(struct program *p) +void shader_unviewed(struct program *p) { g_signal_handler_disconnect(p->tool.save, p->shader.id[0]); g_signal_handler_disconnect(p->tool.revert, p->shader.id[1]); @@ -194,6 +194,16 @@ void shader_unselected(struct program *p) gtk_widget_hide(p->main.textview_scrolled); } +void shader_unselected(struct program *p) +{ + main_set_viewed(NULL, p); +} + +void shader_selected(struct program *p) +{ + main_set_viewed(&p->selected.iter, p); +} + void shader_list(GtkTreeStore *store, GtkTreeIter *parent, rbug_context_t ctx, struct program *p) { @@ -243,6 +253,8 @@ static void shader_action_info_info(struct rbug_event *e, /* ack pending message */ action->pending = FALSE; + g_assert(header->opcode == RBUG_OP_SHADER_INFO_REPLY); + if (info->disabled) { if (info->replaced_len == 0) buf = icon_get("shader_off_normal", p); @@ -256,7 +268,7 @@ static void shader_action_info_info(struct rbug_event *e, } gtk_tree_store_set(p->main.treestore, &action->iter, COLUMN_PIXBUF, buf, -1); - if (p->selected.id != action->sid) + if (p->viewed.id != action->sid) goto out; update_text(info, p); diff --git a/src/texture.c b/src/texture.c index 1a31ad3..0fcd762 100644 --- a/src/texture.c +++ b/src/texture.c @@ -82,7 +82,7 @@ static void automatic(GtkWidget *widget, struct program *p) p->texture.automatic = !p->texture.automatic; if (p->texture.automatic) - texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p); + texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p); } static void background(GtkWidget *widget, struct program *p) @@ -109,7 +109,7 @@ void texture_list(GtkTreeStore *store, GtkTreeIter *parent, struct program *p) void texture_refresh(struct program *p) { - texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p); + texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p); } void texture_draw(struct program *p) @@ -134,7 +134,7 @@ void texture_draw(struct program *p) break; } - if (p->texture.id != p->selected.id) + if (p->texture.id != p->viewed.id) return; w = p->texture.width; @@ -162,10 +162,10 @@ void texture_draw(struct program *p) glDisable(GL_BLEND); if (p->texture.automatic) - texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p); + texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p); } -void texture_unselected(struct program *p) +void texture_unviewed(struct program *p) { (void)p; @@ -183,11 +183,11 @@ void texture_unselected(struct program *p) g_signal_handler_disconnect(p->tool.background, p->texture.tid[2]); } -void texture_selected(struct program *p) +void texture_viewed(struct program *p) { - g_assert(p->selected.type == TYPE_TEXTURE); + g_assert(p->viewed.type == TYPE_TEXTURE); - texture_start_if_new_read_action(p->selected.id, &p->selected.iter, p); + texture_start_if_new_read_action(p->viewed.id, &p->viewed.iter, p); gtk_widget_show(p->tool.alpha); gtk_widget_show(p->tool.automatic); @@ -203,6 +203,16 @@ void texture_selected(struct program *p) p->texture.tid[2] = g_signal_connect(p->tool.background, "clicked", G_CALLBACK(background), p); } +void texture_unselected(struct program *p) +{ + main_set_viewed(NULL, p); +} + +void texture_selected(struct program *p) +{ + main_set_viewed(&p->selected.iter, p); +} + /* * Actions */ @@ -522,7 +532,7 @@ static void texture_start_if_new_read_action(rbug_texture_t t, /* are we currently trying download anything? */ if (p->texture.read) { /* ok we are downloading something, but is it the one we want? */ - if (p->texture.read->id == p->selected.id) { + if (p->texture.read->id == p->viewed.id) { /* don't need to do anything */ return; } else { |