Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_wm_api.c
index c81256154026ea5d640f562fb293acf14644774e..e33f02c7a76e7fe65dee2041f2e9b7581295bda7 100644 (file)
@@ -71,6 +71,8 @@ const EnumPropertyItem rna_enum_window_cursor_items[] = {
 #include "UI_interface.h"
 #include "BKE_context.h"
 
+#include "WM_types.h"
+
 static wmKeyMap *rna_keymap_active(wmKeyMap *km, bContext *C)
 {
        wmWindowManager *wm = CTX_wm_manager(C);
@@ -115,6 +117,37 @@ static void rna_event_timer_remove(struct wmWindowManager *wm, wmTimer *timer)
        WM_event_remove_timer(wm, timer->win, timer);
 }
 
+
+static wmManipulatorGroupType *wm_manipulatorgrouptype_find_for_add_remove(ReportList *reports, const char *idname)
+{
+       wmManipulatorGroupType *wgt = WM_manipulatorgrouptype_find(idname, true);
+       if (wgt == NULL) {
+               BKE_reportf(reports, RPT_ERROR, "Manipulator group type '%s' not found!", idname);
+               return NULL;
+       }
+       if (wgt->flag & WM_MANIPULATORGROUPTYPE_PERSISTENT) {
+               BKE_reportf(reports, RPT_ERROR, "Manipulator group '%s' has 'PERSISTENT' option set!", idname);
+               return NULL;
+       }
+       return wgt;
+}
+
+static void rna_manipulator_group_type_add(ReportList *reports, const char *idname)
+{
+       wmManipulatorGroupType *wgt = wm_manipulatorgrouptype_find_for_add_remove(reports, idname);
+       if (wgt != NULL) {
+               WM_manipulator_group_type_add_ptr(wgt);
+       }
+}
+
+static void rna_manipulator_group_type_remove(Main *bmain, ReportList *reports, const char *idname)
+{
+       wmManipulatorGroupType *wgt = wm_manipulatorgrouptype_find_for_add_remove(reports, idname);
+       if (wgt != NULL) {
+               WM_manipulator_group_type_remove_ptr(bmain, wgt);
+       }
+}
+
 /* placeholder data for final implementation of a true progressbar */
 static struct wmStaticProgress {
        float min;
@@ -340,6 +373,24 @@ static void rna_PopMenuEnd(bContext *C, PointerRNA *handle)
        UI_popup_menu_end(C, handle->data);
 }
 
+/* popover wrapper */
+static PointerRNA rna_PopoverBegin(bContext *C)
+{
+       PointerRNA r_ptr;
+       void *data;
+
+       data = (void *)UI_popover_begin(C);
+
+       RNA_pointer_create(NULL, &RNA_UIPopover, data, &r_ptr);
+
+       return r_ptr;
+}
+
+static void rna_PopoverEnd(bContext *C, PointerRNA *handle, wmKeyMap *keymap)
+{
+       UI_popover_end(C, handle->data, keymap);
+}
+
 /* pie menu wrapper */
 static PointerRNA rna_PieMenuBegin(bContext *C, const char *title, int icon, PointerRNA *event)
 {
@@ -358,6 +409,18 @@ static void rna_PieMenuEnd(bContext *C, PointerRNA *handle)
        UI_pie_menu_end(C, handle->data);
 }
 
+static PointerRNA rna_WindoManager_operator_properties_last(const char *idname)
+{
+       wmOperatorType *ot = WM_operatortype_find(idname, true);
+
+       if (ot != NULL) {
+               PointerRNA ptr;
+               WM_operator_last_properties_ensure(ot, &ptr);
+               return ptr;
+       }
+       return PointerRNA_NULL;
+}
+
 #else
 
 #define WM_GEN_INVOKE_EVENT (1 << 0)
@@ -451,6 +514,18 @@ void RNA_api_wm(StructRNA *srna)
        parm = RNA_def_pointer(func, "timer", "Timer", "", "");
        RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
 
+       func = RNA_def_function(srna, "manipulator_group_type_add", "rna_manipulator_group_type_add");
+       RNA_def_function_ui_description(func, "Activate an existing widget group (when the persistent option isn't set)");
+       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_REPORTS);
+       parm = RNA_def_string(func, "identifier", NULL, 0, "", "Manipulator group type name");
+       RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
+       func = RNA_def_function(srna, "manipulator_group_type_remove", "rna_manipulator_group_type_remove");
+       RNA_def_function_ui_description(func, "De-activate a widget group (when the persistent option isn't set)");
+       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_MAIN | FUNC_USE_REPORTS);
+       parm = RNA_def_string(func, "identifier", NULL, 0, "", "Manipulator group type name");
+       RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
        /* Progress bar interface */
        func = RNA_def_function(srna, "progress_begin", "rna_progress_begin");
        RNA_def_function_ui_description(func, "Start progress report");
@@ -521,6 +596,23 @@ void RNA_api_wm(StructRNA *srna)
        parm = RNA_def_pointer(func, "menu", "UIPopupMenu", "", "");
        RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
 
+
+       /* wrap UI_popover_begin */
+       func = RNA_def_function(srna, "popover_begin__internal", "rna_PopoverBegin");
+       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
+       /* return */
+       parm = RNA_def_pointer(func, "menu", "UIPopover", "", "");
+       RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
+       RNA_def_function_return(func, parm);
+
+       /* wrap UI_popover_end */
+       func = RNA_def_function(srna, "popover_end__internal", "rna_PopoverEnd");
+       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
+       parm = RNA_def_pointer(func, "menu", "UIPopover", "", "");
+       RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
+       RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Active key map");
+
+
        /* wrap uiPieMenuBegin */
        func = RNA_def_function(srna, "piemenu_begin__internal", "rna_PieMenuBegin");
        RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
@@ -540,6 +632,17 @@ void RNA_api_wm(StructRNA *srna)
        RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
        parm = RNA_def_pointer(func, "menu", "UIPieMenu", "", "");
        RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
+
+       /* access last operator options (optionally create). */
+       func = RNA_def_function(srna, "operator_properties_last", "rna_WindoManager_operator_properties_last");
+       RNA_def_function_flag(func, FUNC_NO_SELF);
+       parm = RNA_def_string(func, "operator", NULL, 0, "", "");
+       RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+       /* return */
+       parm = RNA_def_pointer(func, "result", "OperatorProperties", "", "");
+       RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
+       RNA_def_function_return(func, parm);
+
 }
 
 void RNA_api_operator(StructRNA *srna)