Commit: 80a7c57e5e8d4ea9bec6597a49a1e606875e5d7b
Author: Campbell Barton
Date:   Fri Nov 9 17:05:32 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB80a7c57e5e8d4ea9bec6597a49a1e606875e5d7b

Tool System: add grease pencil primitive tool

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

M       release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M       release/scripts/startup/bl_ui/space_topbar.py
M       source/blender/editors/gpencil/gpencil_ops.c
M       source/blender/editors/gpencil/gpencil_primitive.c

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py 
b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 8ea25a99d6c..1664a6067b9 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1215,6 +1215,45 @@ class _defs_gpencil_paint:
             ),
         )
 
+    @ToolDef.from_fn
+    def line():
+        return dict(
+            text="Line",
+            icon="ops.gpencil.primitive_line",
+            widget=None,
+            keymap=(
+                ("gpencil.primitive",
+                 dict(type='LINE', wait_for_input=False),
+                 dict(type='EVT_TWEAK_A', value='ANY')),
+            ),
+        )
+
+    @ToolDef.from_fn
+    def box():
+        return dict(
+            text="Box",
+            icon="ops.gpencil.primitive_box",
+            widget=None,
+            keymap=(
+                ("gpencil.primitive",
+                 dict(type='BOX', wait_for_input=False),
+                 dict(type='EVT_TWEAK_A', value='ANY')),
+            ),
+        )
+
+    @ToolDef.from_fn
+    def circle():
+        return dict(
+            text="Circle",
+            icon="ops.gpencil.primitive_circle",
+            widget=None,
+            keymap=(
+                ("gpencil.primitive",
+                 dict(type='CIRCLE', wait_for_input=False),
+                 dict(type='EVT_TWEAK_A', value='ANY')),
+            ),
+        )
+
 
 class _defs_gpencil_edit:
     @ToolDef.from_fn
@@ -1804,7 +1843,13 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, 
Panel):
             _defs_weight_paint.gradient,
         ],
         'GPENCIL_PAINT': [
+            _defs_view3d_generic.cursor,
+            None,
             _defs_gpencil_paint.generate_from_brushes,
+            None,
+            _defs_gpencil_paint.line,
+            _defs_gpencil_paint.box,
+            _defs_gpencil_paint.circle,
         ],
         'GPENCIL_EDIT': [
             _defs_view3d_generic.cursor,
diff --git a/release/scripts/startup/bl_ui/space_topbar.py 
b/release/scripts/startup/bl_ui/space_topbar.py
index f343dae4076..c6eb047558a 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -146,7 +146,8 @@ class TOPBAR_HT_lower_bar(Header):
                 #     layout.popover_group(space_type='PROPERTIES', 
region_type='WINDOW', context=".paint_common", category="")
                 pass
             elif tool_mode == 'GPENCIL_PAINT':
-                layout.popover_group(space_type='PROPERTIES', 
region_type='WINDOW', context=".greasepencil_paint", category="")
+                if (tool is not None) and tool.has_datablock:
+                    layout.popover_group(space_type='PROPERTIES', 
region_type='WINDOW', context=".greasepencil_paint", category="")
             elif tool_mode == 'GPENCIL_SCULPT':
                 layout.popover_group(space_type='PROPERTIES', 
region_type='WINDOW', context=".greasepencil_sculpt", category="")
             elif tool_mode == 'GPENCIL_WEIGHT':
diff --git a/source/blender/editors/gpencil/gpencil_ops.c 
b/source/blender/editors/gpencil/gpencil_ops.c
index c2e078ff600..a343d9d680d 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -46,6 +46,7 @@
 
 #include "WM_api.h"
 #include "WM_types.h"
+#include "WM_toolsystem.h"
 
 #include "RNA_access.h"
 
@@ -91,7 +92,8 @@ static bool gp_stroke_paintmode_draw_poll(bContext *C)
        Brush *brush = BKE_brush_getactive_gpencil(ts);
        return ((gpd) && (gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
                (brush && brush->gpencil_settings) &&
-               (brush->gpencil_tool == GPAINT_TOOL_DRAW));
+               (brush->gpencil_tool == GPAINT_TOOL_DRAW) &&
+               WM_toolsystem_active_tool_is_brush(C));
 }
 
 /* Poll callback for stroke painting (erase brush) */
@@ -103,7 +105,8 @@ static bool gp_stroke_paintmode_erase_poll(bContext *C)
        Brush *brush = BKE_brush_getactive_gpencil(ts);
        return ((gpd) && (gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
                (brush && brush->gpencil_settings) &&
-               (brush->gpencil_tool == GPAINT_TOOL_ERASE));
+               (brush->gpencil_tool == GPAINT_TOOL_ERASE) &&
+               WM_toolsystem_active_tool_is_brush(C));
 }
 
 /* Poll callback for stroke painting (fill) */
@@ -115,7 +118,8 @@ static bool gp_stroke_paintmode_fill_poll(bContext *C)
        Brush *brush = BKE_brush_getactive_gpencil(ts);
        return ((gpd) && (gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
                (brush && brush->gpencil_settings) &&
-               (brush->gpencil_tool == GPAINT_TOOL_FILL));
+               (brush->gpencil_tool == GPAINT_TOOL_FILL) &&
+               WM_toolsystem_active_tool_is_brush(C));
 }
 
 /* Poll callback for stroke sculpting mode */
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c 
b/source/blender/editors/gpencil/gpencil_primitive.c
index 0e15e9f0a4e..752e0dc6857 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -411,6 +411,15 @@ static void gpencil_primitive_update(bContext *C, 
wmOperator *op, tGPDprimitive
 
 /* ----------------------- */
 
+static void gpencil_primitive_interaction_begin(tGPDprimitive *tgpi, const 
wmEvent *event)
+{
+       tgpi->top[0] = event->mval[0];
+       tgpi->top[1] = event->mval[1];
+
+       tgpi->bottom[0] = event->mval[0];
+       tgpi->bottom[1] = event->mval[1];
+}
+
 /* Exit and free memory */
 static void gpencil_primitive_exit(bContext *C, wmOperator *op)
 {
@@ -498,7 +507,7 @@ static void gpencil_primitive_init(bContext *C, wmOperator 
*op)
 /* ----------------------- */
 
 /* Invoke handler: Initialize the operator */
-static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent 
*UNUSED(event))
+static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
        wmWindow *win = CTX_wm_window(C);
        bGPdata *gpd = CTX_data_gpencil_data(C);
@@ -508,6 +517,12 @@ static int gpencil_primitive_invoke(bContext *C, 
wmOperator *op, const wmEvent *
        gpencil_primitive_init(C, op);
        tgpi = op->customdata;
 
+       const bool is_modal = RNA_boolean_get(op->ptr, "wait_for_input");
+       if (!is_modal) {
+               tgpi->flag = IN_PROGRESS;
+               gpencil_primitive_interaction_begin(tgpi, event);
+       }
+
        /* if in tools region, wait till we get to the main (3d-space)
         * region before allowing drawing to take place.
         */
@@ -531,7 +546,7 @@ static int gpencil_primitive_invoke(bContext *C, wmOperator 
*op, const wmEvent *
 }
 
 /* Helper to complete a primitive */
-static void gpencil_primitive_done(bContext *C, wmOperator *op, wmWindow *win, 
tGPDprimitive *tgpi)
+static void gpencil_primitive_interaction_end(bContext *C, wmOperator *op, 
wmWindow *win, tGPDprimitive *tgpi)
 {
        bGPDframe *gpf;
        bGPDstroke *gps;
@@ -589,17 +604,12 @@ static int gpencil_primitive_modal(bContext *C, 
wmOperator *op, const wmEvent *e
                                /* start drawing primitive */
                                /* TODO: Ignore if not in main region yet */
                                tgpi->flag = IN_PROGRESS;
-
-                               tgpi->top[0] = event->mval[0];
-                               tgpi->top[1] = event->mval[1];
-
-                               tgpi->bottom[0] = event->mval[0];
-                               tgpi->bottom[1] = event->mval[1];
+                               gpencil_primitive_interaction_begin(tgpi, 
event);
                        }
                        else if ((event->val == KM_RELEASE) && (tgpi->flag == 
IN_PROGRESS)) {
                                /* stop drawing primitive */
                                tgpi->flag = IDLE;
-                               gpencil_primitive_done(C, op, win, tgpi);
+                               gpencil_primitive_interaction_end(C, op, win, 
tgpi);
                                /* done! */
                                return OPERATOR_FINISHED;
                        }
@@ -612,7 +622,7 @@ static int gpencil_primitive_modal(bContext *C, wmOperator 
*op, const wmEvent *e
                case RETKEY:  /* confirm */
                {
                        tgpi->flag = IDLE;
-                       gpencil_primitive_done(C, op, win, tgpi);
+                       gpencil_primitive_interaction_end(C, op, win, tgpi);
                        /* done! */
                        return OPERATOR_FINISHED;
                }
@@ -735,8 +745,13 @@ void GPENCIL_OT_primitive(wmOperatorType *ot)
        ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING;
 
        /* properties */
+       PropertyRNA *prop;
+
        RNA_def_int(ot->srna, "edges", 4, MIN_EDGES, MAX_EDGES, "Edges", 
"Number of polygon edges", MIN_EDGES, MAX_EDGES);
        RNA_def_enum(ot->srna, "type", primitive_type, GP_STROKE_BOX, "Type", 
"Type of shape");
+
+       prop = RNA_def_boolean(ot->srna, "wait_for_input", true, "Wait for 
Input", "");
+       RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
 }
 
 /* *************************************************************** */

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

Reply via email to