Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_screen.c
index 0a997ca2163f25f0516920d168c4414902677184..725149841887b9236f6bc0bb00714a6f5e069b1c 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "DNA_screen_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_workspace_types.h"
 
 const EnumPropertyItem rna_enum_region_type_items[] = {
        {RGN_TYPE_WINDOW, "WINDOW", 0, "Window", ""},
@@ -56,7 +57,10 @@ const EnumPropertyItem rna_enum_region_type_items[] = {
 #ifdef RNA_RUNTIME
 
 #include "BKE_global.h"
-#include "BKE_depsgraph.h"
+#include "BKE_workspace.h"
+#include "BKE_screen.h"
+
+#include "DEG_depsgraph.h"
 
 #include "UI_view2d.h"
 
@@ -64,55 +68,72 @@ const EnumPropertyItem rna_enum_region_type_items[] = {
 #  include "BPY_extern.h"
 #endif
 
-static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value)
+static void rna_Screen_bar_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
-       bScreen *sc = (bScreen *)ptr->data;
-
-       if (value.data == NULL)
-               return;
-
-       sc->newscene = value.data;
+       bScreen *screen = (bScreen *)ptr->data;
+       screen->do_draw = true;
+       screen->do_refresh = true;
 }
 
-static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
+static void rna_Screen_redraw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
-       bScreen *sc = (bScreen *)ptr->data;
-
-       /* exception: must use context so notifier gets to the right window  */
-       if (sc->newscene) {
-#ifdef WITH_PYTHON
-               BPy_BEGIN_ALLOW_THREADS;
-#endif
+       bScreen *screen = (bScreen *)ptr->data;
 
-               ED_screen_set_scene(C, sc, sc->newscene);
+       /* the settings for this are currently only available from a menu in the TimeLine,
+        * hence refresh=SPACE_ACTION, as timeline is now in there
+        */
+       ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_ACTION);
+}
 
-#ifdef WITH_PYTHON
-               BPy_END_ALLOW_THREADS;
-#endif
+static bool rna_Screen_is_animation_playing_get(PointerRNA *UNUSED(ptr))
+{
+       /* can be NULL on file load, T42619 */
+       wmWindowManager *wm = G_MAIN->wm.first;
+       return wm ? (ED_screen_animation_playing(wm) != NULL) : 0;
+}
 
-               WM_event_add_notifier(C, NC_SCENE | ND_SCENEBROWSE, sc->newscene);
+static int rna_region_alignment_get(PointerRNA *ptr)
+{
+       ARegion *region = ptr->data;
+       return (region->alignment & ~RGN_SPLIT_PREV);
+}
 
-               if (G.debug & G_DEBUG)
-                       printf("scene set %p\n", sc->newscene);
+static void rna_Screen_layout_name_get(PointerRNA *ptr, char *value)
+{
+       const bScreen *screen = ptr->data;
+       const WorkSpaceLayout *layout = BKE_workspace_layout_find_global(G_MAIN, screen, NULL);
 
-               sc->newscene = NULL;
+       if (layout) {
+               const char *name = BKE_workspace_layout_name_get(layout);
+               strcpy(value, name);
+       }
+       else {
+               value[0] = '\0';
        }
 }
 
-static void rna_Screen_redraw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
+static int rna_Screen_layout_name_length(PointerRNA *ptr)
 {
-       bScreen *screen = (bScreen *)ptr->data;
+       const bScreen *screen = ptr->data;
+       const WorkSpaceLayout *layout = BKE_workspace_layout_find_global(G_MAIN, screen, NULL);
 
-       /* the settings for this are currently only available from a menu in the TimeLine, hence refresh=SPACE_TIME */
-       ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_TIME);
-}
+       if (layout) {
+               const char *name = BKE_workspace_layout_name_get(layout);
+               return strlen(name);
+       }
 
+       return 0;
+}
 
-static bool rna_Screen_is_animation_playing_get(PointerRNA *UNUSED(ptr))
+static void rna_Screen_layout_name_set(PointerRNA *ptr, const char *value)
 {
-       /* can be NULL on file load, T42619 */
-       wmWindowManager *wm = G_MAIN->wm.first;
-       return wm ? (ED_screen_animation_playing(wm) != NULL) : 0;
+       bScreen *screen = ptr->data;
+       WorkSpace *workspace;
+       WorkSpaceLayout *layout = BKE_workspace_layout_find_global(G_MAIN, screen, &workspace);
+
+       if (layout) {
+               BKE_workspace_layout_name_set(workspace, layout, value);
+       }
 }
 
 static bool rna_Screen_fullscreen_get(PointerRNA *ptr)
@@ -124,21 +145,41 @@ static bool rna_Screen_fullscreen_get(PointerRNA *ptr)
 /* UI compatible list: should not be needed, but for now we need to keep EMPTY
  * at least in the static version of this enum for python scripts. */
 static const EnumPropertyItem *rna_Area_type_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr),
-                                             PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
+                                             PropertyRNA *UNUSED(prop), bool *r_free)
 {
+       EnumPropertyItem *item = NULL;
+       int totitem = 0;
+
        /* +1 to skip SPACE_EMPTY */
-       return rna_enum_space_type_items + 1;
+       for (const EnumPropertyItem *item_from = rna_enum_space_type_items + 1; item_from->identifier; item_from++) {
+               if (ELEM(item_from->value, SPACE_TOPBAR, SPACE_STATUSBAR, SPACE_USERPREF)) {
+                       continue;
+               }
+               RNA_enum_item_add(&item, &totitem, item_from);
+       }
+       RNA_enum_item_end(&item, &totitem);
+       *r_free = true;
+
+       return item;
 }
 
 static int rna_Area_type_get(PointerRNA *ptr)
 {
        ScrArea *sa = (ScrArea *)ptr->data;
-       /* read from this instead of 'spacetype' for correct reporting: T41435 */
-       return sa->butspacetype;
+       /* Usually 'spacetype' is used. It lags behind a bit while switching area
+        * type though, then we use 'butspacetype' instead (T41435). */
+       return (sa->butspacetype == SPACE_EMPTY) ? sa->spacetype : sa->butspacetype;
 }
 
 static void rna_Area_type_set(PointerRNA *ptr, int value)
 {
+       if (ELEM(value, SPACE_TOPBAR, SPACE_STATUSBAR, SPACE_USERPREF)) {
+               /* Special case: An area can not be set to show the top-bar editor (or
+                * other global areas). However it should still be possible to identify
+                * its type from Python. */
+               return;
+       }
+
        ScrArea *sa = (ScrArea *)ptr->data;
        sa->butspacetype = value;
 }
@@ -152,7 +193,7 @@ static void rna_Area_type_update(bContext *C, PointerRNA *ptr)
 
        /* XXX this call still use context, so we trick it to work in the right context */
        for (win = wm->windows.first; win; win = win->next) {
-               if (sc == win->screen) {
+               if (sc == WM_window_get_active_screen(win)) {
                        wmWindow *prevwin = CTX_wm_window(C);
                        ScrArea *prevsa = CTX_wm_area(C);
                        ARegion *prevar = CTX_wm_region(C);
@@ -164,9 +205,12 @@ static void rna_Area_type_update(bContext *C, PointerRNA *ptr)
                        ED_area_newspace(C, sa, sa->butspacetype, true);
                        ED_area_tag_redraw(sa);
 
+                       /* Unset so that rna_Area_type_get uses spacetype instead. */
+                       sa->butspacetype = SPACE_EMPTY;
+
                        /* It is possible that new layers becomes visible. */
                        if (sa->spacetype == SPACE_VIEW3D) {
-                               DAG_on_visible_update(CTX_data_main(C), false);
+                               DEG_on_visible_update(CTX_data_main(C), false);
                        }
 
                        CTX_wm_window_set(C, prevwin);
@@ -177,6 +221,75 @@ static void rna_Area_type_update(bContext *C, PointerRNA *ptr)
        }
 }
 
+
+static const EnumPropertyItem *rna_Area_ui_type_itemf(
+        bContext *C, PointerRNA *UNUSED(ptr),
+        PropertyRNA *UNUSED(prop), bool *r_free)
+{
+       EnumPropertyItem *item = NULL;
+       int totitem = 0;
+
+       /* +1 to skip SPACE_EMPTY */
+       for (const EnumPropertyItem *item_from = rna_enum_space_type_items + 1; item_from->identifier; item_from++) {
+               if (ELEM(item_from->value, SPACE_TOPBAR, SPACE_STATUSBAR, SPACE_USERPREF)) {
+                       continue;
+               }
+
+               SpaceType *st = item_from->identifier[0] ? BKE_spacetype_from_id(item_from->value) : NULL;
+               int totitem_prev = totitem;
+               if (st && st->space_subtype_item_extend != NULL) {
+                       st->space_subtype_item_extend(C, &item, &totitem);
+                       while (totitem_prev < totitem) {
+                               item[totitem_prev++].value |= item_from->value << 16;
+                       }
+               }
+               else {
+                       RNA_enum_item_add(&item, &totitem, item_from);
+                       item[totitem_prev++].value = item_from->value << 16;
+               }
+       }
+       RNA_enum_item_end(&item, &totitem);
+       *r_free = true;
+
+       return item;
+}
+
+static int rna_Area_ui_type_get(PointerRNA *ptr)
+{
+       int value = rna_Area_type_get(ptr) << 16;
+       ScrArea *sa = ptr->data;
+       if (sa->type->space_subtype_item_extend != NULL) {
+               value |= sa->type->space_subtype_get(sa);
+       }
+       return value;
+}
+
+static void rna_Area_ui_type_set(PointerRNA *ptr, int value)
+{
+       ScrArea *sa = ptr->data;
+       const int space_type = value >> 16;
+       SpaceType *st = BKE_spacetype_from_id(space_type);
+
+       rna_Area_type_set(ptr, space_type);
+
+       if (st && st->space_subtype_item_extend != NULL) {
+               sa->butspacetype_subtype = value & 0xffff;
+       }
+}
+
+static void rna_Area_ui_type_update(bContext *C, PointerRNA *ptr)
+{
+       ScrArea *sa = ptr->data;
+       SpaceType *st = BKE_spacetype_from_id(sa->butspacetype);
+
+       rna_Area_type_update(C, ptr);
+
+       if ((sa->type == st) && (st->space_subtype_item_extend != NULL)) {
+               st->space_subtype_set(sa, sa->butspacetype_subtype);
+       }
+       sa->butspacetype_subtype = 0;
+}
+
 static void rna_View2D_region_to_view(struct View2D *v2d, int x, int y, float result[2])
 {
        UI_view2d_region_to_view(v2d, x, y, &result[0], &result[1]);
@@ -215,8 +328,8 @@ static void rna_def_area_api(StructRNA *srna)
 
        RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
 
-       func = RNA_def_function(srna, "header_text_set", "ED_area_headerprint");
-       RNA_def_function_ui_description(func, "Set the header text");
+       func = RNA_def_function(srna, "header_text_set", "ED_area_status_text");
+       RNA_def_function_ui_description(func, "Set the header status text");
        RNA_def_string(func, "text", NULL, 0, "Text", "New string for the header, no argument clears the text");
 }
 
@@ -257,6 +370,15 @@ static void rna_def_area(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Area_type_update");
 
+       prop = RNA_def_property(srna, "ui_type", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);  /* infact dummy */
+       RNA_def_property_enum_default(prop, 0);
+       RNA_def_property_enum_funcs(prop, "rna_Area_ui_type_get", "rna_Area_ui_type_set", "rna_Area_ui_type_itemf");
+       RNA_def_property_ui_text(prop, "Editor Type", "Current editor type for this area");
+       RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+       RNA_def_property_update(prop, 0, "rna_Area_ui_type_update");
+
        prop = RNA_def_property(srna, "x", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "totrct.xmin");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -329,15 +451,23 @@ static void rna_def_region(BlenderRNA *brna)
        StructRNA *srna;
        PropertyRNA *prop;
 
+       static const EnumPropertyItem alignment_types[] = {
+               {RGN_ALIGN_NONE, "NONE", 0, "None", "Don't use any fixed alignment, fill available space"},
+               {RGN_ALIGN_TOP, "TOP", 0, "Top", ""},
+               {RGN_ALIGN_BOTTOM, "BOTTOM", 0, "Bottom", ""},
+               {RGN_ALIGN_LEFT, "LEFT", 0, "Left", ""},
+               {RGN_ALIGN_RIGHT, "RIGHT", 0, "Right", ""},
+               {RGN_ALIGN_HSPLIT, "HORIZONTAL_SPLIT", 0, "Horizontal Split", ""},
+               {RGN_ALIGN_VSPLIT, "VERTICAL_SPLIT", 0, "Vertical Split", ""},
+               {RGN_ALIGN_FLOAT, "FLOAT", 0, "Float", "Region floats on screen, doesn't use any fixed alignment"},
+               {RGN_ALIGN_QSPLIT, "QUAD_SPLIT", 0, "Quad Split", "Region is split horizontally and vertically"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
        srna = RNA_def_struct(brna, "Region", NULL);
        RNA_def_struct_ui_text(srna, "Region", "Region in a subdivided screen area");
        RNA_def_struct_sdna(srna, "ARegion");
 
-       prop = RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "swinid");
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, "Region ID", "Unique ID for this region");
-
        prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "regiontype");
        RNA_def_property_enum_items(prop, rna_enum_region_type_items);
@@ -370,6 +500,12 @@ static void rna_def_region(BlenderRNA *brna)
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_ui_text(prop, "View2D", "2D view of the region");
 
+       prop = RNA_def_property(srna, "alignment", PROP_ENUM, PROP_NONE);
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_enum_items(prop, alignment_types);
+       RNA_def_property_enum_funcs(prop, "rna_region_alignment_get", NULL, NULL);
+       RNA_def_property_ui_text(prop, "Alignment", "Alignment of the region within the area");
+
        RNA_def_function(srna, "tag_redraw", "ED_region_tag_redraw");
 }
 
@@ -383,13 +519,11 @@ static void rna_def_screen(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Screen", "Screen data-block, defining the layout of areas in a window");
        RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
 
-       /* pointers */
-       prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
-       RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL);
-       RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL);
-       RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen");
-       RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
-       RNA_def_property_update(prop, 0, "rna_Screen_scene_update");
+       prop = RNA_def_property(srna, "layout_name", PROP_STRING, PROP_NONE);
+       RNA_def_property_string_funcs(prop, "rna_Screen_layout_name_get", "rna_Screen_layout_name_length",
+                                     "rna_Screen_layout_name_set");
+       RNA_def_property_ui_text(prop, "Layout Name", "The name of the layout that refers to the screen");
+       RNA_def_struct_name_property(srna, prop);
 
        /* collections */
        prop = RNA_def_property(srna, "areas", PROP_COLLECTION, PROP_NONE);
@@ -408,6 +542,16 @@ static void rna_def_screen(BlenderRNA *brna)
        RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL);
        RNA_def_property_ui_text(prop, "Maximize", "An area is maximized, filling this screen");
 
+       prop = RNA_def_property(srna, "show_topbar", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SCREEN_COLLAPSE_TOPBAR);
+       RNA_def_property_ui_text(prop, "Show Top Bar", "Show top bar with tool settings");
+       RNA_def_property_update(prop, 0, "rna_Screen_bar_update");
+
+       prop = RNA_def_property(srna, "show_statusbar", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SCREEN_COLLAPSE_STATUSBAR);
+       RNA_def_property_ui_text(prop, "Show Status Bar", "Show status bar");
+       RNA_def_property_update(prop, 0, "rna_Screen_bar_update");
+
        /* Define Anim Playback Areas */
        prop = RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_REGION);