diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-02-26 04:09:26 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-02-26 04:09:26 +0400 |
commit | fcac25e08d29727196c80f1044ea00dd5e629120 (patch) | |
tree | 73ade3e5c99ef6222cbdac36b2257c0d8ecb3d13 /source/blender/editors/interface/interface_ops.c | |
parent | 88be0a852edd13dc1374051aec8e4cd69dbffbdf (diff) |
simplify drag toggle operator, use BLI_rctf_isect_segment between mouse events rather then many calls to ui_but_find_mouse_over().
Diffstat (limited to 'source/blender/editors/interface/interface_ops.c')
-rw-r--r-- | source/blender/editors/interface/interface_ops.c | 83 |
1 files changed, 32 insertions, 51 deletions
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index ab30a0c6152..7b40cb9e9eb 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -1081,63 +1081,45 @@ typedef struct DragOpInfo { eButType but_type_start; } DragOpInfo; -typedef struct DragOpPlotData { - bContext *C; - ARegion *ar; - bool is_set; - eButType but_type_start; - bool do_draw; - const uiBut *but_prev; -} DragOpPlotData; - -static const uiBut *ui_but_set_xy(bContext *C, ARegion *ar, const bool is_set, const eButType but_type_start, - const int xy[2], const uiBut *but_prev) +static bool ui_but_set_xy_xy(bContext *C, ARegion *ar, const bool is_set, const eButType but_type_start, + const int xy_src[2], const int xy_dst[2]) { - uiBut *but = ui_but_find_mouse_over(ar, xy[0], xy[1]); - - if (but_prev == but) { - return but_prev; - } + bool change = false; + uiBlock *block; + + for (block = ar->uiblocks.first; block; block = block->next) { + uiBut *but; + + float xy_a_block[2] = {UNPACK2(xy_src)}; + float xy_b_block[2] = {UNPACK2(xy_dst)}; + + ui_window_to_block_fl(ar, block, &xy_a_block[0], &xy_a_block[1]); + ui_window_to_block_fl(ar, block, &xy_b_block[0], &xy_b_block[1]); + + for (but = block->buttons.first; but; but = but->next) { + if (ui_is_but_interactive(but)) { + if (BLI_rctf_isect_segment(&but->rect, xy_a_block, xy_b_block)) { + + /* execute the button */ + if (ui_is_but_bool(but) && but->type == but_type_start) { + /* is it pressed? */ + bool is_set_but = (ui_get_but_val(but) != 0.0); + BLI_assert(ui_is_but_bool(but) == true); + if (is_set_but != is_set) { + uiButExecute(C, but); + change = true; + } + } + /* done */ - if (but && ui_is_but_bool(but) && but->type == but_type_start) { - /* is it pressed? */ - bool is_set_but = (ui_get_but_val(but) != 0.0); - BLI_assert(ui_is_but_bool(but) == true); - if (is_set_but != is_set) { - uiButExecute(C, but); - return but; + } + } } } - return but_prev; + return change; } -static int ui_but_set_cb(int x, int y, void *data_v) -{ - DragOpPlotData *data = data_v; - int xy[2] = {x, y}; - data->but_prev = ui_but_set_xy(data->C, data->ar, data->is_set, data->but_type_start, xy, data->but_prev); - return 1; /* keep going */ -} - -/* operates on buttons between 2 mouse-points */ -static bool ui_but_set_xy_xy(bContext *C, ARegion *ar, const bool is_set, const eButType but_type_start, - const int xy_src[2], const int xy_dst[2]) -{ - DragOpPlotData data; - data.C = C; - data.ar = ar; - data.is_set = is_set; - data.but_type_start = but_type_start; - data.do_draw = false; - data.but_prev = NULL; - - - /* prevent dragging too fast loosing buttons */ - plot_line_v2v2i(xy_src, xy_dst, ui_but_set_cb, &data); - - return data.do_draw; -} static void ui_drag_but_set(bContext *C, wmOperator *op, const int xy_input[2]) { @@ -1307,4 +1289,3 @@ void UI_buttons_operatortypes(void) WM_operatortype_append(UI_OT_reloadtranslation); WM_operatortype_append(UI_OT_drag_toggle); } - |