Commit: 74308df3f051b6a90560fe00b9a9539a3dbaef19
Author: Antony Riakiotakis
Date:   Fri Dec 12 15:22:31 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB74308df3f051b6a90560fe00b9a9539a3dbaef19

Support for custom cursors for widgets.

They are set when a highlighted widget intersection is detected and on
area level.

There's a discussion about using owners and a stack or array for cursors
but that needs some more thought and design.

===================================================================

M       source/blender/editors/screen/screen_edit.c
M       source/blender/editors/space_sequencer/sequencer_view.c
M       source/blender/makesrna/intern/rna_wm.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_generic_widgets.c
M       source/blender/windowmanager/intern/wm_widgets.c
M       source/blender/windowmanager/wm.h

===================================================================

diff --git a/source/blender/editors/screen/screen_edit.c 
b/source/blender/editors/screen/screen_edit.c
index c179cfc..4627b86 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1078,6 +1078,8 @@ static void region_cursor_set(wmWindow *win, int swinid, 
int swin_changed)
                for (; ar; ar = ar->next) {
                        if (ar->swinid == swinid) {
                                if (swin_changed || (ar->type && 
ar->type->event_cursor)) {
+                                       if 
(WM_widgetmap_cursor_set(ar->widgetmaps.first, win))
+                                               return;
                                        if (ar->type && ar->type->cursor)
                                                ar->type->cursor(win, sa, ar);
                                        else
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c 
b/source/blender/editors/space_sequencer/sequencer_view.c
index 2a81442..71eb64a 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -287,7 +287,7 @@ static int sequencer_overdrop_transform_invoke(bContext *C, 
wmOperator *op, cons
        /* no poll, lives always for the duration of the operator */
        wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, 
widgetgroup_overdrop_draw, CTX_data_main(C), "Seq_Canvas", SPACE_SEQ, 
RGN_TYPE_WINDOW, false);
        struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
-       OverDropTransformData *data = 
MEM_mallocN(sizeof(OverDropTransformData), "backdrop transform data");
+       OverDropTransformData *data = 
MEM_mallocN(sizeof(OverDropTransformData), "overdrop transform data");
        WM_modal_handler_attach_widgetgroup(C, handler, cagetype, op);
        
        RNA_float_set_array(op->ptr, "offset", sseq->overdrop_offset);
@@ -309,10 +309,16 @@ static void sequencer_overdrop_finish(bContext *C, 
OverDropTransformData *data)
 {
        ScrArea *sa = CTX_wm_area(C);
        ED_area_headerprint(sa, NULL);
-       WM_widgetgrouptype_unregister(CTX_data_main(C), data->cagetype);
+       WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
        MEM_freeN(data);
 }
 
+static void sequencer_overdrop_cancel(struct bContext *C, struct wmOperator 
*op)
+{
+       OverDropTransformData *data = op->customdata;
+       sequencer_overdrop_finish(C, data);
+}
+
 static int sequencer_overdrop_transform_modal(bContext *C, wmOperator *op, 
const wmEvent *event)
 {
        OverDropTransformData *data = op->customdata;
@@ -380,6 +386,7 @@ void SEQUENCER_OT_overdrop_transform(struct wmOperatorType 
*ot)
        ot->invoke = sequencer_overdrop_transform_invoke;
        ot->modal = sequencer_overdrop_transform_modal;
        ot->poll = sequencer_overdrop_transform_poll;
+       ot->cancel = sequencer_overdrop_cancel;
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
diff --git a/source/blender/makesrna/intern/rna_wm.c 
b/source/blender/makesrna/intern/rna_wm.c
index e1273d1..c5e311b 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1395,7 +1395,7 @@ static void rna_WidgetGroup_unregister(struct Main 
*bmain, StructRNA *type)
 
        //RNA_struct_free_extension(type, &wgrouptype->ext);
 
-       WM_widgetgrouptype_unregister(bmain, wgrouptype);
+       WM_widgetgrouptype_unregister(NULL, bmain, wgrouptype);
        //WM_operatortype_remove_ptr(ot);
 
        /* not to be confused with the RNA_struct_free that 
WM_operatortype_remove calls, they are 2 different srna's */
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index 456e30d..e7efae5 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -487,15 +487,15 @@ void WM_widget_set_draw_on_hover_only(struct wmWidget 
*widget, bool draw);
 void WM_widget_set_scale(struct wmWidget *widget, float scale);
 
 struct wmWidgetMapType *WM_widgetmaptype_find(const char *idname, int spaceid, 
int regionid, bool is_3d, bool create);
-
 struct wmWidgetGroupType *WM_widgetgrouptype_new(int (*poll)(const struct 
bContext *, struct wmWidgetGroupType *),
                                                  void (*draw)(const struct 
bContext *, struct wmWidgetGroup *), 
                                                  struct Main *bmain, const 
char *mapidname, short spaceid, short regionid, bool is_3d);
-void WM_widgetgrouptype_unregister(struct Main *bmain, struct 
wmWidgetGroupType *wgroup);
+void WM_widgetgrouptype_unregister(struct bContext *C, struct Main *bmain, 
struct wmWidgetGroupType *wgroup);
 
 /* creates a widgetmap with all registered widgets for that type */
 struct wmWidgetMap *WM_widgetmap_from_type(const char *idname, int spaceid, 
int regionid, bool is_3d);
 void WM_widgetmap_delete(struct wmWidgetMap *wmap);
+bool WM_widgetmap_cursor_set(struct wmWidgetMap *wmap, struct wmWindow *win);
 
 void WM_widgetmaptypes_free(void);
 
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 69de4cd..4e89c56 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -656,45 +656,72 @@ static void rect_transform_draw_corners(rctf *r, float 
offsetx, float offsety)
 
 static void rect_transform_draw_interaction(int highlighted, float half_w, 
float half_h, float w, float h)
 {
-       rctf r;
-       
+       float verts[4][2];
+       unsigned short elems[4] = {0, 1, 3, 2};
        
        switch (highlighted) {
                case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT:
-                       r.xmin = -half_w;
-                       r.ymin = -half_h;
-                       r.xmax = -half_w + w;
-                       r.ymax = half_h;
+                       verts[0][0] = -half_w + w;
+                       verts[0][1] = -half_h;
+                       verts[1][0] = -half_w;
+                       verts[1][1] = -half_h;
+                       verts[2][0] = -half_w;
+                       verts[2][1] = half_h;
+                       verts[3][0] = -half_w + w;
+                       verts[3][1] = half_h;
                        break;
                        
                case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT:
-                       r.xmin = half_w - w;
-                       r.ymin = -half_h;
-                       r.xmax = half_w;
-                       r.ymax = half_h;
+                       verts[0][0] = half_w - w;
+                       verts[0][1] = -half_h;
+                       verts[1][0] = half_w;
+                       verts[1][1] = -half_h;
+                       verts[2][0] = half_w;
+                       verts[2][1] = half_h;
+                       verts[3][0] = half_w - w;
+                       verts[3][1] = half_h;
                        break;
                        
                case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN:
-                       r.xmin = -half_w;
-                       r.ymin = -half_h;
-                       r.xmax = half_w;
-                       r.ymax = -half_h + h;
+                       verts[0][0] = -half_w;
+                       verts[0][1] = -half_h + h;
+                       verts[1][0] = -half_w;
+                       verts[1][1] = -half_h;
+                       verts[2][0] = half_w;
+                       verts[2][1] = -half_h;
+                       verts[3][0] = half_w;
+                       verts[3][1] = -half_h + h;
                        break;
                        
                case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_UP:
-                       r.xmin = -half_w;
-                       r.ymin = half_h - h;
-                       r.xmax = half_w;
-                       r.ymax = half_h;
+                       verts[0][0] = -half_w;
+                       verts[0][1] = half_h - h;
+                       verts[1][0] = -half_w;
+                       verts[1][1] = half_h;
+                       verts[2][0] = half_w;
+                       verts[2][1] = half_h;
+                       verts[3][0] = half_w;
+                       verts[3][1] = half_h - h;
                        break;
                        
                default:
                        return;
        }
        
-       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-       glRectf(r.xmin, r.ymin, r.xmax, r.ymax);
-       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glVertexPointer(2, GL_FLOAT, 0, verts);
+       glLineWidth(3.0);
+       glColor3f(0.0, 0.0, 0.0);
+       glDrawArrays(GL_LINE_STRIP, 0, 3);
+       glLineWidth(1.0);
+       glColor3f(1.0, 1.0, 1.0);
+       glDrawArrays(GL_LINE_STRIP, 0, 3);
+       
+       glEnable(GL_BLEND);
+       glColor4f(1.0f, 1.0f, 1.0f, 0.2f);
+       glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, elems);
+       glDisable(GL_BLEND);
+       glDisableClientState(GL_VERTEX_ARRAY);
 }
 
 static void widget_rect_transform_draw(struct wmWidget *widget, const struct 
bContext *UNUSED(C))
@@ -719,7 +746,7 @@ static void widget_rect_transform_draw(struct wmWidget 
*widget, const struct bCo
        else
                glScalef(cage->scale[0], cage->scale[1], 1.0);
        
-       if (widget->flag & WM_WIDGET_HIGHLIGHT) {
+       if (widget->highlighted_part == 
WIDGET_RECT_TRANSFORM_INTERSECT_TRANSLATE) {
                glEnable(GL_BLEND);
                glColor4f(1.0f, 1.0f, 1.0f, 0.2f);
                glRectf(r.xmin, r.ymin, r.xmax, r.ymax);
@@ -749,6 +776,22 @@ static void widget_rect_transform_draw(struct wmWidget 
*widget, const struct bCo
        glPopMatrix();
 }
 
+static int widget_rect_tranfrorm_get_cursor(wmWidget *widget)
+{
+       switch (widget->highlighted_part) {
+               case WIDGET_RECT_TRANSFORM_INTERSECT_TRANSLATE:
+                       return BC_HANDCURSOR;
+               case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT:
+               case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT:
+                       return CURSOR_X_MOVE;
+               case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN:
+               case WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_UP:
+                       return CURSOR_Y_MOVE;
+               default:
+                       return CURSOR_STD;
+       }
+}
+
 static int widget_rect_tranfrorm_intersect(struct bContext *UNUSED(C), const 
struct wmEvent *event, struct wmWidget *widget)
 {
        RectTransformWidget *cage = (RectTransformWidget *)widget;
@@ -1000,6 +1043,7 @@ struct wmWidget *WIDGET_rect_transform_new(struct 
wmWidgetGroup *wgroup, int sty
        cage->widget.bind_to_prop = widget_rect_transform_bind_to_prop;
        cage->widget.handler = widget_rect_transform_handler;
        cage->widget.intersect = widget_rect_tranfrorm_intersect;
+       cage->widget.get_cursor = widget_rect_tranfrorm_get_cursor;
        cage->widget.max_prop = 2;
        cage->scale[0] = cage->scale[1] = 1.0f;
        cage->style = style;
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index 41a47b7..4afeedf 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -100,7 +100,7 @@ static ListBase widgetmaptypes = {NULL, NULL};
 struct wmWidgetGroupType *WM_widgetgrouptype_new(
         int (*poll)(const struct bContext *C, struct wmWidgetGroupType *),
         void (*draw)(const struct bContext *, struct wmWidgetGroup *), 
-        Main *bmain, const char *mapidname, short spaceid, short regionid,bool 
is_3d
+        struct Main *bmain, const char *mapidname, short spaceid, short 
regionid,bool is_3d
         )
 {
        bScreen *sc;
@@ -627,10 +627,22 @@ wmWidget *wm_widget_find_highlighted(struct wmWidgetMap 
*wmap, bContext *C, cons
        return NULL;
 }
 
+bool WM_widgetmap_cursor_set(wmWidgetMap *wmap, wmWindow *win)
+{
+       for (; wmap; wmap = wmap->next) {
+               wmWidget *widget = wmap->highlighted_widget;
+               if (widget && widget->get_cursor) {
+                       WM_cursor_set(win, widget->get_cursor(widget));
+                       return 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to