|
Blender
V2.59
|
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