facelift for mothra: flat ui is in.

Remove false 3d, add borders for visual separation between
content area and navigation area.
This commit is contained in:
Ori Bernstein 2020-04-28 20:50:10 -07:00
parent dcf96a006d
commit 9b8af27299
9 changed files with 64 additions and 108 deletions

View file

@ -21,16 +21,24 @@ struct Button{
#define BUTTON 1
#define CHECK 2
#define RADIO 3
#define MENU 4
void pl_drawbutton(Panel *p){
Rectangle r;
Button *bp;
bp=p->data;
r=pl_box(p->b, p->r, p->state);
switch(bp->btype){
case MENU:
r=pl_box(p->b, p->r, p->state);
break;
case BUTTON:
r=pl_box(p->b, p->r, p->state|BORDER);
break;
case CHECK:
r=pl_box(p->b, p->r, p->state|BORDER);
r=pl_check(p->b, r, bp->check);
break;
case RADIO:
r=pl_box(p->b, p->r, p->state|BORDER);
r=pl_radio(p->b, r, bp->check);
break;
}
@ -93,7 +101,7 @@ Point pl_getsizebutton(Panel *p, Point children){
USED(children); /* shouldn't have any children */
bp=p->data;
s=pl_iconsize(p->flags, bp->icon);
if(bp->btype!=BUTTON){
if(bp->btype!=BUTTON && bp->btype!=MENU){
ckw=pl_ckwid();
if(s.y<ckw){
s.x+=ckw;
@ -121,6 +129,7 @@ void pl_initbtype(Panel *v, int flags, Icon *icon, void (*hit)(Panel *, int, int
bp->hit=hit;
bp->icon=icon;
switch(btype){
case MENU: v->kind="button"; break;
case BUTTON: v->kind="button"; break;
case CHECK: v->kind="checkbutton"; break;
case RADIO: v->kind="radiobutton"; break;
@ -140,6 +149,13 @@ void plinitcheckbutton(Panel *p, int flags, Icon *icon, void (*hit)(Panel *, int
void plinitradiobutton(Panel *p, int flags, Icon *icon, void (*hit)(Panel *, int, int)){
pl_initbtype(p, flags, icon, hit, RADIO);
}
Panel *pl_menubutton(Panel *parent, int flags, Icon *icon, void (*hit)(Panel *, int)){
Panel *p;
p=pl_newpanel(parent, sizeof(Button));
((Button *)p->data)->pl_buttonhit=hit;
pl_initbtype(p, flags, icon, pl_buttonhit, MENU);
return p;
}
Panel *plbutton(Panel *parent, int flags, Icon *icon, void (*hit)(Panel *, int)){
Panel *p;
p=pl_newpanel(parent, sizeof(Button));
@ -173,7 +189,7 @@ void plinitmenu(Panel *v, int flags, Icon **item, int cflags, void (*hit)(int, i
v->child=0;
}
for(i=0;item[i];i++){
b=plbutton(v, cflags, item[i], pl_hitmenu);
b=pl_menubutton(v, cflags, item[i], pl_hitmenu);
((Button *)b->data)->menuhit=hit;
((Button *)b->data)->index=i;
}

View file

@ -6,109 +6,60 @@
#include "pldefs.h"
#define PWID 1 /* width of label border */
#define BWID 1 /* width of button relief */
#define FWID 2 /* width of frame relief */
#define SPACE 1 /* space inside relief of button or frame */
#define FWID 1 /* width of frame relief */
#define SPACE 2 /* space inside relief of button or frame */
#define CKSIZE 3 /* size of check mark */
#define CKSPACE 2 /* space around check mark */
#define CKWID 1 /* width of frame around check mark */
#define CKINSET 1 /* space around check mark frame */
#define CKBORDER 2 /* space around X inside frame */
static int plldepth;
static Image *pl_white, *pl_light, *pl_dark, *pl_black, *pl_hilit;
Image *pl_blue;
int pl_drawinit(int ldepth){
plldepth=ldepth;
/* mono */
int pl_drawinit(void){
pl_white=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF);
pl_light=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF);
pl_dark=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x555555FF);
pl_dark=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x777777FF);
pl_black=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x000000FF);
pl_hilit=allocimage(display, Rect(0,0,1,1), CHAN1(CAlpha,8), 1, 0x80);
pl_blue=allocimage(display, Rect(0,0,1,1), RGB24, 1, 0x0000FFFF);
if(pl_white==0 || pl_light==0 || pl_black==0 || pl_dark==0 || pl_blue==0) sysfatal("allocimage: %r");
return 1;
}
void pl_relief(Image *b, Image *ul, Image *lr, Rectangle r, int wid){
int x, y;
draw(b, Rect(r.min.x, r.max.y-wid, r.max.x, r.max.y), lr, 0, ZP); /* bottom */
draw(b, Rect(r.max.x-wid, r.min.y, r.max.x, r.max.y), lr, 0, ZP); /* right */
draw(b, Rect(r.min.x, r.min.y, r.min.x+wid, r.max.y), ul, 0, ZP); /* left */
draw(b, Rect(r.min.x, r.min.y, r.max.x, r.min.y+wid), ul, 0, ZP); /* top */
for(x=0;x!=wid;x++) for(y=wid-1-x;y!=wid;y++){
draw(b, rectaddpt(Rect(0,0,1,1), Pt(x+r.max.x-wid, y+r.min.y)), lr, 0, ZP);
draw(b, rectaddpt(Rect(0,0,1,1), Pt(x+r.min.x, y+r.max.y-wid)), lr, 0, ZP);
}
}
Rectangle pl_boxoutline(Image *b, Rectangle r, int style, int fill){
if(plldepth==0) switch(style){
int doborder;
doborder = (style & BORDER) != 0;
switch(style & ~BORDER){
case SUP:
case TUP:
pl_relief(b, pl_white, pl_white, r, BWID);
if(fill) draw(b, r, pl_light, 0, ZP);
else border(b, r, BWID+SPACE, pl_white, ZP);
if(doborder) border(b, r, BWID, pl_black, ZP);
r=insetrect(r, BWID);
if(fill) draw(b, r, pl_white, 0, ZP);
else border(b, r, SPACE, pl_white, ZP);
break;
case UP:
pl_relief(b, pl_black, pl_black, r, BWID);
if(fill) draw(b, r, pl_light, 0, ZP);
else border(b, r, BWID+SPACE, pl_white, ZP);
if(doborder) border(b, r, BWID, pl_black, ZP);
r=insetrect(r, BWID);
if(fill) draw(b, r, pl_white, 0, ZP);
else border(b, r, SPACE, pl_white, ZP);
break;
case DOWN:
case DOWN1:
case DOWN2:
case DOWN3:
pl_relief(b, pl_black, pl_black, r, BWID);
r=insetrect(r, BWID);
if(fill) draw(b, r, pl_black, 0, ZP);
border(b, r, SPACE, pl_black, ZP);
break;
case PASSIVE:
if(fill) draw(b, r, pl_white, 0, ZP);
r=insetrect(r, PWID);
if(!fill) border(b, r, SPACE, pl_white, ZP);
break;
case FRAME:
pl_relief(b, pl_white, pl_black, r, FWID);
r=insetrect(r, FWID);
pl_relief(b, pl_black, pl_white, r, FWID);
r=insetrect(r, FWID);
if(fill) draw(b, r, pl_white, 0, ZP);
else border(b, r, SPACE, pl_white, ZP);
break;
}
else switch(style){
case SUP:
case TUP:
pl_relief(b, pl_white, pl_white, r, BWID);
r=insetrect(r, BWID);
if(fill) draw(b, r, pl_light, 0, ZP);
else border(b, r, SPACE, pl_white, ZP);
break;
case UP:
pl_relief(b, pl_white, pl_black, r, BWID);
r=insetrect(r, BWID);
if(fill) draw(b, r, pl_light, 0, ZP);
else border(b, r, SPACE, pl_white, ZP);
break;
case DOWN:
case DOWN1:
case DOWN2:
case DOWN3:
pl_relief(b, pl_black, pl_white, r, BWID);
r=insetrect(r, BWID);
if(fill) draw(b, r, pl_dark, 0, ZP);
else border(b, r, SPACE, pl_black, ZP);
else border(b, r, BWID+SPACE, pl_dark, ZP);
if(doborder) border(b, r, BWID, pl_black, ZP);
r=insetrect(r, BWID);
break;
case PASSIVE:
if(fill) draw(b, r, pl_light, 0, ZP);
else border(b, r, PWID+SPACE, pl_white, ZP);
if(doborder) border(b, r, BWID, pl_black, ZP);
r=insetrect(r, PWID);
if(!fill) border(b, r, SPACE, pl_white, ZP);
break;
case FRAME:
pl_relief(b, pl_white, pl_black, r, FWID);
r=insetrect(r, FWID);
pl_relief(b, pl_black, pl_white, r, FWID);
border(b, r, FWID, pl_black, ZP);
r=insetrect(r, FWID);
if(fill) draw(b, r, pl_light, 0, ZP);
else border(b, r, SPACE, pl_white, ZP);
@ -136,7 +87,7 @@ Point pl_boxsize(Point interior, int state){
case PASSIVE:
return addpt(interior, Pt(2*(PWID+SPACE), 2*(PWID+SPACE)));
case FRAME:
return addpt(interior, Pt(4*FWID+2*SPACE, 4*FWID+2*SPACE));
return addpt(interior, Pt(2*FWID+2*SPACE, 2*FWID+2*SPACE));
}
return Pt(0, 0);
}
@ -155,8 +106,8 @@ void pl_interior(int state, Point *ul, Point *size){
*size=subpt(*size, Pt(2*(PWID+SPACE), 2*(PWID+SPACE)));
break;
case FRAME:
*ul=addpt(*ul, Pt(2*FWID+SPACE, 2*FWID+SPACE));
*size=subpt(*size, Pt(4*FWID+2*SPACE, 4*FWID+2*SPACE));
*ul=addpt(*ul, Pt(FWID+SPACE, FWID+SPACE));
*size=subpt(*size, Pt(2*FWID+2*SPACE, 2*FWID+2*SPACE));
}
}
@ -194,15 +145,9 @@ Rectangle pl_radio(Image *b, Rectangle r, int val){
r.max.x=r.min.x+r.max.y-r.min.y;
remainder.min.x=r.max.x;
r=insetrect(r, CKINSET);
if(plldepth==0)
pl_relief(b, pl_black, pl_black, r, CKWID);
else
pl_relief(b, pl_black, pl_white, r, CKWID);
border(b, r, CKWID, pl_white, ZP);
r=insetrect(r, CKWID);
if(plldepth==0)
draw(b, r, pl_white, 0, ZP);
else
draw(b, r, pl_light, 0, ZP);
draw(b, r, pl_light, 0, ZP);
if(val) draw(b, insetrect(r, CKSPACE), pl_black, 0, ZP);
return remainder;
}
@ -212,15 +157,9 @@ Rectangle pl_check(Image *b, Rectangle r, int val){
r.max.x=r.min.x+r.max.y-r.min.y;
remainder.min.x=r.max.x;
r=insetrect(r, CKINSET);
if(plldepth==0)
pl_relief(b, pl_black, pl_black, r, CKWID);
else
pl_relief(b, pl_black, pl_white, r, CKWID);
border(b, r, CKWID, pl_white, ZP);
r=insetrect(r, CKWID);
if(plldepth==0)
draw(b, r, pl_white, 0, ZP);
else
draw(b, r, pl_light, 0, ZP);
draw(b, r, pl_light, 0, ZP);
r=insetrect(r, CKBORDER);
if(val){
line(b, Pt(r.min.x, r.min.y+1), Pt(r.max.x-1, r.max.y ), Endsquare, Endsquare, 0, pl_black, ZP);
@ -292,7 +231,7 @@ void pl_clr(Image *b, Rectangle r){
draw(b, r, display->white, 0, ZP);
}
void pl_fill(Image *b, Rectangle r){
draw(b, r, plldepth==0? pl_white : pl_light, 0, ZP);
draw(b, r, pl_light, 0, ZP);
}
void pl_cpy(Image *b, Point dst, Rectangle src){
draw(b, Rpt(dst, addpt(dst, subpt(src.max, src.min))), b, 0, src.min);

View file

@ -49,7 +49,7 @@ void pl_drawentry(Panel *p){
char *s;
ep=p->data;
r=pl_box(p->b, p->r, p->state);
r=pl_box(p->b, p->r, p->state|BORDER);
s=ep->entry;
if(p->flags & USERFL){
char *p;

View file

@ -5,7 +5,7 @@
#include <panel.h>
#include "pldefs.h"
void pl_drawgroup(Panel *p){
USED(p);
pl_outline(p->b, p->r, FRAME);
}
int pl_hitgroup(Panel *p, Mouse *m){
USED(p, m);
@ -14,12 +14,11 @@ int pl_hitgroup(Panel *p, Mouse *m){
void pl_typegroup(Panel *p, Rune c){
USED(p, c);
}
Point pl_getsizegroup(Panel *p, Point children){
USED(p);
return children;
Point pl_getsizegroup(Panel *, Point children){
return pl_boxsize(children, FRAME);
}
void pl_childspacegroup(Panel *p, Point *ul, Point *size){
USED(p, ul, size);
void pl_childspacegroup(Panel *, Point *ul, Point *size){
pl_interior(FRAME, ul, size);
}
void plinitgroup(Panel *v, int flags){
v->flags=flags;

View file

@ -7,7 +7,7 @@
/*
* Just a wrapper for all the initialization routines
*/
int plinit(int ldepth){
if(!pl_drawinit(ldepth)) return 0;
int plinit(void){
if(!pl_drawinit()) return 0;
return 1;
}

View file

@ -109,9 +109,7 @@ struct Panel{
Panel *plkbfocus; /* the panel in keyboard focus */
extern Image *pl_blue;
int plinit(int); /* initialization */
int plinit(void); /* initialization */
void plpack(Panel *, Rectangle); /* figure out where to put the Panel & children */
void plmove(Panel *, Point); /* move an already-packed panel to a new location */
void pldraw(Panel *, Image *); /* display the panel on the bitmap */

View file

@ -25,7 +25,8 @@ enum{
DOWN3,
DOWN,
PASSIVE,
FRAME
FRAME,
BORDER = 1<<8,
};
/*
* Scroll flags
@ -38,6 +39,9 @@ enum{
SCROLLRIGHT,
SCROLLABSX,
};
extern Image *pl_blue;
/*
* Scrollbar, slider orientations
*/
@ -53,7 +57,7 @@ Panel *pl_ptinpanel(Point, Panel *); /* highest-priority subpanel containing poi
/*
* Drawing primitives
*/
int pl_drawinit(int);
int pl_drawinit(void);
Rectangle pl_box(Image *, Rectangle, int);
Rectangle pl_outline(Image *, Rectangle, int);
Point pl_boxsize(Point, int);

View file

@ -216,7 +216,7 @@ void pl_rtdraw(Image *b, Rectangle r, Rtext *t, Point offs){
if(t->flags&PL_HOT)
string(b, dr.min, pl_blue, ZP, t->font, t->text);
else
string(b, dr.min,display->black, ZP, t->font, t->text);
string(b, dr.min, display->black, ZP, t->font, t->text);
if(t->flags&PL_SEL)
pl_highlight(b, dr);
if(t->flags&PL_STR){

View file

@ -349,7 +349,7 @@ void main(int argc, char *argv[]){
if(pipe(kickpipe) < 0)
sysfatal("pipe: %r");
estart(Ekick, kickpipe[0], 256);
plinit(screen->depth);
plinit();
if(debug) notify(dienow);
getfonts();
hrule=allocimage(display, Rect(0, 0, 1, 5), screen->chan, 1, DWhite);