Blender V4.3
interface_region_menu_popup.cc File Reference
#include <algorithm>
#include <cstdarg>
#include <cstdlib>
#include <cstring>
#include <functional>
#include "MEM_guardedalloc.h"
#include "DNA_userdef_types.h"
#include "BLI_hash.hh"
#include "BLI_listbase.h"
#include "BLI_math_vector.h"
#include "BLI_rect.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "BKE_context.hh"
#include "BKE_report.hh"
#include "BKE_screen.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "RNA_access.hh"
#include "UI_interface.hh"
#include "BLT_translation.hh"
#include "ED_screen.hh"
#include "interface_intern.hh"
#include "interface_regions_intern.hh"

Go to the source code of this file.

Classes

struct  uiPopupMenu
 

Functions

Utility Functions
bool ui_but_menu_step_poll (const uiBut *but)
 
int ui_but_menu_step (uiBut *but, int direction)
 
Popup Menu Memory

Support menu-memory, a feature that positions the cursor over the previously used menu item.

Note
This is stored for each unique menu title.
static uint ui_popup_string_hash (const StringRef str, const bool use_sep)
 
uint ui_popup_menu_hash (const StringRef str)
 
static uiButui_popup_menu_memory__internal (uiBlock *block, uiBut *but)
 
uiButui_popup_menu_memory_get (uiBlock *block)
 
void ui_popup_menu_memory_set (uiBlock *block, uiBut *but)
 
Popup Menu with Callback or String
static void ui_popup_menu_create_block (bContext *C, uiPopupMenu *pup, const StringRef title, const StringRef block_name)
 
static uiBlockui_block_func_POPUP (bContext *C, uiPopupBlockHandle *handle, void *arg_pup)
 
static void ui_block_free_func_POPUP (void *arg_pup)
 
static uiPopupBlockHandleui_popup_menu_create_impl (bContext *C, ARegion *butregion, uiBut *but, const char *title, std::function< void(bContext *, uiLayout *)> menu_func, const bool can_refresh)
 
uiPopupBlockHandleui_popup_menu_create (bContext *C, ARegion *butregion, uiBut *but, uiMenuCreateFunc menu_func, void *arg)
 
Popup Menu API with begin & end
static void create_title_button (uiLayout *layout, const char *title, int icon)
 
uiPopupMenuUI_popup_menu_begin_ex (bContext *C, const char *title, const char *block_name, int icon)
 
uiPopupMenuUI_popup_menu_begin (bContext *C, const char *title, int icon)
 
void UI_popup_menu_but_set (uiPopupMenu *pup, ARegion *butregion, uiBut *but)
 
void UI_popup_menu_end (bContext *C, uiPopupMenu *pup)
 
bool UI_popup_menu_end_or_cancel (bContext *C, uiPopupMenu *pup)
 
uiLayoutUI_popup_menu_layout (uiPopupMenu *pup)
 
Standard Popup Menus
void UI_popup_menu_reports (bContext *C, ReportList *reports)
 
static void ui_popup_menu_create_from_menutype (bContext *C, MenuType *mt, const char *title, const int icon)
 
int UI_popup_menu_invoke (bContext *C, const char *idname, ReportList *reports)
 
Popup Block API
void UI_popup_block_invoke_ex (bContext *C, uiBlockCreateFunc func, void *arg, uiFreeArgFunc arg_free, const bool can_refresh)
 
void UI_popup_block_invoke (bContext *C, uiBlockCreateFunc func, void *arg, uiFreeArgFunc arg_free)
 
void UI_popup_block_ex (bContext *C, uiBlockCreateFunc func, uiBlockHandleFunc popup_func, uiBlockCancelFunc cancel_func, void *arg, wmOperator *op)
 
static void popup_block_template_close_cb (bContext *C, void *arg1, void *)
 
bool UI_popup_block_template_confirm_is_supported (const uiBlock *block)
 
void UI_popup_block_template_confirm (uiBlock *block, const bool cancel_default, blender::FunctionRef< uiBut *()> confirm_fn, blender::FunctionRef< uiBut *()> cancel_fn)
 
void UI_popup_block_template_confirm_op (uiLayout *layout, wmOperatorType *ot, const char *confirm_text, const char *cancel_text, const int icon, bool cancel_default, PointerRNA *r_ptr)
 
void UI_popup_block_close (bContext *C, wmWindow *win, uiBlock *block)
 
bool UI_popup_block_name_exists (const bScreen *screen, const blender::StringRef name)
 
void UI_popup_menu_close (const uiBlock *block, const bool is_cancel)
 
void UI_popup_menu_close_from_but (const uiBut *but, const bool is_cancel)
 

Detailed Description

PopUp Menu Region

Definition in file interface_region_menu_popup.cc.

Function Documentation

◆ create_title_button()

static void create_title_button ( uiLayout * layout,
const char * title,
int icon )
static

◆ popup_block_template_close_cb()

static void popup_block_template_close_cb ( bContext * C,
void * arg1,
void *  )
static

◆ ui_block_free_func_POPUP()

static void ui_block_free_func_POPUP ( void * arg_pup)
static

Definition at line 382 of file interface_region_menu_popup.cc.

Referenced by ui_popup_menu_create_impl().

◆ ui_block_func_POPUP()

◆ ui_but_menu_step()

◆ ui_but_menu_step_poll()

bool ui_but_menu_step_poll ( const uiBut * but)

◆ UI_popup_block_close()

◆ UI_popup_block_ex()

◆ UI_popup_block_invoke()

◆ UI_popup_block_invoke_ex()

void UI_popup_block_invoke_ex ( bContext * C,
uiBlockCreateFunc func,
void * arg,
uiFreeArgFunc arg_free,
bool can_refresh )
Parameters
can_refreshWhen true, the popup may be refreshed (updated after creation).
Note
It can be useful to disable refresh (even though it will work) as this exits text fields which can be disruptive if refresh isn't needed.

Definition at line 669 of file interface_region_menu_popup.cc.

References CTX_wm_window(), WorkspaceStatus::item(), wmWindow::modalhandlers, UI_block_active_only_flagged_buttons(), ui_popup_block_create(), UI_popup_handlers_add(), and WM_event_add_mousemove().

Referenced by blender::ed::space_node::invoke_node_link_drag_add_menu(), text_insert_unicode_invoke(), UI_popup_block_invoke(), WM_enum_search_invoke(), and wm_search_menu_invoke().

◆ UI_popup_block_name_exists()

bool UI_popup_block_name_exists ( const bScreen * screen,
const blender::StringRef name )

◆ UI_popup_block_template_confirm()

void UI_popup_block_template_confirm ( uiBlock * block,
bool cancel_default,
blender::FunctionRef< uiBut *()> confirm_fn,
blender::FunctionRef< uiBut *()> cancel_fn )

◆ UI_popup_block_template_confirm_is_supported()

bool UI_popup_block_template_confirm_is_supported ( const uiBlock * block)

Return true when UI_popup_block_template_confirm and related functions are supported.

Definition at line 743 of file interface_region_menu_popup.cc.

References uiBlock::flag, UI_BLOCK_KEEP_OPEN, and UI_BLOCK_POPOVER.

◆ UI_popup_block_template_confirm_op()

void UI_popup_block_template_confirm_op ( uiLayout * layout,
wmOperatorType * ot,
const char * confirm_text,
const char * cancel_text,
const int icon,
bool cancel_default,
PointerRNA * r_ptr )

Create confirm & cancel buttons in a popup using an operator.

Parameters
confirm_textThe text to confirm, null for default text or an empty string to hide.
cancel_textThe text to cancel, null for default text or an empty string to hide.
r_ptrThe pointer for operator properties, set a "confirm" button has been created.

Definition at line 786 of file interface_region_menu_popup.cc.

References uiBlock::buttons, IFACE_, ListBase::last, ot, UI_BTYPE_BUT, UI_ITEM_NONE, UI_popup_block_template_confirm(), UI_UNIT_X, UI_UNIT_Y, uiDefIconTextBut(), uiItemFullO_ptr(), uiLayoutGetBlock(), uiLayoutGetOperatorContext(), and uiLayoutSplit().

◆ UI_popup_menu_begin()

◆ UI_popup_menu_begin_ex()

uiPopupMenu * UI_popup_menu_begin_ex ( bContext * C,
const char * title,
const char * block_name,
int icon )

Directly create a popup menu that is not refreshed on redraw.

Only return handler, and set optional title.

Parameters
block_nameAssigned to uiBlock.name (useful info for debugging).

Definition at line 468 of file interface_region_menu_popup.cc.

References uiPopupMenu::block, create_title_button(), uiBlock::handle, uiPopupMenu::layout, uiPopupMenu::title, and ui_popup_menu_create_block().

Referenced by UI_popup_menu_begin(), and UI_popup_menu_reports().

◆ UI_popup_menu_but_set()

void UI_popup_menu_but_set ( uiPopupMenu * pup,
ARegion * butregion,
uiBut * but )

Setting the button makes the popup open from the button instead of the cursor.

Definition at line 494 of file interface_region_menu_popup.cc.

References uiPopupMenu::but, and uiPopupMenu::butregion.

Referenced by ui_item_menu_hold().

◆ UI_popup_menu_close()

void UI_popup_menu_close ( const uiBlock * block,
bool is_cancel = false )

If block is displayed in a popup menu, tag it for closing.

Parameters
is_cancelIf set to true, the popup will be closed as being cancelled (e.g. when pressing escape) as opposed to being handled successfully.

Definition at line 914 of file interface_region_menu_popup.cc.

References UI_popup_menu_retval_set(), UI_RETURN_CANCEL, and UI_RETURN_OK.

Referenced by UI_popup_menu_close_from_but().

◆ UI_popup_menu_close_from_but()

void UI_popup_menu_close_from_but ( const uiBut * but,
bool is_cancel = false )

Version of UI_popup_menu_close() that can be called on a button contained in a popup menu block. Convenience since the block may not be available.

Definition at line 919 of file interface_region_menu_popup.cc.

References uiBut::block, and UI_popup_menu_close().

Referenced by force_activate_view_item_but().

◆ ui_popup_menu_create()

uiPopupBlockHandle * ui_popup_menu_create ( bContext * C,
ARegion * butregion,
uiBut * but,
uiMenuCreateFunc menu_func,
void * arg )

Definition at line 431 of file interface_region_menu_popup.cc.

References ui_popup_menu_create_impl().

Referenced by ui_block_open_begin().

◆ ui_popup_menu_create_block()

static void ui_popup_menu_create_block ( bContext * C,
uiPopupMenu * pup,
const StringRef title,
const StringRef block_name )
static

◆ ui_popup_menu_create_from_menutype()

static void ui_popup_menu_create_from_menutype ( bContext * C,
MenuType * mt,
const char * title,
const int icon )
static

◆ ui_popup_menu_create_impl()

◆ UI_popup_menu_end()

void UI_popup_menu_end ( bContext * C,
uiPopupMenu * pup )

Set the whole structure to work.

Definition at line 500 of file interface_region_menu_popup.cc.

References uiPopupMenu::but, uiPopupMenu::butregion, CTX_wm_window(), wmWindow::eventstate, wmWindow::modalhandlers, uiPopupMenu::mx, uiPopupMenu::my, uiPopupBlockHandle::popup, uiPopupMenu::popup, ui_block_func_POPUP(), ui_popup_block_create(), UI_popup_handlers_add(), WM_event_add_mousemove(), and wmEvent::xy.

Referenced by armature_parent_clear_invoke(), armature_parent_set_invoke(), context_menu_invoke(), driver_dvar_invalid_name_query_cb(), blender::ed::sculpt_paint::dyntopo::dyntopo_warning_popup(), insert_key_menu_invoke(), keyingset_active_menu_invoke(), blender::ed::object::move_to_collection_invoke(), move_to_collection_regular_invoke(), blender::ed::space_node::node_group_separate_invoke(), blender::ed::object::object_hide_collection_invoke(), blender::ed::outliner::outliner_operator_menu(), blender::ed::object::parent_set_invoke_menu(), blender::ed::object::pose_ik_add_invoke(), repeat_history_invoke(), screen_area_options_invoke(), screen_context_menu_invoke(), blender::ed::object::select_grouped_collection(), select_orientation_invoke(), text_resolve_conflict_invoke(), toggle_cyclic_invoke(), ui_item_menu_hold(), ui_popup_context_menu_for_panel(), UI_popup_menu_end_or_cancel(), UI_popup_menu_invoke(), UI_popup_menu_reports(), unpack_all_invoke(), unpack_item_invoke(), unpack_menu(), blender::ed::object::bake_simulation::unpack_single_bake_invoke(), uv_mark_seam_invoke(), weight_sample_group_invoke(), wm_drop_import_file_invoke(), WM_menu_invoke_ex(), and workspace_add_invoke().

◆ UI_popup_menu_end_or_cancel()

◆ ui_popup_menu_hash()

uint ui_popup_menu_hash ( const StringRef str)

◆ UI_popup_menu_invoke()

◆ UI_popup_menu_layout()

◆ ui_popup_menu_memory__internal()

◆ ui_popup_menu_memory_get()

uiBut * ui_popup_menu_memory_get ( uiBlock * block)

Definition at line 145 of file interface_region_menu_popup.cc.

References ui_popup_menu_memory__internal().

Referenced by ui_block_func_POPUP().

◆ ui_popup_menu_memory_set()

void ui_popup_menu_memory_set ( uiBlock * block,
uiBut * but )

Definition at line 150 of file interface_region_menu_popup.cc.

References ui_popup_menu_memory__internal().

Referenced by button_activate_exit().

◆ UI_popup_menu_reports()

◆ ui_popup_string_hash()

static uint ui_popup_string_hash ( const StringRef str,
const bool use_sep )
static