* Added very basic loading of .py files on startup to define panels.
  It now executes all .py files in .blender/ui on startup. Right now
  this contains the object buttons, the C code for it is commented out.

  These files should get embedded in the blender executable as well
  eventually, that's a bit more complicated so this works for now.

* For scons and cmake it seems to copy & find the files OK, for make
  only "make release" works (same with scripts/ folder it seems).

* Added BLI_gethome_folder function in BLI_util.h. This is adapted
  from bpy_gethome, and gives the path to a folder in .blender like
  scripts or ui.

There's plenty of things to figure out here about paths, embedding,
caching, user configs ...
This commit is contained in:
2009-04-11 02:18:24 +00:00
parent 3ed5e21537
commit c7b587105f
11 changed files with 300 additions and 4 deletions

View File

@@ -472,6 +472,17 @@ if env['OURPLATFORM']!='darwin':
source=[dp+os.sep+f for f in df] source=[dp+os.sep+f for f in df]
scriptinstall.append(env.Install(dir=dir,source=source)) scriptinstall.append(env.Install(dir=dir,source=source))
#-- .blender/ui
scriptpath='release/ui'
for dp, dn, df in os.walk(scriptpath):
if 'CVS' in dn:
dn.remove('CVS')
if '.svn' in dn:
dn.remove('.svn')
dir=env['BF_INSTALLDIR']+'/.blender/ui'+dp[len(scriptpath):]
source=[dp+os.sep+f for f in df]
scriptinstall.append(env.Install(dir=dir,source=source))
#-- icons #-- icons
if env['OURPLATFORM']=='linux2': if env['OURPLATFORM']=='linux2':
iconlist = [] iconlist = []

View File

@@ -163,6 +163,9 @@ endif
@echo "----> Copy python infrastructure" @echo "----> Copy python infrastructure"
@[ ! -d scripts ] || cp -r scripts $(CONFDIR)/scripts @[ ! -d scripts ] || cp -r scripts $(CONFDIR)/scripts
@echo "----> Copy python UI files"
@[ ! -d ui ] || cp -r ui $(CONFDIR)/ui
ifeq ($(OS),darwin) ifeq ($(OS),darwin)
@echo "----> Move .blender to .app/Contents/MacOS/" @echo "----> Move .blender to .app/Contents/MacOS/"
@rm -fr $(DISTDIR)/blender$(EXT0)/Contents/MacOS/.blender @rm -fr $(DISTDIR)/blender$(EXT0)/Contents/MacOS/.blender

View File

@@ -0,0 +1,124 @@
class OBJECT_PT_transform(bpy.types.Panel):
__label__ = "Transform"
__context__ = "object"
def draw(self, context):
ob = context.active_object
layout = self.layout
if not ob:
return
layout.template_column_flow(3)
layout.itemR(ob, "location")
layout.itemR(ob, "rotation")
layout.itemR(ob, "scale")
class OBJECT_PT_groups(bpy.types.Panel):
__label__ = "Groups"
__context__ = "object"
def draw(self, context):
ob = context.active_object
layout = self.layout
if not ob:
return
layout.template_column_flow(2)
layout.itemR(ob, "pass_index")
layout.itemR(ob, "parent")
# layout.template_left_right()
# layout.itemO("OBJECT_OT_add_group");
for group in bpy.data.groups:
if ob in group.objects:
sublayout = layout.template_stack()
sublayout.template_left_right()
sublayout.itemR(group, "name")
# sublayout.itemO("OBJECT_OT_remove_group")
sublayout.template_column_flow(2)
sublayout.itemR(group, "layer")
sublayout.itemR(group, "dupli_offset")
class OBJECT_PT_display(bpy.types.Panel):
__label__ = "Display"
__context__ = "object"
def draw(self, context):
ob = context.active_object
layout = self.layout
if not ob:
return
layout.template_column_flow(2)
layout.itemR(ob, "max_draw_type", text="Type")
layout.itemR(ob, "draw_bounds_type", text="Bounds")
layout.template_column_flow(2)
layout.itemR(ob, "draw_name", text="Name")
layout.itemR(ob, "draw_axis", text="Axis")
layout.itemR(ob, "draw_wire", text="Wire")
layout.itemR(ob, "draw_texture_space", text="Texture Space")
layout.itemR(ob, "x_ray", text="X-Ray")
layout.itemR(ob, "draw_transparent", text="Transparency")
class OBJECT_PT_duplication(bpy.types.Panel):
__label__ = "Duplication"
__context__ = "object"
def draw(self, context):
ob = context.active_object
layout = self.layout
if not ob:
return
layout.template_column()
layout.itemR(ob, "dupli_type", text="")
if ob.dupli_type == "FRAMES":
layout.template_column_flow(2)
layout.itemR(ob, "dupli_frames_start", text="Start:")
layout.itemR(ob, "dupli_frames_end", text="End:")
layout.itemR(ob, "dupli_frames_on", text="On:")
layout.itemR(ob, "dupli_frames_off", text="Off:")
class OBJECT_PT_animation(bpy.types.Panel):
__label__ = "Animation"
__context__ = "object"
def draw(self, context):
ob = context.active_object
layout = self.layout
if not ob:
return
layout.template_column()
layout.template_slot("COLUMN_1")
layout.itemL(text="Time Offset:")
layout.itemR(ob, "time_offset_edit", text="Edit")
layout.itemR(ob, "time_offset_particle", text="Particle")
layout.itemR(ob, "time_offset_parent", text="Parent")
layout.itemR(ob, "slow_parent")
layout.itemR(ob, "time_offset", text="Offset:")
layout.template_slot("COLUMN_2")
layout.itemL(text="Tracking:")
layout.itemR(ob, "track_axis", text="Axis")
layout.itemR(ob, "up_axis", text="Up Axis")
layout.itemR(ob, "track_rotation", text="Rotation")
bpy.ui.addPanel(OBJECT_PT_transform, "BUTTONS_WINDOW", "WINDOW")
bpy.ui.addPanel(OBJECT_PT_groups, "BUTTONS_WINDOW", "WINDOW")
bpy.ui.addPanel(OBJECT_PT_display, "BUTTONS_WINDOW", "WINDOW")
bpy.ui.addPanel(OBJECT_PT_duplication, "BUTTONS_WINDOW", "WINDOW")
bpy.ui.addPanel(OBJECT_PT_animation, "BUTTONS_WINDOW", "WINDOW")

View File

@@ -42,6 +42,8 @@ struct ListBase;
struct direntry; struct direntry;
char *BLI_gethome(void); char *BLI_gethome(void);
char *BLI_gethome_folder(char *folder_name);
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file); void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file);
void BLI_make_exist(char *dir); void BLI_make_exist(char *dir);
void BLI_make_existing_file(char *name); void BLI_make_existing_file(char *name);

View File

@@ -827,6 +827,102 @@ char *BLI_gethome(void) {
#endif #endif
} }
/* this function returns the path to a blender folder, if it exists,
* trying in this order:
*
* $HOME/.blender/folder_name
* path_to_executable/.blender/folder_name
* release/folder_name (in svn)
*
* returns NULL if none is found. */
char *BLI_gethome_folder(char *folder_name)
{
extern char bprogname[]; /* argv[0] from creator.c */
static char homedir[FILE_MAXDIR] = "";
static char fulldir[FILE_MAXDIR] = "";
char tmpdir[FILE_MAXDIR];
char bprogdir[FILE_MAXDIR];
char *s;
int i;
if(folder_name) {
if(fulldir[0] != '\0')
return fulldir;
}
else if(homedir[0] != '\0')
return homedir;
/* BLI_gethome() can return NULL if env vars are not set */
s = BLI_gethome();
if(!s) { /* bail if no $HOME */
printf("$HOME is NOT set\n");
return NULL;
}
if(strstr(s, ".blender"))
BLI_strncpy(homedir, s, FILE_MAXDIR);
else
BLI_make_file_string("/", homedir, s, ".blender");
/* if $HOME/.blender/folder_name exists, return it */
if(BLI_exists(homedir)) {
if (folder_name) {
BLI_make_file_string("/", fulldir, homedir, folder_name);
if(BLI_exists(fulldir))
return fulldir;
}
else
return homedir;
}
else
homedir[0] = '\0';
/* if either:
* no homedir was found or
* folder_name = 1 but there's no folder_name/ inside homedir,
* use argv[0] (bprogname) to get .blender/ in
* Blender's installation dir */
s = BLI_last_slash(bprogname);
i = s - bprogname + 1;
BLI_strncpy(bprogdir, bprogname, i);
/* using tmpdir to preserve homedir (if) found above:
* the ideal is to have a home dir with folder_name dir inside
* it, but if that isn't available, it's possible to
* have a 'broken' home dir somewhere and a folder_name dir in the
* svn sources */
BLI_make_file_string("/", tmpdir, bprogdir, ".blender");
if(BLI_exists(tmpdir)) {
if(folder_name) {
BLI_make_file_string("/", fulldir, tmpdir, folder_name);
if(BLI_exists(fulldir)) {
BLI_strncpy(homedir, tmpdir, FILE_MAXDIR);
return fulldir;
}
else {
homedir[0] = '\0';
fulldir[0] = '\0';
}
}
else return homedir;
}
/* last try for folder_name dir: blender in svn dir, folder_name/ inside release/: */
if (folder_name) {
BLI_snprintf(tmpdir, sizeof(tmpdir), "release/%s", folder_name);
BLI_make_file_string("/", fulldir, bprogdir, tmpdir);
if (BLI_exists(fulldir)) return fulldir;
else fulldir[0] = '\0';
}
return NULL;
}
void BLI_clean(char *path) void BLI_clean(char *path)
{ {
if(path==0) return; if(path==0) return;

View File

@@ -4458,6 +4458,7 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
pa->active= 0; pa->active= 0;
pa->sortcounter= 0; pa->sortcounter= 0;
pa->activedata= NULL; pa->activedata= NULL;
pa->type= NULL;
} }
ar->regiondata= newdataadr(fd, ar->regiondata); ar->regiondata= newdataadr(fd, ar->regiondata);

View File

@@ -51,6 +51,7 @@
#include "WM_types.h" #include "WM_types.h"
#if 0
static void object_panel_transform(const bContext *C, Panel *pnl) static void object_panel_transform(const bContext *C, Panel *pnl)
{ {
uiLayout *layout= pnl->layout; uiLayout *layout= pnl->layout;
@@ -166,9 +167,11 @@ static void object_panel_animation(const bContext *C, Panel *pnl)
uiItemR(layout, "Up Axis: ", 0, &obptr, "up_axis"); uiItemR(layout, "Up Axis: ", 0, &obptr, "up_axis");
uiItemR(layout, "Rotation", 0, &obptr, "track_rotation"); uiItemR(layout, "Rotation", 0, &obptr, "track_rotation");
} }
#endif
void buttons_object_register(ARegionType *art) void buttons_object_register(ARegionType *art)
{ {
#if 0
PanelType *pt; PanelType *pt;
/* panels: transform */ /* panels: transform */
@@ -210,5 +213,6 @@ void buttons_object_register(ARegionType *art)
pt->context= "object"; pt->context= "object";
pt->draw= object_panel_animation; pt->draw= object_panel_animation;
BLI_addtail(&art->paneltypes, pt); BLI_addtail(&art->paneltypes, pt);
#endif
} }

View File

@@ -99,6 +99,7 @@ extern "C" {
/* 2.5 UI Scripts */ /* 2.5 UI Scripts */
int BPY_run_python_script( struct bContext *C, const char *filename, struct Text *text ); // 2.5 working int BPY_run_python_script( struct bContext *C, const char *filename, struct Text *text ); // 2.5 working
int BPY_run_script_space_draw(struct bContext *C, struct SpaceScript * sc); // 2.5 working int BPY_run_script_space_draw(struct bContext *C, struct SpaceScript * sc); // 2.5 working
void BPY_run_ui_scripts(struct bContext *C);
// int BPY_run_script_space_listener(struct bContext *C, struct SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5 working // int BPY_run_script_space_listener(struct bContext *C, struct SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5 working

View File

@@ -1,13 +1,19 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#ifndef WIN32
#include <dirent.h>
#else
#include "BLI_winstuff.h"
#endif
#include <Python.h> #include <Python.h>
#include "compile.h" /* for the PyCodeObject */ #include "compile.h" /* for the PyCodeObject */
#include "eval.h" /* for PyEval_EvalCode */ #include "eval.h" /* for PyEval_EvalCode */
#include "BKE_context.h"
#include "bpy_compat.h" #include "bpy_compat.h"
#include "bpy_rna.h" #include "bpy_rna.h"
@@ -15,11 +21,15 @@
#include "bpy_ui.h" #include "bpy_ui.h"
#include "DNA_space_types.h" #include "DNA_space_types.h"
#include "BKE_text.h"
#include "DNA_text_types.h" #include "DNA_text_types.h"
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
#include "BLI_util.h"
#include "BKE_context.h"
#include "BKE_text.h"
void BPY_free_compiled_text( struct Text *text ) void BPY_free_compiled_text( struct Text *text )
{ {
if( text->compiled ) { if( text->compiled ) {
@@ -293,3 +303,41 @@ int BPY_run_python_script_space(const char *modulename, const char *func)
return 1; return 1;
} }
#endif #endif
/* XXX this is temporary, need a proper script registration system for 2.5 */
void BPY_run_ui_scripts(bContext *C)
{
DIR *dir;
struct dirent *de;
struct stat status;
char *file_extension;
char path[FILE_MAX];
char *dirname= BLI_gethome_folder("ui");
if(!dirname)
return;
dir = opendir(dirname);
if(!dir)
return;
if (dir != NULL) {
while((de = readdir(dir)) != NULL) {
BLI_make_file_string("/", path, dirname, de->d_name);
stat(path, &status);
/* run if it is a .py file */
if(S_ISREG(status.st_mode)) {
file_extension = strstr(de->d_name, ".py");
if(file_extension && *(file_extension + 3) == '\0')
BPY_run_python_script(C, path, NULL);
}
}
closedir(dir);
}
}

View File

@@ -100,6 +100,7 @@ IF(UNIX AND NOT APPLE)
COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/.blender/ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/.blender/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/.blender/ COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/.blender/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/.blender/ COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/.blender/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/.blender/
COMMAND find ${TARGETDIR} -name CVS -prune -exec rm -rf {} "\;" COMMAND find ${TARGETDIR} -name CVS -prune -exec rm -rf {} "\;"
) )
ENDIF(UNIX AND NOT APPLE) ENDIF(UNIX AND NOT APPLE)
@@ -124,6 +125,7 @@ IF(APPLE)
COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/Resources/ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/Resources/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
COMMAND find ${TARGETDIR}/blender.app -name CVS -prune -exec rm -rf {} "\;" COMMAND find ${TARGETDIR}/blender.app -name CVS -prune -exec rm -rf {} "\;"
COMMAND find ${TARGETDIR}/blender.app -name CVS.sandboxinfo -prune -exec rm -rf {} "\;" COMMAND find ${TARGETDIR}/blender.app -name CVS.sandboxinfo -prune -exec rm -rf {} "\;"
COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;" COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
@@ -139,11 +141,13 @@ IF(WIN32)
COMMAND if not exist \"${TARGETDIR}\\.blender\" mkdir \"${TARGETDIR}\\.blender\" COMMAND if not exist \"${TARGETDIR}\\.blender\" mkdir \"${TARGETDIR}\\.blender\"
COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\" COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\"
COMMAND if not exist \"${TARGETDIR}\\.blender\\scripts\" mkdir \"${TARGETDIR}\\.blender\\scripts\" COMMAND if not exist \"${TARGETDIR}\\.blender\\scripts\" mkdir \"${TARGETDIR}\\.blender\\scripts\"
COMMAND if not exist \"${TARGETDIR}\\.blender\\ui\" mkdir \"${TARGETDIR}\\.blender\\ui\"
COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\" COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\" COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\"
COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\" COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\"
COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\" COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\"
COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\" COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\"
COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\ui\\*.*\" \"${TARGETDIR}\\.blender\\ui\"
COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\" COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\"
COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\" COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\"
COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\windows\\extra\\python25.zip\" \"${TARGETDIR}\\\" COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\windows\\extra\\python25.zip\" \"${TARGETDIR}\\\"

View File

@@ -528,6 +528,8 @@ int main(int argc, char **argv)
* on U.pythondir. * on U.pythondir.
*/ */
BPY_post_start_python(); BPY_post_start_python();
BPY_run_ui_scripts(C);
#endif #endif
#ifdef WITH_QUICKTIME #ifdef WITH_QUICKTIME