xref: /inferno-os/libprefab/iconbox.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include <lib9.h>
2*37da2899SCharles.Forsyth #include <draw.h>
3*37da2899SCharles.Forsyth #include <interp.h>
4*37da2899SCharles.Forsyth #include <isa.h>
5*37da2899SCharles.Forsyth #include "../libinterp/runt.h"
6*37da2899SCharles.Forsyth #include <drawif.h>
7*37da2899SCharles.Forsyth #include <prefab.h>
8*37da2899SCharles.Forsyth 
9*37da2899SCharles.Forsyth PCompound*
iconbox(Prefab_Environ * e,Draw_Point p,String * titletext,Draw_Image * icon,Draw_Image * mask)10*37da2899SCharles.Forsyth iconbox(Prefab_Environ *e, Draw_Point p, String *titletext, Draw_Image *icon, Draw_Image *mask)
11*37da2899SCharles.Forsyth {
12*37da2899SCharles.Forsyth 	Draw_Rect er, r, ir;
13*37da2899SCharles.Forsyth 	PCompound *pc;
14*37da2899SCharles.Forsyth 	Prefab_Compound *c;
15*37da2899SCharles.Forsyth 	PElement *elem, *title;
16*37da2899SCharles.Forsyth 	Image *disp;
17*37da2899SCharles.Forsyth 	Draw_Image *ddisp;
18*37da2899SCharles.Forsyth 	Screen *screen;
19*37da2899SCharles.Forsyth 	Heap *h;
20*37da2899SCharles.Forsyth 	Rectangle t;
21*37da2899SCharles.Forsyth 	Point pt;
22*37da2899SCharles.Forsyth 
23*37da2899SCharles.Forsyth 	screen = lookupscreen(e->screen);
24*37da2899SCharles.Forsyth 	if(screen == nil)
25*37da2899SCharles.Forsyth 		return H;
26*37da2899SCharles.Forsyth 	h = heapz(TCompound);
27*37da2899SCharles.Forsyth 	if(h == H)
28*37da2899SCharles.Forsyth 		return H;
29*37da2899SCharles.Forsyth 	pc = H2D(PCompound*, h);
30*37da2899SCharles.Forsyth 	c = &pc->c;
31*37da2899SCharles.Forsyth 
32*37da2899SCharles.Forsyth 	gchalt++;
33*37da2899SCharles.Forsyth 	title = H;
34*37da2899SCharles.Forsyth 	if(titletext != H){
35*37da2899SCharles.Forsyth 		er.min.x = 0;
36*37da2899SCharles.Forsyth 		er.min.y = 0;
37*37da2899SCharles.Forsyth 		er.max.x = Dx(icon->r)-5;
38*37da2899SCharles.Forsyth 		er.max.y = 0;
39*37da2899SCharles.Forsyth 		title = textelement(e, titletext, er, ETitle);
40*37da2899SCharles.Forsyth 		if(title == H){
41*37da2899SCharles.Forsyth     Err:
42*37da2899SCharles.Forsyth 			destroy(c);
43*37da2899SCharles.Forsyth 			gchalt--;
44*37da2899SCharles.Forsyth 			return H;
45*37da2899SCharles.Forsyth 		}
46*37da2899SCharles.Forsyth 		c->title = (Prefab_Element*)title;
47*37da2899SCharles.Forsyth 	}
48*37da2899SCharles.Forsyth 
49*37da2899SCharles.Forsyth 	r = icon->r;
50*37da2899SCharles.Forsyth 	if(title != H)
51*37da2899SCharles.Forsyth 		r.max.y += 2+1+title->nkids*e->style->titlefont->height+1;
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth 	er = edgerect(e, p, &r);
54*37da2899SCharles.Forsyth 
55*37da2899SCharles.Forsyth 	R2R(t, er);
56*37da2899SCharles.Forsyth 	disp = allocwindow(screen, t, Refbackup /*refreshcompound*/, DWhite);
57*37da2899SCharles.Forsyth 	if(disp == nil)
58*37da2899SCharles.Forsyth 		goto Err;
59*37da2899SCharles.Forsyth 
60*37da2899SCharles.Forsyth 	if((ddisp=mkdrawimage(disp, e->screen, e->screen->display, nil)) == H){
61*37da2899SCharles.Forsyth 		freeimage(disp);
62*37da2899SCharles.Forsyth 		goto Err;
63*37da2899SCharles.Forsyth 	}
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth 	ir = r;
66*37da2899SCharles.Forsyth 	if(title != H){
67*37da2899SCharles.Forsyth 		ir = r;
68*37da2899SCharles.Forsyth 		pt.x = r.min.x+3;
69*37da2899SCharles.Forsyth 		pt.y = r.min.y+3;
70*37da2899SCharles.Forsyth 		translateelement(&title->e, pt);
71*37da2899SCharles.Forsyth 		ir.min.y = title->e.r.max.y+1;
72*37da2899SCharles.Forsyth 	}
73*37da2899SCharles.Forsyth 
74*37da2899SCharles.Forsyth 	elem = iconelement(e, ir, icon, mask);
75*37da2899SCharles.Forsyth 	c->r = r;
76*37da2899SCharles.Forsyth 	c->image = ddisp;
77*37da2899SCharles.Forsyth 	c->environ = e;
78*37da2899SCharles.Forsyth 	D2H(e)->ref++;
79*37da2899SCharles.Forsyth 	c->contents = (Prefab_Element*)elem;
80*37da2899SCharles.Forsyth 	pc->display = screen->display;
81*37da2899SCharles.Forsyth 	gchalt--;
82*37da2899SCharles.Forsyth 	return pc;
83*37da2899SCharles.Forsyth }
84