2.5: Top Menu

* Clean up File menu, added back recover last session op.
* .blend compress now behaves a bit different, previously
  it would only respect the user preference. Now it saves
  existing files the same way they are saved, and new files
  following the user preference. The save operator has a
  Compress toggle in the file browser left panels now.

* Add menu working again, some fixes to make these operators
  work outside the 3d view were needed.
* Timeline menu removed, its contents will be moved to the
  timeline header menus.
* Game menu can now start game, changed the start game op
  to choose another 3d view if none is available.
* Render menu has a few items now.
* Help menu contains a few links again.
This commit is contained in:
Brecht Van Lommel 2009-07-23 21:35:11 +00:00
parent 0bb50594f9
commit 1ee8038e41
11 changed files with 273 additions and 59 deletions

@ -7,6 +7,7 @@ class INFO_HT_header(bpy.types.Header):
def draw(self, context): def draw(self, context):
st = context.space_data st = context.space_data
rd = context.scene.render_data
layout = self.layout layout = self.layout
layout.template_header() layout.template_header()
@ -15,7 +16,6 @@ class INFO_HT_header(bpy.types.Header):
row = layout.row() row = layout.row()
row.itemM("INFO_MT_file") row.itemM("INFO_MT_file")
row.itemM("INFO_MT_add") row.itemM("INFO_MT_add")
row.itemM("INFO_MT_timeline")
row.itemM("INFO_MT_game") row.itemM("INFO_MT_game")
row.itemM("INFO_MT_render") row.itemM("INFO_MT_render")
row.itemM("INFO_MT_help") row.itemM("INFO_MT_help")
@ -36,21 +36,49 @@ class INFO_MT_file(bpy.types.Menu):
layout = self.layout layout = self.layout
layout.operator_context = "EXEC_AREA" layout.operator_context = "EXEC_AREA"
layout.itemO("wm.read_homefile") layout.itemO("wm.read_homefile", text="New")
layout.operator_context = "INVOKE_AREA" layout.operator_context = "INVOKE_AREA"
layout.itemO("wm.open_mainfile") layout.itemO("wm.open_mainfile", text="Open...")
layout.item_menu_enumO("wm.open_recentfile", "file", text="Open Recent")
layout.itemO("wm.recover_last_session")
layout.itemS() layout.itemS()
layout.operator_context = "EXEC_AREA" layout.operator_context = "EXEC_AREA"
layout.itemO("wm.save_mainfile") layout.itemO("wm.save_mainfile", text="Save")
layout.operator_context = "INVOKE_AREA" layout.operator_context = "INVOKE_AREA"
layout.itemO("wm.save_as_mainfile") layout.itemO("wm.save_as_mainfile", text="Save As...")
layout.itemS()
layout.itemM("INFO_MT_file_import")
layout.itemM("INFO_MT_file_export")
layout.itemS() layout.itemS()
layout.itemM("INFO_MT_file_external_data") layout.itemM("INFO_MT_file_external_data")
layout.itemS()
layout.operator_context = "EXEC_AREA"
layout.itemO("wm.exit_blender", text="Quit")
class INFO_MT_file_import(bpy.types.Menu):
__space_type__ = "USER_PREFERENCES"
__label__ = "Import"
def draw(self, context):
layout = self.layout
class INFO_MT_file_export(bpy.types.Menu):
__space_type__ = "USER_PREFERENCES"
__label__ = "Export"
def draw(self, context):
layout = self.layout
layout.itemO("export.ply", text="PLY")
class INFO_MT_file_external_data(bpy.types.Menu): class INFO_MT_file_external_data(bpy.types.Menu):
__space_type__ = "USER_PREFERENCES" __space_type__ = "USER_PREFERENCES"
__label__ = "External Data" __label__ = "External Data"
@ -74,15 +102,25 @@ class INFO_MT_add(bpy.types.Menu):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
layout.itemL(text="Nothing yet")
class INFO_MT_timeline(bpy.types.Menu): layout.operator_context = "EXEC_SCREEN"
__space_type__ = "USER_PREFERENCES"
__label__ = "Timeline"
def draw(self, context): layout.item_menu_enumO( "OBJECT_OT_mesh_add", "type", text="Mesh", icon="ICON_OUTLINER_OB_MESH")
layout = self.layout layout.item_menu_enumO( "OBJECT_OT_curve_add", "type", text="Curve", icon="ICON_OUTLINER_OB_CURVE")
layout.itemL(text="Nothing yet") layout.item_menu_enumO( "OBJECT_OT_surface_add", "type", text="Surface", icon="ICON_OUTLINER_OB_SURFACE")
layout.item_enumO("OBJECT_OT_object_add", "type", "META", icon="ICON_OUTLINER_OB_META")
layout.itemO("OBJECT_OT_text_add", text="Text", icon="ICON_OUTLINER_OB_FONT")
layout.itemS()
layout.itemO("OBJECT_OT_armature_add", text="Armature", icon="ICON_OUTLINER_OB_ARMATURE")
layout.item_enumO("OBJECT_OT_object_add", "type", "LATTICE", icon="ICON_OUTLINER_OB_LATTICE")
layout.item_enumO("OBJECT_OT_object_add", "type", "EMPTY", icon="ICON_OUTLINER_OB_EMPTY")
layout.itemS()
layout.item_enumO("OBJECT_OT_object_add", "type", "CAMERA", icon="ICON_OUTLINER_OB_CAMERA")
layout.item_enumO("OBJECT_OT_object_add", "type", "LAMP", icon="ICON_OUTLINER_OB_LAMP")
class INFO_MT_game(bpy.types.Menu): class INFO_MT_game(bpy.types.Menu):
__space_type__ = "USER_PREFERENCES" __space_type__ = "USER_PREFERENCES"
@ -90,7 +128,8 @@ class INFO_MT_game(bpy.types.Menu):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
layout.itemL(text="Nothing yet")
layout.itemO("view3d.game_start")
class INFO_MT_render(bpy.types.Menu): class INFO_MT_render(bpy.types.Menu):
__space_type__ = "USER_PREFERENCES" __space_type__ = "USER_PREFERENCES"
@ -98,7 +137,14 @@ class INFO_MT_render(bpy.types.Menu):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
layout.itemL(text="Nothing yet") rd = context.scene.render_data
layout.itemO("screen.render", text="Render Image")
layout.item_booleanO("screen.render", "animation", True, text="Render Animation")
layout.itemS()
layout.itemO("screen.render_view_show")
class INFO_MT_help(bpy.types.Menu): class INFO_MT_help(bpy.types.Menu):
__space_type__ = "USER_PREFERENCES" __space_type__ = "USER_PREFERENCES"
@ -106,7 +152,16 @@ class INFO_MT_help(bpy.types.Menu):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
layout.itemL(text="Nothing yet")
layout.itemO("help.manual")
layout.itemO("help.release_logs")
layout.itemS()
layout.itemO("help.blender_website")
layout.itemO("help.blender_eshop")
layout.itemO("help.developer_community")
layout.itemO("help.user_community")
class INFO_PT_tabs(bpy.types.Panel): class INFO_PT_tabs(bpy.types.Panel):
__space_type__ = "USER_PREFERENCES" __space_type__ = "USER_PREFERENCES"
@ -477,12 +532,12 @@ class INFO_PT_bottombar(bpy.types.Panel):
split.itemL(text="") split.itemL(text="")
split.itemO("wm.save_homefile", text="Save As Default") split.itemO("wm.save_homefile", text="Save As Default")
bpy.types.register(INFO_HT_header) bpy.types.register(INFO_HT_header)
bpy.types.register(INFO_MT_file) bpy.types.register(INFO_MT_file)
bpy.types.register(INFO_MT_file_import)
bpy.types.register(INFO_MT_file_export)
bpy.types.register(INFO_MT_file_external_data) bpy.types.register(INFO_MT_file_external_data)
bpy.types.register(INFO_MT_add) bpy.types.register(INFO_MT_add)
bpy.types.register(INFO_MT_timeline)
bpy.types.register(INFO_MT_game) bpy.types.register(INFO_MT_game)
bpy.types.register(INFO_MT_render) bpy.types.register(INFO_MT_render)
bpy.types.register(INFO_MT_help) bpy.types.register(INFO_MT_help)
@ -495,3 +550,57 @@ bpy.types.register(INFO_PT_autosave)
bpy.types.register(INFO_PT_language) bpy.types.register(INFO_PT_language)
bpy.types.register(INFO_PT_bottombar) bpy.types.register(INFO_PT_bottombar)
# Help operators
import bpy_ops # XXX - should not need to do this
del bpy_ops
class HelpOperator(bpy.types.Operator):
def execute(self, context):
try: import webbrowser
except: webbrowser = None
if webbrowser:
webbrowser.open(self.__URL__)
else:
raise Exception("Operator requires a full Python installation")
return ('FINISHED',)
class HELP_OT_manual(HelpOperator):
__idname__ = "help.manual"
__label__ = "Manual"
__URL__ = 'http://wiki.blender.org/index.php/Manual'
class HELP_OT_release_logs(HelpOperator):
__idname__ = "help.release_logs"
__label__ = "Release Logs"
__URL__ = 'http://www.blender.org/development/release-logs/'
class HELP_OT_blender_website(HelpOperator):
__idname__ = "help.blender_website"
__label__ = "Blender Website"
__URL__ = 'http://www.blender.org/'
class HELP_OT_blender_eshop(HelpOperator):
__idname__ = "help.blender_eshop"
__label__ = "Blender e-Shop"
__URL__ = 'http://www.blender3d.org/e-shop'
class HELP_OT_developer_community(HelpOperator):
__idname__ = "help.developer_community"
__label__ = "Developer Community"
__URL__ = 'http://www.blender.org/community/get-involved/'
class HELP_OT_user_community(HelpOperator):
__idname__ = "help.user_community"
__label__ = "User Community"
__URL__ = 'http://www.blender.org/community/user-community/'
bpy.ops.add(HELP_OT_manual)
bpy.ops.add(HELP_OT_release_logs)
bpy.ops.add(HELP_OT_blender_website)
bpy.ops.add(HELP_OT_blender_eshop)
bpy.ops.add(HELP_OT_developer_community)
bpy.ops.add(HELP_OT_user_community)

@ -4724,11 +4724,13 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
Mat3MulMat3(cmat, imat, mat); Mat3MulMat3(cmat, imat, mat);
Mat3Inv(imat, cmat); Mat3Inv(imat, cmat);
} }
else
Mat3One(imat);
setflagsNurb(editnurb, 0); setflagsNurb(editnurb, 0);
} }
else { else
return NULL; return NULL;
}
/* these types call this function to return a Nurb */ /* these types call this function to return a Nurb */
if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) { if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) {

@ -3587,10 +3587,11 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(scene->id.lib) return; if(scene->id.lib) return;
if(base==NULL) return; if(base==NULL) return;
if(sa->spacetype==SPACE_VIEW3D) if(sa && sa->spacetype==SPACE_VIEW3D)
v3d= sa->spacedata.first; v3d= sa->spacedata.first;
if((v3d==NULL || (base->lay & v3d->lay))==0) return; if(v3d && (base->lay & v3d->lay)==0) return;
else if(!v3d && (base->lay & scene->lay)==0) return;
ob = base->object; ob = base->object;

@ -93,7 +93,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
} }
else if(CTX_data_equals(member, "active_base")) { else if(CTX_data_equals(member, "active_base")) {
if(scene->basact) if(scene->basact)
CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact); CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact);
return 1; return 1;
} }

@ -206,6 +206,7 @@ int ED_operator_object_active(bContext *C)
int ED_operator_editmesh(bContext *C) int ED_operator_editmesh(bContext *C)
{ {
Object *obedit= CTX_data_edit_object(C); Object *obedit= CTX_data_edit_object(C);
printf("em %p %d\n", obedit, (obedit)? obedit->type == OB_MESH: -1);
if(obedit && obedit->type==OB_MESH) if(obedit && obedit->type==OB_MESH)
return NULL != ((Mesh *)obedit->data)->edit_mesh; return NULL != ((Mesh *)obedit->data)->edit_mesh;
return 0; return 0;

@ -1425,7 +1425,7 @@ static void RestoreState(bContext *C)
} }
/* maybe we need this defined somewhere else */ /* maybe we need this defined somewhere else */
extern void StartKetsjiShell(struct bContext *C,int always_use_expand_framing); extern void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing);
#endif // GAMEBLENDER == 1 #endif // GAMEBLENDER == 1
@ -1433,13 +1433,40 @@ static int game_engine_exec(bContext *C, wmOperator *unused)
{ {
#if GAMEBLENDER == 1 #if GAMEBLENDER == 1
Scene *startscene = CTX_data_scene(C); Scene *startscene = CTX_data_scene(C);
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa, *prevsa= CTX_wm_area(C);
ARegion *ar, *prevar= CTX_wm_region(C);
sa= prevsa;
if(sa->spacetype != SPACE_VIEW3D) {
for(sa=sc->areabase.first; sa; sa= sa->next)
if(sa->spacetype==SPACE_VIEW3D)
break;
}
if(!sa)
return OPERATOR_CANCELLED;
for(ar=sa->regionbase.first; ar; ar=ar->next)
if(ar->regiontype == RGN_TYPE_WINDOW)
break;
if(!ar)
return OPERATOR_CANCELLED;
// bad context switch ..
CTX_wm_area_set(C, sa);
CTX_wm_region_set(C, ar);
view3d_operator_needs_opengl(C); view3d_operator_needs_opengl(C);
SaveState(C); SaveState(C);
StartKetsjiShell(C, 1); StartKetsjiShell(C, ar, 1);
RestoreState(C); RestoreState(C);
CTX_wm_region_set(C, prevar);
CTX_wm_area_set(C, prevsa);
//XXX restore_all_scene_cfra(scene_cfra_store); //XXX restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(startscene); set_scene_bg(startscene);
//XXX scene_update_for_newframe(G.scene, G.scene->lay); //XXX scene_update_for_newframe(G.scene, G.scene->lay);
@ -1461,7 +1488,7 @@ void VIEW3D_OT_game_start(wmOperatorType *ot)
/* api callbacks */ /* api callbacks */
ot->exec= game_engine_exec; ot->exec= game_engine_exec;
ot->poll= ED_operator_view3d_active; //ot->poll= ED_operator_view3d_active;
} }
/* ************************************** */ /* ************************************** */

@ -57,7 +57,7 @@ struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect);
int WM_read_homefile (struct bContext *C, struct wmOperator *op); int WM_read_homefile (struct bContext *C, struct wmOperator *op);
int WM_write_homefile (struct bContext *C, struct wmOperator *op); int WM_write_homefile (struct bContext *C, struct wmOperator *op);
void WM_read_file (struct bContext *C, char *name, struct ReportList *reports); void WM_read_file (struct bContext *C, char *name, struct ReportList *reports);
void WM_write_file (struct bContext *C, char *target, struct ReportList *reports); void WM_write_file (struct bContext *C, char *target, int compress, struct ReportList *reports);
void WM_read_autosavefile(struct bContext *C); void WM_read_autosavefile(struct bContext *C);
void WM_write_autosave (struct bContext *C); void WM_write_autosave (struct bContext *C);

@ -451,7 +451,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
CTX_wm_region_set(C, NULL); CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL); CTX_wm_area_set(C, NULL);
retval= wm_operator_invoke(C, ot, window->eventstate, properties); retval= wm_operator_invoke(C, ot, event, properties);
CTX_wm_region_set(C, ar); CTX_wm_region_set(C, ar);
CTX_wm_area_set(C, area); CTX_wm_area_set(C, area);

@ -539,7 +539,7 @@ static void do_history(char *name, ReportList *reports)
BKE_report(reports, RPT_ERROR, "Unable to make version backup"); BKE_report(reports, RPT_ERROR, "Unable to make version backup");
} }
void WM_write_file(bContext *C, char *target, ReportList *reports) void WM_write_file(bContext *C, char *target, int compress, ReportList *reports)
{ {
Library *li; Library *li;
int writeflags, len; int writeflags, len;
@ -580,10 +580,11 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
do_history(di, reports); do_history(di, reports);
/* we use the UserDef to define compression flag */ writeflags= G.fileflags;
writeflags= G.fileflags & ~G_FILE_COMPRESS;
if(U.flag & USER_FILECOMPRESS) /* set compression flag */
writeflags |= G_FILE_COMPRESS; if(compress) writeflags |= G_FILE_COMPRESS;
else writeflags &= ~G_FILE_COMPRESS;
if (BLO_write_file(CTX_data_main(C), di, writeflags, reports)) { if (BLO_write_file(CTX_data_main(C), di, writeflags, reports)) {
strcpy(G.sce, di); strcpy(G.sce, di);
@ -592,6 +593,9 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
G.save_over = 1; /* disable untitled.blend convention */ G.save_over = 1; /* disable untitled.blend convention */
if(compress) G.fileflags |= G_FILE_COMPRESS;
else G.fileflags &= ~G_FILE_COMPRESS;
writeBlog(); writeBlog();
} }

@ -571,7 +571,7 @@ static void WM_OT_read_homefile(wmOperatorType *ot)
static int recentfile_exec(bContext *C, wmOperator *op) static int recentfile_exec(bContext *C, wmOperator *op)
{ {
int event= RNA_int_get(op->ptr, "nr"); int event= RNA_enum_get(op->ptr, "file");
// XXX wm in context is not set correctly after WM_read_file -> crash // XXX wm in context is not set correctly after WM_read_file -> crash
// do it before for now, but is this correct with multiple windows? // do it before for now, but is this correct with multiple windows?
@ -594,30 +594,54 @@ static int recentfile_exec(bContext *C, wmOperator *op)
static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event) static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{ {
struct RecentFile *recent;
uiPopupMenu *pup; uiPopupMenu *pup;
uiLayout *layout; uiLayout *layout;
int i, ofs= 0;
pup= uiPupMenuBegin(C, "Open Recent", 0); pup= uiPupMenuBegin(C, "Open Recent", 0);
layout= uiPupMenuLayout(pup); layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, op->type->idname, "file");
if(G.sce[0]) {
uiItemIntO(layout, G.sce, 0, op->type->idname, "nr", 1);
ofs = 1;
}
for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++)
if(strcmp(recent->filename, G.sce))
uiItemIntO(layout, recent->filename, 0, op->type->idname, "nr", i+ofs+1);
uiPupMenuEnd(C, pup); uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
static EnumPropertyItem *open_recentfile_itemf(bContext *C, PointerRNA *ptr, int *free)
{
EnumPropertyItem tmp = {0, "", 0, "", ""};
EnumPropertyItem *item= NULL;
struct RecentFile *recent;
int totitem= 0, i, ofs= 0;
if(G.sce[0]) {
tmp.value= 1;
tmp.identifier= G.sce;
tmp.name= G.sce;
RNA_enum_item_add(&item, &totitem, &tmp);
ofs = 1;
}
/* dynamically construct enum */
for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++) {
if(strcmp(recent->filename, G.sce)) {
tmp.value= i+ofs+1;
tmp.identifier= recent->filename;
tmp.name= recent->filename;
RNA_enum_item_add(&item, &totitem, &tmp);
}
}
RNA_enum_item_end(&item, &totitem);
*free= 1;
return item;
}
static void WM_OT_open_recentfile(wmOperatorType *ot) static void WM_OT_open_recentfile(wmOperatorType *ot)
{ {
PropertyRNA *prop;
static EnumPropertyItem file_items[]= {
{0, NULL, 0, NULL, NULL}};
ot->name= "Open Recent File"; ot->name= "Open Recent File";
ot->idname= "WM_OT_open_recentfile"; ot->idname= "WM_OT_open_recentfile";
@ -625,7 +649,8 @@ static void WM_OT_open_recentfile(wmOperatorType *ot)
ot->exec= recentfile_exec; ot->exec= recentfile_exec;
ot->poll= WM_operator_winactive; ot->poll= WM_operator_winactive;
RNA_def_property(ot->srna, "nr", PROP_INT, PROP_UNSIGNED); prop= RNA_def_enum(ot->srna, "file", file_items, 1, "File", "");
RNA_def_enum_funcs(prop, open_recentfile_itemf);
} }
/* ********* main file *********** */ /* ********* main file *********** */
@ -675,16 +700,58 @@ static void WM_OT_open_mainfile(wmOperatorType *ot)
ot->exec= wm_open_mainfile_exec; ot->exec= wm_open_mainfile_exec;
ot->poll= WM_operator_winactive; ot->poll= WM_operator_winactive;
ot->flag= 0;
RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
}
static int wm_recover_last_session_exec(bContext *C, wmOperator *op)
{
char scestr[FILE_MAX], filename[FILE_MAX];
int save_over;
/* back up some values */
BLI_strncpy(scestr, G.sce, sizeof(scestr));
save_over = G.save_over;
// XXX wm in context is not set correctly after WM_read_file -> crash
// do it before for now, but is this correct with multiple windows?
WM_event_add_notifier(C, NC_WINDOW, NULL);
/* load file */
BLI_make_file_string("/", filename, btempdir, "quit.blend");
WM_read_file(C, filename, op->reports);
/* restore */
G.save_over = save_over;
BLI_strncpy(G.sce, scestr, sizeof(G.sce));
return 0;
}
static void WM_OT_recover_last_session(wmOperatorType *ot)
{
ot->name= "Recover Last Session";
ot->idname= "WM_OT_recover_last_session";
ot->exec= wm_recover_last_session_exec;
ot->poll= WM_operator_winactive;
}
static void save_set_compress(wmOperator *op)
{
if(!RNA_property_is_set(op->ptr, "compress")) {
if(G.save_over) /* keep flag for existing file */
RNA_boolean_set(op->ptr, "compress", G.fileflags & G_FILE_COMPRESS);
else /* use userdef for new file */
RNA_boolean_set(op->ptr, "compress", U.flag & USER_FILECOMPRESS);
}
} }
static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{ {
char name[FILE_MAX]; char name[FILE_MAX];
save_set_compress(op);
BLI_strncpy(name, G.sce, FILE_MAX); BLI_strncpy(name, G.sce, FILE_MAX);
untitled(name); untitled(name);
RNA_string_set(op->ptr, "filename", name); RNA_string_set(op->ptr, "filename", name);
@ -698,6 +765,10 @@ static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *even
static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
{ {
char filename[FILE_MAX]; char filename[FILE_MAX];
int compress;
save_set_compress(op);
compress= RNA_boolean_get(op->ptr, "compress");
if(RNA_property_is_set(op->ptr, "filename")) if(RNA_property_is_set(op->ptr, "filename"))
RNA_string_get(op->ptr, "filename", filename); RNA_string_get(op->ptr, "filename", filename);
@ -705,7 +776,8 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
BLI_strncpy(filename, G.sce, FILE_MAX); BLI_strncpy(filename, G.sce, FILE_MAX);
untitled(filename); untitled(filename);
} }
WM_write_file(C, filename, op->reports);
WM_write_file(C, filename, compress, op->reports);
WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL); WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL);
@ -721,10 +793,8 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
ot->exec= wm_save_as_mainfile_exec; ot->exec= wm_save_as_mainfile_exec;
ot->poll= WM_operator_winactive; ot->poll= WM_operator_winactive;
ot->flag= 0; RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "");
RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file.");
RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
} }
/* *************** Save file directly ******** */ /* *************** Save file directly ******** */
@ -733,6 +803,8 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{ {
char name[FILE_MAX]; char name[FILE_MAX];
save_set_compress(op);
BLI_strncpy(name, G.sce, FILE_MAX); BLI_strncpy(name, G.sce, FILE_MAX);
untitled(name); untitled(name);
RNA_string_set(op->ptr, "filename", name); RNA_string_set(op->ptr, "filename", name);
@ -750,10 +822,8 @@ static void WM_OT_save_mainfile(wmOperatorType *ot)
ot->exec= wm_save_as_mainfile_exec; ot->exec= wm_save_as_mainfile_exec;
ot->poll= WM_operator_winactive; ot->poll= WM_operator_winactive;
ot->flag= 0; RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "");
RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file.");
RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
} }
@ -1590,6 +1660,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_exit_blender); WM_operatortype_append(WM_OT_exit_blender);
WM_operatortype_append(WM_OT_open_recentfile); WM_operatortype_append(WM_OT_open_recentfile);
WM_operatortype_append(WM_OT_open_mainfile); WM_operatortype_append(WM_OT_open_mainfile);
WM_operatortype_append(WM_OT_recover_last_session);
WM_operatortype_append(WM_OT_jobs_timer); WM_operatortype_append(WM_OT_jobs_timer);
WM_operatortype_append(WM_OT_save_as_mainfile); WM_operatortype_append(WM_OT_save_as_mainfile);
WM_operatortype_append(WM_OT_save_mainfile); WM_operatortype_append(WM_OT_save_mainfile);

@ -118,11 +118,10 @@ static BlendFileData *load_game_data(char *filename)
return bfd; return bfd;
} }
extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_framing) extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing)
{ {
/* context values */ /* context values */
struct wmWindow *win= CTX_wm_window(C); struct wmWindow *win= CTX_wm_window(C);
struct ARegion *ar= CTX_wm_region(C);
struct Scene *scene= CTX_data_scene(C); struct Scene *scene= CTX_data_scene(C);
struct Main* maggie1= CTX_data_main(C); struct Main* maggie1= CTX_data_main(C);