Code cleanup: removed some unused UI button types

* CHARTAB: not needed anymore with improved copy/paste support and text input.
* IDPOIN: replaced by SEARCH_MENU.
* ICONROW/ICONTEXTROW: replaced by RNA enums.
* NUMABS: can use min/max limits instead.
* BUT_TOGDUAL, TOG3, TOGR, SLI: not used in 2.5 interface.
This commit is contained in:
Brecht Van Lommel 2013-06-09 18:05:50 +00:00
parent 13b3b425f8
commit 860fce4eb9
12 changed files with 80 additions and 671 deletions

@ -19,26 +19,22 @@ Contents
4. API for uiButton 4. API for uiButton
4.1 UiDefBut 4.1 UiDefBut
1. BUT 1. BUT
2. TOG or TOGN or TOGR 2. TOG or TOGN
TOG|BIT|<nr> TOG|BIT|<nr>
3. TOG3|BIT|<nr> 3. ROW
4. ROW 4. NUMSLI or HSVSLI
5. SLI or NUMSLI or HSVSLI 5. NUM
6. NUM 6. TEX
7. TEX 7. LABEL
8. LABEL 8 SEPR
9 SEPR 9. MENU
10. MENU 10. COL
11. COL
4.2 Icon buttons 4.2 Icon buttons
12. ICONROW
13. ICONTEXTROW
4.3 pulldown menus / block buttons 4.3 pulldown menus / block buttons
14. BLOCK 14. BLOCK
4.4 specials 4.4 specials
15. KEYEVT 15. KEYEVT
16. LINK and INLINK 16. LINK and INLINK
17. IDPOIN
4.5 uiButton control fuctions 4.5 uiButton control fuctions
@ -289,55 +285,49 @@ type:
Activation button. (like "Render") Activation button. (like "Render")
Passing on a pointer is not needed Passing on a pointer is not needed
2. TOG or TOGN or TOGR 2. TOG or TOGN
Toggle button (like "Lock") Toggle button (like "Lock")
The pointer value is set either at 0 or 1 The pointer value is set either at 0 or 1
If pressed, it calls the optional function with arguments provided. If pressed, it calls the optional function with arguments provided.
Type TOGN: works negative, when pressed it sets at 0 Type TOGN: works negative, when pressed it sets at 0
Type TOGR: is part of a row, redraws automatically all buttons with same *poin
"|BIT|<nr>" "|BIT|<nr>"
When added to type, it works on a single bit <nr> (lowest order bit: nr = '0') When added to type, it works on a single bit <nr> (lowest order bit: nr = '0')
3. TOG3|BIT|<nr> 3. ROW
A toggle with 3 values!
Can be only used for short *poin.
In the third toggle setting, the bit <nr> of *( poin+1) is set.
4. ROW
Button that's part of a row. Button that's part of a row.
in "min" you set a row-id number, in "max" the value you want *poin to be in "min" you set a row-id number, in "max" the value you want *poin to be
assigned when you press the button. Always pass on these values as floats. assigned when you press the button. Always pass on these values as floats.
When this button is pressed, it sets the "max" value to *poin, and redraws When this button is pressed, it sets the "max" value to *poin, and redraws
all buttons with the same row-id number. all buttons with the same row-id number.
5. SLI or NUMSLI or HSVSLI 4. NUMSLI or HSVSLI
Slider, number-slider or hsv-slider button. Number-slider or hsv-slider button.
"min" and "max" are to clamp the value to. "min" and "max" are to clamp the value to.
If you want a button type "Col" to be updated, make 'a1' equal to 'retval' If you want a button type "Col" to be updated, make 'a1' equal to 'retval'
from the COL button. from the COL button.
6. NUM 5. NUM
Number button Number button
Set the clamping values 'min' and 'max' always as float. Set the clamping values 'min' and 'max' always as float.
For UiDefButF, set a 'step' in 'a1', in 1/100's. The step value is the increment or For UiDefButF, set a 'step' in 'a1', in 1/100's. The step value is the increment or
decrement when you click once on the right or left side of a button. decrement when you click once on the right or left side of a button.
The optional button function is additionally called for each change of the *poin value. The optional button function is additionally called for each change of the *poin value.
7. TEX 6. TEX
Text string button. Text string button.
Pointertype is standard a char. Value 'max' is length of string (pass as float). Pointertype is standard a char. Value 'max' is length of string (pass as float).
When button is left with ESC, it doesn't put the 'retval' at the queue. When button is left with ESC, it doesn't put the 'retval' at the queue.
8. LABEL 7. LABEL
Label button. Label button.
Only displays text. Only displays text.
If 'min' is set at 1.0, the text is printed in white. If 'min' is set at 1.0, the text is printed in white.
9 SEPR 8 SEPR
A separator line, typically used within pulldown menus. A separator line, typically used within pulldown menus.
10. MENU 9. MENU
Menu button. Menu button.
The syntax of the string in *name defines the menu items: The syntax of the string in *name defines the menu items:
- %t means the previous text becomes the title - %t means the previous text becomes the title
@ -346,7 +336,7 @@ type:
without returnvalues, the first item gets value 0 (incl. title!) without returnvalues, the first item gets value 0 (incl. title!)
Example: "Do something %t| turn left %2| turn right %1| nothing %0" Example: "Do something %t| turn left %2| turn right %1| nothing %0"
11. COLOR 10. COLOR
A special button that only visualizes a RGB value A special button that only visualizes a RGB value
In 'retval' you can put a code, which is used to identify for sliders if it needs In 'retval' you can put a code, which is used to identify for sliders if it needs
redraws while using the sliders. Check button '5'. redraws while using the sliders. Check button '5'.
@ -371,19 +361,6 @@ uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, char *s
Same again, but now with an icon and string as button name. Same again, but now with an icon and string as button name.
Two special icon buttons are available in Blender:
12. ICONROW
(uiDefIconBut)
This button pops up a vertical menu with a row of icons to choose from.
'max' = amount of icons. The icons are supposed to be ordered in a sequence
It writes in *poin which item in the menu was choosen (starting with 0).
13. ICONTEXTROW
(uiDefIconTextBut)
Same as previous, but with the texts next to it.
-----------4.3 pulldown menus / block buttons -----------4.3 pulldown menus / block buttons
@ -465,37 +442,6 @@ uiDefIconBut(block, INLINK, 0, ICON_INLINK, x1, y1, w, h, void *poin, short from
17. IDPOIN
void uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, int retval, char *str,
short x1, short y1, short x2, short y2, void *idpp, char *tip)
The ID struct is a generic part in structs like Object, Material, Mesh, etc.
Most linking options in Blender happens using ID's. (Mesh -> Material).
This special button in Blender visualizes an ID pointer with its name. Typing in
a new name, changes the pointer. For most ID types in Blender functions have been
written already, needed by this button, to check validity of names, and assign the pointer.
(BTW: the 'void *idpp' has to be a pointer to the ID pointer!)
Example function that can be put in 'func':
void test_scriptpoin_but(char *name, ID **idpp)
{
ID *id;
id= G.main->text.first;
while(id) {
if( strcmp(name, id->name+2)==0 ) {
*idpp= id;
return;
}
id= id->next;
}
*idpp= 0;
}
------------- 4.5 uiButton control fuctions ------------- 4.5 uiButton control fuctions

@ -96,7 +96,6 @@ extern void BKE_undo_step(struct bContext *C, int step);
extern void BKE_undo_name(struct bContext *C, const char *name); extern void BKE_undo_name(struct bContext *C, const char *name);
extern int BKE_undo_valid(const char *name); extern int BKE_undo_valid(const char *name);
extern void BKE_reset_undo(void); extern void BKE_reset_undo(void);
extern char *BKE_undo_menu_string(void);
extern void BKE_undo_number(struct bContext *C, int nr); extern void BKE_undo_number(struct bContext *C, int nr);
extern const char *BKE_undo_get_name(int nr, int *active); extern const char *BKE_undo_get_name(int nr, int *active);
extern int BKE_undo_save_file(const char *filename); extern int BKE_undo_save_file(const char *filename);

@ -792,25 +792,6 @@ const char *BKE_undo_get_name(int nr, int *active)
return NULL; return NULL;
} }
char *BKE_undo_menu_string(void)
{
UndoElem *uel;
DynStr *ds = BLI_dynstr_new();
char *menu;
BLI_dynstr_append(ds, "Global Undo History %t");
for (uel = undobase.first; uel; uel = uel->next) {
BLI_dynstr_append(ds, "|");
BLI_dynstr_append(ds, uel->name);
}
menu = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
return menu;
}
/* saves .blend using undo buffer, returns 1 == success */ /* saves .blend using undo buffer, returns 1 == success */
int BKE_undo_save_file(const char *filename) int BKE_undo_save_file(const char *filename)
{ {

@ -210,20 +210,14 @@ typedef enum {
BUT = (1 << 9), BUT = (1 << 9),
ROW = (2 << 9), ROW = (2 << 9),
TOG = (3 << 9), TOG = (3 << 9),
SLI = (4 << 9),
NUM = (5 << 9), NUM = (5 << 9),
TEX = (6 << 9), TEX = (6 << 9),
TOG3 = (7 << 9),
TOGR = (8 << 9),
TOGN = (9 << 9), TOGN = (9 << 9),
LABEL = (10 << 9), LABEL = (10 << 9),
MENU = (11 << 9), /* Dropdown list, actually! */ MENU = (11 << 9), /* Dropdown list, actually! */
ICONROW = (12 << 9),
ICONTOG = (13 << 9), ICONTOG = (13 << 9),
NUMSLI = (14 << 9), NUMSLI = (14 << 9),
COLOR = (15 << 9), COLOR = (15 << 9),
IDPOIN = (16 << 9),
/* HSVSLI = (17 << 9), */ /* UNUSED */
SCROLL = (18 << 9), SCROLL = (18 << 9),
BLOCK = (19 << 9), BLOCK = (19 << 9),
BUTM = (20 << 9), BUTM = (20 << 9),
@ -231,18 +225,13 @@ typedef enum {
LINK = (22 << 9), LINK = (22 << 9),
INLINK = (23 << 9), INLINK = (23 << 9),
KEYEVT = (24 << 9), KEYEVT = (24 << 9),
ICONTEXTROW = (25 << 9),
HSVCUBE = (26 << 9), HSVCUBE = (26 << 9),
PULLDOWN = (27 << 9), /* Menu, actually! */ PULLDOWN = (27 << 9), /* Menu, actually! */
ROUNDBOX = (28 << 9), ROUNDBOX = (28 << 9),
CHARTAB = (29 << 9),
BUT_COLORBAND = (30 << 9), BUT_COLORBAND = (30 << 9),
BUT_NORMAL = (31 << 9), BUT_NORMAL = (31 << 9),
BUT_CURVE = (32 << 9), BUT_CURVE = (32 << 9),
BUT_TOGDUAL = (33 << 9),
ICONTOGN = (34 << 9), ICONTOGN = (34 << 9),
/* FTPREVIEW = (35 << 9), */ /* UNUSED */
NUMABS = (36 << 9),
TOGBUT = (37 << 9), TOGBUT = (37 << 9),
OPTION = (38 << 9), OPTION = (38 << 9),
OPTIONN = (39 << 9), OPTIONN = (39 << 9),
@ -560,7 +549,6 @@ void uiButGetStrInfo(struct bContext *C, uiBut *but, ...);
/* Special Buttons /* Special Buttons
* *
* Buttons with a more specific purpose: * Buttons with a more specific purpose:
* - IDPoinBut: for creating buttons that work on a pointer to an ID block.
* - MenuBut: buttons that popup a menu (in headers usually). * - MenuBut: buttons that popup a menu (in headers usually).
* - PulldownBut: like MenuBut, but creating a uiBlock (for compatibility). * - PulldownBut: like MenuBut, but creating a uiBlock (for compatibility).
* - BlockBut: buttons that popup a block with more buttons. * - BlockBut: buttons that popup a block with more buttons.
@ -582,12 +570,6 @@ void uiButGetStrInfo(struct bContext *C, uiBut *but, ...);
#define UI_ID_PREVIEWS 2048 #define UI_ID_PREVIEWS 2048
#define UI_ID_FULL (UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE | UI_ID_DELETE | UI_ID_LOCAL) #define UI_ID_FULL (UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE | UI_ID_DELETE | UI_ID_LOCAL)
typedef void (*uiIDPoinFuncFP)(struct bContext *C, const char *str, struct ID **idpp);
typedef void (*uiIDPoinFunc)(struct bContext *C, struct ID *id, int event);
uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, const char *str,
int x, int y, short width, short height, void *idpp, const char *tip);
int uiIconFromID(struct ID *id); int uiIconFromID(struct ID *id);
uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip); uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);

@ -1140,9 +1140,6 @@ int ui_is_but_push_ex(uiBut *but, double *value)
break; break;
case TOGBUT: case TOGBUT:
case TOG: case TOG:
case TOGR:
case TOG3:
case BUT_TOGDUAL:
case ICONTOG: case ICONTOG:
case OPTION: case OPTION:
UI_GET_BUT_VALUE_INIT(but, *value); UI_GET_BUT_VALUE_INIT(but, *value);
@ -1420,7 +1417,7 @@ bool ui_is_but_float(uiBut *but)
bool ui_is_but_bool(uiBut *but) bool ui_is_but_bool(uiBut *but)
{ {
if (ELEM5(but->type, TOG, TOGN, TOGR, ICONTOG, ICONTOGN)) if (ELEM4(but->type, TOG, TOGN, ICONTOG, ICONTOGN))
return true; return true;
if (but->rnaprop && RNA_property_type(but->rnaprop) == PROP_BOOLEAN) if (but->rnaprop && RNA_property_type(but->rnaprop) == PROP_BOOLEAN)
@ -1620,8 +1617,6 @@ int ui_get_but_string_max_length(uiBut *but)
{ {
if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK))
return but->hardmax; return but->hardmax;
else if (but->type == IDPOIN)
return MAX_ID_NAME - 2;
else else
return UI_MAX_DRAW_STR; return UI_MAX_DRAW_STR;
} }
@ -1716,7 +1711,7 @@ static float ui_get_but_step_unit(uiBut *but, float step_default)
*/ */
void ui_get_but_string_ex(uiBut *but, char *str, const size_t maxlen, const int float_precision) void ui_get_but_string_ex(uiBut *but, char *str, const size_t maxlen, const int float_precision)
{ {
if (but->rnaprop && ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (but->rnaprop && ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
PropertyType type; PropertyType type;
const char *buf = NULL; const char *buf = NULL;
int buf_len; int buf_len;
@ -1753,18 +1748,6 @@ void ui_get_but_string_ex(uiBut *but, char *str, const size_t maxlen, const int
MEM_freeN((void *)buf); MEM_freeN((void *)buf);
} }
} }
else if (but->type == IDPOIN) {
/* ID pointer */
if (but->idpoin_idpp) { /* Can be NULL for ID properties by python */
ID *id = *(but->idpoin_idpp);
if (id) {
BLI_strncpy(str, id->name + 2, maxlen);
return;
}
}
str[0] = '\0';
return;
}
else if (but->type == TEX) { else if (but->type == TEX) {
/* string */ /* string */
BLI_strncpy(str, but->poin, maxlen); BLI_strncpy(str, but->poin, maxlen);
@ -1865,7 +1848,7 @@ bool ui_set_but_string_eval_num(bContext *C, uiBut *but, const char *str, double
bool ui_set_but_string(bContext *C, uiBut *but, const char *str) bool ui_set_but_string(bContext *C, uiBut *but, const char *str)
{ {
if (but->rnaprop && ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (but->rnaprop && ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
if (RNA_property_editable(&but->rnapoin, but->rnaprop)) { if (RNA_property_editable(&but->rnapoin, but->rnaprop)) {
PropertyType type; PropertyType type;
@ -1910,11 +1893,6 @@ bool ui_set_but_string(bContext *C, uiBut *but, const char *str)
} }
} }
} }
else if (but->type == IDPOIN) {
/* ID pointer */
but->idpoin_func(C, str, but->idpoin_idpp);
return true;
}
else if (but->type == TEX) { else if (but->type == TEX) {
/* string */ /* string */
if (ui_is_but_utf8(but)) BLI_strncpy_utf8(but->poin, str, but->hardmax); if (ui_is_but_utf8(but)) BLI_strncpy_utf8(but->poin, str, but->hardmax);
@ -1944,7 +1922,6 @@ bool ui_set_but_string(bContext *C, uiBut *but, const char *str)
} }
if (!ui_is_but_float(but)) value = (int)floor(value + 0.5); if (!ui_is_but_float(but)) value = (int)floor(value + 0.5);
if (but->type == NUMABS) value = fabs(value);
/* not that we use hard limits here */ /* not that we use hard limits here */
if (value < (double)but->hardmin) value = but->hardmin; if (value < (double)but->hardmin) value = but->hardmin;
@ -2285,7 +2262,6 @@ void ui_check_but(uiBut *but)
/* test for min and max, icon sliders, etc */ /* test for min and max, icon sliders, etc */
switch (but->type) { switch (but->type) {
case NUM: case NUM:
case SLI:
case SCROLL: case SCROLL:
case NUMSLI: case NUMSLI:
UI_GET_BUT_VALUE_INIT(but, value); UI_GET_BUT_VALUE_INIT(but, value);
@ -2293,15 +2269,6 @@ void ui_check_but(uiBut *but)
else if (value > (double)but->hardmax) ui_set_but_val(but, but->hardmax); else if (value > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
break; break;
case NUMABS:
{
double value_abs;
UI_GET_BUT_VALUE_INIT(but, value);
value_abs = fabs(value);
if (value_abs < (double)but->hardmin) ui_set_but_val(but, but->hardmin);
else if (value_abs > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
break;
}
case ICONTOG: case ICONTOG:
case ICONTOGN: case ICONTOGN:
if (!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) { if (!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
@ -2310,20 +2277,6 @@ void ui_check_but(uiBut *but)
} }
break; break;
case ICONROW:
if (!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
UI_GET_BUT_VALUE_INIT(but, value);
but->iconadd = (int)value - (int)(but->hardmin);
}
break;
case ICONTEXTROW:
if (!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
UI_GET_BUT_VALUE_INIT(but, value);
but->iconadd = (int)value - (int)(but->hardmin);
}
break;
/* quiet warnings for unhandled types */ /* quiet warnings for unhandled types */
default: default:
break; break;
@ -2337,7 +2290,6 @@ void ui_check_but(uiBut *but)
switch (but->type) { switch (but->type) {
case MENU: case MENU:
case ICONTEXTROW:
if (BLI_rctf_size_x(&but->rect) > 24.0f) { if (BLI_rctf_size_x(&but->rect) > 24.0f) {
UI_GET_BUT_VALUE_INIT(but, value); UI_GET_BUT_VALUE_INIT(but, value);
@ -2347,7 +2299,6 @@ void ui_check_but(uiBut *but)
case NUM: case NUM:
case NUMSLI: case NUMSLI:
case NUMABS:
UI_GET_BUT_VALUE_INIT(but, value); UI_GET_BUT_VALUE_INIT(but, value);
@ -2394,7 +2345,6 @@ void ui_check_but(uiBut *but)
break; break;
case IDPOIN:
case TEX: case TEX:
case SEARCH_MENU: case SEARCH_MENU:
case SEARCH_MENU_UNLINK: case SEARCH_MENU_UNLINK:
@ -2444,14 +2394,6 @@ void ui_check_but(uiBut *but)
break; break;
case BUT_TOGDUAL:
/* trying to get the dual-icon to left of text... not very nice */
if (but->str[0]) {
BLI_strncpy(but->drawstr, " ", UI_MAX_DRAW_STR);
BLI_strncpy(but->drawstr + 2, but->str, UI_MAX_DRAW_STR - 2);
}
break;
case HSVCUBE: case HSVCUBE:
case HSVCIRCLE: case HSVCIRCLE:
break; break;
@ -2771,7 +2713,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str,
but->pos = -1; /* cursor invisible */ but->pos = -1; /* cursor invisible */
if (ELEM3(but->type, NUM, NUMABS, NUMSLI)) { /* add a space to name */ if (ELEM(but->type, NUM, NUMSLI)) { /* add a space to name */
/* slen remains unchanged from previous assignment, ensure this stays true */ /* slen remains unchanged from previous assignment, ensure this stays true */
if (slen > 0 && slen < UI_MAX_NAME_STR - 2) { if (slen > 0 && slen < UI_MAX_NAME_STR - 2) {
if (but->str[slen - 1] != ' ') { if (but->str[slen - 1] != ' ') {
@ -2782,13 +2724,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str,
} }
if ((block->flag & UI_BLOCK_LOOP) || if ((block->flag & UI_BLOCK_LOOP) ||
ELEM9(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU, PROGRESSBAR, SEARCH_MENU_UNLINK)) ELEM8(but->type, MENU, TEX, LABEL, BLOCK, BUTM, SEARCH_MENU, PROGRESSBAR, SEARCH_MENU_UNLINK))
{ {
but->flag |= (UI_TEXT_LEFT | UI_ICON_LEFT); but->flag |= (UI_TEXT_LEFT | UI_ICON_LEFT);
} }
else if (but->type == BUT_TOGDUAL) {
but->flag |= UI_ICON_LEFT;
}
but->flag |= (block->flag & UI_BUT_ALIGN); but->flag |= (block->flag & UI_BUT_ALIGN);
@ -3164,26 +3103,6 @@ void autocomplete_end(AutoComplete *autocpl, char *autoname)
MEM_freeN(autocpl); MEM_freeN(autocpl);
} }
/* autocomplete callback for ID buttons */
static void autocomplete_id(bContext *C, char *str, void *arg_v)
{
int blocktype = (intptr_t)arg_v;
ListBase *listb = which_libbase(CTX_data_main(C), blocktype);
if (listb == NULL) return;
/* search if str matches the beginning of an ID struct */
if (str[0]) {
AutoComplete *autocpl = autocomplete_begin(str, MAX_ID_NAME - 2);
ID *id;
for (id = listb->first; id; id = id->next)
autocomplete_do_name(autocpl, id->name + 2);
autocomplete_end(autocpl, str);
}
}
static void ui_check_but_and_iconize(uiBut *but, int icon) static void ui_check_but_and_iconize(uiBut *but, int icon)
{ {
if (icon) { if (icon) {
@ -3675,19 +3594,6 @@ void uiButSetCompleteFunc(uiBut *but, uiButCompleteFunc func, void *arg)
but->autofunc_arg = arg; but->autofunc_arg = arg;
} }
uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, const char *str, int x, int y, short width, short height, void *idpp, const char *tip)
{
uiBut *but = ui_def_but(block, IDPOIN, retval, str, x, y, width, height, NULL, 0.0, 0.0, 0.0, 0.0, tip);
but->idpoin_func = func;
but->idpoin_idpp = (ID **) idpp;
ui_check_but(but);
if (blocktype)
uiButSetCompleteFunc(but, autocomplete_id, (void *)(intptr_t)blocktype);
return but;
}
uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip) uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip)
{ {
uiBut *but = ui_def_but(block, BLOCK, 0, str, x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip); uiBut *but = ui_def_but(block, BLOCK, 0, str, x, y, width, height, arg, 0.0, 0.0, 0.0, 0.0, tip);

@ -321,7 +321,7 @@ static uiBut *ui_but_last(uiBlock *block)
static bool ui_is_a_warp_but(uiBut *but) static bool ui_is_a_warp_but(uiBut *but)
{ {
if (U.uiflag & USER_CONTINUOUS_MOUSE) { if (U.uiflag & USER_CONTINUOUS_MOUSE) {
if (ELEM7(but->type, NUM, NUMSLI, NUMABS, HSVCIRCLE, TRACKPREVIEW, HSVCUBE, BUT_CURVE)) { if (ELEM6(but->type, NUM, NUMSLI, HSVCIRCLE, TRACKPREVIEW, HSVCUBE, BUT_CURVE)) {
return true; return true;
} }
} }
@ -431,7 +431,7 @@ static void ui_apply_undo(uiBut *but)
/* define which string to use for undo */ /* define which string to use for undo */
if (ELEM(but->type, LINK, INLINK)) str = "Add button link"; if (ELEM(but->type, LINK, INLINK)) str = "Add button link";
else if (ELEM(but->type, MENU, ICONTEXTROW)) str = but->drawstr; else if (but->type == MENU) str = but->drawstr;
else if (but->drawstr[0]) str = but->drawstr; else if (but->drawstr[0]) str = but->drawstr;
else str = but->tip; else str = but->tip;
@ -544,7 +544,7 @@ static void ui_apply_but_BUTM(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_apply_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data) static void ui_apply_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data)
{ {
if (ELEM3(but->type, MENU, ICONROW, ICONTEXTROW)) if (but->type == MENU)
ui_set_but_val(but, data->value); ui_set_but_val(but, data->value);
ui_check_but(but); ui_check_but(but);
@ -558,16 +558,6 @@ static void ui_apply_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data)
double value; double value;
int w, lvalue, push; int w, lvalue, push;
/* local hack... */
if (but->type == BUT_TOGDUAL && data->togdual) {
if (but->pointype == UI_BUT_POIN_SHORT) {
but->poin += 2;
}
else if (but->pointype == UI_BUT_POIN_INT) {
but->poin += 4;
}
}
value = ui_get_but_val(but); value = ui_get_but_val(but);
lvalue = (int)value; lvalue = (int)value;
@ -576,17 +566,6 @@ static void ui_apply_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data)
if (w) lvalue = UI_BITBUT_CLR(lvalue, but->bitnr); if (w) lvalue = UI_BITBUT_CLR(lvalue, but->bitnr);
else lvalue = UI_BITBUT_SET(lvalue, but->bitnr); else lvalue = UI_BITBUT_SET(lvalue, but->bitnr);
if (but->type == TOGR) {
if (!data->togonly) {
lvalue = 1 << (but->bitnr);
ui_set_but_val(but, (double)lvalue);
}
else {
if (lvalue == 0) lvalue = 1 << (but->bitnr);
}
}
ui_set_but_val(but, (double)lvalue); ui_set_but_val(but, (double)lvalue);
if (but->type == ICONTOG || but->type == ICONTOGN) ui_check_but(but); if (but->type == ICONTOG || but->type == ICONTOGN) ui_check_but(but);
} }
@ -600,16 +579,6 @@ static void ui_apply_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data)
if (but->type == ICONTOG || but->type == ICONTOGN) ui_check_but(but); if (but->type == ICONTOG || but->type == ICONTOGN) ui_check_but(but);
} }
/* end local hack... */
if (but->type == BUT_TOGDUAL && data->togdual) {
if (but->pointype == UI_BUT_POIN_SHORT) {
but->poin -= 2;
}
else if (but->pointype == UI_BUT_POIN_INT) {
but->poin -= 4;
}
}
ui_apply_but_func(C, but); ui_apply_but_func(C, but);
data->retval = but->retval; data->retval = but->retval;
@ -673,41 +642,6 @@ static void ui_apply_but_NUM(bContext *C, uiBut *but, uiHandleButtonData *data)
data->applied = true; data->applied = true;
} }
static void ui_apply_but_TOG3(bContext *C, uiBut *but, uiHandleButtonData *data)
{
if (but->pointype == UI_BUT_POIN_SHORT) {
short *sp = (short *)but->poin;
if (UI_BITBUT_TEST(sp[1], but->bitnr)) {
sp[1] = UI_BITBUT_CLR(sp[1], but->bitnr);
sp[0] = UI_BITBUT_CLR(sp[0], but->bitnr);
}
else if (UI_BITBUT_TEST(sp[0], but->bitnr)) {
sp[1] = UI_BITBUT_SET(sp[1], but->bitnr);
}
else {
sp[0] = UI_BITBUT_SET(sp[0], but->bitnr);
}
}
else {
if (UI_BITBUT_TEST(*(but->poin + 2), but->bitnr)) {
*(but->poin + 2) = UI_BITBUT_CLR(*(but->poin + 2), but->bitnr);
*(but->poin) = UI_BITBUT_CLR(*(but->poin), but->bitnr);
}
else if (UI_BITBUT_TEST(*(but->poin), but->bitnr)) {
*(but->poin + 2) = UI_BITBUT_SET(*(but->poin + 2), but->bitnr);
}
else {
*(but->poin) = UI_BITBUT_SET(*(but->poin), but->bitnr);
}
}
ui_check_but(but);
ui_apply_but_func(C, but);
data->retval = but->retval;
data->applied = true;
}
static void ui_apply_but_VEC(bContext *C, uiBut *but, uiHandleButtonData *data) static void ui_apply_but_VEC(bContext *C, uiBut *but, uiHandleButtonData *data)
{ {
ui_set_but_vectorf(but, data->vec); ui_set_but_vectorf(but, data->vec);
@ -732,24 +666,6 @@ static void ui_apply_but_CURVE(bContext *C, uiBut *but, uiHandleButtonData *data
data->applied = true; data->applied = true;
} }
static void ui_apply_but_IDPOIN(bContext *C, uiBut *but, uiHandleButtonData *data)
{
ui_set_but_string(C, but, data->str);
ui_check_but(but);
ui_apply_but_func(C, but);
data->retval = but->retval;
data->applied = true;
}
#ifdef WITH_INTERNATIONAL
static void ui_apply_but_CHARTAB(bContext *C, uiBut *but, uiHandleButtonData *data)
{
ui_apply_but_func(C, but);
data->retval = but->retval;
data->applied = true;
}
#endif
/* ****************** drag drop code *********************** */ /* ****************** drag drop code *********************** */
#ifdef USE_DRAG_TOGGLE #ifdef USE_DRAG_TOGGLE
@ -1292,11 +1208,9 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
break; break;
case TOGBUT: case TOGBUT:
case TOG: case TOG:
case TOGR:
case ICONTOG: case ICONTOG:
case ICONTOGN: case ICONTOGN:
case TOGN: case TOGN:
case BUT_TOGDUAL:
case OPTION: case OPTION:
case OPTIONN: case OPTIONN:
ui_apply_but_TOG(C, but, data); ui_apply_but_TOG(C, but, data);
@ -1307,17 +1221,10 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
break; break;
case SCROLL: case SCROLL:
case NUM: case NUM:
case NUMABS:
case SLI:
case NUMSLI: case NUMSLI:
ui_apply_but_NUM(C, but, data); ui_apply_but_NUM(C, but, data);
break; break;
case TOG3:
ui_apply_but_TOG3(C, but, data);
break;
case MENU: case MENU:
case ICONROW:
case ICONTEXTROW:
case BLOCK: case BLOCK:
case PULLDOWN: case PULLDOWN:
ui_apply_but_BLOCK(C, but, data); ui_apply_but_BLOCK(C, but, data);
@ -1342,14 +1249,6 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
case BUT_CURVE: case BUT_CURVE:
ui_apply_but_CURVE(C, but, data); ui_apply_but_CURVE(C, but, data);
break; break;
case IDPOIN:
ui_apply_but_IDPOIN(C, but, data);
break;
#ifdef WITH_INTERNATIONAL
case CHARTAB:
ui_apply_but_CHARTAB(C, but, data);
break;
#endif
case KEYEVT: case KEYEVT:
case HOTKEYEVT: case HOTKEYEVT:
ui_apply_but_BUT(C, but, data); ui_apply_but_BUT(C, but, data);
@ -1392,7 +1291,7 @@ static void ui_but_drop(bContext *C, const wmEvent *event, uiBut *but, uiHandleB
for (wmd = drags->first; wmd; wmd = wmd->next) { for (wmd = drags->first; wmd; wmd = wmd->next) {
if (wmd->type == WM_DRAG_ID) { if (wmd->type == WM_DRAG_ID) {
/* align these types with UI_but_active_drop_name */ /* align these types with UI_but_active_drop_name */
if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
ID *id = (ID *)wmd->poin; ID *id = (ID *)wmd->poin;
if (but->poin == NULL && but->rnapoin.data == NULL) {} if (but->poin == NULL && but->rnapoin.data == NULL) {}
@ -1433,7 +1332,7 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
} }
/* numeric value */ /* numeric value */
if (ELEM3(but->type, NUM, NUMABS, NUMSLI)) { if (ELEM(but->type, NUM, NUMSLI)) {
if (but->poin == NULL && but->rnapoin.data == NULL) { if (but->poin == NULL && but->rnapoin.data == NULL) {
/* pass */ /* pass */
@ -1497,7 +1396,7 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
} }
/* text/string and ID data */ /* text/string and ID data */
else if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { else if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
uiHandleButtonData *active_data = but->active; uiHandleButtonData *active_data = but->active;
if (but->poin == NULL && but->rnapoin.data == NULL) { if (but->poin == NULL && but->rnapoin.data == NULL) {
@ -2041,7 +1940,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
BLI_str_rstrip_float_zero(data->str, '\0'); BLI_str_rstrip_float_zero(data->str, '\0');
} }
if (ELEM3(but->type, NUM, NUMABS, NUMSLI)) { if (ELEM(but->type, NUM, NUMSLI)) {
ui_convert_to_unit_alt_name(but, data->str, data->maxlen); ui_convert_to_unit_alt_name(but, data->str, data->maxlen);
} }
@ -2113,7 +2012,7 @@ static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
return; return;
for (but = actbut->next; but; but = but->next) { for (but = actbut->next; but; but = but->next) {
if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (ELEM5(but->type, TEX, NUM, NUMSLI, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
if (!(but->flag & UI_BUT_DISABLED)) { if (!(but->flag & UI_BUT_DISABLED)) {
data->postbut = but; data->postbut = but;
data->posttype = BUTTON_ACTIVATE_TEXT_EDITING; data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@ -2122,7 +2021,7 @@ static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
} }
} }
for (but = block->buttons.first; but != actbut; but = but->next) { for (but = block->buttons.first; but != actbut; but = but->next) {
if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (ELEM5(but->type, TEX, NUM, NUMSLI, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
if (!(but->flag & UI_BUT_DISABLED)) { if (!(but->flag & UI_BUT_DISABLED)) {
data->postbut = but; data->postbut = but;
data->posttype = BUTTON_ACTIVATE_TEXT_EDITING; data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@ -2141,7 +2040,7 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
return; return;
for (but = actbut->prev; but; but = but->prev) { for (but = actbut->prev; but; but = but->prev) {
if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (ELEM5(but->type, TEX, NUM, NUMSLI, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
if (!(but->flag & UI_BUT_DISABLED)) { if (!(but->flag & UI_BUT_DISABLED)) {
data->postbut = but; data->postbut = but;
data->posttype = BUTTON_ACTIVATE_TEXT_EDITING; data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@ -2150,7 +2049,7 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
} }
} }
for (but = block->buttons.last; but != actbut; but = but->prev) { for (but = block->buttons.last; but != actbut; but = but->prev) {
if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (ELEM5(but->type, TEX, NUM, NUMSLI, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
if (!(but->flag & UI_BUT_DISABLED)) { if (!(but->flag & UI_BUT_DISABLED)) {
data->postbut = but; data->postbut = but;
data->posttype = BUTTON_ACTIVATE_TEXT_EDITING; data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@ -2345,7 +2244,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
/* exception that's useful for number buttons, some keyboard /* exception that's useful for number buttons, some keyboard
* numpads have a comma instead of a period */ * numpads have a comma instead of a period */
if (ELEM3(but->type, NUM, NUMABS, NUMSLI)) { /* could use data->min*/ if (ELEM(but->type, NUM, NUMSLI)) { /* could use data->min*/
if (event->type == PADPERIOD && ascii == ',') { if (event->type == PADPERIOD && ascii == ',') {
ascii = '.'; ascii = '.';
utf8_buf = NULL; /* force ascii fallback */ utf8_buf = NULL; /* force ascii fallback */
@ -2517,14 +2416,6 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
menustr = but->str; menustr = but->str;
} }
break; break;
case ICONROW:
menufunc = ui_block_func_ICONROW;
arg = but;
break;
case ICONTEXTROW:
menufunc = ui_block_func_ICONTEXTROW;
arg = but;
break;
case COLOR: case COLOR:
ui_get_but_vectorf(but, data->origvec); ui_get_but_vectorf(but, data->origvec);
copy_v3_v3(data->vec, data->origvec); copy_v3_v3(data->vec, data->origvec);
@ -3530,7 +3421,7 @@ static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, co
button_activate_state(C, but, BUTTON_STATE_MENU_OPEN); button_activate_state(C, but, BUTTON_STATE_MENU_OPEN);
return WM_UI_HANDLER_BREAK; return WM_UI_HANDLER_BREAK;
} }
else if (ELEM3(but->type, MENU, ICONROW, ICONTEXTROW)) { else if (but->type == MENU) {
if (ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) { if (ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) {
const int direction = (event->type == WHEELDOWNMOUSE) ? -1 : 1; const int direction = (event->type == WHEELDOWNMOUSE) ? -1 : 1;
@ -4793,112 +4684,6 @@ static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHand
return WM_UI_HANDLER_CONTINUE; return WM_UI_HANDLER_CONTINUE;
} }
#ifdef WITH_INTERNATIONAL
static int ui_do_but_CHARTAB(bContext *UNUSED(C), uiBlock *UNUSED(block), uiBut *UNUSED(but), uiHandleButtonData *UNUSED(data), const wmEvent *UNUSED(event))
{
/* XXX 2.50 bad global and state access */
#if 0
float sx, sy, ex, ey;
float width, height;
float butw, buth;
int mx, my, x, y, cs, che;
mx = event->x;
my = event->y;
ui_window_to_block(data->region, block, &mx, &my);
if (data->state == BUTTON_STATE_HIGHLIGHT) {
if (ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val == KM_PRESS) {
/* Calculate the size of the button */
width = abs(BLI_rctf_size_x(&but->rect));
height = abs(BLI_rctf_size_y(&but->rect));
butw = floor(width / 12);
buth = floor(height / 6);
/* Initialize variables */
sx = but->rect.xmin;
ex = but->rect.xmin + butw;
sy = but->rect.ymin + height - buth;
ey = but->rect.ymin + height;
cs = G.charstart;
/* And the character is */
x = (int) ((mx / butw) - 0.5);
y = (int) (6 - ((my / buth) - 0.5));
che = cs + (y * 12) + x;
if (che > G.charmax)
che = 0;
if (G.obedit) {
do_textedit(0, 0, che);
}
button_activate_state(C, but, BUTTON_STATE_EXIT);
return WM_UI_HANDLER_BREAK;
}
else if (ELEM(event->type, WHEELUPMOUSE, PAGEUPKEY)) {
for (but = block->buttons.first; but; but = but->next) {
if (but->type == CHARTAB) {
G.charstart = G.charstart - (12 * 6);
if (G.charstart < 0)
G.charstart = 0;
if (G.charstart < G.charmin)
G.charstart = G.charmin;
ui_draw_but(but);
//Really nasty... to update the num button from the same butblock
for (bt = block->buttons.first; bt; bt = bt->next)
{
if (ELEM(bt->type, NUM, NUMABS)) {
ui_check_but(bt);
ui_draw_but(bt);
}
}
retval = UI_CONT;
break;
}
}
return WM_UI_HANDLER_BREAK;
}
else if (ELEM(event->type, WHEELDOWNMOUSE, PAGEDOWNKEY)) {
for (but = block->buttons.first; but; but = but->next) {
if (but->type == CHARTAB) {
G.charstart = G.charstart + (12 * 6);
if (G.charstart > (0xffff - 12 * 6))
G.charstart = 0xffff - (12 * 6);
if (G.charstart > G.charmax - 12 * 6)
G.charstart = G.charmax - 12 * 6;
ui_draw_but(but);
for (bt = block->buttons.first; bt; bt = bt->next)
{
if (ELEM(bt->type, NUM, NUMABS)) {
ui_check_but(bt);
ui_draw_but(bt);
}
}
but->flag |= UI_ACTIVE;
retval = UI_RETURN_OK;
break;
}
}
return WM_UI_HANDLER_BREAK;
}
}
#endif
return WM_UI_HANDLER_CONTINUE;
}
#endif
static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event) static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
{ {
VECCOPY2D(but->linkto, event->mval); VECCOPY2D(but->linkto, event->mval);
@ -5552,11 +5337,9 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
break; break;
case TOGBUT: case TOGBUT:
case TOG: case TOG:
case TOGR:
case ICONTOG: case ICONTOG:
case ICONTOGN: case ICONTOGN:
case TOGN: case TOGN:
case BUT_TOGDUAL:
case OPTION: case OPTION:
case OPTIONN: case OPTIONN:
retval = ui_do_but_TOG(C, but, data, event); retval = ui_do_but_TOG(C, but, data, event);
@ -5565,17 +5348,14 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
retval = ui_do_but_SCROLL(C, block, but, data, event); retval = ui_do_but_SCROLL(C, block, but, data, event);
break; break;
case NUM: case NUM:
case NUMABS:
retval = ui_do_but_NUM(C, block, but, data, event); retval = ui_do_but_NUM(C, block, but, data, event);
break; break;
case SLI:
case NUMSLI: case NUMSLI:
retval = ui_do_but_SLI(C, block, but, data, event); retval = ui_do_but_SLI(C, block, but, data, event);
break; break;
case ROUNDBOX: case ROUNDBOX:
case LISTBOX: case LISTBOX:
case LABEL: case LABEL:
case TOG3:
case ROW: case ROW:
case LISTROW: case LISTROW:
case BUT_IMAGE: case BUT_IMAGE:
@ -5593,7 +5373,6 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
retval = ui_do_but_VECTORSCOPE(C, block, but, data, event); retval = ui_do_but_VECTORSCOPE(C, block, but, data, event);
break; break;
case TEX: case TEX:
case IDPOIN:
case SEARCH_MENU: case SEARCH_MENU:
retval = ui_do_but_TEX(C, block, but, data, event); retval = ui_do_but_TEX(C, block, but, data, event);
break; break;
@ -5601,8 +5380,6 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
retval = ui_do_but_SEARCH_UNLINK(C, block, but, data, event); retval = ui_do_but_SEARCH_UNLINK(C, block, but, data, event);
break; break;
case MENU: case MENU:
case ICONROW:
case ICONTEXTROW:
case BLOCK: case BLOCK:
case PULLDOWN: case PULLDOWN:
retval = ui_do_but_BLOCK(C, but, data, event); retval = ui_do_but_BLOCK(C, but, data, event);
@ -5631,16 +5408,6 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
case HSVCIRCLE: case HSVCIRCLE:
retval = ui_do_but_HSVCIRCLE(C, block, but, data, event); retval = ui_do_but_HSVCIRCLE(C, block, but, data, event);
break; break;
#ifdef WITH_INTERNATIONAL
case CHARTAB:
retval = ui_do_but_CHARTAB(C, block, but, data, event);
break;
#else
/* do nothing */
case CHARTAB:
break;
#endif
case LINK: case LINK:
case INLINK: case INLINK:
retval = ui_do_but_LINK(C, but, data, event); retval = ui_do_but_LINK(C, but, data, event);
@ -5713,7 +5480,7 @@ int UI_but_active_drop_name(bContext *C)
uiBut *but = ui_but_find_activated(ar); uiBut *but = ui_but_find_activated(ar);
if (but) { if (but) {
if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK))
return 1; return 1;
} }
@ -5923,7 +5690,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
button_tooltip_timer_reset(C, but); button_tooltip_timer_reset(C, but);
/* automatic open pulldown block timer */ /* automatic open pulldown block timer */
if (ELEM3(but->type, BLOCK, PULLDOWN, ICONTEXTROW)) { if (ELEM(but->type, BLOCK, PULLDOWN)) {
if (data->used_mouse && !data->autoopentimer) { if (data->used_mouse && !data->autoopentimer) {
int time; int time;
@ -6733,7 +6500,7 @@ static void ui_handle_button_return_submenu(bContext *C, const wmEvent *event, u
if ((menu->menuretval & UI_RETURN_OK) || (menu->menuretval & UI_RETURN_UPDATE)) { if ((menu->menuretval & UI_RETURN_OK) || (menu->menuretval & UI_RETURN_UPDATE)) {
if (but->type == COLOR) if (but->type == COLOR)
copy_v3_v3(data->vec, menu->retvec); copy_v3_v3(data->vec, menu->retvec);
else if (ELEM3(but->type, MENU, ICONROW, ICONTEXTROW)) else if (but->type == MENU)
data->value = menu->retvalue; data->value = menu->retvalue;
} }
@ -7207,11 +6974,6 @@ static int ui_handle_menu_event(bContext *C, const wmEvent *event, uiPopupBlockH
doit = TRUE; doit = TRUE;
} }
} }
/* exception for menus like layer buts, with button aligning they're not drawn in order */
else if (but->type == TOGR) {
if (but->bitnr == act - 1)
doit = TRUE;
}
else if (count == act) { else if (count == act) {
doit = TRUE; doit = TRUE;
} }

@ -230,10 +230,6 @@ struct uiBut {
short modifier_key; short modifier_key;
short iconadd; short iconadd;
/* IDPOIN data */
uiIDPoinFuncFP idpoin_func;
ID **idpoin_idpp;
/* BLOCK data */ /* BLOCK data */
uiBlockCreateFunc block_create_func; uiBlockCreateFunc block_create_func;
@ -460,8 +456,6 @@ struct uiPopupBlockHandle {
}; };
uiBlock *ui_block_func_COLOR(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but); uiBlock *ui_block_func_COLOR(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
void ui_block_func_ICONROW(struct bContext *C, uiLayout *layout, void *arg_but);
void ui_block_func_ICONTEXTROW(struct bContext *C, uiLayout *layout, void *arg_but);
struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but); struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
void ui_tooltip_free(struct bContext *C, struct ARegion *ar); void ui_tooltip_free(struct bContext *C, struct ARegion *ar);

@ -481,7 +481,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
data->totline++; data->totline++;
} }
if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) { if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
/* full string */ /* full string */
ui_get_but_string(but, buf, sizeof(buf)); ui_get_but_string(but, buf, sizeof(buf));
if (buf[0]) { if (buf[0]) {
@ -1866,53 +1866,6 @@ static void ui_block_func_MENUSTR(bContext *UNUSED(C), uiLayout *layout, void *a
menudata_free(md); menudata_free(md);
} }
void ui_block_func_ICONROW(bContext *UNUSED(C), uiLayout *layout, void *arg_but)
{
uiBlock *block = uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle = block->handle;
uiBut *but = arg_but;
int a;
uiBlockSetFlag(block, UI_BLOCK_MOVEMOUSE_QUIT);
for (a = (int)but->hardmin; a <= (int)but->hardmax; a++)
uiDefIconButF(block, BUTM, B_NOP, but->icon + (a - but->hardmin), 0, 0, UI_UNIT_X * 5, UI_UNIT_Y,
&handle->retvalue, (float)a, 0.0, 0, -1, "");
}
void ui_block_func_ICONTEXTROW(bContext *UNUSED(C), uiLayout *layout, void *arg_but)
{
uiBlock *block = uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle = block->handle;
uiBut *but = arg_but, *bt;
MenuData *md;
MenuEntry *entry;
int a;
uiBlockSetFlag(block, UI_BLOCK_MOVEMOUSE_QUIT);
md = decompose_menu_string(but->str);
/* title */
if (md->title) {
bt = uiDefBut(block, LABEL, 0, md->title, 0, 0, UI_UNIT_X * 5, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
bt->flag = UI_TEXT_LEFT;
}
/* loop through the menu options and draw them out with icons & text labels */
for (a = 0; a < md->nitems; a++) {
entry = &md->items[md->nitems - a - 1];
if (entry->sepr)
uiItemS(layout);
else
uiDefIconTextButF(block, BUTM, B_NOP, (short)((but->icon) + (entry->retval - but->hardmin)), entry->str,
0, 0, UI_UNIT_X * 5, UI_UNIT_Y, &handle->retvalue, (float) entry->retval, 0.0, 0, -1, "");
}
menudata_free(md);
}
#if 0 #if 0
static void ui_warp_pointer(int x, int y) static void ui_warp_pointer(int x, int y)
{ {

@ -113,7 +113,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
if (icon == ICON_DOT) if (icon == ICON_DOT)
icon = 0; icon = 0;
but = uiDefIconTextButR_prop(block, IDPOIN, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL); but = uiDefIconTextButR_prop(block, SEARCH_MENU, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
break; break;
} }
case PROP_COLLECTION: case PROP_COLLECTION:

@ -891,23 +891,12 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, const rcti
float ofs = 1.0f / aspect; float ofs = 1.0f / aspect;
if (but->flag & UI_ICON_LEFT) { if (but->flag & UI_ICON_LEFT) {
if (but->type == BUT_TOGDUAL) { if (but->block->flag & UI_BLOCK_LOOP) {
if (but->drawstr[0]) {
xs = rect->xmin - ofs;
}
else {
xs = (rect->xmin + rect->xmax - height) / 2.0f;
}
}
else if (but->block->flag & UI_BLOCK_LOOP) {
if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK)) if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK))
xs = rect->xmin + 4.0f * ofs; xs = rect->xmin + 4.0f * ofs;
else else
xs = rect->xmin + ofs; xs = rect->xmin + ofs;
} }
else if ((but->type == ICONROW) || (but->type == ICONTEXTROW)) {
xs = rect->xmin + 3.0f * ofs;
}
else { else {
xs = rect->xmin + 4.0f * ofs; xs = rect->xmin + 4.0f * ofs;
} }
@ -1220,13 +1209,12 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
#if 0 #if 0
ui_rasterpos_safe(x, y, but->aspect); ui_rasterpos_safe(x, y, but->aspect);
if (but->type == IDPOIN) transopts = 0; /* no translation, of course! */ transopts = ui_translate_buttons();
else transopts = ui_translate_buttons();
#endif #endif
/* cut string in 2 parts - only for menu entries */ /* cut string in 2 parts - only for menu entries */
if ((but->block->flag & UI_BLOCK_LOOP)) { if ((but->block->flag & UI_BLOCK_LOOP)) {
if (ELEM5(but->type, SLI, NUM, TEX, NUMSLI, NUMABS) == 0) { if (ELEM3(but->type, NUM, TEX, NUMSLI) == 0) {
cpoin = strchr(but->drawstr, '|'); cpoin = strchr(but->drawstr, '|');
if (cpoin) *cpoin = 0; if (cpoin) *cpoin = 0;
} }
@ -1292,7 +1280,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
if (but->editstr && but->pos >= 0) { if (but->editstr && but->pos >= 0) {
ui_text_clip_cursor(fstyle, but, rect); ui_text_clip_cursor(fstyle, but, rect);
} }
else if (ELEM4(but->type, NUM, NUMABS, NUMSLI, SLI)) { else if (ELEM(but->type, NUM, NUMSLI)) {
ui_text_clip_right_label(fstyle, but, rect); ui_text_clip_right_label(fstyle, but, rect);
} }
else if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) { else if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
@ -1306,64 +1294,46 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
} }
/* check for button text label */ /* check for button text label */
if (but->type == ICONTEXTROW) { if (but->type == MENU && (but->flag & UI_BUT_NODE_LINK)) {
widget_draw_icon(but, (BIFIconID) (but->icon + but->iconadd), 1.0f, rect); int tmp = rect->xmin;
rect->xmin = rect->xmax - BLI_rcti_size_y(rect) - 1;
widget_draw_icon(but, ICON_LAYER_USED, alpha, rect);
rect->xmin = tmp;
} }
else {
if (but->type == BUT_TOGDUAL) { /* If there's an icon too (made with uiDefIconTextBut) then draw the icon
int dualset = 0; * and offset the text label to accommodate it */
if (but->pointype == UI_BUT_POIN_SHORT) {
dualset = UI_BITBUT_TEST(*(((short *)but->poin) + 1), but->bitnr);
}
else if (but->pointype == UI_BUT_POIN_INT) {
dualset = UI_BITBUT_TEST(*(((int *)but->poin) + 1), but->bitnr);
}
widget_draw_icon(but, ICON_DOT, dualset ? alpha : 0.25f, rect); if (but->flag & UI_HAS_ICON) {
} widget_draw_icon(but, but->icon + but->iconadd, alpha, rect);
else if (but->type == MENU && (but->flag & UI_BUT_NODE_LINK)) {
int tmp = rect->xmin;
rect->xmin = rect->xmax - BLI_rcti_size_y(rect) - 1;
widget_draw_icon(but, ICON_LAYER_USED, alpha, rect);
rect->xmin = tmp;
}
/* If there's an icon too (made with uiDefIconTextBut) then draw the icon /* icons default draw 0.8f x height */
* and offset the text label to accommodate it */ rect->xmin += (int)(0.8f * BLI_rcti_size_y(rect));
if (but->flag & UI_HAS_ICON) { if (but->editstr || (but->flag & UI_TEXT_LEFT)) {
widget_draw_icon(but, but->icon + but->iconadd, alpha, rect);
/* icons default draw 0.8f x height */
rect->xmin += (int)(0.8f * BLI_rcti_size_y(rect));
if (but->editstr || (but->flag & UI_TEXT_LEFT)) {
rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
}
else if ((but->flag & UI_TEXT_RIGHT)) {
rect->xmax -= (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
}
}
else if ((but->flag & UI_TEXT_LEFT)) {
rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect; rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
} }
else if ((but->flag & UI_TEXT_RIGHT)) { else if ((but->flag & UI_TEXT_RIGHT)) {
rect->xmax -= (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect; rect->xmax -= (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
} }
/* unlink icon for this button type */
if (but->type == SEARCH_MENU_UNLINK && !but->editstr && but->drawstr[0]) {
rcti temp = *rect;
temp.xmin = temp.xmax - (BLI_rcti_size_y(rect) * 1.08f);
widget_draw_icon(but, ICON_X, alpha, &temp);
}
/* always draw text for textbutton cursor */
widget_draw_text(fstyle, wcol, but, rect);
} }
else if ((but->flag & UI_TEXT_LEFT)) {
rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
}
else if ((but->flag & UI_TEXT_RIGHT)) {
rect->xmax -= (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect;
}
/* unlink icon for this button type */
if (but->type == SEARCH_MENU_UNLINK && !but->editstr && but->drawstr[0]) {
rcti temp = *rect;
temp.xmin = temp.xmax - (BLI_rcti_size_y(rect) * 1.08f);
widget_draw_icon(but, ICON_X, alpha, &temp);
}
/* always draw text for textbutton cursor */
widget_draw_text(fstyle, wcol, but, rect);
ui_button_text_password_hide(password_str, but, TRUE); ui_button_text_password_hide(password_str, but, TRUE);
} }
@ -3279,7 +3249,6 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
case TOGBUT: case TOGBUT:
case TOG: case TOG:
case TOGN: case TOGN:
case TOG3:
wt = widget_type(UI_WTYPE_TOGGLE); wt = widget_type(UI_WTYPE_TOGGLE);
break; break;
@ -3300,7 +3269,6 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
case MENU: case MENU:
case BLOCK: case BLOCK:
case ICONTEXTROW:
/* new node-link button, not active yet XXX */ /* new node-link button, not active yet XXX */
if (but->flag & UI_BUT_NODE_LINK) if (but->flag & UI_BUT_NODE_LINK)
wt = widget_type(UI_WTYPE_MENU_NODE_LINK); wt = widget_type(UI_WTYPE_MENU_NODE_LINK);

@ -395,79 +395,6 @@ bool paintface_minmax(Object *ob, float r_min[3], float r_max[3])
return ok; return ok;
} }
/* *************************************** */
#if 0
static void seam_edgehash_insert_face(EdgeHash *ehash, MPoly *mp, MLoop *loopstart)
{
MLoop *ml1, *ml2;
int a;
for (a = 0; a < mp->totloop; a++) {
ml1 = loopstart + a;
ml2 = loopstart + (a + 1) % mp->totloop;
BLI_edgehash_insert(ehash, ml1->v, ml2->v, NULL);
}
}
void seam_mark_clear_tface(Scene *scene, short mode)
{
Mesh *me;
MPoly *mp;
MLoop *ml1, *ml2;
MEdge *med;
int a, b;
me = BKE_mesh_from_object(OBACT);
if (me == 0 || me->totpoly == 0) return;
if (mode == 0)
mode = pupmenu(IFACE_("Seams %t|Mark Border Seam %x1|Clear Seam %x2"));
if (mode != 1 && mode != 2)
return;
if (mode == 2) {
EdgeHash *ehash = BLI_edgehash_new();
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++)
if (!(mp->flag & ME_HIDE) && (mp->flag & ME_FACE_SEL))
seam_edgehash_insert_face(ehash, mp, me->mloop + mp->loopstart);
for (a = 0, med = me->medge; a < me->totedge; a++, med++)
if (BLI_edgehash_haskey(ehash, med->v1, med->v2))
med->flag &= ~ME_SEAM;
BLI_edgehash_free(ehash, NULL);
}
else {
/* mark edges that are on both selected and deselected faces */
EdgeHash *ehash1 = BLI_edgehash_new();
EdgeHash *ehash2 = BLI_edgehash_new();
for (a = 0, mp = me->mpoly; a < me->totpoly; a++, mp++) {
if ((mp->flag & ME_HIDE) || !(mp->flag & ME_FACE_SEL))
seam_edgehash_insert_face(ehash1, mp, me->mloop + mp->loopstart);
else
seam_edgehash_insert_face(ehash2, mp, me->mloop + mp->loopstart);
}
for (a = 0, med = me->medge; a < me->totedge; a++, med++)
if (BLI_edgehash_haskey(ehash1, med->v1, med->v2) &&
BLI_edgehash_haskey(ehash2, med->v1, med->v2))
med->flag |= ME_SEAM;
BLI_edgehash_free(ehash1, NULL);
BLI_edgehash_free(ehash2, NULL);
}
// XXX if (G.debug_value == 8)
// unwrap_lscm(1);
me->drawflag |= ME_DRAWSEAMS;
}
#endif
bool paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], bool extend, bool deselect, bool toggle) bool paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], bool extend, bool deselect, bool toggle)
{ {
Mesh *me; Mesh *me;

@ -329,36 +329,27 @@ static int edbm_extrude_mesh(Scene *scene, Object *obedit, BMEditMesh *em, wmOpe
zero_v3(nor); zero_v3(nor);
/* XXX If those popup menus were to be enabled again, please get rid of this "menu string" syntax! */
if (em->selectmode & SCE_SELECT_VERTEX) { if (em->selectmode & SCE_SELECT_VERTEX) {
if (em->bm->totvertsel == 0) nr = 0; if (em->bm->totvertsel == 0) nr = 0;
else if (em->bm->totvertsel == 1) nr = 4; else if (em->bm->totvertsel == 1) nr = 4;
else if (em->bm->totedgesel == 0) nr = 4; else if (em->bm->totedgesel == 0) nr = 4;
else if (em->bm->totfacesel == 0) else if (em->bm->totfacesel == 0)
nr = 3; /* pupmenu("Extrude %t|Only Edges %x3|Only Vertices %x4"); */ nr = 3;
else if (em->bm->totfacesel == 1) else if (em->bm->totfacesel == 1)
nr = 1; /* pupmenu("Extrude %t|Region %x1|Only Edges% x3|Only Vertices %x4"); */ nr = 1;
else else
nr = 1; /* pupmenu("Extrude %t|Region %x1|Individual Faces %x2|Only Edges %x3|Only Vertices %x4"); */ nr = 1;
} }
else if (em->selectmode & SCE_SELECT_EDGE) { else if (em->selectmode & SCE_SELECT_EDGE) {
if (em->bm->totedgesel == 0) nr = 0; if (em->bm->totedgesel == 0) nr = 0;
nr = 1; nr = 1;
#if 0
else if (em->totedgesel == 1) nr = 3;
else if (em->totfacesel == 0) nr = 3;
else if (em->totfacesel == 1)
nr = 1; /* pupmenu("Extrude %t|Region %x1|Only Edges %x3"); */
else
nr = 1; /* pupmenu("Extrude %t|Region %x1|Individual Faces %x2|Only Edges %x3"); */
#endif
} }
else { else {
if (em->bm->totfacesel == 0) nr = 0; if (em->bm->totfacesel == 0) nr = 0;
else if (em->bm->totfacesel == 1) nr = 1; else if (em->bm->totfacesel == 1) nr = 1;
else else
nr = 1; /* pupmenu("Extrude %t|Region %x1|Individual Faces %x2"); */ nr = 1;
} }
if (nr < 1) return 'g'; if (nr < 1) return 'g';