summaryrefslogtreecommitdiff
path: root/libprefab/iconbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'libprefab/iconbox.c')
-rw-r--r--libprefab/iconbox.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/libprefab/iconbox.c b/libprefab/iconbox.c
new file mode 100644
index 00000000..0586d6a0
--- /dev/null
+++ b/libprefab/iconbox.c
@@ -0,0 +1,83 @@
+#include <lib9.h>
+#include <draw.h>
+#include <interp.h>
+#include <isa.h>
+#include "../libinterp/runt.h"
+#include <drawif.h>
+#include <prefab.h>
+
+PCompound*
+iconbox(Prefab_Environ *e, Draw_Point p, String *titletext, Draw_Image *icon, Draw_Image *mask)
+{
+ Draw_Rect er, r, ir;
+ PCompound *pc;
+ Prefab_Compound *c;
+ PElement *elem, *title;
+ Image *disp;
+ Draw_Image *ddisp;
+ Screen *screen;
+ Heap *h;
+ Rectangle t;
+ Point pt;
+
+ screen = lookupscreen(e->screen);
+ if(screen == nil)
+ return H;
+ h = heapz(TCompound);
+ if(h == H)
+ return H;
+ pc = H2D(PCompound*, h);
+ c = &pc->c;
+
+ gchalt++;
+ title = H;
+ if(titletext != H){
+ er.min.x = 0;
+ er.min.y = 0;
+ er.max.x = Dx(icon->r)-5;
+ er.max.y = 0;
+ title = textelement(e, titletext, er, ETitle);
+ if(title == H){
+ Err:
+ destroy(c);
+ gchalt--;
+ return H;
+ }
+ c->title = (Prefab_Element*)title;
+ }
+
+ r = icon->r;
+ if(title != H)
+ r.max.y += 2+1+title->nkids*e->style->titlefont->height+1;
+
+ er = edgerect(e, p, &r);
+
+ R2R(t, er);
+ disp = allocwindow(screen, t, Refbackup /*refreshcompound*/, DWhite);
+ if(disp == nil)
+ goto Err;
+
+ if((ddisp=mkdrawimage(disp, e->screen, e->screen->display, nil)) == H){
+ freeimage(disp);
+ goto Err;
+ }
+
+ ir = r;
+ if(title != H){
+ ir = r;
+ pt.x = r.min.x+3;
+ pt.y = r.min.y+3;
+ translateelement(&title->e, pt);
+ ir.min.y = title->e.r.max.y+1;
+ }
+
+ elem = iconelement(e, ir, icon, mask);
+ c->r = r;
+ c->image = ddisp;
+ c->environ = e;
+ D2H(e)->ref++;
+ c->contents = (Prefab_Element*)elem;
+ pc->display = screen->display;
+ gchalt--;
+ return pc;
+}