[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58366] branches/soc-2013-paint/source/ blender: Use regular drag'n drop system for pasting colors.

Antony Riakiotakis kalast at gmail.com
Thu Jul 18 13:42:31 CEST 2013


Revision: 58366
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58366
Author:   psy-fi
Date:     2013-07-18 11:42:30 +0000 (Thu, 18 Jul 2013)
Log Message:
-----------
Use regular drag'n drop system for pasting colors. That was a fun patch
to write, it abuses the custom pointer of the drag system and required
patching the drag'n drop system to support freeing the pointer if
needed. The result is nice icons when dropping colours :). Unfortunately
the name of the operator is strangely not always visible when dragging
to a correct spot (such as the toolbar)

Modified Paths:
--------------
    branches/soc-2013-paint/source/blender/editors/include/UI_interface.h
    branches/soc-2013-paint/source/blender/editors/interface/interface_handlers.c
    branches/soc-2013-paint/source/blender/editors/interface/interface_intern.h
    branches/soc-2013-paint/source/blender/editors/interface/interface_ops.c
    branches/soc-2013-paint/source/blender/editors/interface/interface_templates.c
    branches/soc-2013-paint/source/blender/editors/screen/screen_ops.c
    branches/soc-2013-paint/source/blender/editors/space_view3d/space_view3d.c
    branches/soc-2013-paint/source/blender/windowmanager/WM_api.h
    branches/soc-2013-paint/source/blender/windowmanager/WM_types.h
    branches/soc-2013-paint/source/blender/windowmanager/intern/wm.c
    branches/soc-2013-paint/source/blender/windowmanager/intern/wm_dragdrop.c
    branches/soc-2013-paint/source/blender/windowmanager/intern/wm_event_system.c
    branches/soc-2013-paint/source/blender/windowmanager/intern/wm_operators.c
    branches/soc-2013-paint/source/blender/windowmanager/intern/wm_window.c
    branches/soc-2013-paint/source/blender/windowmanager/wm_event_types.h

Modified: branches/soc-2013-paint/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/soc-2013-paint/source/blender/editors/include/UI_interface.h	2013-07-18 10:18:51 UTC (rev 58365)
+++ branches/soc-2013-paint/source/blender/editors/include/UI_interface.h	2013-07-18 11:42:30 UTC (rev 58366)
@@ -73,6 +73,9 @@
 struct bNodeTree;
 struct bNode;
 struct bNodeSocket;
+struct wmDropBox;
+struct wmDrag;
+struct wmEvent;
 
 typedef struct uiBut uiBut;
 typedef struct uiBlock uiBlock;
@@ -432,6 +435,7 @@
 void    uiButSetDragImage(uiBut *but, const char *path, int icon, struct ImBuf *ima, float scale);
 
 int     UI_but_active_drop_name(struct bContext *C);
+int     UI_but_active_drop_color(struct bContext *C);
 struct uiBut  *ui_but_find_mouse_over(struct ARegion *ar, int x, int y);
 
 void    uiButSetFlag(uiBut *but, int flag);
@@ -887,6 +891,8 @@
 
 /* UI Operators */
 void UI_buttons_operatortypes(void);
+void UI_drop_color_copy(struct wmDrag *drag, struct wmDropBox *drop);
+int UI_drop_color_poll(struct bContext *C, struct wmDrag *drag, const struct wmEvent *event);
 
 /* Helpers for Operators */
 uiBut *uiContextActiveButton(const struct bContext *C);

Modified: branches/soc-2013-paint/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/soc-2013-paint/source/blender/editors/interface/interface_handlers.c	2013-07-18 10:18:51 UTC (rev 58365)
+++ branches/soc-2013-paint/source/blender/editors/interface/interface_handlers.c	2013-07-18 11:42:30 UTC (rev 58366)
@@ -673,11 +673,6 @@
 
 #ifdef USE_DRAG_TOGGLE
 
-typedef struct uiDragColorHandle {
-	float color[3];
-	bool gamma_corrected;
-} uiDragColorHandle;
-
 typedef struct uiDragToggleHandle {
 	/* init */
 	bool is_init;
@@ -790,69 +785,6 @@
 	copy_v2_v2_int(drag_info->xy_last, xy);
 }
 
-
-static void ui_handler_region_drag_color_remove(bContext *UNUSED(C), void *userdata)
-{
-	uiDragColorHandle *drag_info = userdata;
-	MEM_freeN(drag_info);
-}
-
-static int ui_handler_region_drag_color(bContext *C, const wmEvent *event, void *userdata)
-{
-	uiDragColorHandle *drag_info = userdata;
-
-	switch (event->type) {
-		case LEFTMOUSE:
-		{
-			if (event->val != KM_PRESS) {
-				wmWindow *win = CTX_wm_window(C);
-				ARegion *ar;
-				ScrArea *sa;
-				uiBut *but = NULL;
-				bool found = false;
-
-				/* find button under mouse, check if it has RNA color property and
-				 * if it does copy the data */
-				for (sa = win->screen->areabase.first; sa && !found; sa = sa->next) {
-					for (ar = sa->regionbase.first; ar && !found; ar = ar->next) {
-						if ((but = ui_but_find_mouse_over(ar, event->x, event->y)) != NULL)
-							found = true;
-					}
-				}
-
-				if (but && but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) {
-					if (!drag_info->gamma_corrected)
-						linearrgb_to_srgb_v3_v3(drag_info->color, drag_info->color);
-					RNA_property_float_set_array(&but->rnapoin, but->rnaprop, drag_info->color);
-					RNA_property_update(C, &but->rnapoin, but->rnaprop);
-				}
-
-				if (but && but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR) {
-					if (drag_info->gamma_corrected)
-						srgb_to_linearrgb_v3_v3(drag_info->color, drag_info->color);
-					RNA_property_float_set_array(&but->rnapoin, but->rnaprop, drag_info->color);
-					RNA_property_update(C, &but->rnapoin, but->rnaprop);
-				}
-
-				WM_event_remove_ui_handler(&win->modalhandlers,
-				                           ui_handler_region_drag_color,
-				                           ui_handler_region_drag_color_remove,
-				                           drag_info, false);
-				ui_handler_region_drag_color_remove(C, drag_info);
-
-				WM_event_add_mousemove(C);
-				ED_region_tag_redraw(ar);
-
-				return WM_UI_HANDLER_BREAK;
-			}
-			break;
-		}
-	}
-
-	return WM_UI_HANDLER_CONTINUE;
-}
-
-
 static void ui_handler_region_drag_toggle_remove(bContext *UNUSED(C), void *userdata)
 {
 	uiDragToggleHandle *drag_info = userdata;
@@ -989,10 +921,7 @@
 			}
 
 			if (valid) {
-				WM_event_add_ui_handler(C, &data->window->modalhandlers,
-			                        ui_handler_region_drag_color,
-			                        ui_handler_region_drag_color_remove,
-			                        drag_info);
+				WM_event_start_drag(C, ICON_COLOR, WM_DRAG_COLOR, drag_info, 0.0, WM_DRAG_FREE_DATA);
 			}
 			else {
 				MEM_freeN(drag_info);
@@ -1003,7 +932,7 @@
 		{
 			wmDrag *drag;
 
-			drag = WM_event_start_drag(C, but->icon, but->dragtype, but->dragpoin, ui_get_but_val(but));
+			drag = WM_event_start_drag(C, but->icon, but->dragtype, but->dragpoin, ui_get_but_val(but), 0);
 			if (but->imb)
 				WM_event_drag_image(drag, but->imb, but->imb_scale, BLI_rctf_size_x(&but->rect), BLI_rctf_size_y(&but->rect));
 		}
@@ -5550,7 +5479,7 @@
 	return BLI_rctf_isect_pt(&but->rect, mx, my);
 }
 
-static uiBut *ui_but_find_activated(ARegion *ar)
+uiBut *ui_but_find_activated(ARegion *ar)
 {
 	uiBlock *block;
 	uiBut *but;
@@ -5605,6 +5534,17 @@
 	return 0;
 }
 
+int UI_but_active_drop_color(bContext *C)
+{
+	ARegion *ar = CTX_wm_region(C);
+	uiBut *but = ui_but_find_activated(ar);
+
+	if (but && but->type == COLOR)
+		return 1;
+
+	return 0;
+}
+
 static void ui_blocks_set_tooltips(ARegion *ar, const bool enable)
 {
 	uiBlock *block;

Modified: branches/soc-2013-paint/source/blender/editors/interface/interface_intern.h
===================================================================
--- branches/soc-2013-paint/source/blender/editors/interface/interface_intern.h	2013-07-18 10:18:51 UTC (rev 58365)
+++ branches/soc-2013-paint/source/blender/editors/interface/interface_intern.h	2013-07-18 11:42:30 UTC (rev 58366)
@@ -410,7 +410,6 @@
 extern void ui_bounds_block(uiBlock *block);
 extern void ui_block_translate(uiBlock *block, int x, int y);
 extern void ui_block_do_align(uiBlock *block);
-
 extern struct ColorManagedDisplay *ui_block_display_get(uiBlock *block);
 void ui_block_to_display_space_v3(uiBlock *block, float pixel[3]);
 void ui_block_to_scene_linear_v3(uiBlock *block, float pixel[3]);
@@ -520,6 +519,7 @@
 extern bool ui_button_is_active(struct ARegion *ar);
 extern int ui_button_open_menu_direction(uiBut *but);
 extern void ui_button_text_password_hide(char password_str[UI_MAX_DRAW_STR], uiBut *but, int restore);
+extern uiBut *ui_but_find_activated(struct ARegion *ar);
 
 /* interface_widgets.c */
 void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
@@ -582,4 +582,9 @@
 int ui_but_anim_expression_create(uiBut *but, const char *str);
 void ui_but_anim_autokey(struct bContext *C, uiBut *but, struct Scene *scene, float cfra);
 
+typedef struct uiDragColorHandle {
+	float color[3];
+	bool gamma_corrected;
+} uiDragColorHandle;
+
 #endif

Modified: branches/soc-2013-paint/source/blender/editors/interface/interface_ops.c
===================================================================
--- branches/soc-2013-paint/source/blender/editors/interface/interface_ops.c	2013-07-18 10:18:51 UTC (rev 58365)
+++ branches/soc-2013-paint/source/blender/editors/interface/interface_ops.c	2013-07-18 11:42:30 UTC (rev 58366)
@@ -1072,6 +1072,73 @@
 	ot->exec = reloadtranslation_exec;
 }
 
+int UI_drop_color_poll(struct bContext *C, wmDrag *drag, const wmEvent *UNUSED(event))
+{
+	/* should only return true for regions that include buttons, for now
+	 * return true always */
+	if (drag->type == WM_DRAG_COLOR && UI_but_active_drop_color(C))
+		return TRUE;
+
+	return FALSE;
+}
+
+void UI_drop_color_copy(wmDrag *drag, wmDropBox *drop)
+{
+	uiDragColorHandle *drag_info = (uiDragColorHandle *)drag->poin;
+
+	RNA_float_set_array(drop->ptr, "color", drag_info->color);
+	RNA_boolean_set(drop->ptr, "gamma", drag_info->gamma_corrected);
+}
+
+static int drop_color_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+	ARegion *ar = CTX_wm_region(C);
+	uiBut *but = NULL;
+	float color[3];
+	bool gamma;
+
+	RNA_float_get_array(op->ptr, "color", color);
+	gamma = RNA_boolean_get(op->ptr, "gamma");
+
+	/* find button under mouse, check if it has RNA color property and
+	 * if it does copy the data */
+	but = ui_but_find_activated(ar);
+
+	if (but && but->type == COLOR && but->rnaprop) {
+		if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) {
+			if (!gamma)
+				linearrgb_to_srgb_v3_v3(color, color);
+			RNA_property_float_set_array(&but->rnapoin, but->rnaprop, color);
+			RNA_property_update(C, &but->rnapoin, but->rnaprop);
+		}
+		else if (RNA_property_subtype(but->rnaprop) == PROP_COLOR) {
+			if (gamma)
+				srgb_to_linearrgb_v3_v3(color, color);
+			RNA_property_float_set_array(&but->rnapoin, but->rnaprop, color);
+			RNA_property_update(C, &but->rnapoin, but->rnaprop);
+		}
+	}
+
+	ED_region_tag_redraw(ar);
+
+	return OPERATOR_FINISHED;
+}
+
+
+static void UI_OT_drop_color(wmOperatorType *ot)
+{
+	ot->name = "Drop Color";
+	ot->idname = "UI_OT_drop_color";
+	ot->description = "Drop colors to buttons";
+
+	ot->invoke = drop_color_invoke;
+
+	RNA_def_float_color(ot->srna, "color", 3, NULL, 0.0, MAXFLOAT, "Color", "Source color", 0.0, 1.0);
+	RNA_def_boolean(ot->srna, "gamma", 0, "Gamma Corrected", "The source color is gamma corrected ");
+}
+
+
+
 /* ********************************************************* */
 /* Registration */
 
@@ -1083,7 +1150,7 @@
 	WM_operatortype_append(UI_OT_reset_default_button);
 	WM_operatortype_append(UI_OT_copy_to_selected_button);
 	WM_operatortype_append(UI_OT_reports_to_textblock);  /* XXX: temp? */
-
+	WM_operatortype_append(UI_OT_drop_color);
 #ifdef WITH_PYTHON
 	WM_operatortype_append(UI_OT_editsource);
 	WM_operatortype_append(UI_OT_edittranslation_init);

Modified: branches/soc-2013-paint/source/blender/editors/interface/interface_templates.c
===================================================================
--- branches/soc-2013-paint/source/blender/editors/interface/interface_templates.c	2013-07-18 10:18:51 UTC (rev 58365)
+++ branches/soc-2013-paint/source/blender/editors/interface/interface_templates.c	2013-07-18 11:42:30 UTC (rev 58366)
@@ -2301,7 +2301,7 @@
 }
 
 /* This template now follows User Preference for type - name is not correct anymore... */
-void uiTemplatePalette(uiLayout *layout, PointerRNA *ptr, const char *propname, int colors)
+void uiTemplatePalette(uiLayout *layout, PointerRNA *ptr, const char *propname, int UNUSED(colors))
 {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list