[Bf-blender-cvs] [da40b73] UI-experiments: UI-experiments: User Preferences tabs

Julian Eisel noreply at git.blender.org
Sat Apr 25 20:21:58 CEST 2015


Commit: da40b73f32dac8c354e2849f194be3e62f7a9317
Author: Julian Eisel
Date:   Sat Apr 25 20:17:47 2015 +0200
Branches: UI-experiments
https://developer.blender.org/rBda40b73f32dac8c354e2849f194be3e62f7a9317

UI-experiments: User Preferences tabs

Looking at this, there's still a lot to be done :P

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

M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/blenkernel/BKE_blender.h
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_draw.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_layout.c
M	source/blender/editors/interface/interface_widgets.c
M	source/blender/editors/interface/resources.c
M	source/blender/editors/interface/view2d.c
M	source/blender/editors/interface/view2d_ops.c
M	source/blender/editors/screen/CMakeLists.txt
M	source/blender/editors/screen/area.c
M	source/blender/editors/space_userpref/space_userpref.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_screen.c
M	source/blender/makesrna/intern/rna_ui_api.c
M	source/blender/makesrna/intern/rna_userdef.c
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 3b17e40..2fdaf3c 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -72,7 +72,7 @@ class USERPREF_HT_header(Header):
 class USERPREF_PT_tabs(Panel):
     bl_label = ""
     bl_space_type = 'USER_PREFERENCES'
-    bl_region_type = 'WINDOW'
+    bl_region_type = 'TABS'
     bl_options = {'HIDE_HEADER'}
 
     def draw(self, context):
@@ -80,7 +80,7 @@ class USERPREF_PT_tabs(Panel):
 
         userpref = context.user_preferences
 
-        layout.prop(userpref, "active_section", expand=True)
+        layout.prop_tabs(userpref, "active_section")
 
 
 class USERPREF_MT_interaction_presets(Menu):
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 0815538..1506669 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         274
-#define BLENDER_SUBVERSION      5
+#define BLENDER_SUBVERSION      6
 /* Several breakages with 270, e.g. constraint deg vs rad */
 #define BLENDER_MINVERSION      270
 #define BLENDER_MINSUBVERSION   5
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 66b9468..d3ec420 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -186,6 +186,8 @@ enum {
 
 #define UI_PANEL_CATEGORY_MARGIN_WIDTH (U.widget_unit * 1.0f)
 
+#define UI_TAB_REGION_MARGIN_HEIGHT (U.widget_unit * 1.15f)
+
 /* but->drawflag - these flags should only affect how the button is drawn. */
 /* Note: currently, these flags _are not passed_ to the widget's state() or draw() functions
  *       (except for the 'align' ones)!
@@ -247,6 +249,7 @@ typedef enum {
 	UI_BTYPE_CHECKBOX               = (13 << 9),  /* similar to toggle, display a 'tick' */
 	UI_BTYPE_CHECKBOX_N             = (14 << 9),
 	UI_BTYPE_COLOR                  = (15 << 9),
+	UI_BTYPE_TAB                    = (16 << 9),
 	UI_BTYPE_SCROLL                 = (18 << 9),
 	UI_BTYPE_BLOCK                  = (19 << 9),
 	UI_BTYPE_LABEL                  = (20 << 9),
@@ -944,6 +947,7 @@ void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *p
 void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value);
 void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon);
 void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiItemTabsR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, const char *name, int icon, int alignment, int icon_only);
 void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon);
 void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, struct IDProperty *properties, int context, int flag);
 
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 5c548d3..ba54196 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1441,6 +1441,7 @@ int ui_but_is_pushed_ex(uiBut *but, double *value)
 				break;
 			case UI_BTYPE_ROW:
 			case UI_BTYPE_LISTROW:
+			case UI_BTYPE_TAB:
 				UI_GET_BUT_VALUE_INIT(but, *value);
 				/* support for rna enum buts */
 				if (but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
@@ -2927,6 +2928,9 @@ static void ui_block_align_calc_but(uiBut *first, short nr)
 	
 	/* note;  how it uses 'flag' in loop below (either set it, or OR it) is confusing */
 	for (but = first, prev = NULL; but && but->alignnr == nr; prev = but, but = but->next) {
+		if (but->type == UI_BTYPE_TAB)
+			continue;
+
 		next = but->next;
 		if (next && next->alignnr != nr)
 			next = NULL;
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 414903f..24c03df 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -403,6 +403,93 @@ void UI_draw_text_underline(int pos_x, int pos_y, int len, int height)
 
 /* ************** SPECIAL BUTTON DRAWING FUNCTIONS ************* */
 
+void ui_draw_but_TAB_outline(rcti *rect, float rad, int roundboxtype, unsigned char highlight[3],
+                             unsigned char highlight_fade[3])
+{
+	float vec[4][2] = {
+		{0.195, 0.02},
+		{0.55, 0.169},
+		{0.831, 0.45},
+		{0.98, 0.805},
+	};
+	int a;
+	/* the 1px offset makes sure its inside the button, because it doesn't draw nicely outside */
+	int minx = rect->xmin + 1, maxx = rect->xmax - 1;
+	int miny = rect->ymin + 1, maxy = rect->ymax - 1;
+
+	/* mult */
+	for (a = 0; a < 4; a++) {
+		mul_v2_fl(vec[a], rad);
+	}
+
+	glEnable(GL_LINE_SMOOTH);
+	glEnable(GL_BLEND);
+	glShadeModel(GL_SMOOTH);
+	glBegin(GL_LINE_STRIP);
+
+	glColor3ubv(highlight);
+
+	/*start with corner left-top*/
+	if (roundboxtype & UI_CNR_TOP_LEFT) {
+		glVertex2f(minx, maxy - rad);
+		for (a = 0; a < 4; a++) {
+			glVertex2f(minx + vec[a][1], maxy - rad + vec[a][0]);
+		}
+		glVertex2f(minx + rad, maxy);
+	}
+	else {
+		glVertex2f(minx, maxy);
+	}
+
+	/* corner right-top */
+	if (roundboxtype & UI_CNR_TOP_RIGHT) {
+		glVertex2f(maxx - rad, maxy);
+		for (a = 0; a < 4; a++) {
+			glVertex2f(maxx - rad + vec[a][0], maxy - vec[a][1]);
+		}
+		glVertex2f(maxx, maxy - rad);
+	}
+	else {
+		glVertex2f(maxx, maxy);
+	}
+
+	glColor3ubv(highlight_fade);
+
+	/* corner right-bottom */
+	if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
+		glVertex2f(maxx, miny + rad);
+		for (a = 0; a < 4; a++) {
+			glVertex2f(maxx - vec[a][1], miny + rad - vec[a][0]);
+		}
+		glVertex2f(maxx - rad, miny);
+	}
+	else {
+		glVertex2f(maxx, miny);
+	}
+
+	/* corner left-bottom */
+	if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
+		glVertex2f(minx + rad, miny);
+		for (a = 0; a < 4; a++) {
+			glVertex2f(minx + rad - vec[a][0], miny + vec[a][1]);
+		}
+		glVertex2f(minx, miny + rad);
+	}
+	else {
+		glVertex2f(minx, miny);
+	}
+
+	glColor3ubv(highlight);
+
+	/* back to corner left-top */
+	glVertex2f(minx, roundboxtype & UI_CNR_TOP_LEFT ? maxy - rad : maxy);
+
+	glEnd();
+	glShadeModel(GL_FLAT);
+	glDisable(GL_BLEND);
+	glDisable(GL_LINE_SMOOTH);
+}
+
 void ui_draw_but_IMAGE(ARegion *UNUSED(ar), uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti *rect)
 {
 #ifdef WITH_HEADLESS
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 57a26ce..343f785 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1642,6 +1642,7 @@ static void ui_apply_but(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
 			break;
 		case UI_BTYPE_ROW:
 		case UI_BTYPE_LISTROW:
+		case UI_BTYPE_TAB:
 			ui_apply_but_ROW(C, block, but, data);
 			break;
 		case UI_BTYPE_SCROLL:
@@ -3270,6 +3271,17 @@ static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, c
 	return WM_UI_HANDLER_CONTINUE;
 }
 
+static int ui_do_but_TAB(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) {
+	if (data->state == BUTTON_STATE_HIGHLIGHT) {
+		if (ELEM(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val == KM_RELEASE) {
+			button_activate_state(C, but, BUTTON_STATE_EXIT);
+			return WM_UI_HANDLER_CONTINUE;
+		}
+	}
+
+	return WM_UI_HANDLER_CONTINUE;
+}
+
 static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
 {
 	if (data->state == BUTTON_STATE_HIGHLIGHT) {
@@ -6468,6 +6480,9 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
 		case UI_BTYPE_HOTKEY_EVENT:
 			retval = ui_do_but_HOTKEYEVT(C, but, data, event);
 			break;
+		case UI_BTYPE_TAB:
+			retval = ui_do_but_TAB(C, but, data, event);
+			break;
 		case UI_BTYPE_BUT_TOGGLE:
 		case UI_BTYPE_TOGGLE:
 		case UI_BTYPE_ICON_TOGGLE:
@@ -6727,6 +6742,24 @@ uiBut *ui_but_find_active_in_region(ARegion *ar)
 	return NULL;
 }
 
+uiBut *ui_but_find_activated_tab(const ARegion *ar)
+{
+	uiBlock *block;
+	uiBut *but;
+
+	if (ar->regiontype == RGN_TYPE_TABS) {
+		for (block = ar->uiblocks.first; block; block = block->next) {
+			for (but = block->buttons.first; but; but = but->next) {
+				if (but->type == UI_BTYPE_TAB && but->flag & UI_SELECT) {
+					return but;
+				}
+			}
+		}
+	}
+
+	return NULL;
+}
+
 bool ui_but_is_active(ARegion *ar)
 {
 	return (ui_but_find_active_in_region(ar) != NULL);
@@ -9177,6 +9210,46 @@ static int ui_handle_menus_recursive(
 
 /* *************** UI event handlers **************** */
 
+static int ui_tab_region_handler(bContext *C, const wmEvent *event, ARegion *ar)
+{
+	ScrArea *sa = CTX_wm_area(C);
+
+	if (ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE)) {
+		uiBut *nextbut, *but = NULL;
+
+		if (ar->regiontype == RGN_TYPE_TABS);
+		else if ((sa->flag & AREA_CONTAINS_TABS) && event->ctrl)
+			ar = BKE_area_find_region_type(sa, RGN_TYPE_TABS);
+		else
+			return WM_UI_HANDLER_CONTINUE;
+
+		but = ui_but_find_activated_tab(ar);
+
+		if (!but) {
+			WM_event_add_mousemove(C);
+			return WM_UI_HANDLER_CONTINUE;
+		}
+
+		if (event->type == WHEELUPMOUSE) {
+			if (but->next == NULL)
+				nextbut = but->block->buttons.first;
+			else
+				nextbut = but->next;
+		}
+		else {
+			if (but->prev == NULL)
+				nextbut = but->block->buttons.last;
+			else
+				nextbut = but->prev;
+		}
+
+		ui_handle_button_activate(C, ar, nextbut, BUTTON_ACTIVATE_APPLY);
+
+		return WM_UI_HANDLER_BREAK;
+	}
+	return WM_UI_HANDLER_CONTINUE;
+}
+
 static int ui_region_handler(bContext *C, const wmEvent *event, void *UNUSED(userdata))
 {
 	ARegion *ar;
@@ -9197,6 +9270,9 @@ static int ui_region_handler(bContext *C, const wmEvent *event, void *UN

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list