Drag & Drop: Support Open/Link/Append when dropping .blend file

When a .blend file is dropped into Blender a small menu opens.
In that menu the user can choose between three options: Open, Link and Append.

Reviewers: brecht

Differential Revision: https://developer.blender.org/D3801
This commit is contained in:
Jacques Lucke
2018-10-22 17:18:42 +02:00
parent 0628fe7a6c
commit 650cdc6b2d
3 changed files with 32 additions and 11 deletions

View File

@@ -2677,6 +2677,30 @@ class WM_MT_splash(Menu):
layout.separator()
class WM_OT_drop_blend_file(Operator):
bl_idname = "wm.drop_blend_file"
bl_label = "Handle dropped .blend file"
bl_options = {'INTERNAL'}
filepath: StringProperty()
def invoke(self, context, event):
context.window_manager.popup_menu(self.draw_menu, title=bpy.path.basename(self.filepath), icon='QUESTION')
return {"FINISHED"}
def draw_menu(self, menu, context):
layout = menu.layout
col = layout.column()
col.operator_context = 'EXEC_DEFAULT'
col.operator("wm.open_mainfile", text="Open", icon='FILE_FOLDER').filepath = self.filepath
layout.separator()
col = layout.column()
col.operator_context = 'INVOKE_DEFAULT'
col.operator("wm.link", text="Link...", icon='LINK_BLEND').filepath = self.filepath
col.operator("wm.append", text="Append...", icon='APPEND_BLEND').filepath = self.filepath
classes = (
BRUSH_OT_active_index_set,
WM_OT_addon_disable,
@@ -2710,6 +2734,7 @@ classes = (
WM_OT_copy_prev_settings,
WM_OT_doc_view,
WM_OT_doc_view_manual,
WM_OT_drop_blend_file,
WM_OT_keyconfig_activate,
WM_OT_keyconfig_export,
WM_OT_keyconfig_import,

View File

@@ -4855,7 +4855,7 @@ static void keymap_modal_set(wmKeyConfig *keyconf)
}
static bool open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
static bool blend_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
{
if (drag->type == WM_DRAG_PATH) {
if (drag->icon == ICON_FILE_BLEND)
@@ -4864,11 +4864,10 @@ static bool open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent
return 0;
}
static void open_file_drop_copy(wmDrag *drag, wmDropBox *drop)
static void blend_file_drop_copy(wmDrag *drag, wmDropBox *drop)
{
/* copy drag path to properties */
RNA_string_set(drop->ptr, "filepath", drag->path);
drop->opcontext = WM_OP_EXEC_DEFAULT;
}
@@ -5055,7 +5054,7 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
/* dropbox for entire window */
lb = WM_dropboxmap_find("Window", 0, 0);
WM_dropbox_add(lb, "WM_OT_open_mainfile", open_file_drop_poll, open_file_drop_copy);
WM_dropbox_add(lb, "WM_OT_drop_blend_file", blend_file_drop_poll, blend_file_drop_copy);
WM_dropbox_add(lb, "UI_OT_drop_color", UI_drop_color_poll, UI_drop_color_copy);
keymap_modal_set(keyconf);

View File

@@ -106,11 +106,7 @@ static bool wm_link_append_poll(bContext *C)
static int wm_link_append_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
if (RNA_struct_property_is_set(op->ptr, "filepath")) {
return WM_operator_call_notest(C, op);
}
else {
/* XXX TODO solve where to get last linked library from */
if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
if (G.lib[0] != '\0') {
RNA_string_set(op->ptr, "filepath", G.lib);
}
@@ -120,9 +116,10 @@ static int wm_link_append_invoke(bContext *C, wmOperator *op, const wmEvent *UNU
BLI_parent_dir(path);
RNA_string_set(op->ptr, "filepath", path);
}
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
}
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
}
static short wm_link_append_flag(wmOperator *op)