Revision: 20516
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20516
Author:   aligorith
Date:     2009-05-30 12:41:41 +0200 (Sat, 30 May 2009)

Log Message:
-----------
NLA SoC: More UI work + 'Push down' tool 

'UI Work'
* Added more drawing code for drawing NLA data 
* Made the operators for the 'channel-list' of NLA work. A special version of 
borderselect for the NLA channel-list (due to the different vertical order) 
still needs to be coded though.

'Push Down' tool
The active action of each AnimData block, represented by the reddy/orange 
channel, can be added to the NLA stack as a new action by using the 
'snow-flake' icon/button (probably need a special icon for this later). This 
will add a new NLA track and an NLA strip referencing this action. The AnimData 
block's 'active action' slot will then be left empty.

(Unfortunately, there still seems to be a bug here, which I'll check on later)

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/editors/animation/anim_channels.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_draw.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_edit.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_intern.h
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_ops.c
    branches/soc-2009-aligorith/source/blender/editors/space_nla/space_nla.c

Added Paths:
-----------
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_channels.c

Modified: 
branches/soc-2009-aligorith/source/blender/editors/animation/anim_channels.c
===================================================================
--- 
branches/soc-2009-aligorith/source/blender/editors/animation/anim_channels.c    
    2009-05-30 07:26:45 UTC (rev 20515)
+++ 
branches/soc-2009-aligorith/source/blender/editors/animation/anim_channels.c    
    2009-05-30 10:41:41 UTC (rev 20516)
@@ -217,6 +217,10 @@
                                        if (ale->flag & FCURVE_SELECTED)
                                                sel= ACHANNEL_SETFLAG_CLEAR;
                                        break;
+                               case ANIMTYPE_NLATRACK:
+                                       if (ale->flag & NLATRACK_SELECTED)
+                                               sel= ACHANNEL_SETFLAG_CLEAR;
+                                       break;
                        }
                }
        }
@@ -263,6 +267,14 @@
                                fcu->flag &= ~FCURVE_ACTIVE;
                        }
                                break;
+                       case ANIMTYPE_NLATRACK:
+                       {
+                               NlaTrack *nlt= (NlaTrack *)ale->data;
+                               
+                               ACHANNEL_SET_FLAG(nlt, sel, NLATRACK_SELECTED);
+                               nlt->flag &= ~NLATRACK_ACTIVE;
+                       }
+                               break;
                }
        }
        

Added: 
branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_channels.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_channels.c 
                        (rev 0)
+++ branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_channels.c 
2009-05-30 10:41:41 UTC (rev 20516)
@@ -0,0 +1,336 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Joshua Leung (major recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
+#include "BKE_context.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframes_edit.h"
+#include "ED_markers.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_interface_icons.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "nla_intern.h"        // own include
+
+/* *********************************************** */
+/* Operators for NLA channels-list which need to be different from the 
standard Animation Editor ones */
+
+// TODO: implemented borderselect too, since that also relies on ranges of 
buttons
+
+/* ******************** Mouse-Click Operator *********************** */
+/* Depending on the channel that was clicked on, the mouse click will activate 
whichever
+ * part of the channel is relevant.
+ *
+ * NOTE: eventually, this should probably be phased out when many of these 
things are replaced with buttons
+ */
+
+static void mouse_nla_channels (bAnimContext *ac, float x, int channel_index, 
short selectmode)
+{
+       ListBase anim_data = {NULL, NULL};
+       bAnimListElem *ale;
+       int filter;
+       
+       /* get the channel that was clicked on */
+               /* filter channels */
+       filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
+       filter= ANIM_animdata_filter(ac, &anim_data, filter, ac->data, 
ac->datatype);
+       
+               /* get channel from index */
+       ale= BLI_findlink(&anim_data, channel_index);
+       if (ale == NULL) {
+               /* channel not found */
+               printf("Error: animation channel (index = %d) not found in 
mouse_anim_channels() \n", channel_index);
+               
+               BLI_freelistN(&anim_data);
+               return;
+       }
+       
+       /* action to take depends on what channel we've got */
+       switch (ale->type) {
+               case ANIMTYPE_SCENE:
+               {
+                       Scene *sce= (Scene *)ale->data;
+                       
+                       if (x < 16) {
+                               /* toggle expand */
+                               sce->flag ^= SCE_DS_COLLAPSED;
+                       }
+                       else {
+                               /* set selection status */
+                               if (selectmode == SELECT_INVERT) {
+                                       /* swap select */
+                                       sce->flag ^= SCE_DS_SELECTED;
+                               }
+                               else {
+                                       sce->flag |= SCE_DS_SELECTED;
+                               }
+                       }
+               }
+                       break;
+               case ANIMTYPE_OBJECT:
+               {
+                       bDopeSheet *ads= (bDopeSheet *)ac->data;
+                       Scene *sce= (Scene *)ads->source;
+                       Base *base= (Base *)ale->data;
+                       Object *ob= base->object;
+                       
+                       if (x < 16) {
+                               /* toggle expand */
+                               ob->nlaflag ^= OB_ADS_COLLAPSED; // XXX 
+                       }
+                       else {
+                               /* set selection status */
+                               if (selectmode == SELECT_INVERT) {
+                                       /* swap select */
+                                       base->flag ^= SELECT;
+                                       ob->flag= base->flag;
+                               }
+                               else {
+                                       Base *b;
+                                       
+                                       /* deleselect all */
+                                       for (b= sce->base.first; b; b= b->next) 
{
+                                               b->flag &= ~SELECT;
+                                               b->object->flag= b->flag;
+                                       }
+                                       
+                                       /* select object now */
+                                       base->flag |= SELECT;
+                                       ob->flag |= SELECT;
+                               }
+                               
+                               /* xxx should be ED_base_object_activate(), but 
we need context pointer for that... */
+                               //set_active_base(base);
+                       }
+               }
+                       break;
+               case ANIMTYPE_FILLMATD:
+               {
+                       Object *ob= (Object *)ale->data;
+                       ob->nlaflag ^= OB_ADS_SHOWMATS; // XXX 
+               }
+                       break;
+                               
+               case ANIMTYPE_DSMAT:
+               {
+                       Material *ma= (Material *)ale->data;
+                       ma->flag ^= MA_DS_EXPAND;
+               }
+                       break;
+               case ANIMTYPE_DSLAM:
+               {
+                       Lamp *la= (Lamp *)ale->data;
+                       la->flag ^= LA_DS_EXPAND;
+               }
+                       break;
+               case ANIMTYPE_DSCAM:
+               {
+                       Camera *ca= (Camera *)ale->data;
+                       ca->flag ^= CAM_DS_EXPAND;
+               }
+                       break;
+               case ANIMTYPE_DSCUR:
+               {
+                       Curve *cu= (Curve *)ale->data;
+                       cu->flag ^= CU_DS_EXPAND;
+               }
+                       break;
+               case ANIMTYPE_DSSKEY:
+               {
+                       Key *key= (Key *)ale->data;
+                       key->flag ^= KEYBLOCK_DS_EXPAND;
+               }
+                       break;
+               case ANIMTYPE_DSWOR:
+               {
+                       World *wo= (World *)ale->data;
+                       wo->flag ^= WO_DS_EXPAND;
+               }
+                       break;
+                       
+               case ANIMTYPE_NLATRACK:
+               {
+                       NlaTrack *nlt= (NlaTrack *)ale->data;
+                       
+                       if (x >= 
(NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) {
+                               /* toggle protection (only if there's a toggle 
there) */
+                               nlt->flag ^= NLATRACK_PROTECTED;
+                       }
+                       else if (x >= 
(NLACHANNEL_NAMEWIDTH-2*NLACHANNEL_BUTTON_WIDTH)) {
+                               /* toggle mute */
+                               nlt->flag ^= NLATRACK_MUTED;
+                       }
+                       else {
+                               /* set selection */
+                               if (selectmode == SELECT_INVERT) {
+                                       /* inverse selection status of this 
F-Curve only */
+                                       nlt->flag ^= NLATRACK_SELECTED;
+                               }
+                               else {
+                                       /* select F-Curve by itself */
+                                       ANIM_deselect_anim_channels(ac->data, 
ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+                                       nlt->flag |= NLATRACK_SELECTED;
+                               }
+                               
+                               /* if NLA-Track is selected now, make NLA-Track 
the 'active' one in the visible list */
+                               if (nlt->flag & NLATRACK_SELECTED)
+                                       ANIM_set_active_channel(ac->data, 
ac->datatype, filter, nlt, ANIMTYPE_NLATRACK);
+                       }
+               }
+                       break;
+               case ANIMTYPE_NLAACTION:
+               {
+                       AnimData *adt= BKE_animdata_from_id(ale->owner); /* 
this won't crash, right? */
+                       
+                       /* for now, only do something if user clicks on the 
'push-down' button */
+                       if (x >= 
(NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) {
+                               /* activate push-down operator */
+                               // TODO: make this use the operator instead of 
calling the function directly
+                               //      however, calling the operator requires 
that we supply the args, and that works with proper buttons only
+                               BKE_nla_action_pushdown(adt);
+                       }
+               }
+                       break;
+                       
+               default:
+                       printf("Error: Invalid channel type in 
mouse_nla_channels() \n");
+       }
+       
+       /* free channels */
+       BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+/* handle clicking */
+static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent 
*event)
+{
+       bAnimContext ac;
+       Scene *scene;
+       ARegion *ar;
+       View2D *v2d;
+       int mval[2], channel_index;
+       short selectmode;
+       float x, y;
+       
+       /* get editor data */
+       if (ANIM_animdata_get_context(C, &ac) == 0)
+               return OPERATOR_CANCELLED;
+               
+       /* get useful pointers from animation context data */
+       scene= ac.scene;
+       ar= ac.ar;
+       v2d= &ar->v2d;
+       
+       /* get mouse coordinates (in region coordinates) */
+       mval[0]= (event->x - ar->winrct.xmin);
+       mval[1]= (event->y - ar->winrct.ymin);
+       
+       /* select mode is either replace (deselect all, then add) or add/extend 
*/
+       if (RNA_boolean_get(op->ptr, "extend"))
+               selectmode= SELECT_INVERT;
+       else
+               selectmode= SELECT_REPLACE;
+       
+       /* figure out which channel user clicked in 
+        * Note: although channels technically start at y= ACHANNEL_FIRST, we 
need to adjust by half a channel's height
+        *              so that the tops of channels get caught ok. Since 
NLACHANNEL_FIRST is really NLACHANNEL_HEIGHT, we simply use
+        *              NLACHANNEL_HEIGHT_HALF.
+        */
+       UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
+       UI_view2d_listview_view_to_cell(v2d, NLACHANNEL_NAMEWIDTH, 
NLACHANNEL_STEP, 0, (float)NLACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+       
+       /* handle mouse-click in the relevant channel then */
+       mouse_nla_channels(&ac, x, channel_index, selectmode);
+       
+       /* set notifier tha things have changed */
+       ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+       
+       return OPERATOR_FINISHED;
+}
+ 
+void NLA_OT_channels_click (wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Mouse Click on Channels";
+       ot->idname= "NLA_OT_channels_click";
+       
+       /* api callbacks */
+       ot->invoke= nlachannels_mouseclick_invoke;
+       ot->poll= ED_operator_areaactive;
+       
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+       
+       /* id-props */
+       RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY
+}
+

@@ 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