Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/screen/screen_ops.c
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| bool do_snap; | bool do_snap; | ||||
| ScrEdge *nedge; /* new edge */ | ScrEdge *nedge; /* new edge */ | ||||
| ScrArea *sarea; /* start area */ | ScrArea *sarea; /* start area */ | ||||
| ScrArea *narea; /* new area */ | ScrArea *narea; /* new area */ | ||||
| } sAreaSplitData; | } sAreaSplitData; | ||||
| static bool area_split_allowed(const ScrArea *area, const eScreenAxis dir_axis) | |||||
campbellbarton: Both args can be const. | |||||
| { | |||||
| if (!area || area->global) { | |||||
| /* Must be a non-global area. */ | |||||
| return false; | |||||
| } | |||||
| if ((dir_axis == SCREEN_AXIS_V && area->winx <= 2 * AREAMINX) || | |||||
| (dir_axis == SCREEN_AXIS_H && area->winy <= 2 * ED_area_headersize())) { | |||||
| /* Must be at least double minimum sizes to split into two. */ | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| static void area_split_draw_cb(const struct wmWindow *UNUSED(win), void *userdata) | static void area_split_draw_cb(const struct wmWindow *UNUSED(win), void *userdata) | ||||
| { | { | ||||
| const wmOperator *op = userdata; | const wmOperator *op = userdata; | ||||
| sAreaSplitData *sd = op->customdata; | sAreaSplitData *sd = op->customdata; | ||||
| if (sd->sarea) { | const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | ||||
| const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | |||||
| float fac = RNA_float_get(op->ptr, "factor"); | |||||
| if (area_split_allowed(sd->sarea, dir_axis)) { | |||||
| float fac = RNA_float_get(op->ptr, "factor"); | |||||
| screen_draw_split_preview(sd->sarea, dir_axis, fac); | screen_draw_split_preview(sd->sarea, dir_axis, fac); | ||||
| } | } | ||||
| } | } | ||||
| /* generic init, menu case, doesn't need active area */ | /* generic init, menu case, doesn't need active area */ | ||||
| static bool area_split_menu_init(bContext *C, wmOperator *op) | static bool area_split_menu_init(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| /* custom data */ | /* custom data */ | ||||
| Show All 13 Lines | |||||
| /* required context */ | /* required context */ | ||||
| if (area == NULL) { | if (area == NULL) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| /* required properties */ | /* required properties */ | ||||
| const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | ||||
| /* minimal size */ | |||||
| if (dir_axis == SCREEN_AXIS_V) { | |||||
| if (area->winx < 2 * AREAMINX) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| else { | |||||
| if (area->winy < 2 * ED_area_headersize()) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| /* custom data */ | /* custom data */ | ||||
| sAreaSplitData *sd = (sAreaSplitData *)MEM_callocN(sizeof(sAreaSplitData), "op_area_split"); | sAreaSplitData *sd = (sAreaSplitData *)MEM_callocN(sizeof(sAreaSplitData), "op_area_split"); | ||||
| op->customdata = sd; | op->customdata = sd; | ||||
| sd->sarea = area; | sd->sarea = area; | ||||
| if (dir_axis == SCREEN_AXIS_V) { | if (dir_axis == SCREEN_AXIS_V) { | ||||
| sd->origmin = area->v1->vec.x; | sd->origmin = area->v1->vec.x; | ||||
| sd->origsize = area->v4->vec.x - sd->origmin; | sd->origsize = area->v4->vec.x - sd->origmin; | ||||
| Show All 40 Lines | |||||
| { | { | ||||
| const wmWindow *win = CTX_wm_window(C); | const wmWindow *win = CTX_wm_window(C); | ||||
| bScreen *screen = CTX_wm_screen(C); | bScreen *screen = CTX_wm_screen(C); | ||||
| sAreaSplitData *sd = (sAreaSplitData *)op->customdata; | sAreaSplitData *sd = (sAreaSplitData *)op->customdata; | ||||
| float fac = RNA_float_get(op->ptr, "factor"); | float fac = RNA_float_get(op->ptr, "factor"); | ||||
| const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | ||||
| if (!area_split_allowed(sd->sarea, dir_axis)) { | |||||
| return false; | |||||
| } | |||||
| sd->narea = area_split(win, screen, sd->sarea, dir_axis, fac, false); /* false = no merge */ | sd->narea = area_split(win, screen, sd->sarea, dir_axis, fac, false); /* false = no merge */ | ||||
| if (sd->narea == NULL) { | if (sd->narea == NULL) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| sd->nedge = area_findsharededge(screen, sd->sarea, sd->narea); | sd->nedge = area_findsharededge(screen, sd->sarea, sd->narea); | ||||
| ▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
| BKE_screen_remove_double_scrverts(CTX_wm_screen(C)); | BKE_screen_remove_double_scrverts(CTX_wm_screen(C)); | ||||
| BKE_screen_remove_double_scredges(CTX_wm_screen(C)); | BKE_screen_remove_double_scredges(CTX_wm_screen(C)); | ||||
| G.moving &= ~G_TRANSFORM_WM; | G.moving &= ~G_TRANSFORM_WM; | ||||
| } | } | ||||
| static void area_split_preview_update_cursor(bContext *C, wmOperator *op) | static void area_split_preview_update_cursor(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| wmWindow *win = CTX_wm_window(C); | sAreaSplitData *sd = (sAreaSplitData *)op->customdata; | ||||
| const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | const eScreenAxis dir_axis = RNA_enum_get(op->ptr, "direction"); | ||||
| WM_cursor_set(win, (dir_axis == SCREEN_AXIS_H) ? WM_CURSOR_H_SPLIT : WM_CURSOR_V_SPLIT); | if (area_split_allowed(sd->sarea, dir_axis)) { | ||||
| WM_cursor_set(CTX_wm_window(C), | |||||
| (dir_axis == SCREEN_AXIS_H) ? WM_CURSOR_H_SPLIT : WM_CURSOR_V_SPLIT); | |||||
| } | |||||
| else { | |||||
| WM_cursor_set(CTX_wm_window(C), WM_CURSOR_STOP); | |||||
| } | |||||
| } | } | ||||
| /* UI callback, adds new handler */ | /* UI callback, adds new handler */ | ||||
| static int area_split_invoke(bContext *C, wmOperator *op, const wmEvent *event) | static int area_split_invoke(bContext *C, wmOperator *op, const wmEvent *event) | ||||
| { | { | ||||
| wmWindow *win = CTX_wm_window(C); | wmWindow *win = CTX_wm_window(C); | ||||
| bScreen *screen = CTX_wm_screen(C); | bScreen *screen = CTX_wm_screen(C); | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| sd->delta = snap_loc - sd->origval; | sd->delta = snap_loc - sd->origval; | ||||
| } | } | ||||
| area_move_apply_do(C, sd->delta, sd->origval, dir_axis, sd->bigger, sd->smaller, SNAP_NONE); | area_move_apply_do(C, sd->delta, sd->origval, dir_axis, sd->bigger, sd->smaller, SNAP_NONE); | ||||
| } | } | ||||
| else { | else { | ||||
| if (sd->sarea) { | if (sd->sarea) { | ||||
| ED_area_tag_redraw(sd->sarea); | ED_area_tag_redraw(sd->sarea); | ||||
| } | } | ||||
| area_split_preview_update_cursor(C, op); | |||||
| /* area context not set */ | /* area context not set */ | ||||
| sd->sarea = BKE_screen_find_area_xy(CTX_wm_screen(C), SPACE_TYPE_ANY, event->xy); | sd->sarea = BKE_screen_find_area_xy(CTX_wm_screen(C), SPACE_TYPE_ANY, event->xy); | ||||
| if (sd->sarea) { | if (sd->sarea) { | ||||
| ScrArea *area = sd->sarea; | ScrArea *area = sd->sarea; | ||||
| if (dir_axis == SCREEN_AXIS_V) { | if (dir_axis == SCREEN_AXIS_V) { | ||||
| sd->origmin = area->v1->vec.x; | sd->origmin = area->v1->vec.x; | ||||
| sd->origsize = area->v4->vec.x - sd->origmin; | sd->origsize = area->v4->vec.x - sd->origmin; | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||
Both args can be const.