Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-10-07 03:32:21 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-10-07 03:32:21 +0400
commit1fe70c07a008185c4e5925aff2c214c93ff396b7 (patch)
tree5dd9fc4a6be56243977b2670c8acfe4eb5543d96 /source/blender/editors/interface
parentcdc1e5a716c08e809b771388c6b5075d32a20c98 (diff)
parente7db06ad9db5a1a05b00fc835038d4366d637851 (diff)
Merged changes in the trunk up to revision 51126.
Conflicts resolved: source/blender/blenloader/intern/readfile.c source/blender/windowmanager/WM_types.h
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r--source/blender/editors/interface/interface.c33
-rw-r--r--source/blender/editors/interface/interface_handlers.c10
-rw-r--r--source/blender/editors/interface/interface_intern.h8
-rw-r--r--source/blender/editors/interface/interface_layout.c4
-rw-r--r--source/blender/editors/interface/interface_regions.c15
-rw-r--r--source/blender/editors/interface/interface_templates.c2
-rw-r--r--source/blender/editors/interface/interface_widgets.c116
7 files changed, 107 insertions, 81 deletions
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 810cbc25862..2c00e39766c 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -996,24 +996,20 @@ void ui_fontscale(short *points, float aspect)
/* project button or block (but==NULL) to pixels in regionspace */
static void ui_but_to_pixelrect(rcti *rect, const ARegion *ar, uiBlock *block, uiBut *but)
{
- float gx, gy;
- float getsizex, getsizey;
+ rctf rectf = (but)? but->rect: block->rect;
- getsizex = ar->winx;
- getsizey = ar->winy;
+ ui_block_to_window_fl(ar, block, &rectf.xmin, &rectf.ymin);
+ ui_block_to_window_fl(ar, block, &rectf.xmax, &rectf.ymax);
- gx = (but ? but->rect.xmin : block->rect.xmin) + (block->panel ? block->panel->ofsx : 0.0f);
- gy = (but ? but->rect.ymin : block->rect.ymin) + (block->panel ? block->panel->ofsy : 0.0f);
-
- rect->xmin = floorf(getsizex * (0.5f + 0.5f * (gx * block->winmat[0][0] + gy * block->winmat[1][0] + block->winmat[3][0])));
- rect->ymin = floorf(getsizey * (0.5f + 0.5f * (gx * block->winmat[0][1] + gy * block->winmat[1][1] + block->winmat[3][1])));
-
- gx = (but ? but->rect.xmax : block->rect.xmax) + (block->panel ? block->panel->ofsx : 0.0f);
- gy = (but ? but->rect.ymax : block->rect.ymax) + (block->panel ? block->panel->ofsy : 0.0f);
-
- rect->xmax = floorf(getsizex * (0.5f + 0.5f * (gx * block->winmat[0][0] + gy * block->winmat[1][0] + block->winmat[3][0])));
- rect->ymax = floorf(getsizey * (0.5f + 0.5f * (gx * block->winmat[0][1] + gy * block->winmat[1][1] + block->winmat[3][1])));
+ rectf.xmin -= ar->winrct.xmin;
+ rectf.ymin -= ar->winrct.ymin;
+ rectf.xmax -= ar->winrct.xmin;
+ rectf.ymax -= ar->winrct.ymin;
+ rect->xmin = floorf(rectf.xmin);
+ rect->ymin = floorf(rectf.ymin);
+ rect->xmax = floorf(rectf.xmax);
+ rect->ymax = floorf(rectf.ymax);
}
/* uses local copy of style, to scale things down, and allow widgets to change stuff */
@@ -2160,8 +2156,6 @@ uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, shor
wm_subwindow_getmatrix(window, region->swinid, block->winmat);
wm_subwindow_getsize(window, region->swinid, &getsizex, &getsizey);
- /* TODO - investigate why block->winmat[0][0] is negative
- * in the image view when viewRedrawForce is called */
block->aspect = 2.0f / fabsf(getsizex * block->winmat[0][0]);
}
else {
@@ -3423,11 +3417,6 @@ void uiBlockClearFlag(uiBlock *block, int flag)
block->flag &= ~flag;
}
-void uiBlockSetXOfs(uiBlock *block, int xofs)
-{
- block->xofs = xofs;
-}
-
void uiButSetFlag(uiBut *but, int flag)
{
but->flag |= flag;
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index bfa9cc2727c..60e4c2aa90f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -2167,6 +2167,16 @@ static void ui_blockopen_end(bContext *C, uiBut *but, uiHandleButtonData *data)
}
}
+int ui_button_open_menu_direction(uiBut *but)
+{
+ uiHandleButtonData *data = but->active;
+
+ if (data && data->menu)
+ return data->menu->direction;
+
+ return 0;
+}
+
/* ***************** events for different button types *************** */
static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index b48c9bcab7e..b4b0686d6fc 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -315,7 +315,6 @@ struct uiBlock {
char tooltipdisabled; /* to avoid tooltip after click */
char endblock; /* uiEndBlock done? */
- float xofs, yofs; /* offset to parent button */
eBlockBoundsCalc bounds_type; /* for doing delayed */
int mx, my;
int bounds, minbounds; /* for doing delayed */
@@ -365,7 +364,8 @@ extern void ui_set_but_hsv(uiBut *but);
extern void ui_get_but_vectorf(uiBut *but, float vec[3]);
extern void ui_set_but_vectorf(uiBut *but, const float vec[3]);
-extern void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float mx, float my);
+extern void ui_hsvcircle_vals_from_pos(float *val_rad, float *val_dist, const rcti *rect,
+ const float mx, const float my);
extern void ui_get_but_string(uiBut *but, char *str, size_t maxlen);
extern void ui_convert_to_unit_alt_name(uiBut *but, char *str, size_t maxlen);
@@ -418,6 +418,9 @@ struct uiPopupBlockHandle {
int menuretval;
float retvalue;
float retvec[4];
+
+ /* menu direction */
+ int direction;
};
uiBlock *ui_block_func_COLOR(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
@@ -480,6 +483,7 @@ void ui_draw_but_TRACKPREVIEW(ARegion *ar, uiBut *but, struct uiWidgetColors *wc
extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but);
extern void ui_button_active_free(const struct bContext *C, uiBut *but);
extern int ui_button_is_active(struct ARegion *ar);
+extern int ui_button_open_menu_direction(uiBut *but);
/* interface_widgets.c */
void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 8ffbcd6d399..7a369019ac4 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2870,12 +2870,12 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,
WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
RNA_string_set(&op_ptr, "operator", op->type->idname);
- op_ptr = uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMIN, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMIN, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
RNA_string_set(&op_ptr, "operator", op->type->idname);
RNA_boolean_set(&op_ptr, "remove_active", TRUE);
- op_ptr = uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMOUT, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMOUT, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
}
if (op->type->ui) {
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 605233cd96f..4dafb4b2d4b 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1341,6 +1341,14 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
ui_block_to_window_fl(butregion, but->block, &butrct.xmin, &butrct.ymin);
ui_block_to_window_fl(butregion, but->block, &butrct.xmax, &butrct.ymax);
+ /* widget_roundbox_set has this correction too, keep in sync */
+ if (but->type != PULLDOWN) {
+ if (but->flag & UI_BUT_ALIGN_TOP)
+ butrct.ymax += 1.0f;
+ if (but->flag & UI_BUT_ALIGN_LEFT)
+ butrct.xmin -= 1.0f;
+ }
+
/* calc block rect */
if (block->rect.xmin == 0.0f && block->rect.xmax == 0.0f) {
if (block->buttons.first) {
@@ -1467,9 +1475,6 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
}
}
- /* apply requested offset in the block */
- xof += block->xofs / block->aspect;
- yof += block->yofs / block->aspect;
#if 0
/* clamp to window bounds, could be made into an option if its ever annoying */
if ( (offscreen = (block->rect.ymin + yof)) < 0) yof -= offscreen; /* bottom */
@@ -1659,12 +1664,10 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut
/* if this is being created from a button */
if (but) {
- if (ELEM(but->type, BLOCK, PULLDOWN))
- block->xofs = -2; /* for proper alignment */
-
block->aspect = but->block->aspect;
ui_block_position(window, butregion, but, block);
+ handle->direction = block->direction;
}
else {
/* keep a list of these, needed for pulldown menus */
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 9a41d32e8ca..974d492a364 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -363,6 +363,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
type = idptr.type;
if (flag & UI_ID_PREVIEWS) {
+ template->preview = TRUE;
but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 6, UI_UNIT_Y * 6,
TIP_(template_id_browse_tip(type)));
@@ -375,7 +376,6 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
uiButSetFlag(but, UI_BUT_DISABLED);
uiLayoutRow(layout, TRUE);
- template->preview = 1;
}
else if (flag & UI_ID_BROWSE) {
but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 1.6, UI_UNIT_Y,
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 87a7d1957c5..3fc20309264 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -1889,53 +1889,47 @@ static void ui_hsv_cursor(float x, float y)
}
-void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float mx, float my)
+void ui_hsvcircle_vals_from_pos(float *val_rad, float *val_dist, const rcti *rect,
+ const float mx, const float my)
{
/* duplication of code... well, simple is better now */
- float centx = BLI_rcti_cent_x_fl(rect);
- float centy = BLI_rcti_cent_y_fl(rect);
- float radius, dist;
-
- if (BLI_rcti_size_x(rect) > BLI_rcti_size_y(rect))
- radius = (float)BLI_rcti_size_y(rect) / 2;
- else
- radius = (float)BLI_rcti_size_x(rect) / 2;
+ const float centx = BLI_rcti_cent_x_fl(rect);
+ const float centy = BLI_rcti_cent_y_fl(rect);
+ const float radius = (float)mini(BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)) / 2.0f;
+ const float m_delta[2] = {mx - centx, my - centy};
+ const float dist_squared = len_squared_v2(m_delta);
- mx -= centx;
- my -= centy;
- dist = sqrt(mx * mx + my * my);
- if (dist < radius)
- *valdist = dist / radius;
- else
- *valdist = 1.0f;
-
- *valrad = atan2f(mx, my) / (2.0f * (float)M_PI) + 0.5f;
+ *val_dist = (dist_squared < (radius * radius)) ? sqrtf(dist_squared) / radius : 1.0f;
+ *val_rad = atan2f(m_delta[0], m_delta[1]) / (2.0f * (float)M_PI) + 0.5f;
}
-static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
+static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *rect)
{
+ const int tot = 32;
+ const float radstep = 2.0f * (float)M_PI / (float)tot;
+
+ const float centx = BLI_rcti_cent_x_fl(rect);
+ const float centy = BLI_rcti_cent_y_fl(rect);
+ float radius = (float)mini(BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)) / 2.0f;
+
/* gouraud triangle fan */
- float radstep, ang = 0.0f;
- float centx, centy, radius, cursor_radius;
+ const float *hsv_ptr = ui_block_hsv_get(but->block);
+ float ang = 0.0f;
+ float cursor_radius;
float rgb[3], hsvo[3], hsv[3], col[3], colcent[3];
- int a, tot = 32;
+ int a;
int color_profile = but->block->color_profile;
if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
color_profile = FALSE;
- radstep = 2.0f * (float)M_PI / (float)tot;
- centx = BLI_rcti_cent_x_fl(rect);
- centy = BLI_rcti_cent_y_fl(rect);
-
- if (BLI_rcti_size_x(rect) > BLI_rcti_size_y(rect))
- radius = (float)BLI_rcti_size_y(rect) / 2;
- else
- radius = (float)BLI_rcti_size_x(rect) / 2;
-
/* color */
ui_get_but_vectorf(but, rgb);
- /* copy_v3_v3(hsv, ui_block_hsv_get(but->block)); */ /* UNUSED */
+
+ /* since we use compat functions on both 'hsv' and 'hsvo', they need to be initialized */
+ hsvo[0] = hsv[0] = hsv_ptr[0];
+ hsvo[1] = hsv[1] = hsv_ptr[1];
+ hsvo[2] = hsv[2] = hsv_ptr[2];
rgb_to_hsv_compat_v(rgb, hsvo);
@@ -2708,16 +2702,16 @@ static void widget_menunodebut(uiWidgetColors *wcol, rcti *rect, int UNUSED(stat
*wcol = wcol_backup;
}
-static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
+static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
if (state & UI_ACTIVE) {
uiWidgetBase wtb;
- float rad = 0.5f * BLI_rcti_size_y(rect); /* 4.0f */
-
+ float rad = 0.25f * BLI_rcti_size_y(rect); /* 4.0f */
+
widget_init(&wtb);
-
+
/* half rounded */
- round_box_edges(&wtb, UI_CNR_ALL, rect, rad);
+ round_box_edges(&wtb, roundboxalign, rect, rad);
widgetbase_draw(&wtb, wcol);
}
@@ -3054,9 +3048,12 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
static int widget_roundbox_set(uiBut *but, rcti *rect)
{
+ int roundbox = UI_CNR_ALL;
+
/* alignment */
- if (but->flag & UI_BUT_ALIGN) {
+ if ((but->flag & UI_BUT_ALIGN) && but->type != PULLDOWN) {
+ /* ui_block_position has this correction too, keep in sync */
if (but->flag & UI_BUT_ALIGN_TOP)
rect->ymax += 1;
if (but->flag & UI_BUT_ALIGN_LEFT)
@@ -3064,27 +3061,50 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
switch (but->flag & UI_BUT_ALIGN) {
case UI_BUT_ALIGN_TOP:
- return UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT;
+ roundbox = UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT;
+ break;
case UI_BUT_ALIGN_DOWN:
- return UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT;
+ roundbox = UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT;
+ break;
case UI_BUT_ALIGN_LEFT:
- return UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT;
+ roundbox = UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT;
+ break;
case UI_BUT_ALIGN_RIGHT:
- return UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT;
+ roundbox = UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT;
+ break;
case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_RIGHT:
- return UI_CNR_TOP_LEFT;
+ roundbox = UI_CNR_TOP_LEFT;
+ break;
case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_LEFT:
- return UI_CNR_TOP_RIGHT;
+ roundbox = UI_CNR_TOP_RIGHT;
+ break;
case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_RIGHT:
- return UI_CNR_BOTTOM_LEFT;
+ roundbox = UI_CNR_BOTTOM_LEFT;
+ break;
case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT:
- return UI_CNR_BOTTOM_RIGHT;
+ roundbox = UI_CNR_BOTTOM_RIGHT;
+ break;
default:
- return 0;
+ roundbox = 0;
+ break;
}
}
- return UI_CNR_ALL;
+ /* align with open menu */
+ if (but->active) {
+ int direction = ui_button_open_menu_direction(but);
+
+ if (direction == UI_TOP)
+ roundbox &= ~(UI_CNR_TOP_RIGHT|UI_CNR_TOP_LEFT);
+ else if (direction == UI_DOWN)
+ roundbox &= ~(UI_CNR_BOTTOM_RIGHT|UI_CNR_BOTTOM_LEFT);
+ else if (direction == UI_LEFT)
+ roundbox &= ~(UI_CNR_TOP_LEFT|UI_CNR_BOTTOM_LEFT);
+ else if (direction == UI_RIGHT)
+ roundbox &= ~(UI_CNR_TOP_RIGHT|UI_CNR_BOTTOM_RIGHT);
+ }
+
+ return roundbox;
}
/* conversion from old to new buttons, so still messy */