[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38303] branches/soc-2011-pepper/source/ blender/editors/space_outliner: == The great Outliner code split up ==

Campbell Barton ideasman42 at gmail.com
Tue Jul 12 14:15:27 CEST 2011


Could you merge this into trunk? - else any changes made to outliner.c
in the coming months will be a pain to apply back.

On Tue, Jul 12, 2011 at 8:01 PM, Joshua Leung <aligorith at gmail.com> wrote:
> Sure, go ahead. I never use CMake, so I've no idea what's breaking it.
>
> On Tue, Jul 12, 2011 at 9:04 PM, Mitchell Stokes <mogurijin at gmail.com> wrote:
>> This commit broke building with CMake. I have the fix if you want me
>> to commit it.
>>
>> Cheers,
>> Mitchell
>>
>> On Mon, Jul 11, 2011 at 3:59 AM, Joshua Leung <aligorith at gmail.com> wrote:
>>> Revision: 38303
>>>          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38303
>>> Author:   aligorith
>>> Date:     2011-07-11 10:59:53 +0000 (Mon, 11 Jul 2011)
>>> Log Message:
>>> -----------
>>> == The great Outliner code split up ==
>>>
>>> As per my proposal (http://lists.blender.org/pipermail/bf-
>>> committers/2011-July/032553.html), I've split outliner.c into several
>>> new files based on the purpose of the relevant code.
>>>
>>> * outliner_tree.c - building outliner structure
>>> * outliner_draw.c - outliner drawing (including toggle buttons and
>>> their handling)
>>> * outliner_edit.c - all operators for toggling stuff, and/or hotkey
>>> accessed operators. Also KeyingSet and Driver operators go here
>>> * outliner_tools.c - all operators and callbacks used for handling RMB
>>> click on items
>>> * outliner_select.c - stuff for selecting rows, and handling the
>>> active/selected toggling stuff
>>>
>>> In a few cases, the split hasn't been totally clear-cut due to cross-
>>> dependencies and other spaghetti. However, in a few cases, I have
>>> managed to remove the need for some of the prototypes that were needed
>>> in the past by judicious reshuffling of functions, which also makes it
>>> easier to actually find what you're looking for.
>>>
>>> Modified Paths:
>>> --------------
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner_intern.h
>>>
>>> Added Paths:
>>> -----------
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner_draw.c
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner_edit.c
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner_select.c
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner_tools.c
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner_tree.c
>>>
>>> Removed Paths:
>>> -------------
>>>    branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner.c
>>>
>>> Deleted: branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner.c
>>> ===================================================================
>>> --- branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner.c   2011-07-11 09:47:13 UTC (rev 38302)
>>> +++ branches/soc-2011-pepper/source/blender/editors/space_outliner/outliner.c   2011-07-11 10:59:53 UTC (rev 38303)
>>> @@ -1,6148 +0,0 @@
>>> -/*
>>> - * $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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
>>> - *
>>> - * The Original Code is Copyright (C) 2004 Blender Foundation.
>>> - * All rights reserved.
>>> - *
>>> - * The Original Code is: all of this file.
>>> - *
>>> - * Contributor(s): none yet.
>>> - *
>>> - * ***** END GPL LICENSE BLOCK *****
>>> - */
>>> -
>>> -/** \file blender/editors/space_outliner/outliner.c
>>> - *  \ingroup spoutliner
>>> - */
>>> -
>>> -
>>> -#include <math.h>
>>> -#include <string.h>
>>> -#include <stdlib.h>
>>> -#include <stddef.h>
>>> -
>>> -#include "MEM_guardedalloc.h"
>>> -
>>> -#include "DNA_anim_types.h"
>>> -#include "DNA_armature_types.h"
>>> -#include "DNA_constraint_types.h"
>>> -#include "DNA_camera_types.h"
>>> -#include "DNA_group_types.h"
>>> -#include "DNA_key_types.h"
>>> -#include "DNA_lamp_types.h"
>>> -#include "DNA_material_types.h"
>>> -#include "DNA_mesh_types.h"
>>> -#include "DNA_meta_types.h"
>>> -#include "DNA_particle_types.h"
>>> -#include "DNA_scene_types.h"
>>> -#include "DNA_world_types.h"
>>> -#include "DNA_sequence_types.h"
>>> -#include "DNA_object_types.h"
>>> -
>>> -#include "BLI_blenlib.h"
>>> -#include "BLI_utildefines.h"
>>> -#include "BLI_math_base.h"
>>> -
>>> -#if defined WIN32 && !defined _LIBC
>>> -# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
>>> -#else
>>> -#  ifndef _GNU_SOURCE
>>> -#    define _GNU_SOURCE
>>> -#  endif
>>> -# include <fnmatch.h>
>>> -#endif
>>> -
>>> -
>>> -#include "BKE_animsys.h"
>>> -#include "BKE_context.h"
>>> -#include "BKE_deform.h"
>>> -#include "BKE_depsgraph.h"
>>> -#include "BKE_fcurve.h"
>>> -#include "BKE_global.h"
>>> -#include "BKE_group.h"
>>> -#include "BKE_library.h"
>>> -#include "BKE_main.h"
>>> -#include "BKE_modifier.h"
>>> -#include "BKE_report.h"
>>> -#include "BKE_scene.h"
>>> -#include "BKE_sequencer.h"
>>> -
>>> -#include "ED_armature.h"
>>> -#include "ED_object.h"
>>> -#include "ED_screen.h"
>>> -#include "ED_util.h"
>>> -
>>> -#include "WM_api.h"
>>> -#include "WM_types.h"
>>> -
>>> -#include "BIF_gl.h"
>>> -#include "BIF_glutil.h"
>>> -
>>> -#include "UI_interface.h"
>>> -#include "UI_interface_icons.h"
>>> -#include "UI_resources.h"
>>> -#include "UI_view2d.h"
>>> -
>>> -#include "RNA_access.h"
>>> -#include "RNA_define.h"
>>> -#include "RNA_enum_types.h"
>>> -
>>> -#include "ED_keyframing.h"
>>> -
>>> -#include "outliner_intern.h"
>>> -
>>> -
>>> -#define OL_Y_OFFSET    2
>>> -
>>> -#define OL_TOG_RESTRICT_VIEWX  (UI_UNIT_X*3)
>>> -#define OL_TOG_RESTRICT_SELECTX        (UI_UNIT_X*2)
>>> -#define OL_TOG_RESTRICT_RENDERX        UI_UNIT_X
>>> -
>>> -#define OL_TOGW OL_TOG_RESTRICT_VIEWX
>>> -
>>> -#define OL_RNA_COLX                    (UI_UNIT_X*15)
>>> -#define OL_RNA_COL_SIZEX       (UI_UNIT_X*7.5)
>>> -#define OL_RNA_COL_SPACEX      (UI_UNIT_X*2.5)
>>> -
>>> -#define TS_CHUNK       128
>>> -
>>> -#define TREESTORE(a) ((a)?soops->treestore->data+(a)->store_index:NULL)
>>> -
>>> -/* ************* XXX **************** */
>>> -
>>> -static void error(const char *UNUSED(arg), ...) {}
>>> -
>>> -/* ********************************** */
>>> -
>>> -
>>> -/* ******************** PROTOTYPES ***************** */
>>> -static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty);
>>> -static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb,
>>> -                                                                                void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *));
>>> -
>>> -static int group_select_flag(Group *gr);
>>> -
>>> -/* ******************** PERSISTANT DATA ***************** */
>>> -
>>> -static void outliner_storage_cleanup(SpaceOops *soops)
>>> -{
>>> -       TreeStore *ts= soops->treestore;
>>> -
>>> -       if(ts) {
>>> -               TreeStoreElem *tselem;
>>> -               int a, unused= 0;
>>> -
>>> -               /* each element used once, for ID blocks with more users to have each a treestore */
>>> -               for(a=0, tselem= ts->data; a<ts->usedelem; a++, tselem++) tselem->used= 0;
>>> -
>>> -               /* cleanup only after reading file or undo step, and always for
>>> -                * RNA datablocks view in order to save memory */
>>> -               if(soops->storeflag & SO_TREESTORE_CLEANUP) {
>>> -
>>> -                       for(a=0, tselem= ts->data; a<ts->usedelem; a++, tselem++) {
>>> -                               if(tselem->id==NULL) unused++;
>>> -                       }
>>> -
>>> -                       if(unused) {
>>> -                               if(ts->usedelem == unused) {
>>> -                                       MEM_freeN(ts->data);
>>> -                                       ts->data= NULL;
>>> -                                       ts->usedelem= ts->totelem= 0;
>>> -                               }
>>> -                               else {
>>> -                                       TreeStoreElem *tsnewar, *tsnew;
>>> -
>>> -                                       tsnew=tsnewar= MEM_mallocN((ts->usedelem-unused)*sizeof(TreeStoreElem), "new tselem");
>>> -                                       for(a=0, tselem= ts->data; a<ts->usedelem; a++, tselem++) {
>>> -                                               if(tselem->id) {
>>> -                                                       *tsnew= *tselem;
>>> -                                                       tsnew++;
>>> -                                               }
>>> -                                       }
>>> -                                       MEM_freeN(ts->data);
>>> -                                       ts->data= tsnewar;
>>> -                                       ts->usedelem-= unused;
>>> -                                       ts->totelem= ts->usedelem;
>>> -                               }
>>> -                       }
>>> -               }
>>> -       }
>>> -}
>>> -
>>> -static void check_persistant(SpaceOops *soops, TreeElement *te, ID *id, short type, short nr)
>>> -{
>>> -       TreeStore *ts;
>>> -       TreeStoreElem *tselem;
>>> -       int a;
>>> -
>>> -       /* case 1; no TreeStore */
>>> -       if(soops->treestore==NULL) {
>>> -               soops->treestore= MEM_callocN(sizeof(TreeStore), "treestore");
>>> -       }
>>> -       ts= soops->treestore;
>>> -
>>> -       /* check if 'te' is in treestore */
>>> -       tselem= ts->data;
>>> -       for(a=0; a<ts->usedelem; a++, tselem++) {
>>> -               if(tselem->id==id && tselem->used==0) {
>>> -                       if((type==0 && tselem->type==0) ||(tselem->type==type && tselem->nr==nr)) {
>>> -                               te->store_index= a;
>>> -                               tselem->used= 1;
>>> -                               return;
>>> -                       }
>>> -               }
>>> -       }
>>> -
>>> -       /* add 1 element to treestore */
>>> -       if(ts->usedelem==ts->totelem) {
>>> -               TreeStoreElem *tsnew;
>>> -
>>> -               tsnew= MEM_mallocN((ts->totelem+TS_CHUNK)*sizeof(TreeStoreElem), "treestore data");
>>> -               if(ts->data) {
>>> -                       memcpy(tsnew, ts->data, ts->totelem*sizeof(TreeStoreElem));
>>> -                       MEM_freeN(ts->data);
>>> -               }
>>> -               ts->data= tsnew;
>>> -               ts->totelem+= TS_CHUNK;
>>> -       }
>>> -
>>> -       tselem= ts->data+ts->usedelem;
>>> -
>>> -       tselem->type= type;
>>> -       if(type) tselem->nr= nr; // we're picky! :)
>>> -       else tselem->nr= 0;
>>> -       tselem->id= id;
>>> -       tselem->used = 0;
>>> -       tselem->flag= TSE_CLOSED;
>>> -       te->store_index= ts->usedelem;
>>> -
>>> -       ts->usedelem++;
>>> -}
>>> -
>>> -/* ******************** TREE MANAGEMENT ****************** */
>>> -
>>> -void outliner_free_tree(ListBase *lb)
>>> -{
>>> -
>>> -       while(lb->first) {
>>> -               TreeElement *te= lb->first;
>>> -
>>> -               outliner_free_tree(&te->subtree);
>>> -               BLI_remlink(lb, te);
>>> -
>>> -               if(te->flag & TE_FREE_NAME) MEM_freeN((void *)te->name);
>>> -               MEM_freeN(te);
>>> -       }
>>> -}
>>> -
>>> -static void outliner_height(SpaceOops *soops, ListBase *lb, int *h)
>>> -{
>>> -       TreeElement *te= lb->first;
>>> -       while(te) {
>>> -               TreeStoreElem *tselem= TREESTORE(te);
>>> -               if((tselem->flag & TSE_CLOSED)==0)
>>> -                       outliner_height(soops, &te->subtree, h);
>>> -               (*h) += UI_UNIT_Y;
>>> -               te= te->next;
>>> -       }
>>> -}
>>> -
>>> -#if 0  // XXX this is currently disabled until te->xend is set correctly
>>> -static void outliner_width(SpaceOops *soops, ListBase *lb, int *w)
>>> -{
>>> -       TreeElement *te= lb->first;
>>> -       while(te) {
>>> -//             TreeStoreElem *tselem= TREESTORE(te);
>>> -
>>> -               // XXX fixme... te->xend is not set yet
>>> -               if(tselem->flag & TSE_CLOSED) {
>>> -                       if (te->xend > *w)
>>> -                               *w = te->xend;
>>> -               }
>>> -               outliner_width(soops, &te->subtree, w);
>>> -               te= te->next;
>>> -       }
>>> -}
>>> -#endif
>>> -
>>> -static void outliner_rna_width(SpaceOops *soops, ListBase *lb, int *w, int startx)
>>> -{
>>> -       TreeElement *te= lb->first;
>>> -       while(te) {
>>> -               TreeStoreElem *tselem= TREESTORE(te);
>>> -                       // XXX fixme... (currently, we're using a fixed length of 100)!
>>> -               /*if(te->xend) {
>>> -                       if(te->xend > *w)
>>> -                               *w = te->xend;
>>> -               }*/
>>> -               if(startx+100 > *w)
>>> -                       *w = startx+100;
>>> -
>>> -               if((tselem->flag & TSE_CLOSED)==0)
>>> -                       outliner_rna_width(soops, &te->subtree, w, startx+UI_UNIT_X);
>>> -               te= te->next;
>>> -       }
>>> -}
>>> -
>>> -static TreeElement *outliner_find_tree_element(ListBase *lb, int store_index)
>>> -{
>>> -       TreeElement *te= lb->first, *tes;
>>> -       while(te) {
>>> -               if(te->store_index==store_index) return te;
>>> -               tes= outliner_find_tree_element(&te->subtree, store_index);
>>> -               if(tes) return tes;
>>> -               te= te->next;
>>> -       }
>>> -       return NULL;
>>> -}
>>> -
>>> -
>>> -
>>> -static ID *outliner_search_back(SpaceOops *soops, TreeElement *te, short idcode)
>>> -{
>>> -       TreeStoreElem *tselem;
>>> -       te= te->parent;
>>> -
>>> -       while(te) {
>>> -               tselem= TREESTORE(te);
>>> -               if(tselem->type==0 && te->idcode==idcode) return tselem->id;
>>> -               te= te->parent;
>>> -       }
>>> -       return NULL;
>>> -}
>>> -
>>> -struct treesort {
>>> -       TreeElement *te;
>>> -       ID *id;
>>> -       const char *name;
>>> -       short idcode;
>>> -};
>>> -
>>> -static int treesort_alpha(const void *v1, const void *v2)
>>> -{
>>> -       const struct treesort *x1= v1, *x2= v2;
>>> -       int comp;
>>> -
>>> -       /* first put objects last (hierarchy) */
>>> -       comp= (x1->idcode==ID_OB);
>>> -       if(x2->idcode==ID_OB) comp+=2;
>>> -
>>> -       if(comp==1) return 1;
>>> -       else if(comp==2) return -1;
>>> -       else if(comp==3) {
>>> -               comp= strcmp(x1->name, x2->name);
>>> -
>>> -               if( comp>0 ) return 1;
>>> -               else if( comp<0) return -1;
>>> -               return 0;
>>> -       }
>>> -       return 0;
>>> -}
>>> -
>>> -/* this is nice option for later? doesnt look too useful... */
>>> -#if 0
>>> -static int treesort_obtype_alpha(const void *v1, const void *v2)
>>> -{
>>> -       const struct treesort *x1= v1, *x2= v2;
>>> -
>>> -       /* first put objects last (hierarchy) */
>>> -       if(x1->idcode==ID_OB && x2->idcode!=ID_OB) return 1;
>>> -       else if(x2->idcode==ID_OB && x1->idcode!=ID_OB) return -1;
>>> -       else {
>>> -               /* 2nd we check ob type */
>>> -               if(x1->idcode==ID_OB && x2->idcode==ID_OB) {
>>> -                       if( ((Object *)x1->id)->type > ((Object *)x2->id)->type) return 1;
>>> -                       else if( ((Object *)x1->id)->type > ((Object *)x2->id)->type) return -1;
>>> -                       else return 0;
>>> -               }
>>> -               else {
>>> -                       int comp= strcmp(x1->name, x2->name);
>>> -
>>> -                       if( comp>0 ) return 1;
>>> -                       else if( comp<0) return -1;
>>> -                       return 0;
>>> -               }
>>> -       }
>>> -}
>>> -#endif
>>> -
>>> -/* sort happens on each subtree individual */
>>> -static void outliner_sort(SpaceOops *soops, ListBase *lb)
>>> -{
>>> -       TreeElement *te;
>>> -       TreeStoreElem *tselem;
>>> -       int totelem=0;
>>> -
>>> -       te= lb->last;
>>> -       if(te==NULL) return;
>>> -       tselem= TREESTORE(te);
>>> -
>>> -       /* sorting rules; only object lists or deformgroups */
>>> -       if( (tselem->type==TSE_DEFGROUP) || (tselem->type==0 && te->idcode==ID_OB)) {
>>> -
>>> -               /* count first */
>>> -               for(te= lb->first; te; te= te->next) totelem++;
>>> -
>>> -               if(totelem>1) {
>>> -                       struct treesort *tear= MEM_mallocN(totelem*sizeof(struct treesort), "tree sort array");
>>>
>>> @@ Diff output truncated at 10240 characters. @@
>>> _______________________________________________
>>> Bf-blender-cvs mailing list
>>> Bf-blender-cvs at blender.org
>>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>>
>> _______________________________________________
>> Bf-committers mailing list
>> Bf-committers at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-committers
>>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>



-- 
- Campbell


More information about the Bf-committers mailing list