Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / space_file / space_file.c
index 8b681bd..62e7c79 100644 (file)
@@ -49,6 +49,7 @@
 
 #include "WM_api.h"
 #include "WM_types.h"
+#include "WM_message.h"
 
 #include "ED_space_api.h"
 #include "ED_screen.h"
@@ -67,7 +68,7 @@
 
 /* ******************** default callbacks for file space ***************** */
 
-static SpaceLink *file_new(const bContext *UNUSED(C))
+static SpaceLink *file_new(const ScrArea *UNUSED(area), const Scene *UNUSED(scene))
 {
        ARegion *ar;
        SpaceFile *sfile;
@@ -291,11 +292,13 @@ static void file_refresh(const bContext *C, ScrArea *sa)
                file_tools_region(sa);
 
                ED_area_initialize(wm, CTX_wm_window(C), sa);
-               ED_area_tag_redraw(sa);
        }
+
+       ED_area_tag_redraw(sa);
 }
 
-static void file_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
+static void file_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Scene *UNUSED(scene),
+                          WorkSpace *UNUSED(workspace))
 {
        SpaceFile *sfile = (SpaceFile *)sa->spacedata.first;
 
@@ -305,16 +308,13 @@ static void file_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn)
                        switch (wmn->data) {
                                case ND_SPACE_FILE_LIST:
                                        ED_area_tag_refresh(sa);
-                                       ED_area_tag_redraw(sa);
                                        break;
                                case ND_SPACE_FILE_PARAMS:
                                        ED_area_tag_refresh(sa);
-                                       ED_area_tag_redraw(sa);
                                        break;
                                case ND_SPACE_FILE_PREVIEW:
                                        if (sfile->files && filelist_cache_previews_update(sfile->files)) {
                                                ED_area_tag_refresh(sa);
-                                               ED_area_tag_redraw(sa);
                                        }
                                        break;
                        }
@@ -337,7 +337,9 @@ static void file_main_region_init(wmWindowManager *wm, ARegion *ar)
        WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
 }
 
-static void file_main_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
+static void file_main_region_listener(
+        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar,
+        wmNotifier *wmn, const Scene *UNUSED(scene))
 {
        /* context changes */
        switch (wmn->category) {
@@ -354,6 +356,42 @@ static void file_main_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa),
        }
 }
 
+static void file_main_region_message_subscribe(
+        const struct bContext *UNUSED(C),
+        struct WorkSpace *UNUSED(workspace), struct Scene *UNUSED(scene),
+        struct bScreen *screen, struct ScrArea *sa, struct ARegion *ar,
+        struct wmMsgBus *mbus)
+{
+       SpaceFile *sfile = sa->spacedata.first;
+       FileSelectParams *params = ED_fileselect_get_params(sfile);
+       /* This is a bit odd that a region owns the subscriber for an area,
+        * keep for now since all subscribers for WM are regions.
+        * May be worth re-visiting later. */
+       wmMsgSubscribeValue msg_sub_value_area_tag_refresh = {
+               .owner = ar,
+               .user_data = sa,
+               .notify = ED_area_do_msg_notify_tag_refresh,
+       };
+
+       /* SpaceFile itself. */
+       {
+               PointerRNA ptr;
+               RNA_pointer_create(&screen->id, &RNA_SpaceFileBrowser, sfile, &ptr);
+
+               /* All properties for this space type. */
+               WM_msg_subscribe_rna(mbus, &ptr, NULL, &msg_sub_value_area_tag_refresh, __func__);
+       }
+
+       /* FileSelectParams */
+       {
+               PointerRNA ptr;
+               RNA_pointer_create(&screen->id, &RNA_FileSelectParams, params, &ptr);
+
+               /* All properties for this space type. */
+               WM_msg_subscribe_rna(mbus, &ptr, NULL, &msg_sub_value_area_tag_refresh, __func__);
+       }
+}
+
 static void file_main_region_draw(const bContext *C, ARegion *ar)
 {
        /* draw entirely, view changes should be handled here */
@@ -601,7 +639,9 @@ static void file_tools_region_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, NULL, -1, true);
 }
 
-static void file_tools_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
+static void file_tools_region_listener(
+        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar),
+        wmNotifier *UNUSED(wmn), const Scene *UNUSED(scene))
 {
 #if 0
        /* context changes */
@@ -663,7 +703,9 @@ static void file_ui_region_draw(const bContext *C, ARegion *ar)
        UI_view2d_view_restore(C);
 }
 
-static void file_ui_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
+static void file_ui_region_listener(
+        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar,
+        wmNotifier *wmn, const Scene *UNUSED(scene))
 {
        /* context changes */
        switch (wmn->category) {
@@ -727,6 +769,7 @@ void ED_spacetype_file(void)
        art->init = file_main_region_init;
        art->draw = file_main_region_draw;
        art->listener = file_main_region_listener;
+       art->message_subscribe = file_main_region_message_subscribe;
        art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D;
        BLI_addhead(&st->regiontypes, art);