about summary refs log tree commit diff
path: root/src/game/editor
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-01-13 22:37:58 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-01-13 22:37:58 +0000
commita9c90d6ac082dbfea5590c54d5be7a71dd112b5d (patch)
treeab2ed6fefe6cb18e54c07bcb7eaf84db99600ebe /src/game/editor
parentc04df11f1ec1e3dd3e23fced9e1b127e5b05ab91 (diff)
downloadzcatch-a9c90d6ac082dbfea5590c54d5be7a71dd112b5d.tar.gz
zcatch-a9c90d6ac082dbfea5590c54d5be7a71dd112b5d.zip
fixed better image selection
Diffstat (limited to 'src/game/editor')
-rw-r--r--src/game/editor/ed_editor.cpp169
-rw-r--r--src/game/editor/ed_editor.hpp3
-rw-r--r--src/game/editor/ed_layer_quads.cpp2
3 files changed, 123 insertions, 51 deletions
diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp
index 5bb5bb3a..bf6918fa 100644
--- a/src/game/editor/ed_editor.cpp
+++ b/src/game/editor/ed_editor.cpp
@@ -25,10 +25,15 @@ static int entities_texture = 0;
 
 
 // popup menu handling
-static RECT ui_popup_rect;
-static void *ui_popup_id = 0;
-static int (*ui_popup_func)(RECT rect);
-static int ui_popup_is_menu = 0;
+static struct
+{
+	RECT rect;
+	void *id;
+	int (*func)(RECT rect);
+	int is_menu;
+	void *extra;
+} ui_popups[8];
+static int ui_num_popups = 0;
 
 EDITOR editor;
 
@@ -181,13 +186,14 @@ static void draw_editor_button_menu(const void *id, const char *text, int checke
 	*/
 
 	RECT r = *rect;
-	if(ui_popup_id == id)
+	/*
+	if(ui_popups[id == id)
 	{
 		ui_draw_rect(&r, vec4(0.5f,0.5f,0.5f,0.75f), CORNER_T, 3.0f);
 		ui_margin(&r, 1.0f, &r);
 		ui_draw_rect(&r, vec4(0,0,0,0.75f), CORNER_T, 3.0f);
 	}
-	else
+	else*/
 		ui_draw_rect(&r, vec4(0.5f,0.5f,0.5f, 1.0f), CORNER_T, 3.0f);
 	
 
@@ -198,10 +204,10 @@ static void draw_editor_button_menu(const void *id, const char *text, int checke
 	//RECT t = *r;
 }
 
-static void draw_editor_button_menuitem(const void *id, const char *text, int checked, const RECT *r, const void *extra)
+void draw_editor_button_menuitem(const void *id, const char *text, int checked, const RECT *r, const void *extra)
 {
 	if(ui_hot_item() == id) if(extra) editor.tooltip = (const char *)extra;
-	if(ui_hot_item() == id)
+	if(ui_hot_item() == id || checked)
 		ui_draw_rect(r, get_button_color(id, checked), CORNER_ALL, 3.0f);
 	
 	RECT t = *r;
@@ -340,56 +346,58 @@ static int ui_do_value_selector(void *id, RECT *r, const char *label, int curren
 	return current;
 }
 
-static void ui_invoke_popup_menu(void *id, int flags, float x, float y, float w, float h, int (*func)(RECT rect))
+static void ui_invoke_popup_menu(void *id, int flags, float x, float y, float w, float h, int (*func)(RECT rect), void *extra=0)
 {
 	dbg_msg("", "invoked");
-	ui_popup_is_menu = flags;
-	ui_popup_id = id;
-	ui_popup_rect.x = x;
-	ui_popup_rect.y = y;
-	ui_popup_rect.w = w;
-	ui_popup_rect.h = h;
-	ui_popup_func = func;
+	ui_popups[ui_num_popups].id = id;
+	ui_popups[ui_num_popups].is_menu = flags;
+	ui_popups[ui_num_popups].rect.x = x;
+	ui_popups[ui_num_popups].rect.y = y;
+	ui_popups[ui_num_popups].rect.w = w;
+	ui_popups[ui_num_popups].rect.h = h;
+	ui_popups[ui_num_popups].func = func;
+	ui_popups[ui_num_popups].extra = extra;
+	ui_num_popups++;
 }
 
 static void ui_do_popup_menu()
 {
-	if(!ui_popup_id)
-		return;
-		
-	bool inside = ui_mouse_inside(&ui_popup_rect);
-	ui_set_hot_item(&ui_popup_id);
-	
-	if(ui_active_item() == &ui_popup_id)
+	for(int i = 0; i < ui_num_popups; i++)
 	{
-		if(!ui_mouse_button(0))
+		bool inside = ui_mouse_inside(&ui_popups[i].rect);
+		ui_set_hot_item(&ui_popups[i].id);
+		
+		if(ui_active_item() == &ui_popups[i].id)
 		{
-			if(!inside)
-				ui_popup_id = 0;
-			ui_set_active_item(0);
+			if(!ui_mouse_button(0))
+			{
+				if(!inside)
+					ui_num_popups--;
+				ui_set_active_item(0);
+			}
+		}
+		else if(ui_hot_item() == &ui_popups[i].id)
+		{
+			if(ui_mouse_button(0))
+				ui_set_active_item(&ui_popups[i].id);
 		}
-	}
-	else if(ui_hot_item() == &ui_popup_id)
-	{
-		if(ui_mouse_button(0))
-			ui_set_active_item(&ui_popup_id);
-	}
-	
-	int corners = CORNER_ALL;
-	if(ui_popup_is_menu)
-		corners = CORNER_R|CORNER_B;
-	
-	RECT r = ui_popup_rect;
-	ui_draw_rect(&r, vec4(0.5f,0.5f,0.5f,0.75f), corners, 3.0f);
-	ui_margin(&ui_popup_rect, 1.0f, &r);
-	ui_draw_rect(&r, vec4(0,0,0,0.75f), corners, 3.0f);
-	ui_margin(&ui_popup_rect, 4.0f, &r);
-	
-	if(ui_popup_func(r))
-		ui_popup_id = 0;
 		
-	if(inp_key_pressed(KEY_ESC))
-		ui_popup_id = 0;
+		int corners = CORNER_ALL;
+		if(ui_popups[i].is_menu)
+			corners = CORNER_R|CORNER_B;
+		
+		RECT r = ui_popups[i].rect;
+		ui_draw_rect(&r, vec4(0.5f,0.5f,0.5f,0.75f), corners, 3.0f);
+		ui_margin(&r, 1.0f, &r);
+		ui_draw_rect(&r, vec4(0,0,0,0.75f), corners, 3.0f);
+		ui_margin(&r, 4.0f, &r);
+		
+		if(ui_popups[i].func(r))
+			ui_num_popups--;
+			
+		if(inp_key_down(KEY_ESC))
+			ui_num_popups--;
+	}
 }
 
 LAYERGROUP *EDITOR::get_selected_group()
@@ -1205,6 +1213,51 @@ static void do_map_editor(RECT view, RECT toolbar)
 	ui_clip_disable();
 }
 
+static int select_image_selected = -100;
+static int select_image_current = -100;
+
+static int popup_select_image(RECT view)
+{
+	RECT buttonbar, imageview;
+	ui_vsplit_l(&view, 80.0f, &buttonbar, &view);
+	ui_margin(&view, 10.0f, &imageview);
+	
+	int show_image = select_image_current;
+	
+	for(int i = -1; i < editor.map.images.len(); i++)
+	{
+		RECT button;
+		ui_hsplit_t(&buttonbar, 12.0f, &button, &buttonbar);
+		ui_hsplit_t(&buttonbar, 2.0f, 0, &buttonbar);
+		
+		if(ui_mouse_inside(&button))
+			show_image = i;
+			
+		if(i == -1)
+		{
+			if(do_editor_button(&editor.map.images[i], "None", i==select_image_current, &button, draw_editor_button_menuitem, 0, 0))
+				select_image_selected = -1;
+		}
+		else
+		{
+			char buf[64];
+			sprintf(buf, "%d", i);
+			if(do_editor_button(&editor.map.images[i], buf, i==select_image_current, &button, draw_editor_button_menuitem, 0, 0))
+				select_image_selected = i;
+		}
+	}
+	
+	if(show_image >= 0 && show_image < editor.map.images.len())
+		gfx_texture_set(editor.map.images[show_image]->tex_id);
+	else
+		gfx_texture_set(-1);
+	gfx_quads_begin();
+	gfx_quads_drawTL(imageview.x, imageview.y, imageview.w, imageview.h);
+	gfx_quads_end();
+
+	return 0;
+}
+
 int EDITOR::do_properties(RECT *toolbox, PROPERTY *props, int *ids, int *new_val)
 {
 	int change = -1;
@@ -1280,6 +1333,24 @@ int EDITOR::do_properties(RECT *toolbox, PROPERTY *props, int *ids, int *new_val
 				change = i;
 			}
 		}
+		else if(props[i].type == PROPTYPE_IMAGE)
+		{
+			if(do_editor_button(&ids[i], "Choose", 0, &shifter, draw_editor_button, 0, 0))
+			{
+				static int select_image_popup_id = 0;
+				select_image_selected = -100;
+				select_image_current = props[i].value;
+				ui_invoke_popup_menu(&select_image_popup_id, 0, ui_mouse_x(), ui_mouse_y(), 400, 300, popup_select_image);
+			}
+			
+			if(select_image_selected != -100)
+			{
+				*new_val = select_image_selected;
+				change = i;
+				select_image_current = select_image_selected;
+				select_image_selected = -100;
+			}
+		}
 	}
 	
 	return change;
@@ -2253,8 +2324,6 @@ static void editor_render()
 	if(editor.gui_active)
 		render_statusbar(statusbar);
 	
-	//do_propsdialog();
-
 	// render butt ugly mouse cursor
 	float mx = ui_mouse_x();
 	float my = ui_mouse_y();
diff --git a/src/game/editor/ed_editor.hpp b/src/game/editor/ed_editor.hpp
index 998c8b86..c0a3b494 100644
--- a/src/game/editor/ed_editor.hpp
+++ b/src/game/editor/ed_editor.hpp
@@ -308,6 +308,8 @@ enum
 	PROPTYPE_INT_STEP,
 	PROPTYPE_INT_SCROLL,
 	PROPTYPE_COLOR,
+	PROPTYPE_IMAGE,
+	PROPTYPE_ENVELOPE,
 	
 	PROPS_NONE=0,
 	PROPS_GROUP,
@@ -478,3 +480,4 @@ public:
 
 int do_editor_button(const void *id, const char *text, int checked, const RECT *r, ui_draw_button_func draw_func, int flags, const char *tooltip);
 void draw_editor_button(const void *id, const char *text, int checked, const RECT *r, const void *extra);
+void draw_editor_button_menuitem(const void *id, const char *text, int checked, const RECT *r, const void *extra);
diff --git a/src/game/editor/ed_layer_quads.cpp b/src/game/editor/ed_layer_quads.cpp
index 5d5488f5..ee75a503 100644
--- a/src/game/editor/ed_layer_quads.cpp
+++ b/src/game/editor/ed_layer_quads.cpp
@@ -169,7 +169,7 @@ int LAYER_QUADS::render_properties(RECT *toolbox)
 		};
 		
 		PROPERTY props[] = {
-			{"Image", image, PROPTYPE_INT_STEP, -1, 0},
+			{"Image", image, PROPTYPE_IMAGE, -1, 0},
 			{0},
 		};