[Bf-blender-cvs] [8d838f0] pie-menus: Pie Menu goodies:
Antony Riakiotakis
noreply at git.blender.org
Fri Jun 6 02:08:07 CEST 2014
Commit: 8d838f02e2f2c0ce2870563044422a6974836bac
Author: Antony Riakiotakis
Date: Fri Jun 6 02:17:07 2014 +0300
https://developer.blender.org/rB8d838f02e2f2c0ce2870563044422a6974836bac
Pie Menu goodies:
* Add right click cancel to pie menus.
* Add drag style timeout. If the button used to spawn the menu is
released before the time out then leftclick will be used to confirm the
menu.
===================================================================
M release/scripts/startup/bl_ui/space_userpref.py
M source/blender/editors/interface/interface_handlers.c
M source/blender/editors/interface/interface_intern.h
M source/blender/editors/interface/interface_regions.c
M source/blender/makesdna/DNA_userdef_types.h
M source/blender/makesrna/intern/rna_userdef.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index bc478ed..eea02d2 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -217,6 +217,10 @@ class USERPREF_PT_interface(Panel):
sub.prop(view, "open_sublevel_delay", text="Sub Level")
col.separator()
+ col.label(text="Pie Menus:")
+ col.prop(view, "pie_drag_timeout")
+ col.prop(view, "pie_initial_timeout")
+ col.separator()
col.separator()
col.separator()
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 0016c1c..d4e233e 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8291,14 +8291,28 @@ static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPo
}
+static void ui_pie_menu_apply (bContext *C, uiPopupBlockHandle *menu)
+{
+ uiBut *but = ui_but_find_activated(menu->region);
+
+ 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;
+ }
+}
+
/* 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;
+ double time_diff;
/* we block all events, this is modal interaction, except for drop events which is described below */
int retval = WM_UI_HANDLER_BREAK;
@@ -8319,56 +8333,54 @@ static int ui_handler_pie(bContext *C, const wmEvent *event, void *userdata)
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);
+ /* add menu 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 */
+ time_diff = PIL_check_seconds_timer() - menu->towardstime;
- switch (event->type) {
- case MOUSEMOVE:
- /* mouse move should always refresh the area for pie menus */
+ if (event->type == block->pie_data.event) {
+ if (event->val != KM_RELEASE) {
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);
+ /* why redraw here? It's simple, we are getting many double click events here.
+ * Those operate like mouse move events almost */
+ ED_region_tag_redraw(ar);
+ }
+ else {
+ if (time_diff > U.pie_drag_timeout * 0.1) {
+ ui_pie_menu_apply(C, menu);
}
- 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);
+ else {
+ menu->is_click_style = true;
+ }
+ }
+ }
+ else {
+ 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;
- ED_region_tag_redraw(ar);
+ case LEFTMOUSE:
+ if (menu->is_click_style) {
+ ui_pie_menu_apply(C, menu);
}
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;
- }
+ ui_handle_menu_button(C, event, menu);
+ menu->menuretval = 0;
}
- }
- else {
+ break;
+
+ case RIGHTMOUSE:
+ menu->menuretval = UI_RETURN_CANCEL;
+ break;
+
+ default:
ui_handle_menu_button(C, event, menu);
- }
- break;
+ break;
+ }
}
/* free if done, does not free handle itself */
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 29cb1ae..61f8ce8 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -488,6 +488,9 @@ struct uiPopupBlockHandle {
/* menu direction */
int direction;
+ /* pie menus */
+ bool is_click_style; /* button released before timeout, this is a click style menu */
+
/* #ifdef USE_DRAG_POPUP */
bool is_grab;
int grab_xy_prev[2];
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 56bcea6..fb2ef46 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -43,6 +43,8 @@
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
+#include "PIL_time.h"
+
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_report.h"
@@ -2511,6 +2513,7 @@ void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
menu = ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_PIE, pie);
menu->popup = true;
+ menu->towardstime = PIL_check_seconds_timer();
/* change to pie version! */
UI_add_pie_handlers(C, &window->modalhandlers, menu);
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 4f5670d..45b4dca 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -527,6 +527,11 @@ typedef struct UserDef {
float fcu_inactive_alpha; /* opacity of inactive F-Curves in F-Curve Editor */
float pixelsize; /* private, set by GHOST, to multiply DPI with */
+ int pie_drag_timeout; /* if keeping a pie menu spawn button pressed after this time, it turns into
+ * a drag/release pie menu */
+ int pie_initial_timeout; /* direction in the pie menu will always be calculated from the initial position
+ * within this time limit */
+
struct WalkNavigation walk_navigation;
} UserDef;
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 7c101fb..9cf6550 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -3195,6 +3195,15 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sub Level Menu Open Delay",
"Time delay in 1/10 seconds before automatically opening sub level menus");
+ /* pie menus */
+ prop = RNA_def_property(srna, "pie_drag_timeout", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 0.00f, 40.0f);
+ RNA_def_property_ui_text(prop, "Drag Timeout", "Pie Menus turn to drag style after this amount of time (in 1/10ths of sec)");
+
+ prop = RNA_def_property(srna, "pie_initial_timeout", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 0.00f, 40.0f);
+ RNA_def_property_ui_text(prop, "Recenter Timeout", "Pie Menus will use the mouse position as center for this amount of time (in 1/10ths of sec)");
+
prop = RNA_def_property(srna, "use_quit_dialog", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_QUIT_PROMPT);
RNA_def_property_ui_text(prop, "Prompt Quit",
More information about the Bf-blender-cvs
mailing list