Blender  V2.59
space_outliner.c
Go to the documentation of this file.
00001 /*
00002  * $Id: space_outliner.c 39291 2011-08-11 05:46:18Z campbellbarton $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version. 
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2008 Blender Foundation.
00021  * All rights reserved.
00022  *
00023  * 
00024  * Contributor(s): Blender Foundation
00025  *
00026  * ***** END GPL LICENSE BLOCK *****
00027  */
00028 
00034 #include <string.h>
00035 #include <stdio.h>
00036 
00037 #include "MEM_guardedalloc.h"
00038 
00039 #include "BLI_blenlib.h"
00040 #include "BLI_math.h"
00041 #include "BLI_rand.h"
00042 #include "BLI_utildefines.h"
00043 
00044 #include "BKE_context.h"
00045 #include "BKE_screen.h"
00046 
00047 #include "ED_space_api.h"
00048 #include "ED_screen.h"
00049 
00050 #include "WM_api.h"
00051 #include "WM_types.h"
00052 
00053 #include "BIF_gl.h"
00054 
00055 #include "UI_resources.h"
00056 #include "UI_view2d.h"
00057 
00058 
00059 #include "outliner_intern.h"
00060 
00061 static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar)
00062 {
00063         wmKeyMap *keymap;
00064         
00065         UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
00066         
00067         /* own keymap */
00068         keymap= WM_keymap_find(wm->defaultconf, "Outliner", SPACE_OUTLINER, 0);
00069         /* don't pass on view2d mask, it's always set with scrollbar space, hide fails */
00070         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, &ar->winrct);
00071 }
00072 
00073 static void outliner_main_area_draw(const bContext *C, ARegion *ar)
00074 {
00075         View2D *v2d= &ar->v2d;
00076         View2DScrollers *scrollers;
00077         
00078         /* clear */
00079         UI_ThemeClearColor(TH_BACK);
00080         glClear(GL_COLOR_BUFFER_BIT);
00081         
00082         draw_outliner(C);
00083         
00084         /* reset view matrix */
00085         UI_view2d_view_restore(C);
00086         
00087         /* scrollers */
00088         scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
00089         UI_view2d_scrollers_draw(C, v2d, scrollers);
00090         UI_view2d_scrollers_free(scrollers);
00091 }
00092 
00093 
00094 static void outliner_main_area_free(ARegion *UNUSED(ar))
00095 {
00096         
00097 }
00098 
00099 static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
00100 {
00101         /* context changes */
00102         switch(wmn->category) {
00103                 case NC_SCENE:
00104                         switch(wmn->data) {
00105                                 case ND_OB_ACTIVE:
00106                                 case ND_OB_SELECT:
00107                                 case ND_OB_VISIBLE:
00108                                 case ND_OB_RENDER:
00109                                 case ND_MODE:
00110                                 case ND_KEYINGSET:
00111                                 case ND_FRAME:
00112                                 case ND_RENDER_OPTIONS:
00113                                 case ND_LAYER:
00114                                 case ND_WORLD:
00115                                         ED_region_tag_redraw(ar);
00116                                         break;
00117                         }
00118                         break;
00119                 case NC_OBJECT:
00120                         switch(wmn->data) {
00121                                 case ND_TRANSFORM:
00122                                         /* transform doesn't change outliner data */
00123                                         break;
00124                                 case ND_BONE_ACTIVE:
00125                                 case ND_BONE_SELECT:
00126                                 case ND_DRAW:
00127                                 case ND_PARENT:
00128                                 case ND_OB_SHADING:
00129                                         ED_region_tag_redraw(ar);
00130                                         break;
00131                                 case ND_CONSTRAINT:
00132                                         switch(wmn->action) {
00133                                                 case NA_ADDED:
00134                                                 case NA_REMOVED:
00135                                                 case NA_RENAME:
00136                                                         ED_region_tag_redraw(ar);
00137                                                         break;
00138                                         }
00139                                         break;
00140                                 case ND_MODIFIER:
00141                                         /* all modifier actions now */
00142                                         ED_region_tag_redraw(ar);
00143                                         break;
00144                         }
00145                         break;
00146                 case NC_GROUP:
00147                         /* all actions now, todo: check outliner view mode? */
00148                         ED_region_tag_redraw(ar);
00149                         break;
00150                 case NC_LAMP:
00151                         /* For updating lamp icons, when changing lamp type */
00152                         if(wmn->data == ND_LIGHTING_DRAW)
00153                                 ED_region_tag_redraw(ar);
00154                                 break;
00155                 case NC_SPACE:
00156                         if(wmn->data == ND_SPACE_OUTLINER)
00157                                 ED_region_tag_redraw(ar);
00158                                 break;
00159                 case NC_ID:
00160                         if(wmn->action == NA_RENAME)
00161                                 ED_region_tag_redraw(ar);
00162                         break;
00163                 case NC_MATERIAL:
00164                         switch(wmn->data) {
00165                                 case ND_SHADING:
00166                                 case ND_SHADING_DRAW:
00167                                         ED_region_tag_redraw(ar);
00168                                         break;
00169                         }
00170                         break;
00171                 case NC_TEXTURE:
00172                         ED_region_tag_redraw(ar);
00173                         break;
00174                 case NC_GEOM:
00175                         switch(wmn->data) {
00176                                 case ND_DATA:
00177                                         /* needed for vertex groups only, no special notifier atm so use NC_GEOM|ND_DATA */
00178                                         ED_region_tag_redraw(ar);
00179                                         break;
00180                         }
00181                         break;
00182                 case NC_ANIMATION:
00183                         switch(wmn->data) {
00184                                 case ND_NLA_ACTCHANGE:
00185                                         ED_region_tag_redraw(ar);
00186                                         break;
00187                         }
00188                         break;
00189         }
00190         
00191 }
00192 
00193 
00194 /* ************************ header outliner area region *********************** */
00195 
00196 /* add handlers, stuff you only do once or on area/region changes */
00197 static void outliner_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
00198 {
00199         ED_region_header_init(ar);
00200 }
00201 
00202 static void outliner_header_area_draw(const bContext *C, ARegion *ar)
00203 {
00204         ED_region_header(C, ar);
00205 }
00206 
00207 static void outliner_header_area_free(ARegion *UNUSED(ar))
00208 {
00209 }
00210 
00211 static void outliner_header_area_listener(ARegion *ar, wmNotifier *wmn)
00212 {
00213         /* context changes */
00214         switch(wmn->category) {
00215                 case NC_SCENE:
00216                         if(wmn->data == ND_KEYINGSET)
00217                                 ED_region_tag_redraw(ar);
00218                         break;
00219                 case NC_SPACE:
00220                         if(wmn->data == ND_SPACE_OUTLINER)
00221                                 ED_region_tag_redraw(ar);
00222                         break;
00223         }
00224 }
00225 
00226 /* ******************** default callbacks for outliner space ***************** */
00227 
00228 static SpaceLink *outliner_new(const bContext *UNUSED(C))
00229 {
00230         ARegion *ar;
00231         SpaceOops *soutliner;
00232 
00233         soutliner= MEM_callocN(sizeof(SpaceOops), "initoutliner");
00234         soutliner->spacetype= SPACE_OUTLINER;
00235         
00236         /* header */
00237         ar= MEM_callocN(sizeof(ARegion), "header for outliner");
00238         
00239         BLI_addtail(&soutliner->regionbase, ar);
00240         ar->regiontype= RGN_TYPE_HEADER;
00241         ar->alignment= RGN_ALIGN_BOTTOM;
00242         
00243         /* main area */
00244         ar= MEM_callocN(sizeof(ARegion), "main area for outliner");
00245         
00246         BLI_addtail(&soutliner->regionbase, ar);
00247         ar->regiontype= RGN_TYPE_WINDOW;
00248         
00249         ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O);
00250         ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
00251         ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
00252         ar->v2d.keeptot= V2D_KEEPTOT_STRICT;
00253         ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
00254         
00255         return (SpaceLink*)soutliner;
00256 }
00257 
00258 /* not spacelink itself */
00259 static void outliner_free(SpaceLink *sl)
00260 {
00261         SpaceOops *soutliner= (SpaceOops*)sl;
00262         
00263         outliner_free_tree(&soutliner->tree);
00264         if(soutliner->treestore) {
00265                 if(soutliner->treestore->data) MEM_freeN(soutliner->treestore->data);
00266                 MEM_freeN(soutliner->treestore);
00267         }
00268         
00269 }
00270 
00271 /* spacetype; init callback */
00272 static void outliner_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
00273 {
00274         
00275 }
00276 
00277 static SpaceLink *outliner_duplicate(SpaceLink *sl)
00278 {
00279         SpaceOops *soutliner= (SpaceOops *)sl;
00280         SpaceOops *soutlinern= MEM_dupallocN(soutliner);
00281 
00282         soutlinern->tree.first= soutlinern->tree.last= NULL;
00283         soutlinern->treestore= NULL;
00284         
00285         return (SpaceLink *)soutlinern;
00286 }
00287 
00288 /* only called once, from space_api/spacetypes.c */
00289 void ED_spacetype_outliner(void)
00290 {
00291         SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype time");
00292         ARegionType *art;
00293         
00294         st->spaceid= SPACE_OUTLINER;
00295         strncpy(st->name, "Outliner", BKE_ST_MAXNAME);
00296         
00297         st->new= outliner_new;
00298         st->free= outliner_free;
00299         st->init= outliner_init;
00300         st->duplicate= outliner_duplicate;
00301         st->operatortypes= outliner_operatortypes;
00302         st->keymap= outliner_keymap;
00303         
00304         /* regions: main window */
00305         art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
00306         art->regionid = RGN_TYPE_WINDOW;
00307         art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
00308         
00309         art->init= outliner_main_area_init;
00310         art->draw= outliner_main_area_draw;
00311         art->free= outliner_main_area_free;
00312         art->listener= outliner_main_area_listener;
00313         BLI_addhead(&st->regiontypes, art);
00314         
00315         /* regions: header */
00316         art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
00317         art->regionid = RGN_TYPE_HEADER;
00318         art->prefsizey= HEADERY;
00319         art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER;
00320         
00321         art->init= outliner_header_area_init;
00322         art->draw= outliner_header_area_draw;
00323         art->free= outliner_header_area_free;
00324         art->listener= outliner_header_area_listener;
00325         BLI_addhead(&st->regiontypes, art);
00326         
00327         BKE_spacetype_register(st);
00328 }
00329