Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/screen/screen_ops.c
| Context not available. | |||||
| #define KM_MODAL_CANCEL 1 | #define KM_MODAL_CANCEL 1 | ||||
| #define KM_MODAL_APPLY 2 | #define KM_MODAL_APPLY 2 | ||||
| #define KM_MODAL_STEP10 3 | #define KM_MODAL_SNAP 3 | ||||
| #define KM_MODAL_STEP10_OFF 4 | #define KM_MODAL_SNAP_OFF 4 | ||||
| /* ************** Exported Poll tests ********************** */ | /* ************** Exported Poll tests ********************** */ | ||||
| Context not available. | |||||
| */ | */ | ||||
| typedef struct sAreaMoveData { | typedef struct sAreaMoveData { | ||||
| int bigger, smaller, origval, step; | int bigger, smaller, origval; | ||||
| char dir; | char dir; | ||||
| bool do_snap; | |||||
| } sAreaMoveData; | } sAreaMoveData; | ||||
| /* helper call to move area-edge, sets limits | /* helper call to move area-edge, sets limits | ||||
| Context not available. | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| static short area_snap_get_loc( | |||||
| const bScreen *sc, const int delta, | |||||
| const int origval, const int dir, | |||||
| const int bigger, const int smaller) | |||||
| { | |||||
| short final_loc = -1; | |||||
| short m_loc = origval + delta; | |||||
| short snap_dist = SHRT_MAX; | |||||
| short dist; | |||||
| short axis = (dir == 'v') ? 0 : 1; | |||||
| { | |||||
| /* Test the snap to middle. */ | |||||
| short middle = origval + (bigger - smaller) / 2; | |||||
| middle -= (middle % AREAGRID); | |||||
| dist = abs(m_loc - middle); | |||||
| if (dist <= snap_dist) { | |||||
| snap_dist = dist; | |||||
| final_loc = middle; | |||||
| } | |||||
| } | |||||
| for (const ScrVert *v1 = sc->vertbase.first; v1; v1 = v1->next) { | |||||
| if (v1->editflag) { | |||||
| short v_loc = (&v1->vec.x)[!axis]; | |||||
| for (const ScrVert *v2 = sc->vertbase.first; v2; v2 = v2->next) { | |||||
| if (!v2->editflag) { | |||||
| if (v_loc == (&v2->vec.x)[!axis]) { | |||||
| short v_loc2 = (&v2->vec.x)[axis]; | |||||
| /* Do not snap to the vertices at the ends. */ | |||||
| if ((origval - smaller) < v_loc2 && v_loc2 < (origval + bigger)) { | |||||
| dist = abs(m_loc - v_loc2); | |||||
| if (dist <= snap_dist) { | |||||
| snap_dist = dist; | |||||
| final_loc = v_loc2; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return final_loc; | |||||
| } | |||||
| /* moves selected screen edge amount of delta, used by split & move */ | /* moves selected screen edge amount of delta, used by split & move */ | ||||
| static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int bigger, int smaller) | static void area_move_apply_do( | ||||
| const bContext *C, int delta, | |||||
| const int origval, const int dir, | |||||
| const int bigger, const int smaller, | |||||
| const bool do_snap) | |||||
| { | { | ||||
| wmWindow *win = CTX_wm_window(C); | wmWindow *win = CTX_wm_window(C); | ||||
| const int winsize_x = WM_window_pixels_x(win); | const int winsize_x = WM_window_pixels_x(win); | ||||
| Context not available. | |||||
| ScrVert *v1; | ScrVert *v1; | ||||
| ScrArea *sa; | ScrArea *sa; | ||||
| int doredraw = 0; | int doredraw = 0; | ||||
| int oldval; | |||||
| delta = CLAMPIS(delta, -smaller, bigger); | delta = CLAMPIS(delta, -smaller, bigger); | ||||
| short final_loc = -1; | |||||
| if (do_snap) { | |||||
| final_loc = area_snap_get_loc(sc, delta, origval, dir, bigger, smaller); | |||||
| } | |||||
| else { | |||||
| final_loc = origval + delta; | |||||
| if (delta != bigger && delta != -smaller) { | |||||
| final_loc -= (final_loc % AREAGRID); | |||||
| } | |||||
| } | |||||
| BLI_assert(final_loc != -1); | |||||
| short axis = (dir == 'v') ? 0 : 1; | |||||
| for (v1 = sc->vertbase.first; v1; v1 = v1->next) { | for (v1 = sc->vertbase.first; v1; v1 = v1->next) { | ||||
| if (v1->editflag) { | if (v1->editflag) { | ||||
| /* that way a nice AREAGRID */ | short oldval = (&v1->vec.x)[axis]; | ||||
| if ((dir == 'v') && v1->vec.x > 0 && v1->vec.x < winsize_x - 1) { | (&v1->vec.x)[axis] = final_loc; | ||||
| oldval = v1->vec.x; | |||||
| v1->vec.x = origval + delta; | if (oldval == final_loc) { | ||||
| /* nothing will change to the other vertices either. */ | |||||
| if (delta != bigger && delta != -smaller) { | break; | ||||
| v1->vec.x -= (v1->vec.x % AREAGRID); | |||||
| v1->vec.x = CLAMPIS(v1->vec.x, origval - smaller, origval + bigger); | |||||
| } | |||||
| if (oldval != v1->vec.x) | |||||
| doredraw = 1; | |||||
| } | |||||
| if ((dir == 'h') && v1->vec.y > 0 && v1->vec.y < winsize_y - 1) { | |||||
| oldval = v1->vec.y; | |||||
| v1->vec.y = origval + delta; | |||||
| if (delta != bigger && delta != smaller) { | |||||
| v1->vec.y -= (v1->vec.y % AREAGRID); | |||||
| v1->vec.y = CLAMPIS(v1->vec.y, origval - smaller, origval + bigger); | |||||
| } | |||||
| if (oldval != v1->vec.y) | |||||
| doredraw = 1; | |||||
| } | } | ||||
| doredraw = 1; | |||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| static void area_move_apply(bContext *C, wmOperator *op) | static void area_move_apply(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| sAreaMoveData *md = op->customdata; | sAreaMoveData *md = op->customdata; | ||||
| int delta; | int delta = RNA_int_get(op->ptr, "delta"); | ||||
| delta = RNA_int_get(op->ptr, "delta"); | area_move_apply_do(C, delta, md->origval, md->dir, md->bigger, md->smaller, md->do_snap); | ||||
| area_move_apply_do(C, md->origval, delta, md->dir, md->bigger, md->smaller); | |||||
| } | } | ||||
| static void area_move_exit(bContext *C, wmOperator *op) | static void area_move_exit(bContext *C, wmOperator *op) | ||||
| Context not available. | |||||
| { | { | ||||
| x = RNA_int_get(op->ptr, "x"); | x = RNA_int_get(op->ptr, "x"); | ||||
| y = RNA_int_get(op->ptr, "y"); | y = RNA_int_get(op->ptr, "y"); | ||||
| delta = (md->dir == 'v') ? event->x - x : event->y - y; | delta = (md->dir == 'v') ? event->x - x : event->y - y; | ||||
| if (md->step) delta = delta - (delta % md->step); | |||||
| RNA_int_set(op->ptr, "delta", delta); | RNA_int_set(op->ptr, "delta", delta); | ||||
| area_move_apply(C, op); | area_move_apply(C, op); | ||||
| break; | break; | ||||
| } | } | ||||
| Context not available. | |||||
| case KM_MODAL_APPLY: | case KM_MODAL_APPLY: | ||||
| area_move_exit(C, op); | area_move_exit(C, op); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| case KM_MODAL_CANCEL: | case KM_MODAL_CANCEL: | ||||
| area_move_cancel(C, op); | area_move_cancel(C, op); | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| case KM_MODAL_STEP10: | case KM_MODAL_SNAP: | ||||
| md->step = 10; | md->do_snap = true; | ||||
| break; | break; | ||||
| case KM_MODAL_STEP10_OFF: | case KM_MODAL_SNAP_OFF: | ||||
| md->step = 0; | md->do_snap = false; | ||||
| break; | break; | ||||
| } | } | ||||
| break; | break; | ||||
| Context not available. | |||||
| int delta; /* delta move edge */ | int delta; /* delta move edge */ | ||||
| int origmin, origsize; /* to calculate fac, for property storage */ | int origmin, origsize; /* to calculate fac, for property storage */ | ||||
| int previewmode; /* draw previewline, then split */ | int previewmode; /* draw previewline, then split */ | ||||
| bool do_snap; | |||||
| ScrEdge *nedge; /* new edge */ | ScrEdge *nedge; /* new edge */ | ||||
| ScrArea *sarea; /* start area */ | ScrArea *sarea; /* start area */ | ||||
| Context not available. | |||||
| sd->delta = (dir == 'v') ? event->x - sd->origval : event->y - sd->origval; | sd->delta = (dir == 'v') ? event->x - sd->origval : event->y - sd->origval; | ||||
| if (sd->previewmode == 0) | if (sd->previewmode == 0) | ||||
| area_move_apply_do(C, sd->origval, sd->delta, dir, sd->bigger, sd->smaller); | area_move_apply_do(C, sd->delta, sd->origval, dir, sd->bigger, sd->smaller, sd->do_snap); | ||||
| else { | else { | ||||
| /* TODO: Snap in preview mode too. */ | |||||
| if (sd->sarea) { | if (sd->sarea) { | ||||
| sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H | AREA_FLAG_DRAWSPLIT_V); | sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H | AREA_FLAG_DRAWSPLIT_V); | ||||
| ED_area_tag_redraw(sd->sarea); | ED_area_tag_redraw(sd->sarea); | ||||
| Context not available. | |||||
| case ESCKEY: | case ESCKEY: | ||||
| area_split_cancel(C, op); | area_split_cancel(C, op); | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| case LEFTCTRLKEY: | |||||
| sd->do_snap = event->val == KM_PRESS; | |||||
| break; | |||||
| } | } | ||||
| return OPERATOR_RUNNING_MODAL; | return OPERATOR_RUNNING_MODAL; | ||||
| } | } | ||||
| Context not available. | |||||
| static const EnumPropertyItem modal_items[] = { | static const EnumPropertyItem modal_items[] = { | ||||
| {KM_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, | {KM_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, | ||||
| {KM_MODAL_APPLY, "APPLY", 0, "Apply", ""}, | {KM_MODAL_APPLY, "APPLY", 0, "Apply", ""}, | ||||
| {KM_MODAL_STEP10, "STEP10", 0, "Steps on", ""}, | {KM_MODAL_SNAP, "SNAP", 0, "Snap on", ""}, | ||||
| {KM_MODAL_STEP10_OFF, "STEP10_OFF", 0, "Steps off", ""}, | {KM_MODAL_SNAP_OFF, "SNAP_OFF", 0, "Snap off", ""}, | ||||
| {0, NULL, 0, NULL, NULL}}; | {0, NULL, 0, NULL, NULL}}; | ||||
| wmKeyMap *keymap; | wmKeyMap *keymap; | ||||
| Context not available. | |||||
| WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY); | WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY); | ||||
| WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY); | WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY); | ||||
| WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_STEP10); | WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_SNAP); | ||||
| WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_MODAL_STEP10_OFF); | WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_MODAL_SNAP_OFF); | ||||
| WM_modalkeymap_assign(keymap, "SCREEN_OT_area_move"); | WM_modalkeymap_assign(keymap, "SCREEN_OT_area_move"); | ||||
| Context not available. | |||||