UI: Windows Blend File Association

This patch allows Windows users to specify that their current blender
installation should be used to create thumbnails and be associated
with ".blend" files. This is done from Preferences / System. The only
way to do this currently is from the command-line and this is sometimes
inconvenient.

Differential Revision: https://developer.blender.org/D10887

Reviewed by Brecht Van Lommel
This commit is contained in:
Harley Acheson 2021-06-14 10:15:37 -07:00
parent 2e5671a959
commit bcff0ef9ca
Notes: blender-bot 2023-02-14 01:35:49 +01:00
Referenced by commit d08e925ef1, Fix Build Warning
Referenced by issue #87140, [Windows Store] No preview thumbnail for blend files.
7 changed files with 68 additions and 4 deletions

View File

@ -605,6 +605,25 @@ class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel):
# col.row().prop(system, "opensubdiv_compute_type", text="")
class USERPREF_PT_system_os_settings(SystemPanel, CenterAlignMixIn, Panel):
bl_label = "Operating System Settings"
@classmethod
def poll(cls, _context):
# Only for Windows so far
import sys
return sys.platform[:3] == "win"
def draw_centered(self, context, layout):
prefs = context.preferences
layout.label(text="Make this installation your default Blender")
split = layout.split(factor=0.4)
split.alignment = 'RIGHT'
split.label(text="")
split.operator("file.associate_blend", text="Make Default")
class USERPREF_PT_system_memory(SystemPanel, CenterAlignMixIn, Panel):
bl_label = "Memory & Limits"
@ -2324,6 +2343,7 @@ classes = (
USERPREF_PT_animation_fcurves,
USERPREF_PT_system_cycles_devices,
USERPREF_PT_system_os_settings,
USERPREF_PT_system_memory,
USERPREF_PT_system_video_sequencer,
USERPREF_PT_system_sound,

View File

@ -105,7 +105,7 @@ int closedir(DIR *dp);
const char *dirname(char *path);
/* Windows utility functions. */
void BLI_windows_register_blend_extension(const bool background);
bool BLI_windows_register_blend_extension(const bool background);
void BLI_windows_get_default_root_dir(char *root_dir);
int BLI_windows_get_executable_dir(char *str);

View File

@ -67,10 +67,9 @@ static void register_blend_extension_failed(HKEY root, const bool background)
if (!background) {
MessageBox(0, "Could not register file extension.", "Blender error", MB_OK | MB_ICONERROR);
}
TerminateProcess(GetCurrentProcess(), 1);
}
void BLI_windows_register_blend_extension(const bool background)
bool BLI_windows_register_blend_extension(const bool background)
{
LONG lresult;
HKEY hkey = 0;
@ -107,6 +106,7 @@ void BLI_windows_register_blend_extension(const bool background)
lresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
if (lresult != ERROR_SUCCESS) {
register_blend_extension_failed(0, background);
return false;
}
}
@ -119,6 +119,7 @@ void BLI_windows_register_blend_extension(const bool background)
}
if (lresult != ERROR_SUCCESS) {
register_blend_extension_failed(root, background);
return false;
}
lresult = RegCreateKeyEx(root,
@ -137,6 +138,7 @@ void BLI_windows_register_blend_extension(const bool background)
}
if (lresult != ERROR_SUCCESS) {
register_blend_extension_failed(root, background);
return false;
}
lresult = RegCreateKeyEx(root,
@ -155,6 +157,7 @@ void BLI_windows_register_blend_extension(const bool background)
}
if (lresult != ERROR_SUCCESS) {
register_blend_extension_failed(root, background);
return false;
}
lresult = RegCreateKeyEx(
@ -166,6 +169,7 @@ void BLI_windows_register_blend_extension(const bool background)
}
if (lresult != ERROR_SUCCESS) {
register_blend_extension_failed(root, background);
return false;
}
BLI_windows_get_executable_dir(InstallDir);
@ -184,7 +188,7 @@ void BLI_windows_register_blend_extension(const bool background)
"all users");
MessageBox(0, MBox, "Blender", MB_OK | MB_ICONINFORMATION);
}
TerminateProcess(GetCurrentProcess(), 0);
return true;
}
void BLI_windows_get_default_root_dir(char *root)

View File

@ -62,6 +62,7 @@ void FILE_OT_bookmark_cleanup(struct wmOperatorType *ot);
void FILE_OT_bookmark_move(struct wmOperatorType *ot);
void FILE_OT_reset_recent(wmOperatorType *ot);
void FILE_OT_hidedot(struct wmOperatorType *ot);
void FILE_OT_associate_blend(struct wmOperatorType *ot);
void FILE_OT_execute(struct wmOperatorType *ot);
void FILE_OT_mouse_execute(struct wmOperatorType *ot);
void FILE_OT_cancel(struct wmOperatorType *ot);

View File

@ -2632,6 +2632,43 @@ void FILE_OT_hidedot(struct wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
/** \name Associate File Type Operator (Windows only)
* \{ */
static int associate_blend_exec(bContext *C, wmOperator *op)
{
#ifdef WIN32
WM_cursor_wait(true);
if (BLI_windows_register_blend_extension(true)) {
BKE_report(op->reports, RPT_INFO, "File association registered");
WM_cursor_wait(false);
return OPERATOR_FINISHED;
}
else {
BKE_report(op->reports, RPT_ERROR, "Unable to register file association");
WM_cursor_wait(false);
return OPERATOR_CANCELLED;
}
#else
BKE_report(op->reports, RPT_WARNING, "Operator Not supported");
return OPERATOR_CANCELLED;
#endif
}
void FILE_OT_associate_blend(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Register File Association";
ot->description = "Use this installation for .blend files and to display thumbnails";
ot->idname = "FILE_OT_associate_blend";
/* api callbacks */
ot->exec = associate_blend_exec;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Increment Filename Operator
* \{ */

View File

@ -675,6 +675,7 @@ static void file_operatortypes(void)
WM_operatortype_append(FILE_OT_bookmark_move);
WM_operatortype_append(FILE_OT_reset_recent);
WM_operatortype_append(FILE_OT_hidedot);
WM_operatortype_append(FILE_OT_associate_blend);
WM_operatortype_append(FILE_OT_filenum);
WM_operatortype_append(FILE_OT_directory_new);
WM_operatortype_append(FILE_OT_delete);

View File

@ -1317,6 +1317,7 @@ static int arg_handle_register_extension(int UNUSED(argc), const char **UNUSED(a
G.background = 1;
}
BLI_windows_register_blend_extension(G.background);
TerminateProcess(GetCurrentProcess(), 0);
# else
(void)data; /* unused */
# endif