[Bf-blender-cvs] [ba918f2] pie-menus: Clamp pies against window borders only, not screen borders.
Antony Riakiotakis
noreply at git.blender.org
Wed Jul 30 12:26:22 CEST 2014
Commit: ba918f2f3d97db641974ce6ae8c466a95411bd0f
Author: Antony Riakiotakis
Date: Wed Jul 30 12:24:28 2014 +0200
Branches: pie-menus
https://developer.blender.org/rBba918f2f3d97db641974ce6ae8c466a95411bd0f
Clamp pies against window borders only, not screen borders.
Added after Dalai's suggestion. Initially i was against this but
clamping against editor area makes pies feel cramped indeed and more
often than not causes a shift in the spawned menu position.
It's not 100% certain still we'll keep this, but having a nice commit
with the feature is not bad either.
===================================================================
M source/blender/editors/interface/interface_regions.c
===================================================================
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index eac6d36..75c2a4c 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1569,7 +1569,7 @@ static void ui_popup_block_clip(wmWindow *window, uiBlock *block)
block->rect.xmin += xofs;
block->rect.xmax += xofs;
}
-
+
if (block->rect.ymin < width)
block->rect.ymin = width;
if (block->rect.ymax > winy - MENU_TOP)
@@ -1705,48 +1705,56 @@ uiBlock *ui_popup_block_refresh(
saferct->safety = block->safety;
BLI_addhead(&block->saferct, saferct);
}
-
+
if (block->flag & UI_BLOCK_RADIAL) {
- /* find area that spawned this menu, keep it inside */
- ScrArea *sa = CTX_wm_area(C);
uiBut *but;
- int ar_w = BLI_rcti_size_x(&sa->totrct);
- int ar_h = BLI_rcti_size_y(&sa->totrct);
- int x_offset = 0, y_offset = 0;
-
- ar->winrct = sa->totrct;
+ int win_width = UI_SCREEN_MARGIN;
+ int winx, winy;
- ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+ int x_offset = 0, y_offset = 0;
- /* spawned coordinates still in window space, convert to screen */
- block->pie_data.pie_center_spawned[0] -= ar->winrct.xmin;
- block->pie_data.pie_center_spawned[1] -= ar->winrct.ymin;
+ winx = WM_window_pixels_x(window);
+ winy = WM_window_pixels_y(window);
copy_v2_v2(block->pie_data.pie_center_init, block->pie_data.pie_center_spawned);
/* only try translation if area is large enough */
- if (BLI_rctf_size_x(&block->rect) < ar_w) {
- if (block->rect.xmin < 0 ) x_offset -= block->rect.xmin;
- if (block->rect.xmax > ar_w) x_offset += ar_w - block->rect.xmax;
+ if (BLI_rctf_size_x(&block->rect) < winx - 2.0 * win_width) {
+ if (block->rect.xmin < win_width ) x_offset += win_width - block->rect.xmin;
+ if (block->rect.xmax > winx - win_width) x_offset += winx - win_width - block->rect.xmax;
}
- if (BLI_rctf_size_y(&block->rect) < ar_h) {
- if (block->rect.ymin < 0 ) y_offset -= block->rect.ymin;
- if (block->rect.ymax > ar_h) y_offset += ar_h - block->rect.ymax;
+ if (BLI_rctf_size_y(&block->rect) < winy - 2.0 * win_width) {
+ if (block->rect.ymin < win_width ) y_offset += win_width - block->rect.ymin;
+ if (block->rect.ymax > winy - win_width) y_offset += winy - win_width - block->rect.ymax;
}
/* if we are offsetting set up initial data for timeout functionality */
+
if ((x_offset != 0) || (y_offset != 0)) {
block->pie_data.pie_center_spawned[0] += x_offset;
block->pie_data.pie_center_spawned[1] += y_offset;
ui_block_translate(block, x_offset, y_offset);
+
if (U.pie_initial_timeout > 0)
block->pie_data.flags |= UI_PIE_INITIAL_DIRECTION;
- else
- ui_block_calculate_pie_segment(block, block->pie_data.pie_center_init[0], block->pie_data.pie_center_init[1]);
}
- else
- block->pie_data.flags |= UI_PIE_INVALID_DIR;
+
+ ar->winrct.xmin = block->rect.xmin - width;
+ ar->winrct.xmax = block->rect.xmax + width;
+ ar->winrct.ymin = block->rect.ymin - width;
+ ar->winrct.ymax = block->rect.ymax + width;
+
+ ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+
+ /* spawned coordinates still in window space, convert to screen */
+ block->pie_data.pie_center_spawned[0] -= ar->winrct.xmin;
+ block->pie_data.pie_center_spawned[1] -= ar->winrct.ymin;
+ block->pie_data.pie_center_init[0] -= ar->winrct.xmin;
+ block->pie_data.pie_center_init[1] -= ar->winrct.ymin;
+
+
+ ui_block_calculate_pie_segment(block, block->pie_data.pie_center_init[0], block->pie_data.pie_center_init[1]);
/* lastly set the buttons at the center of the pie menu, ready for animation */
if (U.pie_animation_timeout > 0) {
More information about the Bf-blender-cvs
mailing list