55 const int delta_pages = int((delta_y - page_size * 0.5f) / page_size);
58 if (
abs(delta_pages) < 1) {
63 return delta_pages * page_size;
121 if (region ==
nullptr) {
286 switch (event->
type) {
289 int deltax = vpd->
lastx -
event->xy[0];
290 int deltay = vpd->
lasty -
event->xy[1];
298 vpd->
lastx =
event->xy[0];
301 vpd->
lasty =
event->xy[1];
304 if (deltax || deltay) {
353 ot->name =
"Pan View";
354 ot->description =
"Pan the view";
355 ot->idname =
"VIEW2D_OT_pan";
368 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
369 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
400 int event_xy_target[2];
429 ot->name =
"View Edge Pan";
430 ot->description =
"Pan the view when the mouse is held at an edge";
431 ot->idname =
"VIEW2D_OT_edge_pan";
477 ot->name =
"Scroll Right";
478 ot->description =
"Scroll the view right";
479 ot->idname =
"VIEW2D_OT_scroll_right";
486 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
487 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
517 ot->name =
"Scroll Left";
518 ot->description =
"Scroll the view left";
519 ot->idname =
"VIEW2D_OT_scroll_left";
526 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
527 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
571 ot->name =
"Scroll Down";
572 ot->description =
"Scroll the view down";
573 ot->idname =
"VIEW2D_OT_scroll_down";
580 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
581 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
626 ot->name =
"Scroll Up";
627 ot->description =
"Scroll the view up";
628 ot->idname =
"VIEW2D_OT_scroll_up";
635 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
636 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
686 r_do_zoom_xy[0] =
true;
687 r_do_zoom_xy[1] =
true;
694 r_do_zoom_xy[1] =
false;
705 if (region ==
nullptr) {
797 const float mval_faci = 1.0f - mval_fac;
798 const float ofs = (mval_fac * dx) - (mval_faci * dx);
833 const float mval_faci = 1.0f - mval_fac;
834 const float ofs = (mval_fac * dy) - (mval_faci * dy);
930 ot->name =
"Zoom In";
931 ot->description =
"Zoom in the view";
932 ot->idname =
"VIEW2D_OT_zoom_in";
994 ot->name =
"Zoom Out";
995 ot->description =
"Zoom out the view";
996 ot->idname =
"VIEW2D_OT_zoom_out";
1046 dx *= time_step * 5.0f;
1047 dy *= time_step * 5.0f;
1060 const float mval_faci = 1.0f - mval_fac;
1061 const float ofs = (mval_fac * dx) - (mval_faci * dx);
1079 const float mval_faci = 1.0f - mval_fac;
1080 const float ofs = (mval_fac * dy) - (mval_faci * dy);
1159 vzd->
lastx =
event->prev_xy[0];
1160 vzd->
lasty =
event->prev_xy[1];
1163 float zoomfac = 0.01f;
1219 vzd->
lastx =
event->xy[0];
1220 vzd->
lasty =
event->xy[1];
1264 float zoomfac = 0.01f;
1294 dx = len_new[0] - len_old[0];
1295 dy = len_new[1] - len_old[1];
1302 float facx = zoomfac * (
event->xy[0] - vzd->
lastx);
1303 float facy = zoomfac * (
event->xy[1] - vzd->
lasty);
1350 vzd->
lastx =
event->xy[0];
1351 vzd->
lasty =
event->xy[1];
1390 ot->name =
"Zoom 2D View";
1391 ot->description =
"Zoom in/out the view";
1392 ot->idname =
"VIEW2D_OT_zoom";
1465 float zoom, center,
size;
1474 cur_new.
xmin = center - (
size * zoom);
1475 cur_new.
xmax = center + (
size * zoom);
1482 cur_new.
ymin = center - (
size * zoom);
1483 cur_new.
ymax = center + (
size * zoom);
1495 ot->name =
"Zoom to Border";
1496 ot->description =
"Zoom in the view to the nearest item contained in the border";
1497 ot->idname =
"VIEW2D_OT_zoom_border";
1517#ifdef WITH_INPUT_NDOF
1524 const wmNDOFMotionData &ndof = *
static_cast<const wmNDOFMotionData *
>(
event->customdata);
1527 const float zoom_sensitivity = 0.5f;
1529 blender::float3 pan_vec = WM_event_ndof_translation_get_for_navigation(ndof);
1533 if (has_translate) {
1534 mul_v2_fl(pan_vec, ndof.dt * pan_speed);
1545 float zoom_factor = zoom_sensitivity * ndof.dt * -pan_vec[2];
1554 C, vzd, do_zoom_xy[0] ? zoom_factor : 0.0f, do_zoom_xy[1] ? zoom_factor : 0.0f);
1565 ot->name =
"NDOF Pan/Zoom";
1566 ot->idname =
"VIEW2D_OT_ndof";
1567 ot->description =
"Use a 3D mouse device to pan/zoom the view";
1570 ot->invoke = view2d_ndof_invoke;
1605 float fac_max = 0.0f;
1607 for (
int i = 0;
i < 2;
i++) {
1609 float tfac =
fabsf(cent_a[
i] - cent_b[
i]) /
min_ff(size_a[
i], size_b[
i]);
1610 fac_max =
max_ff(fac_max, tfac);
1611 if (fac_max >= 1.0f) {
1616 tfac = (1.0f - (
min_ff(size_a[
i], size_b[
i]) /
max_ff(size_a[
i], size_b[
i]))) * 2.0f;
1617 fac_max =
max_ff(fac_max, tfac);
1618 if (fac_max >= 1.0f) {
1622 return min_ff(fac_max, 1.0f);
1628 const int smooth_viewtx)
1650 if (smooth_viewtx && fac > FLT_EPSILON) {
1651 bool changed =
false;
1668 if (v2d->
sms ==
nullptr) {
1669 v2d->
sms = MEM_new<SmoothView2DStore>(__func__);
1719 MEM_delete(v2d->
sms);
1739 if (v2d->
sms ==
nullptr) {
1749 ot->name =
"Smooth View 2D";
1750 ot->idname =
"VIEW2D_OT_smoothview";
1877 const char in_scroller)
1892 vsm->
lastx =
event->xy[0];
1893 vsm->
lasty =
event->xy[1];
1906 rcti scroller_mask = v2d->
hor;
1913 rctf tot_cur_union = v2d->
tot;
1916 if (in_scroller ==
'h') {
1988 float temp = vsm->
fac * vsm->
delta;
1994 switch (vsm->
zone) {
2050 switch (event->
type) {
2060 delta = float(event->
xy[0] - vsm->
lastx);
2064 delta = float(event->
xy[1] - vsm->
lasty);
2073 delta = float(vsm->
lastx - event->
xy[0]);
2077 delta = float(vsm->
lasty - event->
xy[1]);
2083 if (use_page_size_y && (vsm->
scroller ==
'v')) {
2087 if (
IS_EQF(delta, 0.0f)) {
2093 vsm->
lastx =
event->xy[0];
2094 vsm->
lasty =
event->xy[1];
2223 ot->name =
"Scroller Activate";
2224 ot->description =
"Scroll view by mouse click and drag";
2225 ot->idname =
"VIEW2D_OT_scroller_activate";
2304 ot->name =
"Reset View";
2305 ot->description =
"Reset the view";
2306 ot->idname =
"VIEW2D_OT_reset";
2335#ifdef WITH_INPUT_NDOF
bScreen * CTX_wm_screen(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
MINLINE float max_ff(float a, float b)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE bool is_zero_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
void BLI_rcti_union(struct rcti *rct_a, const struct rcti *rct_b)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
void BLI_rctf_union(struct rctf *rct_a, const struct rctf *rct_b)
BLI_INLINE float BLI_rctf_cent_y(const struct rctf *rct)
BLI_INLINE float BLI_rctf_cent_x(const struct rctf *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
void BLI_rctf_interp(struct rctf *rect, const struct rctf *rect_a, const struct rctf *rect_b, float fac)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
bool BLI_rctf_compare(const struct rctf *rect_a, const struct rctf *rect_b, float limit)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define IN_RANGE_INCL(a, b, c)
#define NDOF_PIXELS_PER_SECOND
@ V2D_SCROLL_HORIZONTAL_FULLR
@ V2D_SCROLL_VERTICAL_FULLR
@ V2D_SCROLL_VERTICAL_HANDLES
@ V2D_SCROLL_HORIZONTAL_HANDLES
@ V2D_ZOOM_IGNORE_KEEPOFS
void ED_area_tag_redraw(ScrArea *area)
int ED_region_snap_size_test(const ARegion *region)
bool ED_region_panel_category_gutter_isect_xy(const ARegion *region, const int event_xy[2])
void ED_region_tag_redraw_no_rebuild(ARegion *region)
bool ED_region_snap_size_apply(ARegion *region, int snap_flag)
void ED_region_tag_redraw(ARegion *region)
Read Guarded memory(de)allocation.
const uiStyle * UI_style_get()
void UI_view2d_sync(bScreen *screen, ScrArea *area, View2D *v2dcur, int flag)
void UI_view2d_edge_pan_operator_init(bContext *C, View2DEdgePanData *vpd, wmOperator *op)
char char UI_view2d_mouse_in_scrollers(const ARegion *region, const View2D *v2d, const int xy[2]) ATTR_NONNULL(1
void UI_view2d_curRect_changed(const bContext *C, View2D *v2d)
void UI_view2d_edge_pan_operator_properties(wmOperatorType *ot)
#define V2D_SCROLL_HANDLE_SIZE_HOTSPOT
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
void void UI_view2d_edge_pan_apply_event(bContext *C, View2DEdgePanData *vpd, const wmEvent *event)
void UI_view2d_zoom_cache_reset()
void UI_view2d_region_to_view_rctf(const View2D *v2d, const rctf *rect_src, rctf *rect_dst) ATTR_NONNULL()
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
VecBase< float, 3 > float3
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
struct SmoothView2DStore * sms
struct wmTimer * smooth_timer
double edge_pan_last_time
double edge_pan_start_time_x
double edge_pan_start_time_y
struct wmEvent * eventstate
float view2d_page_size_y(const View2D &v2d)
void view2d_scrollers_calc(View2D *v2d, const rcti *mask_custom, View2DScrollers *r_scrollers)
bool view2d_edge_pan_poll(bContext *C)
static void VIEW2D_OT_scroll_up(wmOperatorType *ot)
static wmOperatorStatus view_scrolldown_exec(bContext *C, wmOperator *op)
static wmOperatorStatus scroller_activate_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void VIEW2D_OT_scroll_left(wmOperatorType *ot)
static wmOperatorStatus view_zoomin_exec(bContext *C, wmOperator *op)
static void scroller_activate_apply(bContext *C, wmOperator *op)
void UI_view2d_smooth_view(const bContext *C, ARegion *region, const rctf *cur, const int smooth_viewtx)
static bool view_zoom_poll(bContext *C)
static void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
void ED_operatortypes_view2d()
static void view_edge_pan_cancel(bContext *, wmOperator *op)
static wmOperatorStatus view_scrollright_exec(bContext *C, wmOperator *op)
static wmOperatorStatus view_zoomdrag_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void VIEW2D_OT_scroll_down(wmOperatorType *ot)
static wmOperatorStatus view_zoomout_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void view_zoomstep_apply(bContext *C, wmOperator *op)
static void VIEW2D_OT_pan(wmOperatorType *ot)
static short scrollbar_zone_get(int mouse, int sh_min, int sh_max)
static void view_zoomstep_apply_ex(bContext *C, v2dViewZoomData *vzd, const float facx, const float facy)
static wmOperatorStatus view_edge_pan_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void view_zoomstep_exit(bContext *C, wmOperator *op)
static void VIEW2D_OT_zoom_out(wmOperatorType *ot)
static wmOperatorStatus view_pan_exec(bContext *C, wmOperator *op)
static void view_pan_apply_ex(bContext *C, v2dViewPanData *vpd, float dx, float dy)
static void scroller_activate_exit(bContext *C, wmOperator *op)
static wmOperatorStatus view_borderzoom_exec(bContext *C, wmOperator *op)
static void VIEW2D_OT_zoom_border(wmOperatorType *ot)
static void view_pan_exit(wmOperator *op)
static void VIEW2D_OT_zoom(wmOperatorType *ot)
static bool view2d_poll(bContext *C)
static void view_zoomdrag_exit(bContext *C, wmOperator *op)
static void VIEW2D_OT_zoom_in(wmOperatorType *ot)
static wmOperatorStatus view_pan_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus view_zoomout_exec(bContext *C, wmOperator *op)
static void view_zoomdrag_apply(bContext *C, wmOperator *op)
static wmOperatorStatus view_edge_pan_invoke(bContext *C, wmOperator *op, const wmEvent *)
static void view_pan_cancel(bContext *, wmOperator *op)
static void scroller_activate_cancel(bContext *C, wmOperator *op)
static float view2d_scroll_delta_y_snap_page_size(const View2D &v2d, const float delta_y)
void ED_keymap_view2d(wmKeyConfig *keyconf)
@ SCROLLHANDLE_MIN_OUTSIDE
@ SCROLLHANDLE_MAX_OUTSIDE
static wmOperatorStatus view_pan_modal(bContext *C, wmOperator *op, const wmEvent *event)
static float smooth_view_rect_to_fac(const rctf *rect_a, const rctf *rect_b)
static void view_pan_init(bContext *C, wmOperator *op)
static wmOperatorStatus view_scrollup_exec(bContext *C, wmOperator *op)
static void VIEW2D_OT_scroll_right(wmOperatorType *ot)
static wmOperatorStatus reset_exec(bContext *C, wmOperator *)
static wmOperatorStatus view_zoomdrag_exec(bContext *C, wmOperator *op)
static void view_pan_apply(bContext *C, wmOperator *op)
static bool view_pan_poll(bContext *C)
static wmOperatorStatus view_scrollleft_exec(bContext *C, wmOperator *op)
static void VIEW2D_OT_edge_pan(wmOperatorType *ot)
static void view_zoomdrag_cancel(bContext *C, wmOperator *op)
static void VIEW2D_OT_reset(wmOperatorType *ot)
static wmOperatorStatus view2d_smoothview_invoke(bContext *C, wmOperator *, const wmEvent *event)
static bool scroller_activate_poll(bContext *C)
static void VIEW2D_OT_smoothview(wmOperatorType *ot)
static wmOperatorStatus scroller_activate_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void scroller_activate_init(bContext *C, wmOperator *op, const wmEvent *event, const char in_scroller)
static void view_zoomdrag_init(bContext *C, wmOperator *op)
static wmOperatorStatus view_zoomin_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void view_zoom_axis_lock_defaults(bContext *C, bool r_do_zoom_xy[2])
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
int WM_event_absolute_delta_y(const wmEvent *event)
int WM_event_absolute_delta_x(const wmEvent *event)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_event_add_mousemove(wmWindow *win)
void WM_gesture_box_cancel(bContext *C, wmOperator *op)
wmOperatorStatus WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
void WM_operator_properties_gesture_box(wmOperatorType *ot)
void WM_operator_properties_border_to_rctf(wmOperator *op, rctf *r_rect)
void WM_operator_properties_use_cursor_init(wmOperatorType *ot)
void WM_operator_properties_gesture_box_zoom(wmOperatorType *ot)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
int WM_operator_smooth_viewtx_get(const wmOperator *op)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const wmEventType event_type, const double time_step)
wmWindow * WM_window_find_under_cursor(wmWindow *win, const int event_xy[2], int r_event_xy_other[2])
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)