[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