[Bf-blender-cvs] [69667a7] pie-menus: Solve pie menu selection not refreshing properly sometimes.

Antony Riakiotakis noreply at git.blender.org
Tue Jun 3 18:27:43 CEST 2014


Commit: 69667a7e1fc2b26bbe050fbfc2ab6ef88f5cf8e3
Author: Antony Riakiotakis
Date:   Tue Jun 3 19:20:59 2014 +0300
https://developer.blender.org/rB69667a7e1fc2b26bbe050fbfc2ab6ef88f5cf8e3

Solve pie menu selection not refreshing properly sometimes.

Reason here is that double press events could get chewed on handler
level. The issue Added an extra flag to hanldlers so that we can choose
to handle if we want.

Also cleanup debug messages

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

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_panel.c
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/interface/interface_widgets.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/wm_event_system.h

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 6e1f022..6c0d1c9 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -706,6 +706,7 @@ void                       UI_panel_category_draw_all(struct ARegion *ar, const
 
 void UI_add_region_handlers(struct ListBase *handlers);
 void UI_add_popup_handlers(struct bContext *C, struct ListBase *handlers, uiPopupBlockHandle *popup);
+void UI_add_pie_handlers(struct bContext *C, struct ListBase *handlers, uiPopupBlockHandle *popup);
 void UI_remove_popup_handlers(struct ListBase *handlers, uiPopupBlockHandle *popup);
 void UI_remove_popup_handlers_all(struct bContext *C, struct ListBase *handlers);
 
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index df81168..f54c373 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1236,7 +1236,8 @@ static bool ui_but_start_drag(bContext *C, uiBut *but, uiHandleButtonData *data,
 			WM_event_add_ui_handler(C, &data->window->modalhandlers,
 			                        ui_handler_region_drag_toggle,
 			                        ui_handler_region_drag_toggle_remove,
-			                        drag_info);
+			                        drag_info,
+			                        false);
 
 			CTX_wm_region_set(C, ar_prev);
 		}
@@ -6661,7 +6662,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
 	if (!(but->block->handle && but->block->handle->popup)) {
 		if (button_modal_state(state)) {
 			if (!button_modal_state(data->state))
-				WM_event_add_ui_handler(C, &data->window->modalhandlers, ui_handler_region_menu, NULL, data);
+				WM_event_add_ui_handler(C, &data->window->modalhandlers, ui_handler_region_menu, NULL, data, false);
 		}
 		else {
 			if (button_modal_state(data->state)) {
@@ -7783,15 +7784,10 @@ static void ui_block_calculate_pie_segment(uiBlock *block, const float mx, const
 	seg1[0] = BLI_rctf_cent_x(&block->rect);
 	seg1[1] = BLI_rctf_cent_y(&block->rect);
 
-	print_v2("center of block", seg1);
-	printf("event: %f %f\n", mx, my);
-
 	seg2[0] = mx - seg1[0];
 	seg2[1] = my - seg1[1];
 
 	normalize_v2_v2(block->pie_dir, seg2);
-
-	print_v2("calculation", seg2);
 }
 
 static int ui_handle_menu_event(
@@ -7812,15 +7808,13 @@ static int ui_handle_menu_event(
 
 	mx = event->x;
 	my = event->y;
-	printf("event: %d %d\n", mx, my);
+
 	ui_window_to_block(ar, block, &mx, &my);
 
 	if (block->flag & UI_BLOCK_RADIAL) {
 		ui_block_calculate_pie_segment(block, mx, my);
 
-		if ((event->type == block->event) && !(event->val == KM_RELEASE)){
-			printf("initial key press\n");
-
+		if ((event->type == block->event) && !(event->val == KM_RELEASE)) {
 			ED_region_tag_redraw(ar);
 			return WM_UI_HANDLER_BREAK;
 		}
@@ -7894,7 +7888,6 @@ static int ui_handle_menu_event(
 
 			/* mouse move should always refresh the area for pie menus */
 			if (block->flag & UI_BLOCK_RADIAL) {
-				printf("refresh\n");
 				ED_region_tag_redraw(ar);
 			}
 
@@ -8591,14 +8584,20 @@ static void ui_handler_remove_popup(bContext *C, void *userdata)
 void UI_add_region_handlers(ListBase *handlers)
 {
 	WM_event_remove_ui_handler(handlers, ui_handler_region, ui_handler_remove_region, NULL, false);
-	WM_event_add_ui_handler(NULL, handlers, ui_handler_region, ui_handler_remove_region, NULL);
+	WM_event_add_ui_handler(NULL, handlers, ui_handler_region, ui_handler_remove_region, NULL, false);
 }
 
 void UI_add_popup_handlers(bContext *C, ListBase *handlers, uiPopupBlockHandle *popup)
 {
-	WM_event_add_ui_handler(C, handlers, ui_handler_popup, ui_handler_remove_popup, popup);
+	WM_event_add_ui_handler(C, handlers, ui_handler_popup, ui_handler_remove_popup, popup, false);
 }
 
+void UI_add_pie_handlers(struct bContext *C, struct ListBase *handlers, uiPopupBlockHandle *pie)
+{
+	WM_event_add_ui_handler(C, handlers, ui_handler_popup, ui_handler_remove_popup, pie, true);
+}
+
+
 void UI_remove_popup_handlers(ListBase *handlers, uiPopupBlockHandle *popup)
 {
 	WM_event_remove_ui_handler(handlers, ui_handler_popup, ui_handler_remove_popup, popup, false);
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 2ccb374..9d564ca 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -1902,7 +1902,7 @@ static void panel_activate_state(const bContext *C, Panel *pa, uiHandlePanelStat
 			data = MEM_callocN(sizeof(uiHandlePanelData), "uiHandlePanelData");
 			pa->activedata = data;
 
-			WM_event_add_ui_handler(C, &win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, pa);
+			WM_event_add_ui_handler(C, &win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, pa, false);
 		}
 
 		if (ELEM(state, PANEL_STATE_ANIMATION, PANEL_STATE_DRAG))
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 9d58e8a..2b0918c 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2523,7 +2523,7 @@ void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
 	menu->popup = true;
 
 	/* change to pie version! */
-	UI_add_popup_handlers(C, &window->modalhandlers, menu);
+	UI_add_pie_handlers(C, &window->modalhandlers, menu);
 	WM_event_add_mousemove(C);
 
 	MEM_freeN(pie);
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 1409f93..07d0492 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3691,7 +3691,6 @@ void ui_draw_pie_center(uiBlock *block)
 	glVertex2f(block->pie_dir[0] * (pie_radius_internal + 10.0f), block->pie_dir[1] * (pie_radius_internal + 10.0f));
 	glEnd();
 
-	print_v2("direction", block->pie_dir);
 	glDisable(GL_BLEND);
 	glPopMatrix();
 }
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 41d26e3..73af3a1 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -271,12 +271,12 @@ typedef struct ARegion {
 // #define WIN_EQUAL		3  // UNUSED
 
 /* area->flag */
-#define HEADER_NO_PULLDOWN		1
-#define AREA_FLAG_DRAWJOINTO	2
-#define AREA_FLAG_DRAWJOINFROM	4
-#define AREA_TEMP_INFO			8
-#define AREA_FLAG_DRAWSPLIT_H	16
-#define AREA_FLAG_DRAWSPLIT_V	32
+#define HEADER_NO_PULLDOWN      (1 << 0)
+#define AREA_FLAG_DRAWJOINTO    (1 << 1)
+#define AREA_FLAG_DRAWJOINFROM  (1 << 2)
+#define AREA_TEMP_INFO          (1 << 3)
+#define AREA_FLAG_DRAWSPLIT_H   (1 << 4)
+#define AREA_FLAG_DRAWSPLIT_V   (1 << 5)
 
 #define EDGEWIDTH	1
 #define AREAGRID	4
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 64cada9..208dbc3 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -148,7 +148,7 @@ void		WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap);
 struct wmEventHandler *WM_event_add_ui_handler(
         const struct bContext *C, ListBase *handlers,
         int (*func)(struct bContext *C, const struct wmEvent *event, void *userdata),
-        void (*remove)(struct bContext *C, void *userdata), void *userdata);
+        void (*remove)(struct bContext *C, void *userdata), void *userdata, bool accept_double_press);
 
 void		WM_event_remove_ui_handler(ListBase *handlers,
                                        int (*func)(struct bContext *C, const struct wmEvent *event, void *userdata),
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index c9855cc..e4a547e 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -398,7 +398,7 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
 	
 	/* UI code doesn't handle return values - it just always returns break. 
 	 * to make the DBL_CLICK conversion work, we just don't send this to UI, except mouse clicks */
-	if (event->type != LEFTMOUSE && event->val == KM_DBL_CLICK)
+	if (!(handler->flag & WM_HANDLER_ACCEPT_DBLPRESS) && event->type != LEFTMOUSE && event->val == KM_DBL_CLICK)
 		return WM_HANDLER_CONTINUE;
 	
 	/* UI is quite aggressive with swallowing events, like scrollwheel */
@@ -2548,7 +2548,8 @@ void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
 }
 
 wmEventHandler *WM_event_add_ui_handler(const bContext *C, ListBase *handlers,
-                                        wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove, void *userdata)
+                                        wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove,
+                                        void *userdata, bool accept_double_press)
 {
 	wmEventHandler *handler = MEM_callocN(sizeof(wmEventHandler), "event ui handler");
 	handler->ui_handle = func;
@@ -2565,6 +2566,8 @@ wmEventHandler *WM_event_add_ui_handler(const bContext *C, ListBase *handlers,
 		handler->ui_menu    = NULL;
 	}
 
+	if (accept_double_press)
+		handler->flag |= WM_HANDLER_ACCEPT_DBLPRESS;
 	
 	BLI_addhead(handlers, handler);
 	
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index df08455..b09eabd 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -81,8 +81,9 @@ enum {
 
 /* handler flag */
 enum {
-	WM_HANDLER_BLOCKING    = 1,  /* after this handler all others are ignored */
-	WM_HANDLER_DO_FREE     = 2   /* handler tagged to be freed in wm_handlers_do() */
+	WM_HANDLER_BLOCKING        = 1,  /* after this handler all others are ignored */
+	WM_HANDLER_DO_FREE         = 2,  /* handler tagged to be freed in wm_handlers_do() */
+	WM_HANDLER_ACCEPT_DBLPRESS = 4   /* handler accepts double key press events */
 };
 
 /* wm_event_system.c */




More information about the Bf-blender-cvs mailing list