/* * 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. * * The Original Code is Copyright (C) 2009 Blender Foundation. * All rights reserved. */ /** \file * \ingroup edinterface */ #include "DNA_space_types.h" #include "DNA_screen_types.h" #include "BLI_blenlib.h" #include "BKE_context.h" #include "BKE_screen.h" #include "UI_interface.h" #include "WM_api.h" #include "WM_types.h" #include "interface_intern.h" #include "interface_eyedropper_intern.h" /* own include */ /* -------------------------------------------------------------------- */ /* Keymap */ /** \name Modal Keymap * \{ */ wmKeyMap *eyedropper_modal_keymap(wmKeyConfig *keyconf) { static const EnumPropertyItem modal_items[] = { {EYE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, {EYE_MODAL_SAMPLE_CONFIRM, "SAMPLE_CONFIRM", 0, "Confirm Sampling", ""}, {EYE_MODAL_SAMPLE_BEGIN, "SAMPLE_BEGIN", 0, "Start Sampling", ""}, {EYE_MODAL_SAMPLE_RESET, "SAMPLE_RESET", 0, "Reset Sampling", ""}, {0, NULL, 0, NULL, NULL}, }; wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Eyedropper Modal Map"); /* this function is called for each spacetype, only needs to add map once */ if (keymap && keymap->modal_items) { return NULL; } keymap = WM_modalkeymap_add(keyconf, "Eyedropper Modal Map", modal_items); /* assign to operators */ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_colorramp"); WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_color"); WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_id"); WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_depth"); WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_driver"); return keymap; } wmKeyMap *eyedropper_colorband_modal_keymap(wmKeyConfig *keyconf) { static const EnumPropertyItem modal_items_point[] = { {EYE_MODAL_POINT_CANCEL, "CANCEL", 0, "Cancel", ""}, {EYE_MODAL_POINT_SAMPLE, "SAMPLE_SAMPLE", 0, "Sample a point", ""}, {EYE_MODAL_POINT_CONFIRM, "SAMPLE_CONFIRM", 0, "Confirm Sampling", ""}, {EYE_MODAL_POINT_RESET, "SAMPLE_RESET", 0, "Reset Sampling", ""}, {0, NULL, 0, NULL, NULL}, }; wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Eyedropper ColorRamp PointSampling Map"); if (keymap && keymap->modal_items) { return keymap; } keymap = WM_modalkeymap_add( keyconf, "Eyedropper ColorRamp PointSampling Map", modal_items_point); /* assign to operators */ WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_colorramp_point"); return keymap; } /** \} */ /* -------------------------------------------------------------------- */ /* Utility Functions */ /** \name Generic Shared Functions * \{ */ void eyedropper_draw_cursor_text(const struct bContext *C, const ARegion *ar, const char *name) { const uiFontStyle *fstyle = UI_FSTYLE_WIDGET; wmWindow *win = CTX_wm_window(C); int x = win->eventstate->x; int y = win->eventstate->y; const float col_fg[4] = {1.0f, 1.0f, 1.0f, 1.0f}; const float col_bg[4] = {0.0f, 0.0f, 0.0f, 0.2f}; if ((name[0] == '\0') || (BLI_rcti_isect_pt(&ar->winrct, x, y) == false)) { return; } x = x - ar->winrct.xmin; y = y - ar->winrct.ymin; y += U.widget_unit; UI_fontstyle_draw_simple_backdrop(fstyle, x, y, name, col_fg, col_bg); } /** * Utility to retrieve a button representing a RNA property that is currently under the cursor. * * This is to be used by any eyedroppers which fetch properties (e.g. UI_OT_eyedropper_driver). * Especially during modal operations (e.g. as with the eyedroppers), context cannot be relied * upon to provide this information, as it is not updated until the operator finishes. * * \return A button under the mouse which relates to some RNA Property, or NULL */ uiBut *eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *event) { bScreen *screen = CTX_wm_screen(C); ScrArea *sa = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, event->x, event->y); ARegion *ar = BKE_area_find_region_xy(sa, RGN_TYPE_ANY, event->x, event->y); uiBut *but = ui_but_find_mouse_over(ar, event); if (ELEM(NULL, but, but->rnapoin.data, but->rnaprop)) { return NULL; } else { return but; } } /** \} */