[Bf-blender-cvs] [603b867] master: UI: support cycling for image space menus

Campbell Barton noreply at git.blender.org
Sun Nov 15 21:22:14 CET 2015


Commit: 603b867588f7940378950fefaffc9dfe0c67c2c7
Author: Campbell Barton
Date:   Mon Nov 16 07:13:40 2015 +1100
Branches: master
https://developer.blender.org/rB603b867588f7940378950fefaffc9dfe0c67c2c7

UI: support cycling for image space menus

also remove arrow buttons.

===================================================================

M	source/blender/editors/include/ED_image.h
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/image_edit.c
M	source/blender/editors/space_image/image_ops.c

===================================================================

diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h
index 4c4cec2..283113f 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -66,6 +66,7 @@ void ED_image_get_uv_aspect(struct Image *ima, struct ImageUser *iuser, float *a
 void ED_image_mouse_pos(struct SpaceImage *sima, struct ARegion *ar, const int mval[2], float co[2]);
 void ED_image_point_pos(struct SpaceImage *sima, struct ARegion *ar, float x, float y, float *xr, float *yr);
 void ED_image_point_pos__reverse(struct SpaceImage *sima, struct ARegion *ar, const float co[2], float r_co[2]);
+bool ED_image_slot_cycle(struct Image *image, int direction);
 
 bool ED_space_image_show_render(struct SpaceImage *sima);
 bool ED_space_image_show_paint(struct SpaceImage *sima);
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index ebcdcef..80d6858 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -53,6 +53,7 @@
 
 #include "ED_gpencil.h"
 #include "ED_screen.h"
+#include "ED_image.h"
 
 #include "RNA_access.h"
 
@@ -310,6 +311,19 @@ static void ui_imageuser_slot_menu(bContext *UNUSED(C), uiLayout *layout, void *
 	}
 }
 
+static bool ui_imageuser_slot_menu_step(bContext *C, int direction, void *image_p)
+{
+	Image *image = image_p;
+
+	if (ED_image_slot_cycle(image, direction)) {
+		WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+		return true;
+	}
+	else {
+		return true;
+	}
+}
+
 static const char *ui_imageuser_layer_fake_name(RenderResult *rr)
 {
 	RenderView *rv = RE_RenderViewGetById(rr, 0);
@@ -526,93 +540,118 @@ static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v)
 	WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
 }
 
-static void image_multi_inclay_cb(bContext *C, void *rr_v, void *iuser_v) 
+static bool ui_imageuser_layer_menu_step(bContext *C, int direction, void *rnd_pt)
 {
-	RenderResult *rr = rr_v;
-	ImageUser *iuser = iuser_v;
-	int tot = BLI_listbase_count(&rr->layers);
+	Scene *scene = CTX_data_scene(C);
+	struct ImageUI_Data *rnd_data = rnd_pt;
+	Image *image = rnd_data->image;
+	ImageUser *iuser = rnd_data->iuser;
+	RenderResult *rr;
+	bool changed = false;
 
-	if (RE_HasFakeLayer(rr))
-		tot++;  /* fake compo/sequencer layer */
+	rr = BKE_image_acquire_renderresult(scene, image);
+	if (UNLIKELY(rr == NULL)) {
+		return false;
+	}
 
-	if (iuser->layer < tot - 1) {
-		iuser->layer++;
-		BKE_image_multilayer_index(rr, iuser); 
-		WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+	if (direction == -1) {
+		if (iuser->layer > 0) {
+			iuser->layer--;
+			changed = true;
+		}
+	}
+	else if (direction == 1) {
+		int tot = BLI_listbase_count(&rr->layers);
+
+		if (RE_HasFakeLayer(rr))
+			tot++;  /* fake compo/sequencer layer */
+
+		if (iuser->layer < tot - 1) {
+			iuser->layer++;
+			changed = true;
+		}
+	}
+	else {
+		BLI_assert(0);
 	}
-}
-static void image_multi_declay_cb(bContext *C, void *rr_v, void *iuser_v) 
-{
-	ImageUser *iuser = iuser_v;
 
-	if (iuser->layer > 0) {
-		iuser->layer--;
-		BKE_image_multilayer_index(rr_v, iuser); 
+	if (changed) {
+		BKE_image_multilayer_index(rr, iuser);
 		WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
 	}
+
+	return changed;
 }
-static void image_multi_incpass_cb(bContext *C, void *rr_v, void *iuser_v) 
+
+static bool ui_imageuser_pass_menu_step(bContext *C, int direction, void *rnd_pt)
 {
-	RenderResult *rr = rr_v;
-	ImageUser *iuser = iuser_v;
-	RenderLayer *rl;
-	RenderPass *rp;
+	Scene *scene = CTX_data_scene(C);
+	struct ImageUI_Data *rnd_data = rnd_pt;
+	Image *image = rnd_data->image;
+	ImageUser *iuser = rnd_data->iuser;
+	RenderResult *rr;
+	bool changed = false;
 	int layer = iuser->layer;
+	RenderLayer *rl;
+	RenderPass *rpass;
+
+	rr = BKE_image_acquire_renderresult(scene, image);
+	if (UNLIKELY(rr == NULL)) {
+		return false;
+	}
 
-	if (RE_HasFakeLayer(rr))
+	if (RE_HasFakeLayer(rr)) {
 		layer -= 1;
+	}
 
 	rl = BLI_findlink(&rr->layers, layer);
+	if (rl == NULL) {
+		return false;
+	}
 
-	if (rl) {
-		RenderPass *rpass = BLI_findlink(&rl->passes, iuser->pass);
-		int rp_index = iuser->pass + 1;
+	rpass = BLI_findlink(&rl->passes, iuser->pass);
+	if (rpass == NULL) {
+		return false;
+	}
 
-		if (rpass == NULL)
-			return;
+	/* note, this looks reversed, but matches menu direction */
+	if (direction == -1) {
+		RenderPass *rp;
+		int rp_index = iuser->pass + 1;
 
 		for (rp = rpass->next; rp; rp = rp->next, rp_index++) {
 			if (rp->passtype != rpass->passtype) {
 				iuser->pass = rp_index;
-				BKE_image_multilayer_index(rr, iuser);
-				WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+				changed = true;
 				break;
 			}
 		}
 	}
-}
-static void image_multi_decpass_cb(bContext *C, void *rr_v, void *iuser_v) 
-{
-	RenderResult *rr = rr_v;
-	ImageUser *iuser = iuser_v;
-	RenderLayer *rl;
-	RenderPass *rp;
-	int layer = iuser->layer;
-
-	if (iuser->pass == 0)
-		return;
-
-	if (RE_HasFakeLayer(rr))
-		layer -= 1;
-
-	rl = BLI_findlink(&rr->layers, layer);
-
-	if (rl) {
-		RenderPass *rpass = BLI_findlink(&rl->passes, iuser->pass);
+	else if (direction == 1) {
+		RenderPass *rp;
 		int rp_index = 0;
 
-		if (rpass == NULL)
-			return;
+		if (iuser->pass == 0)
+			return false;
 
 		for (rp = rl->passes.first; rp; rp = rp->next, rp_index++) {
 			if (rp->passtype == rpass->passtype) {
 				iuser->pass = rp_index - 1;
-				BKE_image_multilayer_index(rr, iuser);
-				WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+				changed = true;
 				break;
 			}
 		}
 	}
+	else {
+		BLI_assert(0);
+	}
+
+	if (changed) {
+		BKE_image_multilayer_index(rr, iuser);
+		WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+	}
+
+	return changed;
 }
 
 /* 5 view button callbacks... */
@@ -643,7 +682,7 @@ static void image_user_change(bContext *C, void *iuser_v, void *unused)
 #endif
 
 static void uiblock_layer_pass_buttons(
-        uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, int w, bool show_arrowbuts,
+        uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, int w,
         short *render_slot)
 {
 	static struct ImageUI_Data rnd_pt;  /* XXX, workaround */
@@ -676,7 +715,9 @@ static void uiblock_layer_pass_buttons(
 		else {
 			BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), *render_slot + 1);
 		}
+
 		but = uiDefMenuBut(block, ui_imageuser_slot_menu, image, str, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select Slot"));
+		UI_but_func_menu_step_set(but, ui_imageuser_slot_menu_step);
 		UI_but_func_set(but, image_multi_cb, rr, iuser);
 		UI_but_type_set_menu_from_pulldown(but);
 	}
@@ -696,16 +737,9 @@ static void uiblock_layer_pass_buttons(
 			display_name = rl ? rl->name : (fake_name ? fake_name : "");
 			but = uiDefMenuBut(block, ui_imageuser_layer_menu, &rnd_pt, display_name,
 			                   0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer"));
+			UI_but_func_menu_step_set(but, ui_imageuser_layer_menu_step);
 			UI_but_func_set(but, image_multi_cb, rr, iuser);
 			UI_but_type_set_menu_from_pulldown(but);
-
-			/* decrease, increase arrows */
-			if (show_arrowbuts) {
-				but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_LEFT,   0, 0, 0.85f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Previous Layer"));
-				UI_but_func_set(but, image_multi_declay_cb, rr, iuser);
-				but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_RIGHT,  0, 0, 0.90f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Next Layer"));
-				UI_but_func_set(but, image_multi_inclay_cb, rr, iuser);
-			}
 		}
 
 		/* pass */
@@ -715,17 +749,10 @@ static void uiblock_layer_pass_buttons(
 		display_name = rpass ? rpass->internal_name : (fake_name ? fake_name : "");
 		but = uiDefMenuBut(block, ui_imageuser_pass_menu, &rnd_pt, IFACE_(display_name),
 		                   0, 0, wmenu3, UI_UNIT_Y, TIP_("Select Pass"));
+		UI_but_func_menu_step_set(but, ui_imageuser_pass_menu_step);
 		UI_but_func_set(but, image_multi_cb, rr, iuser);
 		UI_but_type_set_menu_from_pulldown(but);
 
-		/* decrease, increase arrows */
-		if (show_arrowbuts) {
-			but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_LEFT,   0, 0, 0.85f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Previous Pass"));
-			UI_but_func_set(but, image_multi_decpass_cb, rr, iuser);
-			but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_TRIA_RIGHT,  0, 0, 0.90f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Next Pass"));
-			UI_but_func_set(but, image_multi_incpass_cb, rr, iuser);
-		}
-
 		/* view */
 		if (BLI_listbase_count_ex(&rr->views, 2) > 1 &&
 		    ((!show_stereo) || (!RE_RenderResult_is_stereo(rr))))
@@ -864,14 +891,13 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
 			}
 			else if (ima->type == IMA_TYPE_R_RESULT) {
 				/* browse layer/passes */
-
-				/* use BKE_image_acquire_renderresult  so we get the correct slot in the menu */
-				RenderResult *rr = BKE_image_acquire_renderresult(scene, ima);
+				RenderResult *rr;
 				const float dpi_fac = UI_DPI_FAC;
 				const int menus_width = 230 * dpi_fac;
-				const bool show_arrow_buts = (rr != NULL);
 
-				uiblock_layer_pass_buttons(layout, ima, rr, iuser, menus_width, show_arrow_buts, &ima->render_slot);
+				/* use BKE_image_acquire_renderresult  so we get the correct slot in the menu */
+				rr = BKE_image_acquire_renderresult(scene, ima);
+				uiblock_layer_pass_buttons(layout, ima, rr, iuser, menus_width, &ima->render_slot);
 				BKE_image_release_renderresult(scene, ima);
 			}
 		}
@@ -905,7 +931,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
 			/* multilayer? */
 			if (ima->type == IMA_TYPE_MULTILAYER && ima->rr) {
 				const float dpi_fac = UI_DPI_FAC;
-				uiblock_layer_pass_buttons(layout, ima, ima->rr, iuser, 230 * dpi_fac, true, NULL);
+				uiblock_layer_pass_buttons(layout, ima, ima->rr, iuser, 230 * dpi_fac, NULL);
 			}
 			else if (ima->source != IMA_SRC_GENERATED) {
 				if (compact == 0) {
@@ -1215,14 +1241,14 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
 
 	/* render layers and passes */
 	if (ima && iuser) {
-		Ren

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list