Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-05-25 13:54:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-05-25 13:55:22 +0300
commitb11a1d5da26fa2906955e54254672b1af075d0dc (patch)
tree0fcb6f0004708131f90a4522ed3807704205e672 /source/blender/editors/interface/interface_region_popover.c
parente9908134e87e4c69698d73ff144f3f8771a51be5 (diff)
UI: support for a popup panel which stays open
Diffstat (limited to 'source/blender/editors/interface/interface_region_popover.c')
-rw-r--r--source/blender/editors/interface/interface_region_popover.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c
index 169b3d43e80..1f9326ac204 100644
--- a/source/blender/editors/interface/interface_region_popover.c
+++ b/source/blender/editors/interface/interface_region_popover.c
@@ -189,17 +189,26 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v
UI_block_flag_enable(block, UI_BLOCK_LOOP);
UI_block_direction_set(block, block->direction);
block->minbounds = UI_MENU_WIDTH_MIN;
+ bool use_place_under_active = false;
- uiBut *but = NULL;
- for (but = block->buttons.first; but; but = but->next) {
- if (but->flag & (UI_SELECT | UI_SELECT_DRAW)) {
- break;
- }
+#ifdef USE_POPOVER_ONCE
+ if (pup->is_once) {
+ /* Weak, toolbars act like menus, so position with the cursor under the active button. */
+ use_place_under_active = true;
}
+#endif
+ if (use_place_under_active) {
+ uiBut *but = NULL;
+ for (but = block->buttons.first; but; but = but->next) {
+ if (but->flag & (UI_SELECT | UI_SELECT_DRAW)) {
+ break;
+ }
+ }
- if (but) {
- offset[0] = -(but->rect.xmin + 0.8f * BLI_rctf_size_x(&but->rect));
- offset[1] = -(but->rect.ymin + 0.5f * BLI_rctf_size_y(&but->rect));
+ if (but) {
+ offset[0] = -(but->rect.xmin + 0.8f * BLI_rctf_size_x(&but->rect));
+ offset[1] = -(but->rect.ymin + 0.5f * BLI_rctf_size_y(&but->rect));
+ }
}
UI_block_bounds_set_popup(block, block_margin, offset[0], offset[1]);
@@ -256,11 +265,15 @@ uiPopupBlockHandle *ui_popover_panel_create(
/** \name Standard Popover Panels
* \{ */
-
+static void ui_item_paneltype_func(bContext *C, uiLayout *layout, void *arg_pt)
+{
+ PanelType *pt = (PanelType *)arg_pt;
+ UI_paneltype_draw(C, pt, layout);
+}
int UI_popover_panel_invoke(
bContext *C, int space_id, int region_id, const char *idname,
- ReportList *reports)
+ bool keep_open, ReportList *reports)
{
uiLayout *layout;
PanelType *pt = UI_paneltype_find(space_id, region_id, idname);
@@ -277,7 +290,10 @@ int UI_popover_panel_invoke(
return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
}
- {
+ if (keep_open) {
+ ui_popover_panel_create(C, NULL, NULL, ui_item_paneltype_func, pt);
+ }
+ else {
uiPopover *pup = UI_popover_begin(C);
layout = UI_popover_layout(pup);
UI_paneltype_draw(C, pt, layout);
@@ -366,7 +382,3 @@ void UI_popover_once_clear(uiPopover *pup)
#endif
/** \} */
-
-/* We may want to support this in future */
-/* Similar to UI_popup_menu_invoke */
-// int UI_popover_panel_invoke(bContext *C, const char *idname, ReportList *reports);