|
Blender
V2.59
|
00001 /* 00002 * $Id: space_buttons.c 37557 2011-06-16 15:28:39Z 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 "BIF_gl.h" 00051 00052 #include "WM_api.h" 00053 #include "WM_types.h" 00054 00055 #include "UI_resources.h" 00056 #include "UI_view2d.h" 00057 00058 #include "ED_render.h" 00059 00060 #include "buttons_intern.h" // own include 00061 00062 /* ******************** default callbacks for buttons space ***************** */ 00063 00064 static SpaceLink *buttons_new(const bContext *UNUSED(C)) 00065 { 00066 ARegion *ar; 00067 SpaceButs *sbuts; 00068 00069 sbuts= MEM_callocN(sizeof(SpaceButs), "initbuts"); 00070 sbuts->spacetype= SPACE_BUTS; 00071 sbuts->align= BUT_VERTICAL; 00072 00073 /* header */ 00074 ar= MEM_callocN(sizeof(ARegion), "header for buts"); 00075 00076 BLI_addtail(&sbuts->regionbase, ar); 00077 ar->regiontype= RGN_TYPE_HEADER; 00078 ar->alignment= RGN_ALIGN_TOP; 00079 00080 #if 0 00081 /* context area */ 00082 ar= MEM_callocN(sizeof(ARegion), "context area for buts"); 00083 BLI_addtail(&sbuts->regionbase, ar); 00084 ar->regiontype= RGN_TYPE_CHANNELS; 00085 ar->alignment= RGN_ALIGN_TOP; 00086 #endif 00087 00088 /* main area */ 00089 ar= MEM_callocN(sizeof(ARegion), "main area for buts"); 00090 00091 BLI_addtail(&sbuts->regionbase, ar); 00092 ar->regiontype= RGN_TYPE_WINDOW; 00093 00094 return (SpaceLink *)sbuts; 00095 } 00096 00097 /* not spacelink itself */ 00098 static void buttons_free(SpaceLink *sl) 00099 { 00100 SpaceButs *sbuts= (SpaceButs*) sl; 00101 00102 if(sbuts->ri) { 00103 if (sbuts->ri->rect) MEM_freeN(sbuts->ri->rect); 00104 MEM_freeN(sbuts->ri); 00105 } 00106 00107 if(sbuts->path) 00108 MEM_freeN(sbuts->path); 00109 } 00110 00111 /* spacetype; init callback */ 00112 static void buttons_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) 00113 { 00114 SpaceButs *sbuts= sa->spacedata.first; 00115 00116 /* auto-align based on size */ 00117 if(sbuts->align == BUT_AUTO || !sbuts->align) { 00118 if(sa->winx > sa->winy) 00119 sbuts->align= BUT_HORIZONTAL; 00120 else 00121 sbuts->align= BUT_VERTICAL; 00122 } 00123 } 00124 00125 static SpaceLink *buttons_duplicate(SpaceLink *sl) 00126 { 00127 SpaceButs *sbutsn= MEM_dupallocN(sl); 00128 00129 /* clear or remove stuff from old */ 00130 sbutsn->ri= NULL; 00131 sbutsn->path= NULL; 00132 00133 return (SpaceLink *)sbutsn; 00134 } 00135 00136 /* add handlers, stuff you only do once or on area/region changes */ 00137 static void buttons_main_area_init(wmWindowManager *wm, ARegion *ar) 00138 { 00139 wmKeyMap *keymap; 00140 00141 ED_region_panels_init(wm, ar); 00142 00143 keymap= WM_keymap_find(wm->defaultconf, "Property Editor", SPACE_BUTS, 0); 00144 WM_event_add_keymap_handler(&ar->handlers, keymap); 00145 } 00146 00147 static void buttons_main_area_draw(const bContext *C, ARegion *ar) 00148 { 00149 /* draw entirely, view changes should be handled here */ 00150 SpaceButs *sbuts= CTX_wm_space_buts(C); 00151 int vertical= (sbuts->align == BUT_VERTICAL); 00152 00153 buttons_context_compute(C, sbuts); 00154 00155 if(sbuts->mainb == BCONTEXT_SCENE) 00156 ED_region_panels(C, ar, vertical, "scene", sbuts->mainb); 00157 else if(sbuts->mainb == BCONTEXT_RENDER) 00158 ED_region_panels(C, ar, vertical, "render", sbuts->mainb); 00159 else if(sbuts->mainb == BCONTEXT_WORLD) 00160 ED_region_panels(C, ar, vertical, "world", sbuts->mainb); 00161 else if(sbuts->mainb == BCONTEXT_OBJECT) 00162 ED_region_panels(C, ar, vertical, "object", sbuts->mainb); 00163 else if(sbuts->mainb == BCONTEXT_DATA) 00164 ED_region_panels(C, ar, vertical, "data", sbuts->mainb); 00165 else if(sbuts->mainb == BCONTEXT_MATERIAL) 00166 ED_region_panels(C, ar, vertical, "material", sbuts->mainb); 00167 else if(sbuts->mainb == BCONTEXT_TEXTURE) 00168 ED_region_panels(C, ar, vertical, "texture", sbuts->mainb); 00169 else if(sbuts->mainb == BCONTEXT_PARTICLE) 00170 ED_region_panels(C, ar, vertical, "particle", sbuts->mainb); 00171 else if(sbuts->mainb == BCONTEXT_PHYSICS) 00172 ED_region_panels(C, ar, vertical, "physics", sbuts->mainb); 00173 else if(sbuts->mainb == BCONTEXT_BONE) 00174 ED_region_panels(C, ar, vertical, "bone", sbuts->mainb); 00175 else if(sbuts->mainb == BCONTEXT_MODIFIER) 00176 ED_region_panels(C, ar, vertical, "modifier", sbuts->mainb); 00177 else if (sbuts->mainb == BCONTEXT_CONSTRAINT) 00178 ED_region_panels(C, ar, vertical, "constraint", sbuts->mainb); 00179 else if(sbuts->mainb == BCONTEXT_BONE_CONSTRAINT) 00180 ED_region_panels(C, ar, vertical, "bone_constraint", sbuts->mainb); 00181 00182 sbuts->re_align= 0; 00183 sbuts->mainbo= sbuts->mainb; 00184 } 00185 00186 static void buttons_operatortypes(void) 00187 { 00188 WM_operatortype_append(BUTTONS_OT_toolbox); 00189 WM_operatortype_append(BUTTONS_OT_file_browse); 00190 WM_operatortype_append(BUTTONS_OT_directory_browse); 00191 } 00192 00193 static void buttons_keymap(struct wmKeyConfig *keyconf) 00194 { 00195 wmKeyMap *keymap= WM_keymap_find(keyconf, "Property Editor", SPACE_BUTS, 0); 00196 00197 WM_keymap_add_item(keymap, "BUTTONS_OT_toolbox", RIGHTMOUSE, KM_PRESS, 0, 0); 00198 } 00199 00200 /* add handlers, stuff you only do once or on area/region changes */ 00201 static void buttons_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar) 00202 { 00203 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy); 00204 } 00205 00206 static void buttons_header_area_draw(const bContext *C, ARegion *ar) 00207 { 00208 /* clear */ 00209 UI_ThemeClearColor(ED_screen_area_active(C)?TH_HEADER:TH_HEADERDESEL); 00210 glClear(GL_COLOR_BUFFER_BIT); 00211 00212 /* set view2d view matrix for scrolling (without scrollers) */ 00213 UI_view2d_view_ortho(&ar->v2d); 00214 00215 buttons_header_buttons(C, ar); 00216 00217 /* restore view matrix? */ 00218 UI_view2d_view_restore(C); 00219 } 00220 00221 /* draw a certain button set only if properties area is currently 00222 * showing that button set, to reduce unnecessary drawing. */ 00223 static void buttons_area_redraw(ScrArea *sa, short buttons) 00224 { 00225 SpaceButs *sbuts= sa->spacedata.first; 00226 00227 /* if the area's current button set is equal to the one to redraw */ 00228 if(sbuts->mainb == buttons) 00229 ED_area_tag_redraw(sa); 00230 } 00231 00232 /* reused! */ 00233 static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) 00234 { 00235 SpaceButs *sbuts= sa->spacedata.first; 00236 00237 /* context changes */ 00238 switch(wmn->category) { 00239 case NC_SCENE: 00240 switch(wmn->data) { 00241 case ND_RENDER_OPTIONS: 00242 buttons_area_redraw(sa, BCONTEXT_RENDER); 00243 break; 00244 case ND_FRAME: 00245 /* any buttons area can have animated properties so redraw all */ 00246 ED_area_tag_redraw(sa); 00247 sbuts->preview= 1; 00248 break; 00249 case ND_OB_ACTIVE: 00250 ED_area_tag_redraw(sa); 00251 sbuts->preview= 1; 00252 break; 00253 case ND_KEYINGSET: 00254 buttons_area_redraw(sa, BCONTEXT_SCENE); 00255 break; 00256 case ND_RENDER_RESULT: 00257 break; 00258 case ND_MODE: 00259 case ND_LAYER: 00260 default: 00261 ED_area_tag_redraw(sa); 00262 break; 00263 } 00264 break; 00265 case NC_OBJECT: 00266 switch(wmn->data) { 00267 case ND_TRANSFORM: 00268 buttons_area_redraw(sa, BCONTEXT_OBJECT); 00269 buttons_area_redraw(sa, BCONTEXT_DATA); /* autotexpace flag */ 00270 break; 00271 case ND_POSE: 00272 case ND_BONE_ACTIVE: 00273 case ND_BONE_SELECT: 00274 buttons_area_redraw(sa, BCONTEXT_BONE); 00275 buttons_area_redraw(sa, BCONTEXT_BONE_CONSTRAINT); 00276 break; 00277 case ND_MODIFIER: 00278 if(wmn->action == NA_RENAME) 00279 ED_area_tag_redraw(sa); 00280 else 00281 buttons_area_redraw(sa, BCONTEXT_MODIFIER); 00282 buttons_area_redraw(sa, BCONTEXT_PHYSICS); 00283 break; 00284 case ND_CONSTRAINT: 00285 buttons_area_redraw(sa, BCONTEXT_CONSTRAINT); 00286 buttons_area_redraw(sa, BCONTEXT_BONE_CONSTRAINT); 00287 break; 00288 case ND_PARTICLE: 00289 if (wmn->action == NA_EDITED) 00290 buttons_area_redraw(sa, BCONTEXT_PARTICLE); 00291 sbuts->preview= 1; 00292 break; 00293 case ND_DRAW: 00294 buttons_area_redraw(sa, BCONTEXT_OBJECT); 00295 buttons_area_redraw(sa, BCONTEXT_DATA); 00296 buttons_area_redraw(sa, BCONTEXT_PHYSICS); 00297 case ND_SHADING: 00298 case ND_SHADING_DRAW: 00299 /* currently works by redraws... if preview is set, it (re)starts job */ 00300 sbuts->preview= 1; 00301 break; 00302 default: 00303 /* Not all object RNA props have a ND_ notifier (yet) */ 00304 ED_area_tag_redraw(sa); 00305 break; 00306 } 00307 break; 00308 case NC_GEOM: 00309 switch(wmn->data) { 00310 case ND_SELECT: 00311 case ND_DATA: 00312 ED_area_tag_redraw(sa); 00313 break; 00314 } 00315 break; 00316 case NC_MATERIAL: 00317 ED_area_tag_redraw(sa); 00318 switch(wmn->data) { 00319 case ND_SHADING: 00320 case ND_SHADING_DRAW: 00321 case ND_NODES: 00322 /* currently works by redraws... if preview is set, it (re)starts job */ 00323 sbuts->preview= 1; 00324 break; 00325 } 00326 break; 00327 case NC_WORLD: 00328 buttons_area_redraw(sa, BCONTEXT_WORLD); 00329 sbuts->preview= 1; 00330 break; 00331 case NC_LAMP: 00332 buttons_area_redraw(sa, BCONTEXT_DATA); 00333 sbuts->preview= 1; 00334 break; 00335 case NC_BRUSH: 00336 buttons_area_redraw(sa, BCONTEXT_TEXTURE); 00337 break; 00338 case NC_TEXTURE: 00339 case NC_IMAGE: 00340 ED_area_tag_redraw(sa); 00341 sbuts->preview= 1; 00342 break; 00343 case NC_SPACE: 00344 if(wmn->data == ND_SPACE_PROPERTIES) 00345 ED_area_tag_redraw(sa); 00346 break; 00347 case NC_ID: 00348 if(wmn->action == NA_RENAME) 00349 ED_area_tag_redraw(sa); 00350 break; 00351 case NC_ANIMATION: 00352 switch(wmn->data) { 00353 case ND_KEYFRAME: 00354 if (wmn->action == NA_EDITED) 00355 ED_area_tag_redraw(sa); 00356 break; 00357 } 00358 break; 00359 case NC_NODE: 00360 if(wmn->action==NA_SELECTED) { 00361 ED_area_tag_redraw(sa); 00362 /* new active node, update texture preview */ 00363 if(sbuts->mainb == BCONTEXT_TEXTURE) 00364 sbuts->preview= 1; 00365 } 00366 break; 00367 /* Listener for preview render, when doing an global undo. */ 00368 case NC_WINDOW: 00369 ED_area_tag_redraw(sa); 00370 sbuts->preview= 1; 00371 break; 00372 } 00373 00374 if(wmn->data == ND_KEYS) 00375 ED_area_tag_redraw(sa); 00376 } 00377 00378 /* only called once, from space/spacetypes.c */ 00379 void ED_spacetype_buttons(void) 00380 { 00381 SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype buttons"); 00382 ARegionType *art; 00383 00384 st->spaceid= SPACE_BUTS; 00385 strncpy(st->name, "Buttons", BKE_ST_MAXNAME); 00386 00387 st->new= buttons_new; 00388 st->free= buttons_free; 00389 st->init= buttons_init; 00390 st->duplicate= buttons_duplicate; 00391 st->operatortypes= buttons_operatortypes; 00392 st->keymap= buttons_keymap; 00393 st->listener= buttons_area_listener; 00394 st->context= buttons_context; 00395 00396 /* regions: main window */ 00397 art= MEM_callocN(sizeof(ARegionType), "spacetype buttons region"); 00398 art->regionid = RGN_TYPE_WINDOW; 00399 art->init= buttons_main_area_init; 00400 art->draw= buttons_main_area_draw; 00401 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES; 00402 BLI_addhead(&st->regiontypes, art); 00403 00404 buttons_context_register(art); 00405 00406 /* regions: header */ 00407 art= MEM_callocN(sizeof(ARegionType), "spacetype buttons region"); 00408 art->regionid = RGN_TYPE_HEADER; 00409 art->prefsizey= HEADERY; 00410 art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER; 00411 00412 art->init= buttons_header_area_init; 00413 art->draw= buttons_header_area_draw; 00414 BLI_addhead(&st->regiontypes, art); 00415 00416 BKE_spacetype_register(st); 00417 } 00418