UI List: ctrl click on names in list can be used for renaming.
[blender-staging.git] / source / blender / editors / interface / interface_handlers.c
index cff7500e6ef6d55462fe1ec8bb18bedbc5725b00..c871fdcf7465846f7a68f8447480d7df3672e838 100644 (file)
@@ -235,8 +235,10 @@ typedef struct uiAfterFunc {
 
 
 
+static bool ui_is_but_interactive(uiBut *but, const bool ctrl);
 static bool ui_but_contains_pt(uiBut *but, int mx, int my);
 static bool ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y);
+static uiBut *ui_but_find_mouse_over(ARegion *ar, const wmEvent *event, int x, int y);
 static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state);
 static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *userdata);
 static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiButtonActivateType type);
@@ -301,7 +303,7 @@ void ui_pan_to_scroll(const wmEvent *event, int *type, int *val)
 
 static bool ui_but_editable(uiBut *but)
 {
-       return ELEM6(but->type, LABEL, LISTLABEL, SEPR, ROUNDBOX, LISTBOX, PROGRESSBAR);
+       return ELEM5(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX, PROGRESSBAR);
 }
 
 static uiBut *ui_but_prev(uiBut *but)
@@ -728,7 +730,9 @@ static bool ui_drag_toggle_set_xy_xy(bContext *C, ARegion *ar, const bool is_set
                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)) {
+                       /* Note: ctrl is always true here because (at least for now) we always want to consider text control
+                        *       in this case, even when not embossed. */
+                       if (ui_is_but_interactive(but, true)) {
                                if (BLI_rctf_isect_segment(&but->rect, xy_a_block, xy_b_block)) {
 
                                        /* execute the button */
@@ -754,7 +758,7 @@ static bool ui_drag_toggle_set_xy_xy(bContext *C, ARegion *ar, const bool is_set
        return change;
 }
 
-static void ui_drag_toggle_set(bContext *C, uiDragToggleHandle *drag_info, const int xy_input[2])
+static void ui_drag_toggle_set(bContext *C, uiDragToggleHandle *drag_info, const wmEvent *event)
 {
        ARegion *ar = CTX_wm_region(C);
        bool do_draw = false;
@@ -768,7 +772,7 @@ static void ui_drag_toggle_set(bContext *C, uiDragToggleHandle *drag_info, const
         */
        if (drag_info->is_init == false) {
                /* first store the buttons original coords */
-               uiBut *but = ui_but_find_mouse_over(ar, xy_input[0], xy_input[1]);
+               uiBut *but = ui_but_find_mouse_over(ar, event, 0, 0);
 
                if (but) {
                        if (but->flag & UI_BUT_DRAG_LOCK) {
@@ -796,8 +800,8 @@ static void ui_drag_toggle_set(bContext *C, uiDragToggleHandle *drag_info, const
        /* done with axis locking */
 
 
-       xy[0] = (drag_info->xy_lock[0] == false) ? xy_input[0] : drag_info->xy_last[0];
-       xy[1] = (drag_info->xy_lock[1] == false) ? xy_input[1] : drag_info->xy_last[1];
+       xy[0] = (drag_info->xy_lock[0] == false) ? event->x : drag_info->xy_last[0];
+       xy[1] = (drag_info->xy_lock[1] == false) ? event->y : drag_info->xy_last[1];
 
 
        /* touch all buttons between last mouse coord and this one */
@@ -831,7 +835,7 @@ static int ui_handler_region_drag_toggle(bContext *C, const wmEvent *event, void
                }
                case MOUSEMOVE:
                {
-                       ui_drag_toggle_set(C, drag_info, &event->x);
+                       ui_drag_toggle_set(C, drag_info, event);
                        break;
                }
        }
@@ -839,7 +843,7 @@ static int ui_handler_region_drag_toggle(bContext *C, const wmEvent *event, void
        if (done) {
                wmWindow *win = CTX_wm_window(C);
                ARegion *ar = CTX_wm_region(C);
-               uiBut *but = ui_but_find_mouse_over(ar, drag_info->xy_init[0], drag_info->xy_init[1]);
+               uiBut *but = ui_but_find_mouse_over(ar, NULL, drag_info->xy_init[0], drag_info->xy_init[1]);
 
                if (but) {
                        ui_apply_undo(but);
@@ -881,7 +885,7 @@ static bool ui_but_mouse_inside_icon(uiBut *but, ARegion *ar, const wmEvent *eve
        if (but->imb) {
                /* use button size itself */
        }
-       else if (but->flag & UI_ICON_LEFT) {
+       else if (but->drawflag & UI_BUT_ICON_LEFT) {
                rect.xmax = rect.xmin + (BLI_rcti_size_y(&rect));
        }
        else {
@@ -2097,7 +2101,7 @@ static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
        uiBut *but;
 
        /* label and roundbox can overlap real buttons (backdrops...) */
-       if (ELEM5(actbut->type, LABEL, LISTLABEL, SEPR, ROUNDBOX, LISTBOX))
+       if (ELEM4(actbut->type, LABEL, SEPR, ROUNDBOX, LISTBOX))
                return;
 
        for (but = actbut->next; but; but = but->next) {
@@ -2125,7 +2129,7 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
        uiBut *but;
 
        /* label and roundbox can overlap real buttons (backdrops...) */
-       if (ELEM5(actbut->type, LABEL, LISTLABEL, SEPR, ROUNDBOX, LISTBOX))
+       if (ELEM4(actbut->type, LABEL, SEPR, ROUNDBOX, LISTBOX))
                return;
 
        for (but = actbut->prev; but; but = but->prev) {
@@ -3879,8 +3883,8 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
        float x, y;
        float mx_fl, my_fl;
        bool changed = true;
-       int color_profile = but->block->color_profile;
-       
+       bool use_display_colorspace = ui_hsvcube_use_display_colorspace(but);
+
        ui_mouse_scale_warp(data, mx, my, &mx_fl, &my_fl, shift);
 
 #ifdef USE_CONT_MOUSE_CORRECT
@@ -3892,14 +3896,9 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
        }
 #endif
 
-       if (but->rnaprop) {
-               if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
-                       color_profile = FALSE;
-       }
-
        ui_get_but_vectorf(but, rgb);
 
-       if (color_profile && (int)but->a1 != UI_GRAD_SV)
+       if (use_display_colorspace)
                ui_block_to_display_space_v3(but->block, rgb);
 
        rgb_to_hsv_compat_v(rgb, hsv);
@@ -3913,7 +3912,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
                
                /* calculate original hsv again */
                copy_v3_v3(rgb, data->origvec);
-               if (color_profile && (int)but->a1 != UI_GRAD_SV)
+               if (use_display_colorspace)
                        ui_block_to_display_space_v3(but->block, rgb);
                
                copy_v3_v3(hsvo, ui_block_hsv_get(but->block));
@@ -3974,7 +3973,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
 
        hsv_to_rgb_v(hsv, rgb);
 
-       if (color_profile && ((int)but->a1 != UI_GRAD_SV))
+       if (use_display_colorspace)
                ui_block_to_scene_linear_v3(but->block, rgb);
 
        /* clamp because with color conversion we can exceed range [#34295] */
@@ -3997,17 +3996,11 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
        float *hsv = ui_block_hsv_get(but->block);
        float rgb[3];
        float sensitivity = (shift ? 0.15f : 0.3f) * ndof->dt;
-       
-       int color_profile = but->block->color_profile;
-       
-       if (but->rnaprop) {
-               if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
-                       color_profile = FALSE;
-       }
+       bool use_display_colorspace = ui_hsvcube_use_display_colorspace(but);
 
        ui_get_but_vectorf(but, rgb);
 
-       if (color_profile && (int)but->a1 != UI_GRAD_SV)
+       if (use_display_colorspace)
                ui_block_to_display_space_v3(but->block, rgb);
 
        rgb_to_hsv_compat_v(rgb, hsv);
@@ -4055,7 +4048,7 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
 
        hsv_to_rgb_v(hsv, rgb);
 
-       if (color_profile && (int)but->a1 != UI_GRAD_SV)
+       if (use_display_colorspace)
                ui_block_to_scene_linear_v3(but->block, rgb);
 
        copy_v3_v3(data->vec, rgb);
@@ -5686,7 +5679,6 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
                        break;
                case ROUNDBOX:
                case LABEL:
-               case LISTLABEL:
                case ROW:
                case LISTROW:
                case BUT_IMAGE:
@@ -5895,11 +5887,12 @@ static bool ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y)
 
 /**
  * Can we mouse over the button or is it hidden/disabled/layout.
+ * Note: ctrl is kind of a hack currently, so that non-embossed TEX button behaves as a label when ctrl is not pressed.
  */
-bool ui_is_but_interactive(uiBut *but)
+static bool ui_is_but_interactive(uiBut *but, const bool ctrl)
 {
        /* note, LABEL is included for highlights, this allows drags */
-       if (ELEM(but->type, LABEL, LISTLABEL) && but->dragpoin == NULL)
+       if ((but->type == LABEL) && but->dragpoin == NULL)
                return false;
        if (ELEM3(but->type, ROUNDBOX, SEPR, LISTBOX))
                return false;
@@ -5907,6 +5900,8 @@ bool ui_is_but_interactive(uiBut *but)
                return false;
        if (but->flag & UI_SCROLLED)
                return false;
+       if ((but->type == TEX) && (but->dt & UI_EMBOSSN) && !ctrl)
+               return false;
 
        return true;
 }
@@ -5918,11 +5913,19 @@ bool ui_is_but_search_unlink_visible(uiBut *but)
                (but->drawstr[0] != '\0'));
 }
 
-uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
+/* x and y are only used in case event is NULL... */
+static uiBut *ui_but_find_mouse_over(ARegion *ar, const wmEvent *event, int x, int y)
 {
        uiBlock *block;
        uiBut *but, *butover = NULL;
        int mx, my;
+       bool ctrl = true;
+
+       if (event) {
+               x = event->x;
+               y = event->y;
+               ctrl = event->ctrl;
+       }
 
 //     if (!win->active)
 //             return NULL;
@@ -5935,7 +5938,7 @@ uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
                ui_window_to_block(ar, block, &mx, &my);
 
                for (but = block->buttons.first; but; but = but->next) {
-                       if (ui_is_but_interactive(but)) {
+                       if (ui_is_but_interactive(but, ctrl)) {
                                if (ui_but_contains_pt(but, mx, my)) {
                                        butover = but;
                                }
@@ -6505,7 +6508,7 @@ static int ui_handle_button_over(bContext *C, const wmEvent *event, ARegion *ar)
        uiBut *but;
 
        if (event->type == MOUSEMOVE) {
-               but = ui_but_find_mouse_over(ar, event->x, event->y);
+               but = ui_but_find_mouse_over(ar, event, 0, 0);
                if (but) {
                        button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
                }
@@ -6597,7 +6600,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
                                        data->cancel = TRUE;
                                        button_activate_state(C, but, BUTTON_STATE_EXIT);
                                }
-                               else if (ui_but_find_mouse_over(ar, event->x, event->y) != but) {
+                               else if (ui_but_find_mouse_over(ar, event, 0, 0) != but) {
                                        data->cancel = TRUE;
                                        button_activate_state(C, but, BUTTON_STATE_EXIT);
                                }
@@ -6709,7 +6712,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
                                        }
                                }
 
-                               bt = ui_but_find_mouse_over(ar, event->x, event->y);
+                               bt = ui_but_find_mouse_over(ar, event, 0, 0);
                                
                                if (bt && bt->active != data) {
                                        if (but->type != COLOR) {  /* exception */
@@ -6729,6 +6732,8 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
                // retval = WM_UI_HANDLER_BREAK; XXX why ?
        }
 
+       /* may have been re-allocated above (eyedropper for eg) */
+       data = but->active;
        if (data->state == BUTTON_STATE_EXIT) {
                uiBut *post_but = data->postbut;
                uiButtonActivateType post_type = data->posttype;
@@ -6747,7 +6752,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
                         * it stays active while the mouse is over it.
                         * This avoids adding mousemoves, see: [#33466] */
                        if (ELEM(state_orig, BUTTON_STATE_INIT, BUTTON_STATE_HIGHLIGHT)) {
-                               if (ui_but_find_mouse_over(ar, event->x, event->y) == but) {
+                               if (ui_but_find_mouse_over(ar, event, 0, 0) == but) {
                                        button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
                                }
                        }
@@ -6788,7 +6793,7 @@ static int ui_handle_list_event(bContext *C, const wmEvent *event, ARegion *ar)
                        break;
                }
        }
-       if (dragbut && dragbut == ui_but_find_mouse_over(ar, event->x, event->y)) {
+       if (dragbut && dragbut == ui_but_find_mouse_over(ar, event, 0, 0)) {
                is_over_dragbut = true;
        }
 
@@ -7453,7 +7458,7 @@ static int ui_handle_menu_event(bContext *C, const wmEvent *event, uiPopupBlockH
                                                for (but = block->buttons.first; but; but = but->next) {
                                                        int doit = FALSE;
                                                        
-                                                       if (but->type != LABEL && but->type != LISTLABEL && but->type != SEPR)
+                                                       if (!ELEM(but->type, LABEL, SEPR))
                                                                count++;
                                                        
                                                        /* exception for rna layer buts */