[Bf-blender-cvs] [814df8c] pie-menus: Pie menus have their own handler function now.

Antony Riakiotakis noreply at git.blender.org
Thu Jun 5 23:54:07 CEST 2014


Commit: 814df8ca340c691b7a268af1430b83977c2682e0
Author: Antony Riakiotakis
Date:   Fri Jun 6 00:53:40 2014 +0300
https://developer.blender.org/rB814df8ca340c691b7a268af1430b83977c2682e0

Pie menus have their own handler function now.

This is necessary because pie menus behave quite differently than
regular menus. This will allow us to tweak the behaviour accordingly
without too many spaghetti nightmares

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

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_regions.c
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 6c0d1c9..58bf5d9 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -709,6 +709,8 @@ void UI_add_popup_handlers(struct bContext *C, struct ListBase *handlers, uiPopu
 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);
+void UI_remove_pie_handlers(struct ListBase *handlers, uiPopupBlockHandle *popup);
+void UI_remove_pie_handlers_all(struct bContext *C, struct ListBase *handlers);
 
 /* Module
  *
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 1746c72..0016c1c 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -7811,15 +7811,6 @@ static int ui_handle_menu_event(
 
 	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->pie_data.event) && !(event->val == KM_RELEASE)) {
-			ED_region_tag_redraw(ar);
-			return WM_UI_HANDLER_BREAK;
-		}
-	}
-
 	/* check if mouse is inside block */
 	inside = BLI_rctf_isect_pt(&block->rect, mx, my);
 	inside_title = inside && ((my + (UI_UNIT_Y * 1.5f)) > block->rect.ymax);
@@ -7859,26 +7850,6 @@ static int ui_handle_menu_event(
 		if (event->customdata == menu->scrolltimer)
 			ui_menu_scroll(ar, block, my, NULL);
 	}
-	else if ((block->flag & UI_BLOCK_RADIAL) &&
-		     (((event->type == block->pie_data.event) && event->val == KM_RELEASE) ||
-		     ((event->type == LEFTMOUSE) && event->val == KM_PRESS)))
-	{
-		if (but) {
-			wmEvent local_event = *event;
-
-			local_event.type = RETKEY;
-			local_event.val = KM_PRESS;
-			ui_handle_button_event(C, &local_event, but);
-			local_event.type = RETKEY;
-			local_event.val = KM_RELEASE;
-			ui_handle_button_event(C, &local_event, but);
-			return WM_UI_HANDLER_CONTINUE;
-		}
-		else {
-			menu->menuretval = UI_RETURN_CANCEL;
-			return WM_UI_HANDLER_CONTINUE;
-		}
-	}
 	else {
 		/* for ui_mouse_motion_towards_block */
 		if (event->type == MOUSEMOVE) {
@@ -7886,11 +7857,6 @@ static int ui_handle_menu_event(
 				ui_mouse_motion_towards_init(menu, &event->x);
 			}
 
-			/* mouse move should always refresh the area for pie menus */
-			if (block->flag & UI_BLOCK_RADIAL) {
-				ED_region_tag_redraw(ar);
-			}
-
 			/* add menu scroll timer, if needed */
 			if (ui_menu_scroll_test(block, my))
 				if (menu->scrolltimer == NULL)
@@ -8324,6 +8290,120 @@ static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPo
 		return WM_UI_HANDLER_BREAK;
 }
 
+
+/* two types of pie menus, one with operator + enum, other with regular callbacks */
+static int ui_handler_pie(bContext *C, const wmEvent *event, void *userdata)
+{
+	ARegion *ar;
+	uiBlock *block;
+	uiBut *but;
+	int mx, my;
+	uiPopupBlockHandle *menu = userdata;
+
+	/* we block all events, this is modal interaction, except for drop events which is described below */
+	int retval = WM_UI_HANDLER_BREAK;
+
+	if (event->type == EVT_DROP) {
+		/* may want to leave this here for later if we support pie ovens */
+
+		retval = WM_UI_HANDLER_CONTINUE;
+	}
+
+	ar = menu->region;
+	block = ar->uiblocks.first;
+
+	mx = event->x;
+	my = event->y;
+
+	ui_window_to_block(ar, block, &mx, &my);
+
+	ui_block_calculate_pie_segment(block, mx, my);
+
+	/* add menu scroll timer, this is used to evaluate the time that is needed for
+		 * calculating collision from final/initial position or if pie menu is drag-style
+		 * or press and release style */
+	if (menu->scrolltimer == NULL)
+		menu->scrolltimer =
+		        WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, MENU_SCROLL_INTERVAL);
+
+	switch (event->type) {
+		case MOUSEMOVE:
+			/* mouse move should always refresh the area for pie menus */
+			ui_handle_menu_button(C, event, menu);
+			ED_region_tag_redraw(ar);
+			break;
+
+		case TIMER:
+			if (event->customdata == menu->scrolltimer) {
+				ui_menu_scroll(ar, block, my, NULL);
+			}
+			ui_handle_menu_button(C, event, menu);
+			break;
+
+		case LEFTMOUSE:
+			ui_handle_menu_button(C, event, menu);
+			menu->menuretval = 0;
+			break;
+
+		default:
+			if (event->type == block->pie_data.event) {
+				if (event->val != KM_RELEASE) {
+					ui_handle_menu_button(C, event, menu);
+
+					ED_region_tag_redraw(ar);
+				}
+				else {
+					but = ui_but_find_activated(ar);
+
+					if (but) {
+						ui_apply_button(C, but->block, but, but->active, false);
+						button_activate_exit((bContext *)C, but, but->active, false, true);
+						menu->menuretval = UI_RETURN_OK;
+					}
+					else {
+						menu->menuretval = UI_RETURN_CANCEL;
+					}
+				}
+			}
+			else {
+				ui_handle_menu_button(C, event, menu);
+			}
+			break;
+	}
+
+	/* free if done, does not free handle itself */
+	if (menu->menuretval) {
+		/* copy values, we have to free first (closes region) */
+		uiPopupBlockHandle temp = *menu;
+
+		ui_popup_block_free(C, menu);
+		UI_remove_pie_handlers(&CTX_wm_window(C)->modalhandlers, menu);
+
+		if ((temp.menuretval & UI_RETURN_OK) || (temp.menuretval & UI_RETURN_POPUP_OK)) {
+			if (temp.popup_func)
+				temp.popup_func(C, temp.popup_arg, temp.retvalue);
+			if (temp.optype)
+				WM_operator_name_call(C, temp.optype->idname, temp.opcontext, NULL);
+		}
+		else if (temp.cancel_func)
+			temp.cancel_func(C, temp.popup_arg);
+
+		WM_event_add_mousemove(C);
+	}
+	else {
+		/* re-enable tooltips */
+		if (event->type == MOUSEMOVE && (event->x != event->prevx || event->y != event->prevy))
+			ui_blocks_set_tooltips(menu->region, true);
+	}
+
+	/* delayed apply callbacks */
+	ui_apply_but_funcs_after(C);
+
+	return retval;
+}
+
+
+
 static int ui_handle_menus_recursive(
         bContext *C, const wmEvent *event, uiPopupBlockHandle *menu,
         int level, const bool is_parent_inside, const bool is_parent_menu, const bool is_floating)
@@ -8594,7 +8674,7 @@ void UI_add_popup_handlers(bContext *C, ListBase *handlers, uiPopupBlockHandle *
 
 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);
+	WM_event_add_ui_handler(C, handlers, ui_handler_pie, ui_handler_remove_popup, pie, true);
 }
 
 
@@ -8608,6 +8688,17 @@ void UI_remove_popup_handlers_all(bContext *C, ListBase *handlers)
 	WM_event_free_ui_handler_all(C, handlers, ui_handler_popup, ui_handler_remove_popup);
 }
 
+void UI_remove_pie_handlers(ListBase *handlers, uiPopupBlockHandle *popup)
+{
+	WM_event_remove_ui_handler(handlers, ui_handler_pie, ui_handler_remove_popup, popup, false);
+}
+
+void UI_remove_pie_handlers_all(bContext *C, ListBase *handlers)
+{
+	WM_event_free_ui_handler_all(C, handlers, ui_handler_pie, ui_handler_remove_popup);
+}
+
+
 bool UI_textbutton_activate_rna(const bContext *C, ARegion *ar,
                                 const void *rna_poin_data, const char *rna_prop_id)
 {
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 55cb97b..56bcea6 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2706,6 +2706,7 @@ void uiPupBlockClose(bContext *C, uiBlock *block)
 		/* if loading new .blend while popup is open, window will be NULL */
 		if (win) {
 			UI_remove_popup_handlers(&win->modalhandlers, block->handle);
+			UI_remove_pie_handlers(&win->modalhandlers, block->handle);
 			ui_popup_block_free(C, block->handle);
 		}
 	}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index a06d6c9..303d26e 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -267,7 +267,7 @@ void wm_event_do_notifiers(bContext *C)
 					if (note->data == ND_SCREENBROWSE) {
 						/* free popup handlers only [#35434] */
 						UI_remove_popup_handlers_all(C, &win->modalhandlers);
-
+						UI_remove_pie_handlers_all(C, &win->modalhandlers);
 
 						ED_screen_set(C, note->reference);  // XXX hrms, think this over!
 						if (G.debug & G_DEBUG_EVENTS)




More information about the Bf-blender-cvs mailing list