Final fix for #36905. Enforce redraw of window once before sampling.

Thanks to Brecht for the solution!
This commit is contained in:
Antony Riakiotakis 2013-10-15 13:45:27 +00:00
parent 4f05cecbcd
commit 23612a8598

@ -936,11 +936,23 @@ static int sample_color_exec(bContext *C, wmOperator *op)
Paint *paint = BKE_paint_get_active_from_context(C); Paint *paint = BKE_paint_get_active_from_context(C);
Brush *brush = BKE_paint_brush(paint); Brush *brush = BKE_paint_brush(paint);
ARegion *ar = CTX_wm_region(C); ARegion *ar = CTX_wm_region(C);
wmWindow *win = CTX_wm_window(C);
bool show_cursor = ((paint->flags & PAINT_SHOW_BRUSH) != 0);
int location[2]; int location[2];
paint->flags &= ~PAINT_SHOW_BRUSH;
/* force redraw without cursor */
WM_paint_cursor_tag_redraw(win, ar);
WM_redraw_windows(C);
RNA_int_get_array(op->ptr, "location", location); RNA_int_get_array(op->ptr, "location", location);
paint_sample_color(C, ar, location[0], location[1]); paint_sample_color(C, ar, location[0], location[1]);
if(show_cursor) {
paint->flags |= PAINT_SHOW_BRUSH;
}
WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush); WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
@ -950,14 +962,20 @@ static int sample_color_invoke(bContext *C, wmOperator *op, const wmEvent *event
{ {
Paint *paint = BKE_paint_get_active_from_context(C); Paint *paint = BKE_paint_get_active_from_context(C);
SampleColorData *data = MEM_mallocN(sizeof(SampleColorData), "sample color custom data"); SampleColorData *data = MEM_mallocN(sizeof(SampleColorData), "sample color custom data");
ARegion *ar = CTX_wm_region(C);
wmWindow *win = CTX_wm_window(C);
data->event_type = event->type; data->event_type = event->type;
data->show_cursor = ((paint->flags & PAINT_SHOW_BRUSH) != 0); data->show_cursor = ((paint->flags & PAINT_SHOW_BRUSH) != 0);
op->customdata = data; op->customdata = data;
paint->flags &= ~PAINT_SHOW_BRUSH; paint->flags &= ~PAINT_SHOW_BRUSH;
/* force redraw without cursor */
WM_paint_cursor_tag_redraw(win, ar);
WM_redraw_windows(C);
RNA_int_set_array(op->ptr, "location", event->mval); RNA_int_set_array(op->ptr, "location", event->mval);
sample_color_exec(C, op); paint_sample_color(C, ar, event->mval[0], event->mval[1]);
WM_event_add_modal_handler(C, op); WM_event_add_modal_handler(C, op);
@ -967,10 +985,10 @@ static int sample_color_invoke(bContext *C, wmOperator *op, const wmEvent *event
static int sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event) static int sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event)
{ {
SampleColorData *data = op->customdata; SampleColorData *data = op->customdata;
Paint *paint = BKE_paint_get_active_from_context(C);
Brush *brush = BKE_paint_brush(paint);
if ((event->type == data->event_type) && (event->val == KM_RELEASE)) { if ((event->type == data->event_type) && (event->val == KM_RELEASE)) {
Paint *paint = BKE_paint_get_active_from_context(C);
if(data->show_cursor) { if(data->show_cursor) {
paint->flags |= PAINT_SHOW_BRUSH; paint->flags |= PAINT_SHOW_BRUSH;
} }
@ -981,10 +999,14 @@ static int sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event)
switch (event->type) { switch (event->type) {
case MOUSEMOVE: case MOUSEMOVE:
{
ARegion *ar = CTX_wm_region(C);
RNA_int_set_array(op->ptr, "location", event->mval); RNA_int_set_array(op->ptr, "location", event->mval);
sample_color_exec(C, op); paint_sample_color(C, ar, event->mval[0], event->mval[1]);
WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
break; break;
} }
}
return OPERATOR_RUNNING_MODAL; return OPERATOR_RUNNING_MODAL;
} }