From 61776befc3f88c373e47ccbdf8c75e2ca0f4e987 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 9 Dec 2021 00:55:11 +1100 Subject: Cleanup: move public doc-strings into headers for 'editors' Ref T92709 --- .../blender/editors/interface/interface_intern.h | 250 ++++++++++++++++++++- 1 file changed, 246 insertions(+), 4 deletions(-) (limited to 'source/blender/editors/interface/interface_intern.h') diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 2d549f6176c..dc8744aaae9 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -620,6 +620,9 @@ extern void ui_block_to_window_rctf(const struct ARegion *region, rctf *rct_dst, const rctf *rct_src); extern float ui_block_to_window_scale(const struct ARegion *region, uiBlock *block); +/** + * For mouse cursor. + */ extern void ui_window_to_block_fl(const struct ARegion *region, uiBlock *block, float *x, @@ -637,23 +640,52 @@ extern void ui_window_to_region_rctf(const struct ARegion *region, rctf *rect_dst, const rctf *rct_src); extern void ui_region_to_window(const struct ARegion *region, int *x, int *y); +/** + * Popups will add a margin to #ARegion.winrct for shadow, + * for interactivity (point-inside tests for eg), we want the winrct without the margin added. + */ extern void ui_region_winrct_get_no_margin(const struct ARegion *region, struct rcti *r_rect); +/** + * Reallocate the button (new address is returned) for a new button type. + * This should generally be avoided and instead the correct type be created right away. + * + * \note Only the #uiBut data can be kept. If the old button used a derived type (e.g. #uiButTab), + * the data that is not inside #uiBut will be lost. + */ uiBut *ui_but_change_type(uiBut *but, eButType new_type); extern double ui_but_value_get(uiBut *but); extern void ui_but_value_set(uiBut *but, double value); +/** + * For picker, while editing HSV. + */ extern void ui_but_hsv_set(uiBut *but); +/** + * For buttons pointing to color for example. + */ extern void ui_but_v3_get(uiBut *but, float vec[3]); +/** + * For buttons pointing to color for example. + */ extern void ui_but_v3_set(uiBut *but, const float vec[3]); extern void ui_hsvcircle_vals_from_pos( const rcti *rect, const float mx, const float my, float *r_val_rad, float *r_val_dist); +/** + * Cursor in HSV circle, in float units -1 to 1, to map on radius. + */ extern void ui_hsvcircle_pos_from_vals( const ColorPicker *cpicker, const rcti *rect, const float *hsv, float *xpos, float *ypos); extern void ui_hsvcube_pos_from_vals( const struct uiButHSVCube *hsv_but, const rcti *rect, const float *hsv, float *xp, float *yp); +/** + * \param float_precision: For number buttons the precision + * to use or -1 to fallback to the button default. + * \param use_exp_float: Use exponent representation of floats + * when out of reasonable range (outside of 1e3/1e-3). + */ extern void ui_but_string_get_ex(uiBut *but, char *str, const size_t maxlen, @@ -661,7 +693,16 @@ extern void ui_but_string_get_ex(uiBut *but, const bool use_exp_float, bool *r_use_exp_float) ATTR_NONNULL(1, 2); extern void ui_but_string_get(uiBut *but, char *str, const size_t maxlen) ATTR_NONNULL(); +/** + * A version of #ui_but_string_get_ex for dynamic buffer sizes + * (where #ui_but_string_get_max_length returns 0). + * + * \param r_str_size: size of the returned string (including terminator). + */ extern char *ui_but_string_get_dynamic(uiBut *but, int *r_str_size); +/** + * \param str: will be overwritten. + */ extern void ui_but_convert_to_unit_alt_name(uiBut *but, char *str, size_t maxlen) ATTR_NONNULL(); extern bool ui_but_string_set(struct bContext *C, uiBut *but, const char *str) ATTR_NONNULL(); extern bool ui_but_string_eval_number(struct bContext *C, @@ -669,12 +710,22 @@ extern bool ui_but_string_eval_number(struct bContext *C, const char *str, double *value) ATTR_NONNULL(); extern int ui_but_string_get_max_length(uiBut *but); -/* Clear & exit the active button's string. */ +/** + * Clear & exit the active button's string.. + */ extern void ui_but_active_string_clear_and_exit(struct bContext *C, uiBut *but) ATTR_NONNULL(); +/** + * Use handling code to set a string for the button. Handles the case where the string is set for a + * search button while the search menu is open, so the results are updated accordingly. + * This is basically the same as pasting the string into the button. + */ extern void ui_but_set_string_interactive(struct bContext *C, uiBut *but, const char *value); extern uiBut *ui_but_drag_multi_edit_get(uiBut *but); void ui_def_but_icon(uiBut *but, const int icon, const int flag); +/** + * Avoid using this where possible since it's better not to ask for an icon in the first place. + */ void ui_def_but_icon_clear(uiBut *but); void ui_but_extra_operator_icons_free(uiBut *but); @@ -687,6 +738,11 @@ void ui_but_range_set_hard(uiBut *but); void ui_but_range_set_soft(uiBut *but); bool ui_but_context_poll_operator(struct bContext *C, struct wmOperatorType *ot, const uiBut *but); +/** + * Check if the operator \a ot poll is successful with the context given by \a but (optionally). + * \param but: The button that might store context. Can be NULL for convenience (e.g. if there is + * no button to take context from, but we still want to poll the operator). + */ bool ui_but_context_poll_operator_ex(struct bContext *C, const uiBut *but, const struct wmOperatorCallParams *optype_params); @@ -697,10 +753,21 @@ extern PropertyScaleType ui_but_scale_type(const uiBut *but) ATTR_WARN_UNUSED_RE extern bool ui_but_is_float(const uiBut *but) ATTR_WARN_UNUSED_RESULT; extern bool ui_but_is_bool(const uiBut *but) ATTR_WARN_UNUSED_RESULT; extern bool ui_but_is_unit(const uiBut *but) ATTR_WARN_UNUSED_RESULT; +/** + * Check if this button is similar enough to be grouped with another. + */ extern bool ui_but_is_compatible(const uiBut *but_a, const uiBut *but_b) ATTR_WARN_UNUSED_RESULT; extern bool ui_but_is_rna_valid(uiBut *but) ATTR_WARN_UNUSED_RESULT; +/** + * Checks if the button supports cycling next/previous menu items (ctrl+mouse-wheel). + */ extern bool ui_but_supports_cycling(const uiBut *but) ATTR_WARN_UNUSED_RESULT; +/** + * Check if the button is pushed, this is only meaningful for some button types. + * + * \return (0 == UNSELECT), (1 == SELECT), (-1 == DO-NOTHING) + */ extern int ui_but_is_pushed_ex(uiBut *but, double *value) ATTR_WARN_UNUSED_RESULT; extern int ui_but_is_pushed(uiBut *but) ATTR_WARN_UNUSED_RESULT; @@ -795,6 +862,7 @@ struct uiPopupBlockHandle { /* interface_region_*.c */ /* interface_region_tooltip.c */ + /* exposed as public API in UI_interface.h */ /* interface_region_color_picker.c */ @@ -802,6 +870,10 @@ void ui_color_picker_rgb_to_hsv_compat(const float rgb[3], float r_cp[3]); void ui_color_picker_rgb_to_hsv(const float rgb[3], float r_cp[3]); void ui_color_picker_hsv_to_rgb(const float r_cp[3], float rgb[3]); +/** + * Returns true if the button is for a color with gamma baked in, + * or if it's a color picker for such a button. + */ bool ui_but_is_color_gamma(uiBut *but); void ui_scene_linear_to_perceptual_space(uiBut *but, float rgb[3]); @@ -811,7 +883,10 @@ uiBlock *ui_block_func_COLOR(struct bContext *C, uiPopupBlockHandle *handle, voi ColorPicker *ui_block_colorpicker_create(struct uiBlock *block); /* interface_region_search.c */ -/* Search-box for string button. */ + +/** + * Search-box for string button. + */ struct ARegion *ui_searchbox_create_generic(struct bContext *C, struct ARegion *butregion, uiButSearch *search_but); @@ -822,8 +897,14 @@ struct ARegion *ui_searchbox_create_menu(struct bContext *C, struct ARegion *butregion, uiButSearch *search_but); +/** + * x and y in screen-coords. + */ bool ui_searchbox_inside(struct ARegion *region, const int xy[2]) ATTR_NONNULL(1, 2); int ui_searchbox_find_index(struct ARegion *region, const char *name); +/** + * Region is the search box itself. + */ void ui_searchbox_update(struct bContext *C, struct ARegion *region, uiBut *but, const bool reset); int ui_searchbox_autocomplete(struct bContext *C, struct ARegion *region, uiBut *but, char *str); bool ui_searchbox_event(struct bContext *C, @@ -831,16 +912,26 @@ bool ui_searchbox_event(struct bContext *C, uiBut *but, struct ARegion *butregion, const struct wmEvent *event); +/** + * String validated to be of correct length (but->hardmax). + */ bool ui_searchbox_apply(uiBut *but, struct ARegion *region); void ui_searchbox_free(struct bContext *C, struct ARegion *region); +/** + * XXX weak: search_func adds all partial matches. + */ void ui_but_search_refresh(uiButSearch *but); /* interface_region_menu_popup.c */ + int ui_but_menu_step(uiBut *but, int direction); bool ui_but_menu_step_poll(const uiBut *but); uiBut *ui_popup_menu_memory_get(struct uiBlock *block); void ui_popup_menu_memory_set(uiBlock *block, struct uiBut *but); +/** + * Called for creating new popups and refreshing existing ones. + */ uiBlock *ui_popup_block_refresh(struct bContext *C, uiPopupBlockHandle *handle, struct ARegion *butregion, @@ -860,6 +951,7 @@ uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C, void *arg); /* interface_region_popover.c */ + uiPopupBlockHandle *ui_popover_panel_create(struct bContext *C, struct ARegion *butregion, uiBut *but, @@ -867,6 +959,10 @@ uiPopupBlockHandle *ui_popover_panel_create(struct bContext *C, void *arg); /* interface_region_menu_pie.c */ + +/** + * Set up data for defining a new pie menu level and add button that invokes it. + */ void ui_pie_menu_level_create(uiBlock *block, struct wmOperatorType *ot, const char *propname, @@ -877,6 +973,10 @@ void ui_pie_menu_level_create(uiBlock *block, int flag); /* interface_region_popup.c */ + +/** + * Translate any popup regions (so we can drag them). + */ void ui_popup_translate(struct ARegion *region, const int mdiff[2]); void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle); void ui_popup_block_scrolltest(struct uiBlock *block); @@ -884,10 +984,19 @@ void ui_popup_block_scrolltest(struct uiBlock *block); /* end interface_region_*.c */ /* interface_panel.c */ + +/** + * Handle region panel events like opening and closing panels, changing categories, etc. + * + * \note Could become a modal key-map. + */ extern int ui_handler_panel_region(struct bContext *C, const struct wmEvent *event, struct ARegion *region, const uiBut *active_but); +/** + * Draw a panel integrated in buttons-window, tool/property lists etc. + */ extern void ui_draw_aligned_panel(const struct uiStyle *style, const uiBlock *block, const rcti *rect, @@ -897,14 +1006,20 @@ extern void ui_draw_aligned_panel(const struct uiStyle *style, void ui_panel_tag_search_filter_match(struct Panel *panel); /* interface_draw.c */ + extern void ui_draw_dropshadow( const rctf *rct, float radius, float aspect, float alpha, int select); +/** + * Draws in resolution of 48x4 colors. + */ void ui_draw_gradient(const rcti *rect, const float hsv[3], const eButGradientType type, const float alpha); +/* based on UI_draw_roundbox_gl_mode, + * check on making a version which allows us to skip some sides */ void ui_draw_but_TAB_outline(const rcti *rect, float rad, uchar highlight[3], @@ -930,6 +1045,9 @@ void ui_draw_but_CURVE(struct ARegion *region, uiBut *but, const struct uiWidgetColors *wcol, const rcti *rect); +/** + * Draws the curve profile widget. Somewhat similar to ui_draw_but_CURVE. + */ void ui_draw_but_CURVEPROFILE(struct ARegion *region, uiBut *but, const struct uiWidgetColors *wcol, @@ -944,8 +1062,19 @@ void ui_draw_but_TRACKPREVIEW(struct ARegion *region, const rcti *rect); /* interface_undo.c */ + +/** + * Start the undo stack. + * + * \note The current state should be pushed immediately after calling this. + */ struct uiUndoStack_Text *ui_textedit_undo_stack_create(void); void ui_textedit_undo_stack_destroy(struct uiUndoStack_Text *undo_stack); +/** + * Push the information in the arguments to a new state in the undo stack. + * + * \note Currently the total length of the undo stack is not limited. + */ void ui_textedit_undo_push(struct uiUndoStack_Text *undo_stack, const char *text, int cursor_index); @@ -954,10 +1083,25 @@ const char *ui_textedit_undo(struct uiUndoStack_Text *undo_stack, int *r_cursor_index); /* interface_handlers.c */ + extern void ui_handle_afterfunc_add_operator(struct wmOperatorType *ot, wmOperatorCallContext opcontext); +/** + * Assumes event type is MOUSEPAN. + */ extern void ui_pan_to_scroll(const struct wmEvent *event, int *type, int *val); +/** + * Exported to interface.c: #UI_but_active_only() + * \note The region is only for the button. + * The context needs to be set by the caller. + */ extern void ui_but_activate_event(struct bContext *C, struct ARegion *region, uiBut *but); +/** + * Simulate moving the mouse over a button (or navigating to it with arrow keys). + * + * exported so menus can start with a highlighted button, + * even if the mouse isn't over it + */ extern void ui_but_activate_over(struct bContext *C, struct ARegion *region, uiBut *but); extern void ui_but_execute_begin(struct bContext *C, struct ARegion *region, @@ -968,13 +1112,25 @@ extern void ui_but_execute_end(struct bContext *C, uiBut *but, void *active_back); extern void ui_but_active_free(const struct bContext *C, uiBut *but); +/** + * In some cases we may want to update the view (#View2D) in-between layout definition and drawing. + * E.g. to make sure a button is visible while editing. + */ extern void ui_but_update_view_for_active(const struct bContext *C, const uiBlock *block); extern int ui_but_menu_direction(uiBut *but); extern void ui_but_text_password_hide(char password_str[128], uiBut *but, const bool restore); +/** + * Finds the pressed button in an aligned row (typically an expanded enum). + * + * \param direction: Use when there may be multiple buttons pressed. + */ extern uiBut *ui_but_find_select_in_enum(uiBut *but, int direction); bool ui_but_is_editing(const uiBut *but); float ui_block_calc_pie_segment(struct uiBlock *block, const float event_xy[2]); +/* XXX, this code will shorten any allocated string to 'UI_MAX_NAME_STR' + * since this is really long its unlikely to be an issue, + * but this could be supported */ void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_strip); void ui_but_clipboard_free(void); bool ui_but_rna_equals(const uiBut *a, const uiBut *b); @@ -1039,6 +1195,9 @@ void ui_draw_widget_menu_back_color(const rcti *rect, bool use_shadow, const flo void ui_draw_widget_menu_back(const rcti *rect, bool use_shadow); void ui_draw_tooltip_background(const struct uiStyle *style, uiBlock *block, rcti *rect); +/** + * Conversion from old to new buttons, so still messy. + */ extern void ui_draw_but(const struct bContext *C, struct ARegion *region, struct uiStyle *style, @@ -1059,6 +1218,15 @@ typedef enum { * get clipped before the normal text. */ UI_MENU_ITEM_SEPARATOR_HINT, } uiMenuItemSeparatorType; +/** + * Helper call to draw a menu item without a button. + * + * \param state: The state of the button, + * typically #UI_ACTIVE, #UI_BUT_DISABLED, #UI_BUT_INACTIVE. + * \param separator_type: The kind of separator which controls if and how the string is clipped. + * \param r_xmax: The right hand position of the text, this takes into the icon, + * padding and text clipping when there is not enough room to display the full text. + */ void ui_draw_menu_item(const struct uiFontStyle *fstyle, rcti *rect, const char *name, @@ -1072,6 +1240,10 @@ void ui_draw_preview_item(const struct uiFontStyle *fstyle, int iconid, int state, eFontStyle_Align text_align); +/** + * Version of #ui_draw_preview_item() that does not draw the menu background and item text based on + * state. It just draws the preview and text directly. + */ void ui_draw_preview_item_stateless(const struct uiFontStyle *fstyle, rcti *rect, const char *name, @@ -1081,59 +1253,102 @@ void ui_draw_preview_item_stateless(const struct uiFontStyle *fstyle, #define UI_TEXT_MARGIN_X 0.4f #define UI_POPUP_MARGIN (UI_DPI_FAC * 12) -/* Margin at top of screen for popups. Note this value must be sufficient - * to draw a popover arrow to avoid cropping it. */ +/** + * Margin at top of screen for popups. + * Note this value must be sufficient to draw a popover arrow to avoid cropping it. + */ #define UI_POPUP_MENU_TOP (int)(10 * UI_DPI_FAC) #define UI_PIXEL_AA_JITTER 8 extern const float ui_pixel_jitter[UI_PIXEL_AA_JITTER][2]; /* interface_style.c */ + +/** + * Called on each startup.blend read, + * reading without #uiFont will create one. + */ void uiStyleInit(void); /* interface_icons.c */ + void ui_icon_ensure_deferred(const struct bContext *C, const int icon_id, const bool big); int ui_id_icon_get(const struct bContext *C, struct ID *id, const bool big); /* interface_icons_event.c */ + void icon_draw_rect_input( float x, float y, int w, int h, float alpha, short event_type, short event_value); /* resources.c */ + void ui_resources_init(void); void ui_resources_free(void); /* interface_layout.c */ + void ui_layout_add_but(uiLayout *layout, uiBut *but); void ui_layout_remove_but(uiLayout *layout, const uiBut *but); +/** + * \return true if the button was successfully replaced. + */ bool ui_layout_replace_but_ptr(uiLayout *layout, const void *old_but_ptr, uiBut *new_but); +/** + * \note May reallocate \a but, so the possibly new address is returned. + */ uiBut *ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRNA *searchptr, PropertyRNA *searchprop); +/** + * Check all buttons defined in this layout, + * and set any button flagged as UI_BUT_LIST_ITEM as active/selected. + * Needed to handle correctly text colors of active (selected) list item. + */ void ui_layout_list_set_labels_active(uiLayout *layout); /* menu callback */ void ui_item_menutype_func(struct bContext *C, struct uiLayout *layout, void *arg_mt); void ui_item_paneltype_func(struct bContext *C, struct uiLayout *layout, void *arg_pt); /* interface_button_group.c */ + +/** + * Every function that adds a set of buttons must create another group, + * then #ui_def_but adds buttons to the current group (the last). + */ void ui_block_new_button_group(uiBlock *block, uiButtonGroupFlag flag); void ui_button_group_add_but(uiBlock *block, uiBut *but); void ui_button_group_replace_but_ptr(uiBlock *block, const void *old_but_ptr, uiBut *new_but); void ui_block_free_button_groups(uiBlock *block); /* interface_align.c */ + bool ui_but_can_align(const uiBut *but) ATTR_WARN_UNUSED_RESULT; int ui_but_align_opposite_to_area_align_get(const struct ARegion *region) ATTR_WARN_UNUSED_RESULT; +/** + * Compute the alignment of all 'align groups' of buttons in given block. + * + * This is using an order-independent algorithm, + * i.e. alignment of buttons should be OK regardless of order in which + * they are added to the block. + */ void ui_block_align_calc(uiBlock *block, const struct ARegion *region); /* interface_anim.c */ + void ui_but_anim_flag(uiBut *but, const struct AnimationEvalContext *anim_eval_context); void ui_but_anim_copy_driver(struct bContext *C); void ui_but_anim_paste_driver(struct bContext *C); +/** + * \a str can be NULL to only perform check if \a but has an expression at all. + * \return if button has an expression. + */ bool ui_but_anim_expression_get(uiBut *but, char *str, size_t maxlen); bool ui_but_anim_expression_set(uiBut *but, const char *str); +/** + * Create new expression for button (i.e. a "scripted driver"), if it can be created. + */ bool ui_but_anim_expression_create(uiBut *but, const char *str); void ui_but_anim_autokey(struct bContext *C, uiBut *but, struct Scene *scene, float cfra); @@ -1141,9 +1356,15 @@ void ui_but_anim_decorate_cb(struct bContext *C, void *arg_but, void *arg_dummy) void ui_but_anim_decorate_update_from_flag(uiButDecorator *but); /* interface_query.c */ + bool ui_but_is_editable(const uiBut *but) ATTR_WARN_UNUSED_RESULT; bool ui_but_is_editable_as_text(const uiBut *but) ATTR_WARN_UNUSED_RESULT; bool ui_but_is_toggle(const uiBut *but) ATTR_WARN_UNUSED_RESULT; +/** + * Can we mouse over the button or is it hidden/disabled/layout. + * \note ctrl is kind of a hack currently, + * so that non-embossed UI_BTYPE_TEXT button behaves as a label when ctrl is not pressed. + */ bool ui_but_is_interactive(const uiBut *but, const bool labeledit) ATTR_WARN_UNUSED_RESULT; bool ui_but_is_popover_once_compat(const uiBut *but) ATTR_WARN_UNUSED_RESULT; bool ui_but_has_array_value(const uiBut *but) ATTR_WARN_UNUSED_RESULT; @@ -1174,6 +1395,9 @@ uiBut *ui_tree_row_find_mouse_over(const struct ARegion *region, const int xy[2] uiBut *ui_tree_row_find_active(const struct ARegion *region); typedef bool (*uiButFindPollFn)(const uiBut *but, const void *customdata); +/** + * x and y are only used in case event is NULL. + */ uiBut *ui_but_find_mouse_over_ex(const struct ARegion *region, const int xy[2], const bool labeledit, @@ -1220,41 +1444,56 @@ bool ui_region_contains_point_px(const struct ARegion *region, const int xy[2]) ATTR_NONNULL(1, 2) ATTR_WARN_UNUSED_RESULT; bool ui_region_contains_rect_px(const struct ARegion *region, const rcti *rect_px); +/** + * Check if the cursor is over any popups. + */ struct ARegion *ui_screen_region_find_mouse_over_ex(struct bScreen *screen, const int xy[2]) ATTR_NONNULL(1, 2); struct ARegion *ui_screen_region_find_mouse_over(struct bScreen *screen, const struct wmEvent *event); /* interface_context_menu.c */ + bool ui_popup_context_menu_for_button(struct bContext *C, uiBut *but, const struct wmEvent *event); +/** + * menu to show when right clicking on the panel header + */ void ui_popup_context_menu_for_panel(struct bContext *C, struct ARegion *region, struct Panel *panel); /* interface_eyedropper.c */ + struct wmKeyMap *eyedropper_modal_keymap(struct wmKeyConfig *keyconf); struct wmKeyMap *eyedropper_colorband_modal_keymap(struct wmKeyConfig *keyconf); /* interface_eyedropper_color.c */ + void UI_OT_eyedropper_color(struct wmOperatorType *ot); /* interface_eyedropper_colorband.c */ + void UI_OT_eyedropper_colorramp(struct wmOperatorType *ot); void UI_OT_eyedropper_colorramp_point(struct wmOperatorType *ot); /* interface_eyedropper_datablock.c */ + void UI_OT_eyedropper_id(struct wmOperatorType *ot); /* interface_eyedropper_depth.c */ + void UI_OT_eyedropper_depth(struct wmOperatorType *ot); /* interface_eyedropper_driver.c */ + void UI_OT_eyedropper_driver(struct wmOperatorType *ot); /* interface_eyedropper_gpencil_color.c */ + void UI_OT_eyedropper_gpencil_color(struct wmOperatorType *ot); /* interface_template_asset_view.cc */ + struct uiListType *UI_UL_asset_view(void); /** @@ -1280,12 +1519,15 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, const bool is_first); /* interface_ops.c */ + bool ui_jump_to_target_button_poll(struct bContext *C); /* interface_queries.c */ + void ui_interface_tag_script_reload_queries(void); /* interface_view.cc */ + void ui_block_free_views(struct uiBlock *block); uiTreeViewHandle *ui_block_view_find_matching_in_old_block(const uiBlock *new_block, const uiTreeViewHandle *new_view); -- cgit v1.2.3