- further work on view3d panels:

- you can close them (x icon) or press ESC
- option to open panel at mouse location (try Nkey)
- using 'collapse' (triangle icon) stows header in bottom
- opening again restores at old location
- dragging panels or zooming clips nicely with window

evaluate: an 'auto close' when mouse goes outside panel

Warning: vertex selecting still broken! :) It's 2 am now, bedtime...
This commit is contained in:
2003-10-16 00:17:24 +00:00
parent d518ca6bc6
commit c7618783fb
8 changed files with 257 additions and 105 deletions

View File

@@ -82,9 +82,13 @@ struct ScrArea;
#define UI_HELV 0 #define UI_HELV 0
#define UI_HELVB 1 #define UI_HELVB 1
/* panel style */ /* panel controls */
#define UI_PNL_TRANSP 0 #define UI_PNL_TRANSP 1
#define UI_PNL_SOLID 1 #define UI_PNL_SOLID 2
#define UI_PNL_CLOSE 32
#define UI_PNL_STOW 64
#define UI_PNL_TO_MOUSE 128
/* definitions for icons (and their alignment) in buttons */ /* definitions for icons (and their alignment) in buttons */
@@ -251,8 +255,8 @@ void uiPanelPush(uiBlock *block);
void uiPanelPop(uiBlock *block); void uiPanelPop(uiBlock *block);
extern uiBlock *uiFindOpenPanelBlockName(ListBase *lb, char *name); extern uiBlock *uiFindOpenPanelBlockName(ListBase *lb, char *name);
extern int uiAlignPanelStep(struct ScrArea *sa, float fac); extern int uiAlignPanelStep(struct ScrArea *sa, float fac);
extern void uiSetPanelStyle(int); extern void uiPanelControl(int);
extern void uiSetPanelHandler(int);
#endif /* BIF_INTERFACE_H */ #endif /* BIF_INTERFACE_H */

View File

@@ -49,10 +49,6 @@ struct BWinEvent;
/* is hardcoded in DNA_space_types.h */ /* is hardcoded in DNA_space_types.h */
#define SPACE_MAXHANDLER 8 #define SPACE_MAXHANDLER 8
/* values for events */
#define HANDLER_MOUSEPOS 1
#define HANDLER_CLOSE 2
/* view3d handler codes */ /* view3d handler codes */
#define VIEW3D_HANDLER_BACKGROUND 1 #define VIEW3D_HANDLER_BACKGROUND 1
#define VIEW3D_HANDLER_VIEW 2 #define VIEW3D_HANDLER_VIEW 2
@@ -71,7 +67,7 @@ void scrarea_do_headdraw (struct ScrArea *sa);
void scrarea_do_headchange (struct ScrArea *sa); void scrarea_do_headchange (struct ScrArea *sa);
/* space.c */ /* space.c */
extern void add_blockhandler(struct ScrArea *sa, short eventcode, short val); extern void add_blockhandler(struct ScrArea *sa, short eventcode, short action);
extern void rem_blockhandler(struct ScrArea *sa, short eventcode); extern void rem_blockhandler(struct ScrArea *sa, short eventcode);
extern void space_set_commmandline_options(void); extern void space_set_commmandline_options(void);

View File

@@ -189,11 +189,15 @@ struct uiBlock {
float xofs, yofs; // offset to parent button float xofs, yofs; // offset to parent button
rctf parentrct; // for pulldowns, rect the mouse is allowed outside of menu (parent button) rctf parentrct; // for pulldowns, rect the mouse is allowed outside of menu (parent button)
int handler; // for panels in other windows than buttonswin... just event code
}; };
/* interface.c */ /* interface.c */
extern void ui_check_but(uiBut *but); extern void ui_check_but(uiBut *but);
extern void ui_autofill(uiBlock *block); extern void ui_autofill(uiBlock *block);
extern void ui_graphics_to_window(int win, float *x, float *y);
extern void ui_window_to_graphics(int win, float *x, float *y);
/* interface_panel.c */ /* interface_panel.c */
extern void ui_draw_panel(uiBlock *block); extern void ui_draw_panel(uiBlock *block);

View File

@@ -85,7 +85,9 @@ typedef struct Panel { /* the part from uiBlock that needs saved in file */
char panelname[64], tabname[64]; /* defined as UI_MAX_NAME_STR */ char panelname[64], tabname[64]; /* defined as UI_MAX_NAME_STR */
short ofsx, ofsy, sizex, sizey; short ofsx, ofsy, sizex, sizey;
short flag, active; /* active= used currently by a uiBlock */ short flag, active; /* active= used currently by a uiBlock */
short style, pad2; short control, pad;
short old_ofsx, old_ofsy; /* for stow */
int pad2;
struct Panel *paneltab; /* this panel is tabbed in *paneltab */ struct Panel *paneltab; /* this panel is tabbed in *paneltab */
} Panel; } Panel;

View File

@@ -934,43 +934,43 @@ void do_viewbuts(unsigned short event)
} }
} }
static void view3d_panel_object(short action) // VIEW3D_HANDLER_OBJECT static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
{ {
uiBlock *block; uiBlock *block;
Object *ob= OBACT; Object *ob= OBACT;
float lim; float lim;
if(ob==NULL) return; if(ob==NULL) return;
block= uiNewBlock(&curarea->uiblocks, "view3d_panel_object", UI_EMBOSSX, UI_HELV, curarea->win); block= uiNewBlock(&curarea->uiblocks, "view3d_panel_object", UI_EMBOSSX, UI_HELV, curarea->win);
uiSetPanelStyle(UI_PNL_SOLID); uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | UI_PNL_STOW | cntrl);
uiSetPanelHandler(VIEW3D_HANDLER_OBJECT); // for close and esc
if(uiNewPanel(curarea, block, "Object", "View3d", 10, 230, 318, 204)==0) return; if(uiNewPanel(curarea, block, "Object", "View3d", 10, 230, 318, 204)==0) return;
uiSetPanelStyle(UI_PNL_TRANSP);
uiDefBut(block, TEX, B_IDNAME, "OB: ", 10,180,150,20, ob->id.name+2, 0.0, 18.0, 0, 0, ""); uiDefBut(block, TEX, B_IDNAME, "OB: ", 10,180,150,20, ob->id.name+2, 0.0, 18.0, 0, 0, "");
uiDefIDPoinBut(block, test_obpoin_but, B_REDR, "Par:", 160, 180, 150, 20, &ob->parent, "Parent Object"); uiDefIDPoinBut(block, test_obpoin_but, B_REDR, "Par:", 160, 180, 150, 20, &ob->parent, "Parent Object");
lim= 1000.0*MAX2(1.0, G.vd->grid); lim= 1000.0*MAX2(1.0, G.vd->grid);
uiDefButF(block, NUM, REDRAWVIEW3D, "LocX:", 10, 140, 150, 20, &(ob->loc[0]), -lim, lim, 100, 0, ""); uiDefButF(block, NUM, REDRAWVIEW3D, "LocX:", 10, 140, 150, 19, &(ob->loc[0]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "LocY:", 10, 120, 150, 20, &(ob->loc[1]), -lim, lim, 100, 0, ""); uiDefButF(block, NUM, REDRAWVIEW3D, "LocY:", 10, 120, 150, 19, &(ob->loc[1]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "LocZ:", 10, 100, 150, 20, &(ob->loc[2]), -lim, lim, 100, 0, ""); uiDefButF(block, NUM, REDRAWVIEW3D, "LocZ:", 10, 100, 150, 19, &(ob->loc[2]), -lim, lim, 100, 0, "");
ob_eul[0]= 180.0*ob->rot[0]/M_PI; ob_eul[0]= 180.0*ob->rot[0]/M_PI;
ob_eul[1]= 180.0*ob->rot[1]/M_PI; ob_eul[1]= 180.0*ob->rot[1]/M_PI;
ob_eul[2]= 180.0*ob->rot[2]/M_PI; ob_eul[2]= 180.0*ob->rot[2]/M_PI;
uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:", 10, 70, 150, 20, &(ob_eul[0]), -lim, lim, 1000, 0, ""); uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:", 10, 70, 150, 19, &(ob_eul[0]), -lim, lim, 1000, 0, "");
uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:", 10, 50, 150, 20, &(ob_eul[1]), -lim, lim, 1000, 0, ""); uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:", 10, 50, 150, 19, &(ob_eul[1]), -lim, lim, 1000, 0, "");
uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:", 10, 30, 150, 20, &(ob_eul[2]), -lim, lim, 1000, 0, ""); uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:", 10, 30, 150, 19, &(ob_eul[2]), -lim, lim, 1000, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "SizeX:", 160, 70, 150, 19, &(ob->size[0]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "SizeY:", 160, 50, 150, 19, &(ob->size[1]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "SizeZ:", 160, 30, 150, 19, &(ob->size[2]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "SizeX:", 160, 70, 150, 20, &(ob->size[0]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "SizeY:", 160, 50, 150, 20, &(ob->size[1]), -lim, lim, 100, 0, "");
uiDefButF(block, NUM, REDRAWVIEW3D, "SizeZ:", 160, 30, 150, 20, &(ob->size[2]), -lim, lim, 100, 0, "");
} }
static void view3d_panel_settings(cntrl) // VIEW3D_HANDLER_BACKGROUND
static void view3d_panel_settings(short action) // VIEW3D_HANDLER_SETTINGS
{ {
uiBlock *block; uiBlock *block;
View3D *vd; View3D *vd;
@@ -980,9 +980,9 @@ static void view3d_panel_settings(short action) // VIEW3D_HANDLER_SETTINGS
vd= G.vd; vd= G.vd;
block= uiNewBlock(&curarea->uiblocks, "view3d_panel_settings", UI_EMBOSSX, UI_HELV, curarea->win); block= uiNewBlock(&curarea->uiblocks, "view3d_panel_settings", UI_EMBOSSX, UI_HELV, curarea->win);
uiSetPanelStyle(UI_PNL_SOLID); uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | UI_PNL_STOW | cntrl);
uiSetPanelHandler(VIEW3D_HANDLER_BACKGROUND); // for close and esc
if(uiNewPanel(curarea, block, "Backdrop and settings", "View3d", 10, 10, 318, 204)==0) return; if(uiNewPanel(curarea, block, "Backdrop and settings", "View3d", 10, 10, 318, 204)==0) return;
uiSetPanelStyle(UI_PNL_TRANSP);
if(vd->flag & V3D_DISPBGPIC) { if(vd->flag & V3D_DISPBGPIC) {
if(vd->bgpic==0) { if(vd->bgpic==0) {
@@ -1048,6 +1048,8 @@ static void view3d_blockhandlers(ScrArea *sa)
View3D *v3d= sa->spacedata.first; View3D *v3d= sa->spacedata.first;
short a; short a;
uiFreeBlocksWin(&sa->uiblocks, sa->win);
for(a=0; a<SPACE_MAXHANDLER; a+=2) { for(a=0; a<SPACE_MAXHANDLER; a+=2) {
switch(v3d->blockhandler[a]) { switch(v3d->blockhandler[a]) {

View File

@@ -191,7 +191,7 @@ static uiSaveUnder *ui_save_under(int x, int y, int sx, int sy)
/* ************* DRAW ************** */ /* ************* DRAW ************** */
static void ui_graphics_to_window(int win, float *x, float *y) /* for rectwrite */ void ui_graphics_to_window(int win, float *x, float *y) /* for rectwrite */
{ {
float gx, gy; float gx, gy;
int sx, sy; int sx, sy;
@@ -208,7 +208,7 @@ static void ui_graphics_to_window(int win, float *x, float *y) /* for rectwrite
static void ui_window_to_graphics(int win, float *x, float *y) /* for mouse cursor */ void ui_window_to_graphics(int win, float *x, float *y) /* for mouse cursor */
{ {
float a, b, c, d, e, f, px, py; float a, b, c, d, e, f, px, py;
int getsizex, getsizey; int getsizex, getsizey;
@@ -4335,38 +4335,43 @@ static int ui_do_block(uiBlock *block, uiEvent *uevent)
/* check boundbox and panel events */ /* check boundbox and panel events */
if( block->minx <= uevent->mval[0] && block->maxx >= uevent->mval[0] ) { if( block->minx <= uevent->mval[0] && block->maxx >= uevent->mval[0] ) {
// inside block
if( block->miny <= uevent->mval[1] && block->maxy >= uevent->mval[1] ) inside= 1;
if(block->panel==NULL) { if(block->panel && block->panel->paneltab==NULL) {
if( block->miny <= uevent->mval[1] && block->maxy >= uevent->mval[1] )
inside= 1;
}
else if(block->panel->paneltab==NULL) {
if( block->miny <= uevent->mval[1] && block->maxy >= uevent->mval[1] ) inside= 1;
/* clicked at panel header? */ /* clicked at panel header? */
if(uevent->event==LEFTMOUSE) { if( block->panel->flag & PNL_CLOSEDX) {
if( block->panel->flag & PNL_CLOSEDX) { if(block->minx <= uevent->mval[0] && block->minx+PNL_HEADER >= uevent->mval[0])
if(block->minx <= uevent->mval[0] && block->minx+PNL_HEADER >= uevent->mval[0])
inside= 2;
}
else if( (block->maxy <= uevent->mval[1]) && (block->maxy+PNL_HEADER >= uevent->mval[1]) )
inside= 2; inside= 2;
if(inside==2) {
uiPanelPop(block); // pop matrix; no return without pop!
ui_do_panel(block, uevent);
return UI_EXIT_LOOP; // exit loops because of moving panels
}
} }
else if(uevent->event==PADPLUSKEY || uevent->event==PADMINUS) { else if( (block->maxy <= uevent->mval[1]) && (block->maxy+PNL_HEADER >= uevent->mval[1]) )
SpaceLink *sl= curarea->spacedata.first; inside= 2;
if(uevent->event==PADPLUSKEY) sl->blockscale+= 0.1; if(inside) { // this stuff should move to do_panel
else sl->blockscale-= 0.1;
CLAMP(sl->blockscale, 0.6, 1.0); if(uevent->event==LEFTMOUSE) {
addqueue(block->winq, REDRAW, 1); if(inside==2) {
retval= UI_CONT; uiPanelPop(block); // pop matrix; no return without pop!
ui_do_panel(block, uevent);
return UI_EXIT_LOOP; // exit loops because of moving panels
}
}
else if(uevent->event==ESCKEY) {
if(block->handler) {
rem_blockhandler(curarea, block->handler);
addqueue(curarea->win, REDRAW, 1);
}
}
else if(uevent->event==PADPLUSKEY || uevent->event==PADMINUS) {
SpaceLink *sl= curarea->spacedata.first;
if(uevent->event==PADPLUSKEY) sl->blockscale+= 0.1;
else sl->blockscale-= 0.1;
CLAMP(sl->blockscale, 0.6, 1.0);
addqueue(block->winq, REDRAW, 1);
retval= UI_CONT;
}
} }
} }
} }

View File

@@ -369,7 +369,7 @@ static void copy_panel_offset(Panel *pa, Panel *papar)
/* ugly global... but will be NULLed after each 'newPanel' call */ /* global... but will be NULLed after each 'newPanel' call */
static char *panel_tabbed=NULL, *group_tabbed=NULL; static char *panel_tabbed=NULL, *group_tabbed=NULL;
void uiNewPanelTabbed(char *panelname, char *groupname) void uiNewPanelTabbed(char *panelname, char *groupname)
@@ -379,11 +379,19 @@ void uiNewPanelTabbed(char *panelname, char *groupname)
} }
/* another global... */ /* another global... */
static int pnl_style= UI_PNL_TRANSP; static int pnl_control= UI_PNL_TRANSP;
void uiSetPanelStyle(int style) void uiPanelControl(int control)
{ {
pnl_style= style; pnl_control= control;
}
/* another global... */
static int pnl_handler= 0;
void uiSetPanelHandler(int handler)
{
pnl_handler= handler;
} }
@@ -416,7 +424,6 @@ int uiNewPanel(ScrArea *sa, uiBlock *block, char *panelname, char *tabname, int
pa->ofsy= ofsy & ~(PNL_GRID-1); pa->ofsy= ofsy & ~(PNL_GRID-1);
pa->sizex= sizex; pa->sizex= sizex;
pa->sizey= sizey; pa->sizey= sizey;
pa->style= pnl_style;
/* pre align, for good sorting later on */ /* pre align, for good sorting later on */
if(sa->spacetype==SPACE_BUTS && pa->prev) { if(sa->spacetype==SPACE_BUTS && pa->prev) {
@@ -447,11 +454,26 @@ int uiNewPanel(ScrArea *sa, uiBlock *block, char *panelname, char *tabname, int
} }
} }
if(pnl_control & UI_PNL_TO_MOUSE) {
short mval[2];
Mat4CpyMat4(UIwinmat, block->winmat); // can be first event here
uiGetMouse(block->win, mval);
pa->ofsx= mval[0]-pa->sizex/2;
pa->ofsy= mval[1]-pa->sizey/2;
if(pa->flag & PNL_CLOSED) pa->flag &= ~PNL_CLOSED;
}
block->panel= pa; block->panel= pa;
block->handler= pnl_handler;
pa->active= 1; pa->active= 1;
pa->control= pnl_control;
/* clear global */
/* clear ugly globals */
panel_tabbed= group_tabbed= NULL; panel_tabbed= group_tabbed= NULL;
pnl_handler= 0;
pnl_control= UI_PNL_TRANSP; // back to default
if(block->panel->paneltab) return 0; if(block->panel->paneltab) return 0;
if(block->panel->flag & PNL_CLOSED) return 0; if(block->panel->flag & PNL_CLOSED) return 0;
@@ -647,10 +669,10 @@ static void ui_draw_tria_icon(float x, float y, float aspect, char dir)
glColor3ub(240, 240, 240); glColor3ub(240, 240, 240);
if(dir=='h') { if(dir=='h') {
ui_draw_anti_tria( x, y, x, y+12.0, x+10, y+6); ui_draw_anti_tria( x, y, x, y+10.0, x+8.75, y+5.25);
} }
else { else {
ui_draw_anti_tria( x, y+10.0, x+12, y+10.0, x+6, y); ui_draw_anti_tria( x-2, y+8.75, x+10-2, y+8.75, x+5.25-2, y);
} }
@@ -707,7 +729,7 @@ static void ui_draw_panel_header(uiBlock *block)
{ {
Panel *pa, *panel= block->panel; Panel *pa, *panel= block->panel;
float width; float width;
int a, nr= 1; int a, nr= 1, pnl_icons;
char *str; char *str;
/* count */ /* count */
@@ -719,15 +741,18 @@ static void ui_draw_panel_header(uiBlock *block)
pa= pa->next; pa= pa->next;
} }
pnl_icons= PNL_ICON;
if(panel->control & UI_PNL_CLOSE) pnl_icons+= PNL_ICON;
if(nr==1) { if(nr==1) {
glColor3ub(255,255,255); glColor3ub(255,255,255);
glRasterPos2f(block->minx+40, block->maxy+5); glRasterPos2f(block->minx+pnl_icons, block->maxy+5);
BIF_DrawString(block->curfont, block->panel->panelname, (U.transopts & TR_BUTTONS), 0); BIF_DrawString(block->curfont, block->panel->panelname, (U.transopts & TR_BUTTONS), 0);
return; return;
} }
a= 0; a= 0;
width= (panel->sizex - 3 - 2*PNL_ICON)/nr; width= (panel->sizex - 3 - pnl_icons - PNL_ICON)/nr;
pa= curarea->panels.first; pa= curarea->panels.first;
while(pa) { while(pa) {
if(pa->active==0); if(pa->active==0);
@@ -735,10 +760,10 @@ static void ui_draw_panel_header(uiBlock *block)
/* active tab */ /* active tab */
uiSetRoundBox(15); uiSetRoundBox(15);
glColor3ub(140, 140, 147); glColor3ub(140, 140, 147);
uiRoundBox(2+PNL_ICON+a*width, panel->sizey+3, PNL_ICON+(a+1)*width, panel->sizey+PNL_HEADER-3, 8); uiRoundBox(2+pnl_icons+a*width, panel->sizey+3, pnl_icons+(a+1)*width, panel->sizey+PNL_HEADER-3, 8);
glColor3ub(255,255,255); glColor3ub(255,255,255);
glRasterPos2f(10+PNL_ICON+a*width, panel->sizey+5); glRasterPos2f(10+pnl_icons+a*width, panel->sizey+5);
str= ui_block_cut_str(block, pa->panelname, (short)(width-10)); str= ui_block_cut_str(block, pa->panelname, (short)(width-10));
BIF_DrawString(block->curfont, str, (U.transopts & TR_BUTTONS), 0); BIF_DrawString(block->curfont, str, (U.transopts & TR_BUTTONS), 0);
@@ -748,7 +773,7 @@ static void ui_draw_panel_header(uiBlock *block)
/* not active tab */ /* not active tab */
glColor3ub(95,95,95); glColor3ub(95,95,95);
glRasterPos2f(10+PNL_ICON+a*width, panel->sizey+5); glRasterPos2f(10+pnl_icons+a*width, panel->sizey+5);
str= ui_block_cut_str(block, pa->panelname, (short)(width-10)); str= ui_block_cut_str(block, pa->panelname, (short)(width-10));
BIF_DrawString(block->curfont, str, (U.transopts & TR_BUTTONS), 0); BIF_DrawString(block->curfont, str, (U.transopts & TR_BUTTONS), 0);
@@ -766,37 +791,40 @@ static void ui_draw_panel_header(uiBlock *block)
void ui_draw_panel(uiBlock *block) void ui_draw_panel(uiBlock *block)
{ {
int align=0; Panel *panel= block->panel;
int align=0, ofsx;
if(block->panel->paneltab) return; if(panel->paneltab) return;
if(curarea->spacetype==SPACE_BUTS) { if(curarea->spacetype==SPACE_BUTS) {
SpaceButs *sbuts= curarea->spacedata.first; SpaceButs *sbuts= curarea->spacedata.first;
align= sbuts->align; align= sbuts->align;
} }
if(block->panel->flag & PNL_CLOSEDY) { if(panel->flag & PNL_CLOSEDY) {
uiSetRoundBox(15); uiSetRoundBox(15);
glColor3ub(160, 160, 167); glColor3ub(160, 160, 167);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10);
// title // title
ofsx= 2*PNL_ICON;
if(panel->control & UI_PNL_CLOSE) ofsx+= PNL_ICON;
glColor3ub(255,255,255); glColor3ub(255,255,255);
glRasterPos2f(block->minx+40, block->maxy+5); glRasterPos2f(block->minx+40, block->maxy+5);
BIF_DrawString(block->curfont, block->panel->panelname, (U.transopts & TR_BUTTONS), 0); BIF_DrawString(block->curfont, panel->panelname, (U.transopts & TR_BUTTONS), 0);
// border // border
if(block->panel->flag & PNL_SELECT) { if(panel->flag & PNL_SELECT) {
glColor3ub(64, 64, 64); glColor3ub(64, 64, 64);
uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10);
} }
if(block->panel->flag & PNL_OVERLAP) { if(panel->flag & PNL_OVERLAP) {
glColor3ub(240, 240, 240); glColor3ub(240, 240, 240);
uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10);
} }
} }
else if(block->panel->flag & PNL_CLOSEDX) { else if(panel->flag & PNL_CLOSEDX) {
char str[4]; char str[4];
int a, end, ofs; int a, end, ofs;
@@ -807,10 +835,10 @@ void ui_draw_panel(uiBlock *block)
// title, only capitals for now // title, only capitals for now
glColor3ub(255,255,255); glColor3ub(255,255,255);
str[1]= 0; str[1]= 0;
end= strlen(block->panel->panelname); end= strlen(panel->panelname);
ofs= 20; ofs= 20;
for(a=0; a<end; a++) { for(a=0; a<end; a++) {
str[0]= block->panel->panelname[a]; str[0]= panel->panelname[a];
if( isupper(str[0]) ) { if( isupper(str[0]) ) {
glRasterPos2f(block->minx+5, block->maxy-ofs); glRasterPos2f(block->minx+5, block->maxy-ofs);
BIF_DrawString(block->curfont, str, 0, 0); BIF_DrawString(block->curfont, str, 0, 0);
@@ -819,11 +847,11 @@ void ui_draw_panel(uiBlock *block)
} }
// border // border
if(block->panel->flag & PNL_SELECT) { if(panel->flag & PNL_SELECT) {
glColor3ub(64, 64, 64); glColor3ub(64, 64, 64);
uiRoundRect(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 10);
} }
if(block->panel->flag & PNL_OVERLAP) { if(panel->flag & PNL_OVERLAP) {
glColor3ub(240, 240, 240); glColor3ub(240, 240, 240);
uiRoundRect(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->miny, block->minx+PNL_HEADER, block->maxy+PNL_HEADER, 10);
} }
@@ -833,7 +861,7 @@ void ui_draw_panel(uiBlock *block)
uiSetRoundBox(3); uiSetRoundBox(3);
if(block->panel->style== UI_PNL_SOLID) { if(panel->control & UI_PNL_SOLID) {
glColor3ub(160, 160, 167); glColor3ub(160, 160, 167);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 10);
// blend now for panels in 3d window, test... // blend now for panels in 3d window, test...
@@ -851,7 +879,7 @@ void ui_draw_panel(uiBlock *block)
} }
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }
else { else if(panel->control & UI_PNL_TRANSP) {
glColor3ub(218, 218, 218); glColor3ub(218, 218, 218);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 10);
} }
@@ -861,11 +889,11 @@ void ui_draw_panel(uiBlock *block)
// border // border
uiSetRoundBox(3); uiSetRoundBox(3);
if(block->panel->flag & PNL_SELECT) { if(panel->flag & PNL_SELECT) {
glColor3ub(64, 64, 64); glColor3ub(64, 64, 64);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 10);
} }
if(block->panel->flag & PNL_OVERLAP) { if(panel->flag & PNL_OVERLAP) {
glColor3ub(240, 240, 240); glColor3ub(240, 240, 240);
uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 10); uiRoundRect(block->minx, block->miny, block->maxx, block->maxy+PNL_HEADER, 10);
} }
@@ -879,15 +907,26 @@ void ui_draw_panel(uiBlock *block)
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }
/* draw optional close icon */
ofsx= 0;
if(panel->control & UI_PNL_CLOSE) {
glRasterPos2f(block->minx+2, block->maxy+3);
if(block->aspect>1.1) glPixelZoom(1.0/block->aspect, 1.0/block->aspect);
BIF_draw_icon(ICON_X);
if(block->aspect>1.1) glPixelZoom(1.0/block->aspect, 1.0/block->aspect);
ofsx= 16;
}
/* draw close icon */ /* draw collapse icon */
if(block->panel->flag & PNL_CLOSEDY) if(panel->flag & PNL_CLOSEDY)
ui_draw_tria_icon(block->minx+6, block->maxy+3, block->aspect, 'h'); ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+5, block->aspect, 'h');
else if(block->panel->flag & PNL_CLOSEDX) else if(panel->flag & PNL_CLOSEDX)
ui_draw_tria_icon(block->minx+4, block->maxy+2, block->aspect, 'h'); ui_draw_tria_icon(block->minx+4, block->maxy+2, block->aspect, 'h');
else else
ui_draw_tria_icon(block->minx+6, block->maxy+3, block->aspect, 'v'); ui_draw_tria_icon(block->minx+6+ofsx, block->maxy+5, block->aspect, 'v');
} }
@@ -1131,6 +1170,35 @@ void uiDrawBlocksPanels(ScrArea *sa, int re_align)
/* re-align */ /* re-align */
if(re_align) uiAlignPanelStep(sa, 1.0); if(re_align) uiAlignPanelStep(sa, 1.0);
/* clip panels (headers) for non-butspace situations (maybe make optimized event later) */
if(sa->spacetype!=SPACE_BUTS) {
SpaceLink *sl= sa->spacedata.first;
for(block= sa->uiblocks.first; block; block= block->next) {
if(block->panel && block->panel->active && block->panel->paneltab == NULL) {
float dx=0.0, dy=0.0, minx, miny, maxx, maxy;
minx= sl->blockscale*block->panel->ofsx;
maxx= sl->blockscale*(block->panel->ofsx+block->panel->sizex);
miny= sl->blockscale*(block->panel->ofsy+block->panel->sizey);
maxy= sl->blockscale*(block->panel->ofsy+block->panel->sizey+PNL_HEADER);
if(minx<0.0) dx= -minx;
else if(maxx > (float)sa->winx) dx= sa->winx-maxx;
if(miny<0.0) dy= -miny;
else if(maxy > (float)sa->winy) dy= sa->winy-maxy;
block->panel->ofsx+= dx/sl->blockscale;
block->panel->ofsy+= dy/sl->blockscale;
/* copy locations */
for(patest= sa->panels.first; patest; patest= patest->next) {
if(patest->paneltab==block->panel) copy_panel_offset(patest, block->panel);
}
}
}
}
/* draw */ /* draw */
block= sa->uiblocks.first; block= sa->uiblocks.first;
@@ -1408,6 +1476,55 @@ static void panel_clicked_tabs(uiBlock *block, int mousex)
} }
static void stow_unstow(uiBlock *block)
{
SpaceLink *sl= curarea->spacedata.first;
Panel *pa;
int ok=0, x, y, width;
if(block->panel->flag & PNL_CLOSEDY) {
width= (curarea->winx-320)/sl->blockscale;
if(width<5) width= 5;
/* find empty spot in bottom */
for(y=4; y<100; y+= PNL_HEADER+4) {
for(x=4; x<width; x+= 324) {
ok= 1;
/* check overlap with other panels */
for(pa=curarea->panels.first; pa; pa=pa->next) {
if(pa!=block->panel && pa->active && pa->paneltab==NULL) {
if( abs(pa->ofsx-x)<320 ) {
if( abs(pa->ofsy+pa->sizey-y)<PNL_HEADER+4) ok= 0;
}
}
}
if(ok) break;
}
if(ok) break;
}
if(ok==0) printf("still primitive code... fix!\n");
block->panel->old_ofsx= block->panel->ofsx;
block->panel->old_ofsy= block->panel->ofsy;
block->panel->ofsx= x;
block->panel->ofsy= y-block->panel->sizey;
}
else {
block->panel->ofsx= block->panel->old_ofsx;
block->panel->ofsy= block->panel->old_ofsy;
}
/* copy locations */
for(pa= curarea->panels.first; pa; pa= pa->next) {
if(pa->paneltab==block->panel) copy_panel_offset(pa, block->panel);
}
}
/* this function is supposed to call general window drawing too */ /* this function is supposed to call general window drawing too */
/* also it supposes a block has panel, and isnt a menu */ /* also it supposes a block has panel, and isnt a menu */
@@ -1426,22 +1543,41 @@ void ui_do_panel(uiBlock *block, uiEvent *uevent)
if(uevent->event==LEFTMOUSE && block->panel->paneltab==NULL) { if(uevent->event==LEFTMOUSE && block->panel->paneltab==NULL) {
int button= 0; int button= 0;
/* check open/closed button */ /* check open/collapsed button */
if(block->panel->flag & PNL_CLOSEDX) { if(block->panel->flag & PNL_CLOSEDX) {
if(uevent->mval[1] >= block->maxy) button= 1; if(uevent->mval[1] >= block->maxy) button= 1;
} }
else if(uevent->mval[0] <= block->minx+PNL_ICON+3) button= 1; else if(block->panel->control & UI_PNL_CLOSE) {
if(uevent->mval[0] <= block->minx+PNL_ICON-2) button= 2;
else if(uevent->mval[0] <= block->minx+2*PNL_ICON+2) button= 1;
}
else if(uevent->mval[0] <= block->minx+PNL_ICON+2) {
button= 1;
}
if(button) { if(button) {
if(block->panel->flag & PNL_CLOSED) block->panel->flag &= ~PNL_CLOSED;
else if(align==BUT_HORIZONTAL) block->panel->flag |= PNL_CLOSEDX; if(button==2) { // close
else block->panel->flag |= PNL_CLOSEDY; rem_blockhandler(curarea, block->handler);
addqueue(curarea->win, REDRAW, 1);
for(pa= curarea->panels.first; pa; pa= pa->next) { }
if(pa->paneltab==block->panel) { else {
if(block->panel->flag & PNL_CLOSED) pa->flag |= PNL_CLOSED;
else pa->flag &= ~PNL_CLOSED; if(block->panel->flag & PNL_CLOSED) block->panel->flag &= ~PNL_CLOSED;
else if(align==BUT_HORIZONTAL) block->panel->flag |= PNL_CLOSEDX;
else block->panel->flag |= PNL_CLOSEDY;
for(pa= curarea->panels.first; pa; pa= pa->next) {
if(pa->paneltab==block->panel) {
if(block->panel->flag & PNL_CLOSED) pa->flag |= PNL_CLOSED;
else pa->flag &= ~PNL_CLOSED;
}
} }
// extra, for non-butspace: open/collapse at window header
if(curarea->spacetype!=SPACE_BUTS)
stow_unstow(block);
} }
if(align==0) addqueue(block->win, REDRAW, 1); if(align==0) addqueue(block->win, REDRAW, 1);
else ui_animate_panels(curarea); else ui_animate_panels(curarea);

View File

@@ -169,7 +169,10 @@ void add_blockhandler(ScrArea *sa, short eventcode, short val)
// find empty spot // find empty spot
for(a=0; a<SPACE_MAXHANDLER; a+=2) { for(a=0; a<SPACE_MAXHANDLER; a+=2) {
if( sl->blockhandler[a]==eventcode ); if( sl->blockhandler[a]==eventcode ) {
sl->blockhandler[a+1]= val;
break;
}
else if( sl->blockhandler[a]==0) { else if( sl->blockhandler[a]==0) {
sl->blockhandler[a]= eventcode; sl->blockhandler[a]= eventcode;
sl->blockhandler[a+1]= val; sl->blockhandler[a+1]= val;
@@ -1076,7 +1079,7 @@ void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
} }
else { else {
if(G.obedit); if(G.obedit);
else add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, HANDLER_MOUSEPOS); else add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_TO_MOUSE);
allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWVIEW3D, 0);
} }