[Bf-blender-cvs] [74432c9] pie-menus: Merge branch 'master' into pie-menus
Campbell Barton
noreply at git.blender.org
Sun Jun 15 07:39:10 CEST 2014
Commit: 74432c94f32735ca6678eaaf270acc323fd8a4c6
Author: Campbell Barton
Date: Sun Jun 15 15:26:45 2014 +1000
https://developer.blender.org/rB74432c94f32735ca6678eaaf270acc323fd8a4c6
Merge branch 'master' into pie-menus
Conflicts:
source/blender/editors/interface/interface.c
===================================================================
===================================================================
diff --cc source/blender/editors/interface/interface.c
index 9d3fb7c,0f4bba8..221304a
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@@ -322,43 -321,9 +321,41 @@@ static void ui_centered_bounds_block(wm
ui_bounds_block(block);
}
+
- static void ui_centered_pie_bounds_block(const bContext *C, uiBlock *block)
++static void ui_centered_pie_bounds_block(uiBlock *block, const int xy[2])
+{
- wmWindow *window = CTX_wm_window(C);
+ int x, y;
+ int startx;
+ int width, height;
+
+ /* note: this is used for the splash where window bounds event has not been
+ * updated by ghost, get the window bounds from ghost directly */
+
- x = window->eventstate->x;
- y = window->eventstate->y;
++ x = xy[0];
++ y = xy[1];
+
+ ui_bounds_block(block);
+
+ width = BLI_rctf_size_x(&block->rect);
+ height = BLI_rctf_size_y(&block->rect);
+
+ startx = x - (width * 0.5f);
+
+ /* special case, 3 items means no top, make it so we are going down the full height */
+ if (block->pie_data.flags & UI_PIE_3_ITEMS)
+ ui_block_translate(block, startx - block->rect.xmin, y);
+ else {
+ int starty = y - (height * 0.5f);
+ ui_block_translate(block, startx - block->rect.xmin, starty - block->rect.ymin);
+ }
+
+ /* now recompute bounds and safety */
+ ui_bounds_block(block);
+}
+
-
- static void ui_popup_bounds_block(const bContext *C, uiBlock *block, eBlockBoundsCalc bounds_calc)
+ static void ui_popup_bounds_block(wmWindow *window, uiBlock *block,
+ eBlockBoundsCalc bounds_calc, const int xy[2])
{
- wmWindow *window = CTX_wm_window(C);
int startx, starty, endx, endy, width, height, oldwidth, oldheight;
int oldbounds, xmax, ymax;
const int margin = UI_SCREEN_MARGIN;
@@@ -1195,11 -1171,8 +1205,11 @@@ void uiEndBlock_ex(const bContext *C, u
ui_text_bounds_block(block, 0.0f);
break;
case UI_BLOCK_BOUNDS_POPUP_CENTER:
- ui_centered_bounds_block(C, block);
+ ui_centered_bounds_block(window, block);
break;
+ case UI_BLOCK_BOUNDS_PIE_CENTER:
- ui_centered_pie_bounds_block(C, block);
++ ui_centered_pie_bounds_block(block, xy);
+ break;
/* fallback */
case UI_BLOCK_BOUNDS_POPUP_MOUSE:
diff --cc source/blender/editors/interface/interface_regions.c
index 22d7fd5,cc5a4be..f4afcc3
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@@ -1577,59 -1596,25 +1598,62 @@@ uiBlock *ui_popup_block_refresh
saferct->safety = block->safety;
BLI_addhead(&block->saferct, saferct);
}
-
- /* 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 */
- 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 + MENU_TOP;
-
- ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+ 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);
+ int x_offset = 0, y_offset = 0;
+
+ ar->winrct = sa->totrct;
+
+ 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;
+
+ 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_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 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);
+ block->pie_data.flags |= UI_PIE_INITIAL_DIRECTION;
+ }
+ }
+ 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 */
+ 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 + MENU_TOP;
+
+ ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+ }
- /* adds subwindow */
- ED_region_init(C, ar);
+ if (block_old) {
+ block->oldblock = block_old;
+ uiBlockUpdateFromOld(C, block);
+ uiFreeInactiveBlocks(C, &ar->uiblocks);
+ }
/* checks which buttons are visible, sets flags to prevent draw (do after region init) */
ui_popup_block_scrolltest(block);
@@@ -2449,136 -2473,6 +2518,134 @@@ uiLayout *uiPupMenuLayout(uiPopupMenu *
return pup->layout;
}
+/*************************** Pie Menus ***************************************/
- static uiBlock *ui_block_func_PIE(bContext *C, uiPopupBlockHandle *handle, void *arg_pie)
++static uiBlock *ui_block_func_PIE(bContext *UNUSED(C), uiPopupBlockHandle *handle, void *arg_pie)
+{
+ uiBlock *block;
+ uiPieMenu *pie = arg_pie;
+ int minwidth, width, height;
+
+ minwidth = 50;
+ block = pie->block_radial;
+
+ /* in some cases we create the block before the region,
+ * so we set it delayed here if necessary */
+ if (BLI_findindex(&handle->region->uiblocks, block) == -1)
+ uiBlockSetRegion(block, handle->region);
+
+ uiBlockLayoutResolve(block, &width, &height);
+
+ uiBlockSetFlag(block, UI_BLOCK_LOOP | UI_BLOCK_REDRAW | UI_BLOCK_NUMSELECT);
+
+ block->minbounds = minwidth;
+ block->bounds = 1;
+ block->mx = 0;
+ block->my = 0;
+ block->bounds_type = UI_BLOCK_BOUNDS_PIE_CENTER;
+
+ block->pie_data.pie_center_spawned[0] = pie->mx;
+ block->pie_data.pie_center_spawned[1] = pie->my;
+
- uiEndBlock(C, block);
-
+ return pie->block_radial;
+}
+
+static float uiPieTitleWidth(const char *name, int icon)
+{
+ return UI_GetStringWidth(name) +
+ (UI_UNIT_X * (1.50f + (icon ? 0.25f : 0.0f)));
+}
+
+struct uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon, short event)
+{
+ uiStyle *style = UI_GetStyleDraw();
+ uiPieMenu *pie = MEM_callocN(sizeof(uiPopupMenu), "pie menu");
+ uiBut *but;
+
+ pie->block_radial = uiBeginBlock(C, NULL, __func__, UI_EMBOSS);
+ /* may be useful later to allow spawning pies
+ * from old positions */
+ /* pie->block_radial->flag |= UI_BLOCK_POPUP_MEMORY; */
+ pie->block_radial->puphash = ui_popup_menu_hash(title);
+ pie->block_radial->flag |= UI_BLOCK_RADIAL;
+ pie->block_radial->pie_data.event = event;
+
+ pie->layout = uiBlockLayout(pie->block_radial, UI_LAYOUT_VERTICAL, UI_LAYOUT_PIEMENU, 0, 0, 200, 0, 0, style);
+
+
+ /* create title button */
+ if (title[0]) {
+ char titlestr[256];
+ int w;
+ if (icon) {
+ BLI_snprintf(titlestr, sizeof(titlestr), " %s", title);
+ w = uiPieTitleWidth(titlestr, icon);
+ uiDefIconTextBut(pie->block_radial, LABEL, 0, icon, titlestr, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ }
+ else {
+ w = uiPieTitleWidth(title, 0);
+ but = uiDefBut(pie->block_radial, LABEL, 0, title, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ /* hack, draw label with default transparent style */
+ but->dt = UI_EMBOSSP;
+ }
+ }
+
+ return pie;
+}
+
+void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
+{
+ wmWindow *window = CTX_wm_window(C);
+ uiPopupBlockHandle *menu;
+ pie->mx = window->eventstate->x;
+ pie->my = window->eventstate->y;
+
+ menu = ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_PIE, pie);
+ menu->popup = true;
+ menu->towardstime = PIL_check_seconds_timer();
+
+ UI_add_pie_handlers(C, &window->modalhandlers, menu);
+ WM_event_add_mousemove(C);
+
+ MEM_freeN(pie);
+}
+
+
+uiLayout *uiPieMenuLayout(uiPieMenu *pie)
+{
+ return pie->layout;
+}
+
+void uiPieMenuInvoke(struct bContext *C, const char *idname, short event)
+{
+ uiPieMenu *pie;
+ uiLayout *layout;
+ Menu menu;
+ MenuType *mt = WM_menutype_find(idname, true);
+
+ if (mt == NULL) {
+ printf("%s: named menu \"%s\" not found\n", __func__, idname);
+ return;
+ }
+
+ if (mt->poll && mt->poll(C, mt) == 0)
+ return;
+
+ pie = uiPieMenuBegin(C, IFACE_(mt->label), ICON_NONE, event);
+ layout = uiPieMenuLayout(pie);
+
+ menu.layout = layout;
+ menu.type = mt;
+
+ if (G.debug & G_DEBUG_WM) {
+ printf("%s: opening menu \"%s\"\n", __func__, idname);
+ }
+
+ mt->draw(C, &menu);
+
+ uiPieMenuEnd(C, pie);
+}
+
+
/*************************** Standard Popup Menus ****************************/
void uiPupMenuReports(bContext *C, ReportList *reports)
More information about the Bf-blender-cvs
mailing list