[Bf-blender-cvs] [d9b1e6a8c9e] temp-lineart-contained: Cleanup: Simplify panel activate state function
Hans Goudey
noreply at git.blender.org
Sat Dec 19 06:18:49 CET 2020
Commit: d9b1e6a8c9eae66386ff7a5be323884069fb93f1
Author: Hans Goudey
Date: Thu Nov 12 23:28:53 2020 -0500
Branches: temp-lineart-contained
https://developer.blender.org/rBd9b1e6a8c9eae66386ff7a5be323884069fb93f1
Cleanup: Simplify panel activate state function
This commit moves some of the logic around so that the logic in
panel_activate_state is clearly separated by the state being activated.
There are fewer nested and redundant checks, and it's easier to see
the progression of interaction with the panel handler.
===================================================================
M source/blender/editors/interface/interface_panel.c
===================================================================
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 0d81b43146d..09c918b31ec 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -2566,72 +2566,78 @@ static void ui_handler_remove_panel(bContext *C, void *userdata)
panel_activate_state(C, panel, PANEL_STATE_EXIT);
}
+static void panel_handle_data_ensure(const bContext *C,
+ wmWindow *win,
+ const ARegion *region,
+ Panel *panel,
+ const uiHandlePanelState state)
+{
+ if (panel->activedata == NULL) {
+ panel->activedata = MEM_callocN(sizeof(uiHandlePanelData), __func__);
+ WM_event_add_ui_handler(
+ C, &win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, panel, 0);
+ }
+
+ uiHandlePanelData *data = panel->activedata;
+
+ data->animtimer = WM_event_add_timer(CTX_wm_manager(C), win, TIMER, ANIMATION_INTERVAL);
+
+ data->state = state;
+ data->startx = win->eventstate->x;
+ data->starty = win->eventstate->y;
+ data->startofsx = panel->ofsx;
+ data->startofsy = panel->ofsy;
+ data->start_cur_xmin = region->v2d.cur.xmin;
+ data->start_cur_ymin = region->v2d.cur.ymin;
+ data->starttime = PIL_check_seconds_timer();
+}
+
+/**
+ * \note "select" and "drag drop" flags: First, the panel is "picked up" and both flags are set.
+ * Then when the mouse releases and the panel starts animating to its aligned position, PNL_SELECT
+ * is unset. When the animation finishes, PANEL_IS_DRAG_DROP is cleared.
+ */
static void panel_activate_state(const bContext *C, Panel *panel, const uiHandlePanelState state)
{
uiHandlePanelData *data = panel->activedata;
wmWindow *win = CTX_wm_window(C);
ARegion *region = CTX_wm_region(C);
- if (data && data->state == state) {
+ if (data != NULL && data->state == state) {
return;
}
- /*
- * Note on "select" and "drag drop" flags:
- * First, the panel is "picked up" and both flags are set. Then when the mouse releases
- * and the panel starts animating to its aligned position, PNL_SELECT is unset. When the
- * animation finishes, PANEL_IS_DRAG_DROP is cleared. */
if (state == PANEL_STATE_DRAG) {
panel_set_flag_recursive(panel, PNL_SELECT, true);
panel_set_runtime_flag_recursive(panel, PANEL_IS_DRAG_DROP, true);
+
+ panel_handle_data_ensure(C, win, region, panel, state);
+
+ /* Initiate edge panning during drags for scrolling beyond the initial region view. */
+ wmOperatorType *ot = WM_operatortype_find("VIEW2D_OT_edge_pan", true);
+ ui_handle_afterfunc_add_operator(ot, WM_OP_INVOKE_DEFAULT, true);
}
else if (state == PANEL_STATE_ANIMATION) {
panel_set_flag_recursive(panel, PNL_SELECT, false);
+
+ panel_handle_data_ensure(C, win, region, panel, state);
}
else if (state == PANEL_STATE_EXIT) {
panel_set_runtime_flag_recursive(panel, PANEL_IS_DRAG_DROP, false);
- }
- if (data && data->animtimer) {
- WM_event_remove_timer(CTX_wm_manager(C), win, data->animtimer);
- data->animtimer = NULL;
- }
+ BLI_assert(data != NULL);
+
+ if (data->animtimer) {
+ WM_event_remove_timer(CTX_wm_manager(C), win, data->animtimer);
+ data->animtimer = NULL;
+ }
- if (state == PANEL_STATE_EXIT) {
MEM_freeN(data);
panel->activedata = NULL;
WM_event_remove_ui_handler(
&win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, panel, false);
}
- else {
- if (!data) {
- data = MEM_callocN(sizeof(uiHandlePanelData), "uiHandlePanelData");
- panel->activedata = data;
-
- WM_event_add_ui_handler(
- C, &win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, panel, 0);
- }
-
- if (ELEM(state, PANEL_STATE_ANIMATION, PANEL_STATE_DRAG)) {
- data->animtimer = WM_event_add_timer(CTX_wm_manager(C), win, TIMER, ANIMATION_INTERVAL);
- }
-
- /* Initiate edge panning during drags so we can move beyond the initial region view. */
- if (state == PANEL_STATE_DRAG) {
- wmOperatorType *ot = WM_operatortype_find("VIEW2D_OT_edge_pan", true);
- ui_handle_afterfunc_add_operator(ot, WM_OP_INVOKE_DEFAULT, true);
- }
-
- data->state = state;
- data->startx = win->eventstate->x;
- data->starty = win->eventstate->y;
- data->startofsx = panel->ofsx;
- data->startofsy = panel->ofsy;
- data->start_cur_xmin = region->v2d.cur.xmin;
- data->start_cur_ymin = region->v2d.cur.ymin;
- data->starttime = PIL_check_seconds_timer();
- }
ED_region_tag_redraw(region);
}
More information about the Bf-blender-cvs
mailing list