Prefernces: support loading last saved preferences

This commit is contained in:
2019-05-13 12:44:08 +10:00
parent d7eed63b6d
commit ac94c219ae
5 changed files with 149 additions and 21 deletions

View File

@@ -81,7 +81,9 @@ class USERPREF_PT_save_preferences(Panel):
layout.scale_x = 1.3
layout.scale_y = 1.3
layout.operator("wm.save_userpref")
col = layout.column(align=True)
col.operator("wm.save_userpref")
col.operator("wm.read_userpref")
# Panel mix-in.

View File

@@ -738,6 +738,7 @@ void wm_homefile_read(bContext *C,
ReportList *reports,
bool use_factory_settings,
bool use_empty_data,
bool use_data,
bool use_userdef,
const char *filepath_startup_override,
const char *app_template_override,
@@ -768,7 +769,14 @@ void wm_homefile_read(bContext *C,
* And in this case versioning code is to be run.
*/
bool read_userdef_from_memory = false;
eBLOReadSkip skip_flags = use_userdef ? 0 : BLO_READ_SKIP_USERDEF;
eBLOReadSkip skip_flags = 0;
if (use_data == false) {
skip_flags |= BLO_READ_SKIP_DATA;
}
if (use_userdef == false) {
skip_flags |= BLO_READ_SKIP_USERDEF;
}
/* True if we load startup.blend from memory
* or use app-template startup.blend which the user hasn't saved. */
@@ -781,15 +789,17 @@ void wm_homefile_read(bContext *C,
SET_FLAG_FROM_TEST(G.f, (U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0, G_FLAG_SCRIPT_AUTOEXEC);
}
BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_LOAD_PRE);
if (use_data) {
BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_LOAD_PRE);
G.relbase_valid = 0;
/* put aside screens to match with persistent windows later */
wm_window_match_init(C, &wmbase);
}
UI_view2d_zoom_cache_reset();
G.relbase_valid = 0;
/* put aside screens to match with persistent windows later */
wm_window_match_init(C, &wmbase);
filepath_startup[0] = '\0';
filepath_userdef[0] = '\0';
app_template_system[0] = '\0';
@@ -911,7 +921,9 @@ void wm_homefile_read(bContext *C,
}
if (success) {
if (update_defaults) {
BLO_update_defaults_startup_blend(CTX_data_main(C), app_template);
if (use_data) {
BLO_update_defaults_startup_blend(CTX_data_main(C), app_template);
}
}
is_factory_startup = filepath_startup_is_factory;
}
@@ -990,10 +1002,12 @@ void wm_homefile_read(bContext *C,
BLI_strncpy(U.app_template, app_template_override, sizeof(U.app_template));
}
/* Prevent buggy files that had G_FILE_RELATIVE_REMAP written out by mistake.
* Screws up autosaves otherwise can remove this eventually,
* only in a 2.53 and older, now its not written. */
G.fileflags &= ~G_FILE_RELATIVE_REMAP;
if (use_data) {
/* Prevent buggy files that had G_FILE_RELATIVE_REMAP written out by mistake.
* Screws up autosaves otherwise can remove this eventually,
* only in a 2.53 and older, now its not written. */
G.fileflags &= ~G_FILE_RELATIVE_REMAP;
}
bmain = CTX_data_main(C);
@@ -1003,8 +1017,10 @@ void wm_homefile_read(bContext *C,
reset_app_template = true;
}
/* match the read WM with current WM */
wm_window_match_do(C, &wmbase, &bmain->wm, &bmain->wm);
if (use_data) {
/* match the read WM with current WM */
wm_window_match_do(C, &wmbase, &bmain->wm, &bmain->wm);
}
if (use_factory_settings) {
/* Clear keymaps because the current default keymap may have been initialized
@@ -1016,14 +1032,16 @@ void wm_homefile_read(bContext *C,
}
}
WM_check(C); /* opens window(s), checks keymaps */
if (use_data) {
WM_check(C); /* opens window(s), checks keymaps */
bmain->name[0] = '\0';
bmain->name[0] = '\0';
/* start with save preference untitled.blend */
G.save_over = 0;
/* start with save preference untitled.blend */
G.save_over = 0;
wm_file_read_post(C, true, is_factory_startup, reset_app_template);
wm_file_read_post(C, true, is_factory_startup, reset_app_template);
}
if (r_is_factory_startup) {
*r_is_factory_startup = is_factory_startup;
@@ -1693,6 +1711,105 @@ void WM_OT_save_userpref(wmOperatorType *ot)
ot->exec = wm_userpref_write_exec;
}
static void rna_struct_update_when_changed(bContext *C,
Main *bmain,
PointerRNA *ptr_a,
PointerRNA *ptr_b)
{
CollectionPropertyIterator iter;
PropertyRNA *iterprop = RNA_struct_iterator_property(ptr_a->type);
BLI_assert(ptr_a->type == ptr_b->type);
RNA_property_collection_begin(ptr_a, iterprop, &iter);
for (; iter.valid; RNA_property_collection_next(&iter)) {
PropertyRNA *prop = iter.ptr.data;
if (STREQ(RNA_property_identifier(prop), "rna_type")) {
continue;
}
switch (RNA_property_type(prop)) {
case PROP_POINTER: {
PointerRNA ptr_sub_a = RNA_property_pointer_get(ptr_a, prop);
PointerRNA ptr_sub_b = RNA_property_pointer_get(ptr_b, prop);
rna_struct_update_when_changed(C, bmain, &ptr_sub_a, &ptr_sub_b);
break;
}
case PROP_COLLECTION:
/* Don't handle collections. */
break;
default: {
if (!RNA_property_equals(bmain, ptr_a, ptr_b, prop, RNA_EQ_STRICT)) {
RNA_property_update(C, ptr_b, prop);
}
}
}
}
RNA_property_collection_end(&iter);
}
static void wm_userpref_update_when_changed(bContext *C,
Main *bmain,
UserDef *userdef_prev,
UserDef *userdef_curr)
{
PointerRNA ptr_a, ptr_b;
RNA_pointer_create(NULL, &RNA_Preferences, userdef_prev, &ptr_a);
RNA_pointer_create(NULL, &RNA_Preferences, userdef_curr, &ptr_b);
rna_struct_update_when_changed(C, bmain, &ptr_a, &ptr_b);
#ifdef WITH_PYTHON
BPY_execute_string(C, (const char *[]){"addon_utils", NULL}, "addon_utils.reset_all()");
#endif
WM_keyconfig_reload(C);
}
static int wm_userpref_read_exec(bContext *C, wmOperator *op)
{
const bool use_data = false;
const bool use_userdef = true;
const bool use_factory_settings = false; /* TODO, support this. */
UserDef U_backup = U;
wm_homefile_read(C,
op->reports,
use_factory_settings,
false,
use_data,
use_userdef,
NULL,
WM_init_state_app_template_get(),
NULL);
#define USERDEF_RESTORE(member) \
{ \
U.member = U_backup.member; \
} \
((void)0)
USERDEF_RESTORE(userpref);
#undef USERDEF_RESTORE
Main *bmain = CTX_data_main(C);
wm_userpref_update_when_changed(C, bmain, &U_backup, &U);
WM_event_add_notifier(C, NC_WINDOW, NULL);
return OPERATOR_FINISHED;
}
void WM_OT_read_userpref(wmOperatorType *ot)
{
ot->name = "Load Preferences";
ot->idname = "WM_OT_read_userpref";
ot->description = "Load last saved preferences";
ot->invoke = WM_operator_confirm;
ot->exec = wm_userpref_read_exec;
}
static int wm_history_file_read_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
ED_file_read_bookmarks();
@@ -1767,10 +1884,12 @@ static int wm_homefile_read_exec(bContext *C, wmOperator *op)
app_template = WM_init_state_app_template_get();
}
bool use_data = true;
wm_homefile_read(C,
op->reports,
use_factory_settings,
use_empty_data,
use_data,
use_userdef,
filepath,
app_template,

View File

@@ -255,11 +255,15 @@ void WM_init(bContext *C, int argc, const char **argv)
/* get the default database, plus a wm */
bool is_factory_startup = true;
const bool use_data = true;
const bool use_userdef = true;
wm_homefile_read(C,
NULL,
G.factory_startup,
false,
true,
use_data,
use_userdef,
NULL,
WM_init_state_app_template_get(),
&is_factory_startup);

View File

@@ -3504,6 +3504,7 @@ void wm_operatortypes_register(void)
WM_operatortype_append(WM_OT_read_factory_settings);
WM_operatortype_append(WM_OT_save_homefile);
WM_operatortype_append(WM_OT_save_userpref);
WM_operatortype_append(WM_OT_read_userpref);
WM_operatortype_append(WM_OT_userpref_autoexec_path_add);
WM_operatortype_append(WM_OT_userpref_autoexec_path_remove);
WM_operatortype_append(WM_OT_window_fullscreen_toggle);

View File

@@ -33,6 +33,7 @@ void wm_homefile_read(struct bContext *C,
struct ReportList *reports,
bool use_factory_settings,
bool use_empty_data,
bool use_data,
bool use_userdef,
const char *filepath_startup_override,
const char *app_template_override,
@@ -43,6 +44,7 @@ void WM_OT_save_homefile(struct wmOperatorType *ot);
void WM_OT_userpref_autoexec_path_add(struct wmOperatorType *ot);
void WM_OT_userpref_autoexec_path_remove(struct wmOperatorType *ot);
void WM_OT_save_userpref(struct wmOperatorType *ot);
void WM_OT_read_userpref(struct wmOperatorType *ot);
void WM_OT_read_history(struct wmOperatorType *ot);
void WM_OT_read_homefile(struct wmOperatorType *ot);
void WM_OT_read_factory_settings(struct wmOperatorType *ot);