From 3c8c1841d72d8b9b13799c9a12cd8637b38be51d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 4 Oct 2018 08:54:48 +1000 Subject: UI: use shared toolbar region callbacks Image toolbar now starts with a single column width and snaps to button increments. --- source/blender/editors/screen/area_utils.c | 89 ++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 source/blender/editors/screen/area_utils.c (limited to 'source/blender/editors/screen/area_utils.c') diff --git a/source/blender/editors/screen/area_utils.c b/source/blender/editors/screen/area_utils.c new file mode 100644 index 00000000000..53e2f96d6c4 --- /dev/null +++ b/source/blender/editors/screen/area_utils.c @@ -0,0 +1,89 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/screen/area_utils.c + * \ingroup edscr + * + * Helper functions for area/region API. + */ + +#include "DNA_userdef_types.h" + +#include "BLI_blenlib.h" +#include "BLI_utildefines.h" + +#include "BKE_context.h" + +#include "RNA_access.h" +#include "RNA_types.h" + +#include "WM_api.h" +#include "WM_message.h" + +#include "ED_screen.h" + +#include "UI_interface.h" + +/* -------------------------------------------------------------------- */ +/** \name Generic Tool System Region Callbacks + * \{ */ + +/** + * Callback for #ARegionType.message_subscribe + */ +void ED_region_generic_tools_region_message_subscribe( + const struct bContext *UNUSED(C), + struct WorkSpace *UNUSED(workspace), struct Scene *UNUSED(scene), + struct bScreen *UNUSED(screen), struct ScrArea *UNUSED(sa), struct ARegion *ar, + struct wmMsgBus *mbus) +{ + wmMsgSubscribeValue msg_sub_value_region_tag_redraw = { + .owner = ar, + .user_data = ar, + .notify = ED_region_do_msg_notify_tag_redraw, + }; + WM_msg_subscribe_rna_anon_prop(mbus, WorkSpace, tools, &msg_sub_value_region_tag_redraw); +} + +/** + * Callback for #ARegionType.snap_size + */ +int ED_region_generic_tools_region_snap_size(const ARegion *ar, int size, int axis) +{ + if (axis == 0) { + /* Note, this depends on the icon size: see #ICON_DEFAULT_HEIGHT_TOOLBAR. */ + const float snap_units[] = {2 + 0.8f, 4 + 0.8f}; + const float aspect = BLI_rctf_size_x(&ar->v2d.cur) / (BLI_rcti_size_x(&ar->v2d.mask) + 1); + int best_diff = INT_MAX; + int best_size = size; + for (uint i = 0; i < ARRAY_SIZE(snap_units); i += 1) { + const int test_size = (snap_units[i] * U.widget_unit) / (UI_DPI_FAC * aspect); + const int test_diff = ABS(test_size - size); + if (test_diff < best_diff) { + best_size = test_size; + best_diff = test_diff; + } + } + return best_size; + } + return size; +} + +/** \} */ -- cgit v1.2.3