svn merge -r39781:39792 https://svn.blender.org/svnroot/bf-blender/trunk/blender...
[blender-staging.git] / source / blender / editors / gpencil / editaction_gpencil.c
index 79057b95fd1960aa7c8e88502bc6bf0c459c6d64..937d24eed04613e2fb8f48be46736f5b66bd8380 100644 (file)
@@ -1,6 +1,4 @@
-/**
- * $Id$
- *
+/*
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -15,7 +13,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2008, Blender Foundation
  * This is a new part of Blender
  *
  * ***** END GPL LICENSE BLOCK *****
  */
+
+/** \file blender/editors/gpencil/editaction_gpencil.c
+ *  \ingroup edgpencil
+ */
+
  
 #include <stdio.h>
 #include <string.h>
 
 #include "MEM_guardedalloc.h"
 
-#include "BMF_Api.h"
-
-#include "BLI_arithb.h"
 #include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
 
-#include "DNA_listBase.h"
-#include "DNA_action_types.h"
 #include "DNA_gpencil_types.h"
 #include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_space_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_view3d_types.h"
 
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
-#include "BKE_blender.h"
-#include "BKE_ipo.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "PIL_time.h"
+#include "BKE_fcurve.h"
+#include "BKE_gpencil.h"
 
 #include "ED_anim_api.h"
-#include "ED_keyframes_edit.h"
-#include "ED_keyframes_draw.h"
 #include "ED_gpencil.h"
-#include "ED_util.h"
-#include "ED_types.h"
+#include "ED_keyframes_edit.h"
 
 #include "gpencil_intern.h"
 
-/* XXX */
-static void actdata_filter() {}
-static void BIF_undo_push() {}
-static void error() {}
-static void *get_action_context() {return NULL;}
-static int find_nearest_marker_time() {return 1;}
-/* XXX */
-
-
 /* ***************************************** */
 /* NOTE ABOUT THIS FILE:
  *     This file contains code for editing Grease Pencil data in the Action Editor
@@ -155,6 +132,9 @@ short is_gplayer_frame_selected (bGPDlayer *gpl)
 /* helper function - select gp-frame based on SELECT_* mode */
 static void gpframe_select (bGPDframe *gpf, short select_mode)
 {
+       if (gpf == NULL)
+               return;
+       
        switch (select_mode) {
                case SELECT_ADD:
                        gpf->flag |= GP_FRAME_SELECT;
@@ -189,31 +169,19 @@ void set_gplayer_frame_selection (bGPDlayer *gpl, short mode)
        /* error checking */
        if (gpl == NULL) 
                return;
-               
-       /* convert mode to select_mode */
-       switch (mode) {
-               case 2:
-                       mode= SELECT_INVERT;
-                       break;
-               case 1:
-                       mode= SELECT_ADD;
-                       break;
-               case 0:
-                       mode= SELECT_SUBTRACT;
-                       break;
-               default:
-                       return;
-       }
        
        /* now call the standard function */
-       select_gpencil_frames (gpl, mode);
+       select_gpencil_frames(gpl, mode);
 }
 
 /* select the frame in this layer that occurs on this frame (there should only be one at most) */
 void select_gpencil_frame (bGPDlayer *gpl, int selx, short select_mode)
 {
        bGPDframe *gpf;
-   
+       
+       if (gpl == NULL) 
+               return;
+       
        /* search through frames for a match */
        for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
                /* there should only be one frame with this frame-number */
@@ -229,6 +197,9 @@ void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short se
 {
        bGPDframe *gpf;
        
+       if (gpl == NULL)
+               return;
+       
        /* only select those frames which are in bounds */
        for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
                if (IN_RANGE(gpf->framenum, min, max))
@@ -236,91 +207,9 @@ void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short se
        }
 }
 
-
-/* De-selects or inverts the selection of Layers for a grease-pencil block
- *     mode: 0 = default behaviour (select all), 1 = test if (de)select all, 2 = invert all 
- */
-void deselect_gpencil_layers (void *data, short mode)
-{
-       ListBase act_data = {NULL, NULL};
-       bActListElem *ale;
-       int filter, sel=1;
-       
-       /* filter data */
-       filter= ACTFILTER_VISIBLE;
-       actdata_filter(&act_data, filter, data, ACTCONT_GPENCIL);
-       
-       /* See if we should be selecting or deselecting */
-       if (mode == 1) {
-               for (ale= act_data.first; ale; ale= ale->next) {
-                       if (sel == 0) 
-                               break;
-                       
-                       if (ale->flag & GP_LAYER_SELECT)
-                               sel= 0;
-               }
-       }
-       else
-               sel= 0;
-               
-       /* Now set the flags */
-       for (ale= act_data.first; ale; ale= ale->next) {
-               bGPDlayer *gpl= (bGPDlayer *)ale->data;
-               
-               if (mode == 2)
-                       gpl->flag ^= GP_LAYER_SELECT;
-               else if (sel)
-                       gpl->flag |= GP_LAYER_SELECT;
-               else
-                       gpl->flag &= ~GP_LAYER_SELECT;
-                       
-               gpl->flag &= ~GP_LAYER_ACTIVE;
-       }
-       
-       /* Cleanup */
-       BLI_freelistN(&act_data);
-}
-
 /* ***************************************** */
 /* Frame Editing Tools */
 
-/* Delete selected grease-pencil layers */
-void delete_gpencil_layers (void)
-{
-       ListBase act_data = {NULL, NULL};
-       bActListElem *ale, *next;
-       void *data;
-       short datatype;
-       int filter;
-       
-       /* determine what type of data we are operating on */
-       data = get_action_context(&datatype);
-       if (data == NULL) return;
-       if (datatype != ACTCONT_GPENCIL) return;
-       
-       /* filter data */
-       filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_CHANNELS | ACTFILTER_SEL);
-       actdata_filter(&act_data, filter, data, datatype);
-       
-       /* clean up grease-pencil layers */
-       for (ale= act_data.first; ale; ale= next) {
-               bGPdata *gpd= (bGPdata *)ale->owner;
-               bGPDlayer *gpl= (bGPDlayer *)ale->data;
-               next= ale->next;
-               
-               /* free layer and its data */
-               if (SEL_GPL(gpl)) {
-                       free_gpencil_frames(gpl);
-                       BLI_freelinkN(&gpd->layers, gpl);
-               }
-               
-               /* free temp memory */
-               BLI_freelinkN(&act_data, ale);
-       }
-       
-       BIF_undo_push("Delete GPencil Layers");
-}
-
 /* Delete selected frames */
 void delete_gplayer_frames (bGPDlayer *gpl)
 {
@@ -365,6 +254,7 @@ void duplicate_gplayer_frames (bGPDlayer *gpl)
        }
 }
 
+#if 0 // XXX disabled until grease pencil code stabilises again
 /* -------------------------------------- */
 /* Copy and Paste Tools */
 /* - The copy/paste buffer currently stores a set of GP_Layers, with temporary
@@ -506,7 +396,8 @@ void paste_gpdata (Scene *scene)
                                ScrArea *sa;
                                
                                /* get area that gp-data comes from */
-                               sa= gpencil_data_findowner((bGPdata *)ale->owner);                              
+                               //sa= gpencil_data_findowner((bGPdata *)ale->owner);    
+                               sa = NULL;
                                
                                /* this should be the right frame... as it may be a pre-existing frame, 
                                 * must make sure that only compatible stroke types get copied over 
@@ -600,7 +491,7 @@ static short snap_gpf_cframe (bGPDframe *gpf, Scene *scene)
 static short snap_gpf_nearmarker (bGPDframe *gpf, Scene *scene)
 {
        if (gpf->flag & GP_FRAME_SELECT)
-               gpf->framenum= (int)find_nearest_marker_time((float)gpf->framenum);
+               gpf->framenum= (int)find_nearest_marker_time(&scene->markers, (float)gpf->framenum);
        return 0;
 }
 
@@ -696,15 +587,10 @@ static short mirror_gpf_marker (bGPDframe *gpf, Scene *scene)
                }
                else {
                        /* try to find a marker */
-                       for (marker= scene->markers.first; marker; marker=marker->next) {
-                               if (marker->flag & SELECT) {
-                                       initialised = 1;
-                                       break;
-                               }
+                       marker= ED_markers_get_first_selected(&scene->markers);
+                       if(marker) {
+                               initialised= 1;
                        }
-                       
-                       if (initialised == 0) 
-                               marker = NULL;
                }
        }
        
@@ -737,3 +623,4 @@ void mirror_gplayer_frames (bGPDlayer *gpl, Scene *scene, short mode)
 }
 
 /* ***************************************** */
+#endif // XXX disabled until Grease Pencil code stabilises again...