[Bf-blender-cvs] [15c2ed0] pie-menus: Keep pie menus inside the screen area that spawned them.
Antony Riakiotakis
noreply at git.blender.org
Tue Jun 3 22:22:10 CEST 2014
Commit: 15c2ed08a6fb2e9ca3713848efe5115664c4494a
Author: Antony Riakiotakis
Date: Tue Jun 3 23:21:52 2014 +0300
https://developer.blender.org/rB15c2ed08a6fb2e9ca3713848efe5115664c4494a
Keep pie menus inside the screen area that spawned them.
More cleanup. *
* The reason there's so much cleanup is that the initial code was just
copied over from the popup menus. As I am getting more familiar with the
code I can see which parts are unnecessary or should be copied to new
functions etc.
===================================================================
M source/blender/editors/interface/interface_handlers.c
M source/blender/editors/interface/interface_regions.c
===================================================================
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index f54c373..b4d9d26 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -7876,7 +7876,7 @@ static int ui_handle_menu_event(
}
else {
menu->menuretval = UI_RETURN_CANCEL;
- return WM_UI_HANDLER_BREAK;
+ return WM_UI_HANDLER_CONTINUE;
}
}
else {
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 2b0918c..f1cd8e2 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1575,17 +1575,33 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut
saferct->safety = block->safety;
BLI_addhead(&block->saferct, saferct);
}
-
- /* clip block with window boundary */
- ui_popup_block_clip(window, block);
if (block->flag & UI_BLOCK_RADIAL) {
/* find area that spawned this menu, keep it inside */
ScrArea *sa = CTX_wm_area(C);
+ int ar_w = BLI_rcti_size_x(&sa->totrct);
+ int ar_h = BLI_rcti_size_y(&sa->totrct);
ar->winrct = sa->totrct;
+
+ ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+
+ /* only try translation if area is large enough */
+ if ((BLI_rctf_size_x(&block->rect) < ar_w) && (BLI_rctf_size_y(&block->rect) < ar_h)) {
+ int x_offset = 0, y_offset = 0;
+
+ if (block->rect.xmin < 0 ) x_offset -= block->rect.xmin;
+ if (block->rect.xmax > ar_w) x_offset += ar_w - block->rect.xmax;
+ if (block->rect.ymin < 0 ) y_offset -= block->rect.ymin;
+ if (block->rect.ymax > ar_h) y_offset += ar_h - block->rect.ymax;
+
+ if ((x_offset != 0) || (y_offset != 0))
+ ui_block_translate(block, x_offset, y_offset);
+ }
}
else {
+ /* clip block with window boundary */
+ ui_popup_block_clip(window, block);
/* the block and buttons were positioned in window space as in 2.4x, now
* these menu blocks are regions so we bring it back to region space.
* additionally we add some padding for the menu shadow or rounded menus */
@@ -1593,9 +1609,9 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut
ar->winrct.xmax = block->rect.xmax + width;
ar->winrct.ymin = block->rect.ymin - width;
ar->winrct.ymax = block->rect.ymax + MENU_TOP;
- }
- ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+ ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+ }
/* adds subwindow */
ED_region_init(C, ar);
@@ -2421,12 +2437,10 @@ uiLayout *uiPupMenuLayout(uiPopupMenu *pup)
static uiBlock *ui_block_func_PIE(bContext *C, uiPopupBlockHandle *handle, void *arg_pie)
{
uiBlock *block;
- uiBut *bt;
uiPieMenu *pie = arg_pie;
- int offset[2], minwidth, width, height, direction;
+ int minwidth, width, height;
minwidth = 50;
- direction = UI_DOWN;
block = pie->block_radial;
/* in some cases we create the block before the region,
@@ -2434,38 +2448,14 @@ static uiBlock *ui_block_func_PIE(bContext *C, uiPopupBlockHandle *handle, void
if (BLI_findindex(&handle->region->uiblocks, block) == -1)
uiBlockSetRegion(block, handle->region);
- block->direction = direction;
-
uiBlockLayoutResolve(block, &width, &height);
uiBlockSetFlag(block, UI_BLOCK_LOOP | UI_BLOCK_REDRAW | UI_BLOCK_NUMSELECT);
- uiBlockSetDirection(block, direction);
-
- /* offset the mouse position, possibly based on earlier selection */
- if ((block->flag & UI_BLOCK_POPUP_MEMORY) &&
- (bt = ui_popup_menu_memory_get(block)))
- {
- /* position mouse on last clicked item, at 0.8*width of the
- * button, so it doesn't overlap the text too much, also note
- * the offset is negative because we are inverse moving the
- * block to be under the mouse */
- offset[0] = -(bt->rect.xmin + 0.8f * BLI_rctf_size_x(&bt->rect));
- offset[1] = -(bt->rect.ymin + 0.5f * UI_UNIT_Y);
- }
- else {
- /* position mouse at 0.8*width of the button and below the tile
- * on the first item */
- offset[0] = 0;
- for (bt = block->buttons.first; bt; bt = bt->next)
- offset[0] = min_ii(offset[0], -(bt->rect.xmin + 0.8f * BLI_rctf_size_x(&bt->rect)));
-
- offset[1] = 1.5 * UI_UNIT_Y;
- }
block->minbounds = minwidth;
block->bounds = 1;
- block->mx = offset[0];
- block->my = offset[1];
+ block->mx = 0;
+ block->my = 0;
block->bounds_type = UI_BLOCK_BOUNDS_PIE_CENTER;
uiEndBlock(C, block);
More information about the Bf-blender-cvs
mailing list