[Bf-blender-cvs] [d7c2b78822f] blender2.8: UI: add subpanel support.

Brecht Van Lommel noreply at git.blender.org
Sun Jun 3 21:36:47 CEST 2018


Commit: d7c2b78822ff20fb78418c43d6badd692fa98784
Author: Brecht Van Lommel
Date:   Sun Jun 3 13:32:36 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd7c2b78822ff20fb78418c43d6badd692fa98784

UI: add subpanel support.

In the Python API, any panel becomes a subpanel by setting bl_parent_id
to the name of the parent panel. These subpanels can contain advanced or
less commonly used settings.

===================================================================

M	source/blender/blenkernel/BKE_blender_version.h
M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/include/UI_resources.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_panel.c
M	source/blender/editors/interface/resources.c
M	source/blender/editors/screen/area.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_ui.c
M	source/blender/makesrna/intern/rna_userdef.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 8befeff498e..a1212322983 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -28,7 +28,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         280
-#define BLENDER_SUBVERSION      16
+#define BLENDER_SUBVERSION      17
 /* Several breakages with 270, e.g. constraint deg vs rad */
 #define BLENDER_MINVERSION      270
 #define BLENDER_MINSUBVERSION   6
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index f284e633c5e..0b95152ad8e 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -205,7 +205,8 @@ typedef struct PanelType {
 	char translation_context[BKE_ST_MAXNAME];
 	char context[BKE_ST_MAXNAME];             /* for buttons window */
 	char category[BKE_ST_MAXNAME];            /* for category tabs */
-	char owner_id[BKE_ST_MAXNAME];              /* for work-spaces to selectively show. */
+	char owner_id[BKE_ST_MAXNAME];            /* for work-spaces to selectively show. */
+	char parent_id[BKE_ST_MAXNAME];           /* parent idname for subpanels */
 	int space_type;
 	int region_type;
 
@@ -218,6 +219,10 @@ typedef struct PanelType {
 	/* draw entirely, view changes should be handled here */
 	void (*draw)(const struct bContext *C, struct Panel *pa);
 
+	/* sub panels */
+	struct PanelType *parent;
+	ListBase children;
+
 	/* RNA integration */
 	ExtensionRNA ext;
 } PanelType;
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index ece68884f5c..8cff10902ef 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -69,13 +69,19 @@ static void spacetype_free(SpaceType *st)
 	for (art = st->regiontypes.first; art; art = art->next) {
 		BLI_freelistN(&art->drawcalls);
 
-		for (pt = art->paneltypes.first; pt; pt = pt->next)
-			if (pt->ext.free)
+		for (pt = art->paneltypes.first; pt; pt = pt->next) {
+			if (pt->ext.free) {
 				pt->ext.free(pt->ext.data);
+			}
+
+			BLI_freelistN(&pt->children);
+		}
 
-		for (ht = art->headertypes.first; ht; ht = ht->next)
-			if (ht->ext.free)
+		for (ht = art->headertypes.first; ht; ht = ht->next) {
+			if (ht->ext.free) {
 				ht->ext.free(ht->ext.data);
+			}
+		}
 
 		BLI_freelistN(&art->paneltypes);
 		BLI_freelistN(&art->headertypes);
@@ -169,10 +175,35 @@ void BKE_spacedata_freelist(ListBase *lb)
 	BLI_freelistN(lb);
 }
 
+static void panel_list_copy(ListBase *newlb, const ListBase *lb)
+{
+	BLI_listbase_clear(newlb);
+	BLI_duplicatelist(newlb, lb);
+
+	/* copy panel pointers */
+	Panel *newpa = newlb->first;
+	Panel *pa = lb->first;
+	for (; newpa; newpa = newpa->next, pa = pa->next) {
+		newpa->activedata = NULL;
+
+		Panel *newpatab = newlb->first;
+		Panel *patab = lb->first;
+		while (newpatab) {
+			if (newpa->paneltab == patab) {
+				newpa->paneltab = newpatab;
+				break;
+			}
+			newpatab = newpatab->next;
+			patab = patab->next;
+		}
+
+		panel_list_copy(&newpa->children, &pa->children);
+	}
+}
+
 ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar)
 {
 	ARegion *newar = MEM_dupallocN(ar);
-	Panel *pa, *newpa, *patab;
 	
 	newar->prev = newar->next = NULL;
 	BLI_listbase_clear(&newar->handlers);
@@ -199,25 +230,10 @@ ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar)
 	if (ar->v2d.tab_offset)
 		newar->v2d.tab_offset = MEM_dupallocN(ar->v2d.tab_offset);
 	
-	BLI_listbase_clear(&newar->panels);
-	BLI_duplicatelist(&newar->panels, &ar->panels);
+	panel_list_copy(&newar->panels, &ar->panels);
 
 	BLI_listbase_clear(&newar->ui_previews);
 	BLI_duplicatelist(&newar->ui_previews, &ar->ui_previews);
-
-	/* copy panel pointers */
-	for (newpa = newar->panels.first; newpa; newpa = newpa->next) {
-		patab = newar->panels.first;
-		pa = ar->panels.first;
-		while (patab) {
-			if (newpa->paneltab == pa) {
-				newpa->paneltab = patab;
-				break;
-			}
-			patab = patab->next;
-			pa = pa->next;
-		}
-	}
 	
 	return newar;
 }
@@ -329,6 +345,19 @@ void BKE_region_callback_free_manipulatormap_set(void (*callback)(struct wmManip
 	region_free_manipulatormap_callback = callback;
 }
 
+static void panel_list_free(ListBase *lb)
+{
+	Panel *pa, *pa_next;
+	for (pa = lb->first; pa; pa = pa_next) {
+		pa_next = pa->next;
+		if (pa->activedata) {
+			MEM_freeN(pa->activedata);
+		}
+		panel_list_free(&pa->children);
+		MEM_freeN(pa);
+	}
+}
+
 /* not region itself */
 void BKE_area_region_free(SpaceType *st, ARegion *ar)
 {
@@ -351,16 +380,7 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar)
 		ar->v2d.tab_offset = NULL;
 	}
 
-	if (!BLI_listbase_is_empty(&ar->panels)) {
-		Panel *pa, *pa_next;
-		for (pa = ar->panels.first; pa; pa = pa_next) {
-			pa_next = pa->next;
-			if (pa->activedata) {
-				MEM_freeN(pa->activedata);
-			}
-			MEM_freeN(pa);
-		}
-	}
+	panel_list_free(&ar->panels);
 
 	for (uilst = ar->ui_lists.first; uilst; uilst = uilst->next) {
 		if (uilst->dyn_data) {
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index d2542e977e3..b0a1789eb7e 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6396,19 +6396,24 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
 
 /* *********** READ AREA **************** */
 
-static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
+static void direct_link_panel_list(FileData *fd, ListBase *lb)
 {
-	Panel *pa;
-	uiList *ui_list;
-
-	link_list(fd, &ar->panels);
+	link_list(fd, lb);
 
-	for (pa = ar->panels.first; pa; pa = pa->next) {
+	for (Panel *pa = lb->first; pa; pa = pa->next) {
 		pa->paneltab = newdataadr(fd, pa->paneltab);
 		pa->runtime_flag = 0;
 		pa->activedata = NULL;
 		pa->type = NULL;
+		direct_link_panel_list(fd, &pa->children);
 	}
+}
+
+static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
+{
+	uiList *ui_list;
+
+	direct_link_panel_list(fd, &ar->panels);
 
 	link_list(fd, &ar->panels_category_active);
 
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index de1699e24b7..fb7b3e47153 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2762,14 +2762,19 @@ static void write_soops(WriteData *wd, SpaceOops *so)
 	}
 }
 
+static void write_panel_list(WriteData *wd, ListBase *lb)
+{
+	for (Panel *pa = lb->first; pa; pa = pa->next) {
+		writestruct(wd, DATA, Panel, 1, pa);
+		write_panel_list(wd, &pa->children);
+	}
+}
+
 static void write_area_regions(WriteData *wd, ScrArea *area)
 {
 	for (ARegion *region = area->regionbase.first; region; region = region->next) {
 		write_region(wd, region, area->spacetype);
-
-		for (Panel *pa = region->panels.first; pa; pa = pa->next) {
-			writestruct(wd, DATA, Panel, 1, pa);
-		}
+		write_panel_list(wd, &region->panels);
 
 		for (PanelCategoryStack *pc_act = region->panels_category_active.first; pc_act; pc_act = pc_act->next) {
 			writestruct(wd, DATA, PanelCategoryStack, 1, pc_act);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 5779d6410a8..dc9de9f275f 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -491,8 +491,6 @@ void UI_blocklist_update_window_matrix(const struct bContext *C, const struct Li
 void UI_blocklist_draw(const struct bContext *C, const struct ListBase *lb);
 void UI_block_update_from_old(const struct bContext *C, struct uiBlock *block);
 
-uiBlock *UI_block_find_in_region(const char *name, struct ARegion *ar);
-
 void UI_block_emboss_set(uiBlock *block, char dt);
 
 void UI_block_free(const struct bContext *C, uiBlock *block);
@@ -824,9 +822,10 @@ void UI_panels_begin(const struct bContext *C, struct ARegion *ar);
 void UI_panels_end(const struct bContext *C, struct ARegion *ar, int *x, int *y);
 void UI_panels_draw(const struct bContext *C, struct ARegion *ar);
 
-struct Panel *UI_panel_find_by_type(struct ARegion *ar, struct PanelType *pt);
-struct Panel *UI_panel_begin(struct ScrArea *sa, struct ARegion *ar, uiBlock *block,
-                             struct PanelType *pt, struct Panel *pa, bool *r_open);
+struct Panel *UI_panel_find_by_type(struct ListBase *lb, struct PanelType *pt);
+struct Panel *UI_panel_begin(struct ScrArea *sa, struct ARegion *ar, struct ListBase *lb,
+                             uiBlock *block, struct PanelType *pt, struct Panel *pa,
+                             bool *r_open);
 void UI_panel_end(uiBlock *block, int width, int height);
 void UI_panels_scale(struct ARegion *ar, float new_width);
 
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index b89a57b02d1..f47daf1a963 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -74,6 +74,7 @@ typedef enum ThemeColorID {
 	/* panels */
 	TH_PANEL_HEADER,
 	TH_PANEL_BACK,
+	TH_PANEL_SUB_BACK,
 	TH_PANEL_SHOW_HEADER,
 	TH_PANEL_SHOW_BACK,
 	
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index a9995001659..6cb667cb9a8 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -2814,11 +2814,6 @@ uiBlock *UI_block_begin(const bContext *C, ARegion *region, const char *name, sh
 	return block;
 }
 
-uiBlock *UI_block_find_in_region(const char *name, ARegion *ar)
-{
-	return BLI_findstring(&ar->uiblocks, name, offsetof(uiBlock, name));
-}
-
 void UI_block_emboss_set(uiBlock *block, char dt)
 {
 	block->dt = dt;
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 5711f76e3e9..3847aa72519 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -110,6 +110,7 @@ typedef struct uiHandlePanelData {
 	in

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list