[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34236] trunk/blender: Todo #22395: Restoring Grease Pencil Editing Mode in DopeSheet Editor

Joshua Leung aligorith at gmail.com
Mon Jan 10 23:10:29 CET 2011


Revision: 34236
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34236
Author:   aligorith
Date:     2011-01-10 22:10:28 +0000 (Mon, 10 Jan 2011)
Log Message:
-----------
Todo #22395: Restoring Grease Pencil Editing Mode in DopeSheet Editor

This commit restores some basic functionality for retiming Grease
Pencil sketches. Some of the functionality that existed before still
hasn't been restored (namely snap/mirror tools as well as copy+paste),
though it should be possible to use this for basic retiming and
sketch-frame management again.

- There's still a lot of work required to get this up to the standard
of the rest of the animation editor code, as some of this code was
originally just hacked in based on the old-style code.
- Work is already required to not have to directly access the main db
global to get the list of Grease Pencil datablocks to show, but that
can come along with pending cleanups of the filtering code.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_dopesheet.py
    trunk/blender/source/blender/editors/animation/anim_channels_defines.c
    trunk/blender/source/blender/editors/animation/anim_channels_edit.c
    trunk/blender/source/blender/editors/animation/anim_filter.c
    trunk/blender/source/blender/editors/animation/keyframes_draw.c
    trunk/blender/source/blender/editors/gpencil/editaction_gpencil.c
    trunk/blender/source/blender/editors/include/ED_gpencil.h
    trunk/blender/source/blender/editors/space_action/SConscript
    trunk/blender/source/blender/editors/space_action/action_edit.c
    trunk/blender/source/blender/editors/space_action/action_select.c
    trunk/blender/source/blender/editors/space_action/space_action.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/makesrna/intern/rna_space.c

Modified: trunk/blender/release/scripts/ui/space_dopesheet.py
===================================================================
--- trunk/blender/release/scripts/ui/space_dopesheet.py	2011-01-10 21:30:14 UTC (rev 34235)
+++ trunk/blender/release/scripts/ui/space_dopesheet.py	2011-01-10 22:10:28 UTC (rev 34236)
@@ -20,6 +20,8 @@
 
 import bpy
 
+#######################################
+# DopeSheet Filtering
 
 # used for DopeSheet, NLA, and Graph Editors
 def dopesheet_filter(layout, context):
@@ -70,6 +72,8 @@
         if dopesheet.show_only_group_objects:
             row.prop(dopesheet, "filter_group", text="")
 
+#######################################
+# DopeSheet Editor - General/Standard UI
 
 class DOPESHEET_HT_header(bpy.types.Header):
     bl_space_type = 'DOPESHEET_EDITOR'
@@ -92,11 +96,12 @@
             if st.mode == 'DOPESHEET' or (st.mode == 'ACTION' and st.action != None):
                 sub.menu("DOPESHEET_MT_channel")
             elif st.mode == 'GPENCIL':
-                # gpencil Channel menu
-                pass
+                sub.menu("DOPESHEET_MT_gpencil_channel")
 
             if st.mode != 'GPENCIL':
                 sub.menu("DOPESHEET_MT_key")
+            else:
+                sub.menu("DOPESHEET_MT_gpencil_frame")
 
         layout.prop(st, "mode", text="")
         layout.prop(st.dopesheet, "show_summary", text="Summary")
@@ -106,7 +111,8 @@
 
         elif st.mode in ('ACTION', 'SHAPEKEY'):
             layout.template_ID(st, "action", new="action.new")
-
+        
+        # Grease Pencil mode doesn't need snapping, as it's frame-aligned only
         if st.mode != 'GPENCIL':
             layout.prop(st, "auto_snap", text="")
 
@@ -171,14 +177,16 @@
 
         layout.operator("action.select_column", text="Columns on Selected Markers").mode = 'MARKERS_COLUMN'
         layout.operator("action.select_column", text="Between Selected Markers").mode = 'MARKERS_BETWEEN'
+        
+        # FIXME: grease pencil mode isn't supported for these yet, so skip for that mode only
+        if context.space_data.mode != 'GPENCIL':
+            layout.separator()
+            layout.operator("action.select_more")
+            layout.operator("action.select_less")
 
-        layout.separator()
-        layout.operator("action.select_more")
-        layout.operator("action.select_less")
+            layout.separator()
+            layout.operator("action.select_linked")
 
-        layout.separator()
-        layout.operator("action.select_linked")
-
 class DOPESHEET_MT_marker(bpy.types.Menu):
     bl_label = "Marker"
     
@@ -203,6 +211,9 @@
             layout.separator()
             layout.prop(st, "show_pose_markers")
 
+#######################################
+# Keyframe Editing
+
 class DOPESHEET_MT_channel(bpy.types.Menu):
     bl_label = "Channel"
 
@@ -266,7 +277,6 @@
         layout.operator("action.copy")
         layout.operator("action.paste")
 
-
 class DOPESHEET_MT_key_transform(bpy.types.Menu):
     bl_label = "Transform"
 
@@ -279,7 +289,57 @@
         layout.operator("transform.transform", text="Slide").mode = 'TIME_SLIDE'
         layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE'
 
+#######################################
+# Grease Pencil Editing
 
+class DOPESHEET_MT_gpencil_channel(bpy.types.Menu):
+    bl_label = "Channel"
+    
+    def draw(self, context):
+        layout = self.layout
+
+        layout.operator_context = 'INVOKE_REGION_CHANNELS'
+
+        layout.column()
+        layout.operator("anim.channels_delete")
+
+        layout.separator()
+        layout.operator("anim.channels_setting_toggle")
+        layout.operator("anim.channels_setting_enable")
+        layout.operator("anim.channels_setting_disable")
+
+        layout.separator()
+        layout.operator("anim.channels_editable_toggle")
+        
+        # XXX: to be enabled when these are ready for use!
+        #layout.separator()
+        #layout.operator("anim.channels_expand")
+        #layout.operator("anim.channels_collapse")
+
+        #layout.separator()
+        #layout.operator_menu_enum("anim.channels_move", "direction", text="Move...")
+
+class DOPESHEET_MT_gpencil_frame(bpy.types.Menu):
+    bl_label = "Frame"
+
+    def draw(self, context):
+        layout = self.layout
+
+        layout.column()
+        layout.menu("DOPESHEET_MT_key_transform", text="Transform")
+
+        #layout.operator_menu_enum("action.snap", "type", text="Snap")
+        #layout.operator_menu_enum("action.mirror", "type", text="Mirror")
+
+        layout.separator()
+        layout.operator("action.duplicate")
+        layout.operator("action.delete")
+
+        #layout.separator()
+        #layout.operator("action.copy")
+        #layout.operator("action.paste")
+        
+
 def register():
     pass
 

Modified: trunk/blender/source/blender/editors/animation/anim_channels_defines.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2011-01-10 21:30:14 UTC (rev 34235)
+++ trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2011-01-10 22:10:28 UTC (rev 34236)
@@ -49,6 +49,7 @@
 #include "DNA_meta_types.h"
 #include "DNA_node_types.h"
 #include "DNA_world_types.h"
+#include "DNA_gpencil_types.h"
 
 #include "RNA_access.h"
 
@@ -2404,127 +2405,160 @@
 	acf_shapekey_setting_ptr		/* pointer for setting */
 };
 
-/* Grease Pencil entries  ------------------------------------------- */
-// XXX ... this is currently not restored yet
+/* GPencil Datablock ------------------------------------------- */
 
-#if 0
-static void dummy_olddraw_gpencil ()
+/* get backdrop color for gpencil datablock widget */
+static void acf_gpd_color(bAnimContext *UNUSED(ac), bAnimListElem *ale, float *color)
 {
-	/* determine what needs to be drawn */
-	switch (ale->type) {
-		case ANIMTYPE_GPDATABLOCK: /* gpencil datablock */
-		{
-			bGPdata *gpd = (bGPdata *)ale->data;
-			ScrArea *sa = (ScrArea *)ale->owner; // XXX depreceated...
+	/* highlight only for datablock channels */
+	//if (ale->flag & AGRP_ACTIVE)
+	//	UI_GetThemeColorShade3fv(TH_GROUP_ACTIVE, 10, color);
+	//else
+		UI_GetThemeColorShade3fv(TH_GROUP, 20, color);
+}
+
+// TODO: just get this from RNA?
+static int acf_gpd_icon(bAnimListElem *UNUSED(ale))
+{
+	return ICON_GREASEPENCIL;
+}
+
+/* check if some setting exists for this channel */
+static short acf_gpd_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
+{
+	switch (setting) {
+		/* only select and expand supported */
+		case ACHANNEL_SETTING_SELECT:
+		case ACHANNEL_SETTING_EXPAND:
+			return 1;
 			
-			indent = 0;
-			group= 3;
+		default:
+			return 0;
+	}
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_gpd_setting_flag(bAnimContext *ac, int setting, short *neg)
+{
+	/* clear extra return data first */
+	*neg= 0;
+	
+	switch (setting) {
+		case ACHANNEL_SETTING_SELECT: /* selected */
+			return AGRP_SELECTED;
 			
-			/* only show expand if there are any channels */
-			if (gpd->layers.first) {
-				if (gpd->flag & GP_DATA_EXPAND)
-					expand = ICON_TRIA_DOWN;
-				else
-					expand = ICON_TRIA_RIGHT;
-			}
+		case ACHANNEL_SETTING_EXPAND: /* expanded */
+			return GP_DATA_EXPAND;
+	}
+	
+	/* this shouldn't happen */
+	return 0;
+}
+
+/* get pointer to the setting */
+static void *acf_gpd_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+	bGPdata *gpd= (bGPdata *)ale->data;
+	
+	/* all flags are just in gpd->flag for now... */
+	GET_ACF_FLAG_PTR(gpd->flag);
+}
+
+/* gpencil datablock type define */
+static bAnimChannelType ACF_GPD = 
+{
+	"GPencil Datablock",			/* type name */
+	
+	acf_gpd_color,					/* backdrop color */
+	acf_group_backdrop,				/* backdrop */
+	acf_generic_indention_0,		/* indent level */
+	acf_generic_group_offset,		/* offset */
+	
+	acf_generic_idblock_name,		/* name */
+	NULL,							/* icon */
+	
+	acf_gpd_setting_valid,			/* has setting */
+	acf_gpd_setting_flag,			/* flag for setting */
+	acf_gpd_setting_ptr				/* pointer for setting */
+};
+
+/* GPencil Layer ------------------------------------------- */
+
+/* name for grase pencil layer entries */
+static void acf_gpl_name(bAnimListElem *ale, char *name)
+{
+	bGPDlayer *gpl = (bGPDlayer *)ale->data;
+	
+	if (gpl && name)
+		sprintf(name, gpl->info);
+}
+
+/* check if some setting exists for this channel */
+static short acf_gpl_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+	bGPDlayer *gpl = (bGPDlayer *)ale->data;
+	
+	switch (setting) {
+		/* unsupported */
+		case ACHANNEL_SETTING_EXPAND: /* gpencil layers are more like F-Curves than groups */
+		case ACHANNEL_SETTING_VISIBLE: /* graph editor only */
+			return 0;
+		
+		/* always available */
+		default:
+			return 1;
+	}
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_gpl_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+	/* clear extra return data first */
+	*neg= 0;
+	
+	switch (setting) {
+		case ACHANNEL_SETTING_SELECT: /* selected */
+			return GP_LAYER_SELECT;
 			
-			switch (sa->spacetype) {
-				case SPACE_VIEW3D:
-				{
-					/* this shouldn't cause any overflow... */
-					//sprintf(name, "View3D:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func..
-					strcpy(name, "View3D");
-					special= ICON_VIEW3D;
-				}
-					break;
-				case SPACE_NODE:
-				{
-					SpaceNode *snode= sa->spacedata.first;
-					char treetype[12];
-					
-					if (snode->treetype == 1)
-						strcpy(treetype, "Composite");
-					else
-						strcpy(treetype, "Material");
-					sprintf(name, "Nodes:%s", treetype);
-					
-					special= ICON_NODETREE;
-				}
-					break;
-				case SPACE_SEQ:
-				{
-					SpaceSeq *sseq= sa->spacedata.first;
-					char imgpreview[10];
-					
-					switch (sseq->mainb) {
-						case 1: 	sprintf(imgpreview, "Image..."); 	break;
-						case 2: 	sprintf(imgpreview, "Luma..."); 	break;
-						case 3: 	sprintf(imgpreview, "Chroma...");	break;
-						case 4: 	sprintf(imgpreview, "Histogram");	break;
-						
-						default:	sprintf(imgpreview, "Sequence");	break;
-					}
-					sprintf(name, "Sequencer:%s", imgpreview);
-					
-					special= ICON_SEQUENCE;
-				}
-					break;
-				case SPACE_IMAGE:
-				{
-					SpaceImage *sima= sa->spacedata.first;
-					
-					if (sima->image)
-						sprintf(name, "Image:%s", sima->image->id.name+2);
-					else
-						strcpy(name, "Image:<None>");
-						
-					special= ICON_IMAGE_COL;
-				}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list