UI: Attempt to restore region for redo from Adjust Last Operation panel #108892

Merged
Julian Eisel merged 4 commits from JulianEisel/blender:temp-hud-restore-region into main 2023-07-25 12:42:48 +02:00
3 changed files with 29 additions and 3 deletions

View File

@ -699,6 +699,13 @@ ARegion *ED_area_find_region_xy_visual(const ScrArea *area, int regiontype, cons
struct ARegionType *ED_area_type_hud(int space_type);
void ED_area_type_hud_clear(struct wmWindowManager *wm, ScrArea *area_keep);
JulianEisel marked this conversation as resolved Outdated

picky use more common style doc-strings.

/**
 *  Lookup ... etc.
 */
*picky* use more common style doc-strings. ``` /** * Lookup ... etc. */ ```
void ED_area_type_hud_ensure(struct bContext *C, struct ScrArea *area);
/**
* Lookup the region the operation was executed in, and which should be used to redo the
* operation. The lookup is based on the region type, so it can return a different region when the
* same region type is present multiple times.
*/
ARegion *ED_area_type_hud_redo_region_find(const struct ScrArea *area,
const struct ARegion *hud_region);
/**
* Default key-maps, bit-flags (matches order of evaluation).

View File

@ -385,4 +385,16 @@ void ED_area_type_hud_ensure(bContext *C, ScrArea *area)
region->visible = !((region->flag & RGN_FLAG_HIDDEN) || (region->flag & RGN_FLAG_TOO_SMALL));
}
ARegion *ED_area_type_hud_redo_region_find(const ScrArea *area, const ARegion *hud_region)
{
BLI_assert(hud_region->regiontype == RGN_TYPE_HUD);
HudRegionData *hrd = static_cast<HudRegionData *>(hud_region->regiondata);
if (hrd->regionid == -1) {
return nullptr;
}
return BKE_area_find_region_type(area, hrd->regionid);
}
/** \} */

View File

@ -668,14 +668,21 @@ int ED_undo_operator_repeat(bContext *C, wmOperator *op)
if (op) {
CLOG_INFO(&LOG, 1, "idname='%s'", op->type->idname);
wmWindowManager *wm = CTX_wm_manager(C);
const ScrArea *area = CTX_wm_area(C);
Scene *scene = CTX_data_scene(C);
/* keep in sync with logic in view3d_panel_operator_redo() */
ARegion *region_orig = CTX_wm_region(C);
ARegion *region_win = BKE_area_find_region_active_win(CTX_wm_area(C));
/* If the redo is called from a HUD, this knows about the region type the operator was
* initially called in, so attempt to restore that. */
ARegion *redo_region_from_hud = (region_orig->regiontype == RGN_TYPE_HUD) ?
ED_area_type_hud_redo_region_find(area, region_orig) :
nullptr;
ARegion *region_repeat = redo_region_from_hud ? redo_region_from_hud :
BKE_area_find_region_active_win(area);
JulianEisel marked this conversation as resolved
Review

minor CTX_wm_area(C) can be replaced with area.

*minor* `CTX_wm_area(C)` can be replaced with `area`.
if (region_win) {
CTX_wm_region_set(C, region_win);
if (region_repeat) {
CTX_wm_region_set(C, region_repeat);
}
if (WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type) &&