55 const int delta_pages = int(delta_y / (page_size * 0.5f));
58 if (
abs(delta_pages) < 1) {
63 return delta_pages * page_size;
122 if (region ==
nullptr) {
288 switch (event->
type) {
291 int deltax = vpd->
lastx -
event->xy[0];
292 int deltay = vpd->
lasty -
event->xy[1];
300 vpd->
lastx =
event->xy[0];
303 vpd->
lasty =
event->xy[1];
306 if (deltax || deltay) {
361 ot->name =
"Pan View";
362 ot->description =
"Pan the view";
363 ot->idname =
"VIEW2D_OT_pan";
376 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
377 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
408 int event_xy_target[2];
437 ot->name =
"View Edge Pan";
438 ot->description =
"Pan the view when the mouse is held at an edge";
439 ot->idname =
"VIEW2D_OT_edge_pan";
485 ot->name =
"Scroll Right";
486 ot->description =
"Scroll the view right";
487 ot->idname =
"VIEW2D_OT_scroll_right";
494 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
495 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
525 ot->name =
"Scroll Left";
526 ot->description =
"Scroll the view left";
527 ot->idname =
"VIEW2D_OT_scroll_left";
534 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
535 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
579 ot->name =
"Scroll Down";
580 ot->description =
"Scroll the view down";
581 ot->idname =
"VIEW2D_OT_scroll_down";
588 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
589 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
634 ot->name =
"Scroll Up";
635 ot->description =
"Scroll the view up";
636 ot->idname =
"VIEW2D_OT_scroll_up";
643 RNA_def_int(
ot->srna,
"deltax", 0, INT_MIN, INT_MAX,
"Delta X",
"", INT_MIN, INT_MAX);
644 RNA_def_int(
ot->srna,
"deltay", 0, INT_MIN, INT_MAX,
"Delta Y",
"", INT_MIN, INT_MAX);
695 r_do_zoom_xy[0] =
true;
696 r_do_zoom_xy[1] =
true;
703 r_do_zoom_xy[1] =
false;
714 if (region ==
nullptr) {
806 const float mval_faci = 1.0f - mval_fac;
807 const float ofs = (mval_fac * dx) - (mval_faci * dx);
842 const float mval_faci = 1.0f - mval_fac;
843 const float ofs = (mval_fac * dy) - (mval_faci * dy);
939 ot->name =
"Zoom In";
940 ot->description =
"Zoom in the view";
941 ot->idname =
"VIEW2D_OT_zoom_in";
1003 ot->name =
"Zoom Out";
1004 ot->description =
"Zoom out the view";
1005 ot->idname =
"VIEW2D_OT_zoom_out";
1055 dx *= time_step * 5.0f;
1056 dy *= time_step * 5.0f;
1069 const float mval_faci = 1.0f - mval_fac;
1070 const float ofs = (mval_fac * dx) - (mval_faci * dx);
1088 const float mval_faci = 1.0f - mval_fac;
1089 const float ofs = (mval_fac * dy) - (mval_faci * dy);
1168 vzd->
lastx =
event->prev_xy[0];
1169 vzd->
lasty =
event->prev_xy[1];
1172 float zoomfac = 0.01f;
1228 vzd->
lastx =
event->xy[0];
1229 vzd->
lasty =
event->xy[1];
1274 float zoomfac = 0.01f;
1304 dx = len_new[0] - len_old[0];
1305 dy = len_new[1] - len_old[1];
1312 float facx = zoomfac * (
event->xy[0] - vzd->
lastx);
1313 float facy = zoomfac * (
event->xy[1] - vzd->
lasty);
1360 vzd->
lastx =
event->xy[0];
1361 vzd->
lasty =
event->xy[1];
1403 ot->name =
"Zoom 2D View";
1404 ot->description =
"Zoom in/out the view";
1405 ot->idname =
"VIEW2D_OT_zoom";
1478 float zoom, center,
size;
1487 cur_new.
xmin = center - (
size * zoom);
1488 cur_new.
xmax = center + (
size * zoom);
1495 cur_new.
ymin = center - (
size * zoom);
1496 cur_new.
ymax = center + (
size * zoom);
1508 ot->name =
"Zoom to Border";
1509 ot->description =
"Zoom in the view to the nearest item contained in the border";
1510 ot->idname =
"VIEW2D_OT_zoom_border";
1530#ifdef WITH_INPUT_NDOF
1537 const wmNDOFMotionData &ndof = *
static_cast<const wmNDOFMotionData *
>(
event->customdata);
1540 const float zoom_sensitivity = 0.5f;
1542 blender::float3 pan_vec = WM_event_ndof_translation_get_for_navigation(ndof);
1546 if (has_translate) {
1547 mul_v2_fl(pan_vec, ndof.time_delta * pan_speed);
1558 float zoom_factor = zoom_sensitivity * ndof.time_delta * -pan_vec[2];
1567 C, vzd, do_zoom_xy[0] ? zoom_factor : 0.0f, do_zoom_xy[1] ? zoom_factor : 0.0f);
1578 ot->name =
"NDOF Pan/Zoom";
1579 ot->idname =
"VIEW2D_OT_ndof";
1580 ot->description =
"Use a 3D mouse device to pan/zoom the view";
1583 ot->invoke = view2d_ndof_invoke;
1618 float fac_max = 0.0f;
1620 for (
int i = 0;
i < 2;
i++) {
1622 float tfac =
fabsf(cent_a[
i] - cent_b[
i]) /
min_ff(size_a[
i], size_b[
i]);
1623 fac_max =
max_ff(fac_max, tfac);
1624 if (fac_max >= 1.0f) {
1629 tfac = (1.0f - (
min_ff(size_a[
i], size_b[
i]) /
max_ff(size_a[
i], size_b[
i]))) * 2.0f;
1630 fac_max =
max_ff(fac_max, tfac);
1631 if (fac_max >= 1.0f) {
1635 return min_ff(fac_max, 1.0f);
1641 const int smooth_viewtx)
1663 if (smooth_viewtx && fac > FLT_EPSILON) {
1664 bool changed =
false;
1681 if (v2d->
sms ==
nullptr) {
1682 v2d->
sms = MEM_new<SmoothView2DStore>(__func__);
1732 MEM_delete(v2d->
sms);
1752 if (v2d->
sms ==
nullptr) {
1762 ot->name =
"Smooth View 2D";
1763 ot->idname =
"VIEW2D_OT_smoothview";
1890 const char in_scroller)
1905 vsm->
lastx =
event->xy[0];
1906 vsm->
lasty =
event->xy[1];
1919 rcti scroller_mask = v2d->
hor;
1926 rctf tot_cur_union = v2d->
tot;
1929 if (in_scroller ==
'h') {
2001 float temp = vsm->
fac * vsm->
delta;
2007 switch (vsm->
zone) {
2063 switch (event->
type) {
2096 if (use_page_size_y && (vsm->
scroller ==
'v')) {
2100 if (
IS_EQF(delta, 0.0f)) {
2106 vsm->
lastx =
event->xy[0];
2107 vsm->
lasty =
event->xy[1];
2236 ot->name =
"Scroller Activate";
2237 ot->description =
"Scroll view by mouse click and drag";
2238 ot->idname =
"VIEW2D_OT_scroller_activate";
2317 ot->name =
"Reset View";
2318 ot->description =
"Reset the view";
2319 ot->idname =
"VIEW2D_OT_reset";
2348#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_ZOOM_IGNORE_KEEPOFS
@ V2D_SCROLL_HORIZONTAL_FULLR
@ V2D_SCROLL_VERTICAL_FULLR
@ V2D_SCROLL_VERTICAL_HANDLES
@ V2D_SCROLL_HORIZONTAL_HANDLES
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)
@ SCROLLHANDLE_MIN_OUTSIDE
@ SCROLLHANDLE_MAX_OUTSIDE
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)
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)
bool WM_cursor_modal_is_set_ok(const 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)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, blender::wm::OpCallContext context, PointerRNA *properties, const wmEvent *event)
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)