[Cgui-develop] cgui/examples 28clones.c,NONE,1.1 29rcwrk.c,NONE,1.1 16filere.c,1.2,1.3 25viewer.c,1.
Brought to you by:
chrisan,
rasmusmyklebust
Update of /cvsroot/cgui/cgui/examples In directory sc8-pr-cvs1:/tmp/cvs-serv499/examples Modified Files: 16filere.c 25viewer.c 26joytst.c 27usrob.c game6.c readme.txt Added Files: 28clones.c 29rcwrk.c Log Message: no message --- NEW FILE: 28clones.c --- /* CGUI Example program showing how to create application specific shapes of objects while keeping the original, unsing the "clone" facility. */ #include <allegro.h> #include "cgui.h" #include "cgui/mem.h" static void show_code(void *data nouse) { int id; MkDialogue(ADAPTIVE, "Code view", W_FLOATING); id = AddTextBox(DOWNLEFT, "../examples/28clones.c", 670, 54, TB_TEXTFILE|TB_FRAMESINK|TB_PREFORMAT|3); MakeStretchable(id, NULL, NULL, 0); AddButton(DOWNLEFT, "~Close", CloseWin, NULL); DisplayWin(); } static void close_example(void *data nouse) { CloseWin(NULL); StopProcessEvents(); } static void do_nothing(void *data nouse) { Req("Nothing", "| OK "); } static BITMAP *load_circle(const char *name, int *ok) { DATAFILE *datob; BITMAP *bmp; datob = load_datafile_object("../examples/examples.dat#circles", name); if (datob && datob->type == DAT_BITMAP) { bmp = datob->dat; datob->dat = NULL; unload_datafile_object(datob); return bmp; } *ok = 0; return NULL; } /* This is the drawing routing for the button-"lamp". We prefere to show different images for up and down states (it is however an option of yours to do so or not). 'bmp' is the bitmap of CGUI that we are supposed to fill with whatever. Behind 'data', our private data, is the bitmap-array (as passed to 'SetObjectViewer' in main). */ static void my_button_draw(int id nouse, BITMAP *bmp, void *data, int flags) { BITMAP **bmps = data; if (flags&CGUI_VIEWER_DOWN) blit(bmps[1], bmp, 0, 0, 0, 0, bmps[1]->w, bmps[1]->h); else blit(bmps[0], bmp, 0, 0, 0, 0, bmps[0]->w, bmps[0]->h); } /* This is the drawing routing for the check-"lamp". Note that here we want the check box to alter between four views: Checked, Unchecked and for each of these Unpressed (up) and Pressed (down). */ static void my_check_draw(int id, BITMAP *bmp, void *data, int flags) { BITMAP **bmps = data; int i, var; var = GetObjectState(id); i = var * 2; if (flags & CGUI_VIEWER_DOWN) i++; blit(bmps[i], bmp, 0, 0, 0, 0, bmps[i]->w, bmps[i]->h); } /* This one draws the "recangle" check box, just to show that it mustn't be bitmap based. */ static void my_check_draw2(int id, BITMAP *bmp, void *data nouse, int flags) { char *s = GetObjectData(id); int color, var = GetObjectState(id); if (var) clear_to_color(bmp, cgui_lblue); else clear_to_color(bmp, cgui_blue); if (flags & CGUI_VIEWER_DOWN) color = cgui_white; else color = cgui_black; textout_centre_ex(bmp, GetCguiFont(), s, bmp->w/2, (bmp->h-text_height(GetCguiFont()))/2, color, -1); } /* These two functions has been automatically genrated by a frame generating program that used a pcx file (drawn in a regular drawing program). The generating program is available on the contributions page of cgui */ void draw_in(BITMAP *bmp) { int c0 = makecol(0, 0, 0); int c1 = makecol(128, 128, 128); int c2 = makecol(230, 230, 230); int c3 = makecol(255, 255, 255); clear_to_color(bmp, cgui_gray); hline(bmp, 4, 0, bmp->w-5, c0); hline(bmp, 2, 1, 3, c0); hline(bmp, 4, 1, bmp->w-3, c1); hline(bmp, 2, 2, 4, c1); hline(bmp, 1, bmp->h-3, 2, c2); hline(bmp, bmp->w-4, bmp->h-3, bmp->w-3, c2); hline(bmp, 2, bmp->h-2, 3, c3); hline(bmp, 4, bmp->h-2, bmp->w-5, c2); hline(bmp, bmp->w-4, bmp->h-2, bmp->w-3, c3); hline(bmp, 4, bmp->h-1, bmp->w-5, c3); vline(bmp, 0, 4, bmp->h-5, c0); vline(bmp, 1, 2, 3, c0); vline(bmp, 1, 4, bmp->h-4, c1); vline(bmp, bmp->w-2, 2, bmp->h-5, c2); vline(bmp, bmp->w-2, bmp->h-4, bmp->h-3, c3); vline(bmp, bmp->w-1, 4, bmp->h-5, c3); putpixel(bmp, 2, 3, c1); putpixel(bmp, bmp->w-1, 3, c2); putpixel(bmp, 2, bmp->h-4, c2); putpixel(bmp, bmp->w-3, bmp->h-4, c2); } void draw_out(BITMAP *bmp) { int c0 = makecol(255, 255, 255); int c1 = makecol(230, 230, 230); int c2 = makecol(128, 128, 128); int c3 = makecol(0, 0, 0); clear_to_color(bmp, cgui_gray); hline(bmp, 4, 0, bmp->w-5, c0); hline(bmp, 2, 1, 3, c0); hline(bmp, 4, 1, bmp->w-3, c1); hline(bmp, 2, 2, 4, c1); hline(bmp, bmp->w-4, 2, bmp->w-2, c2); hline(bmp, 1, bmp->h-3, 3, c2); hline(bmp, bmp->w-4, bmp->h-3, bmp->w-3, c2); hline(bmp, 2, bmp->h-2, 3, c3); hline(bmp, 4, bmp->h-2, bmp->w-5, c2); hline(bmp, bmp->w-4, bmp->h-2, bmp->w-3, c3); hline(bmp, 4, bmp->h-1, bmp->w-5, c3); vline(bmp, 0, 4, bmp->h-5, c0); vline(bmp, 1, 2, 3, c0); vline(bmp, 1, 4, bmp->h-5, c1); vline(bmp, bmp->w-2, 3, bmp->h-5, c2); vline(bmp, bmp->w-2, bmp->h-4, bmp->h-3, c3); vline(bmp, bmp->w-1, 4, bmp->h-5, c3); putpixel(bmp, 2, 3, c1); putpixel(bmp, bmp->w-3, 3, c2); putpixel(bmp, bmp->w-1, 3, c2); putpixel(bmp, 1, bmp->h-4, c2); putpixel(bmp, 2, bmp->h-4, c1); putpixel(bmp, bmp->w-3, bmp->h-4, c2); } /* This is the drawing routine for the button with the rounded corners */ static void my_button_draw2(int id, BITMAP *bmp, void *data nouse, int flags) { if (flags&CGUI_VIEWER_DOWN) { draw_in(bmp); DrawDefaultButtonSurface(id, bmp, 1, 3, 3, 0); } else { draw_out(bmp); DrawDefaultButtonSurface(id, bmp, 0, 3, 3, 0); } } int main(void) { int ok = 1, clone_key, id; static int var0, var1, var2; static BITMAP *bmps[4]; static char *label; InitCgui(1024, 768, 15); bmps[0] = load_circle("c1", &ok); bmps[1] = load_circle("c2", &ok); bmps[2] = load_circle("c3", &ok); bmps[3] = load_circle("c4", &ok); /* The below line is not for the user defined objects, it's just for the "normal" ones created for comparing. */ RegisterImage(bmps[0], "the_image", IMAGE_BMP, 0); if (ok) { MkDialogue(ADAPTIVE, "Userdefined objects", 0); AddTextBox(DOWNLEFT, "This example shows how to make userdefined " "object types. You can see the check-box from example 27 " "repeated here, but now you can also find a check-box with " "the original, default shape. This trick can be achieved by " "first cloning the default set of object types, then modifying " "one of the clones._ _" "Below you can see some circles, \"lamps\". To " "the left there is a button and check box using images the " "standard way. To the right there is also a \"lamp\"-button and " "a \"lamp\"check box, here however completely under the control " "of the CGUI programmer. Try them!_ _" "The blue rectangle is yet a customized check-box, not very " "beautiful, just to show how it works. This one is made " "re-sizeable by a call to `MakeStretchable' - just as simple as " "for the standard objects_ _" "The button with rounded corners is a 4:th example how to make " "cursom objects in CGUI. Here the standard drawing routine is " "used to draw the top surface of the button (i.e. the text in " "this case), since we only wanted a different frame in this " "example. Also this button is made re-sizeable. Try them!_ _" "Note that the default look of objects is available in parallel " "to the new ones!_ _" "To make the customized object types you need to call one singel " "function for a new group object types (clone). Another single " "function call for ech object type that should get a new look. " "Finally you need to write the new drawing routine. This can be " "done in a few lines of code. All custom objects in this example " "just need a few lines of hand-written code", 500, 0, TB_FRAMESINK|TB_LINEFEED_); StartContainer(DOWNLEFT, ADAPTIVE, "Standard objects", CT_BORDER); AddButton(DOWNLEFT, "#the_image;", do_nothing, NULL); AddCheck(DOWNLEFT, "#the_image;", &var0); EndContainer(); /* The following 3 lines specifies buttons and checkboxes to be cusomized */ clone_key = CreateClone(); SetObjectViewer(CGUI_OBJTYPE_BUTTON, my_button_draw, bmps, clone_key); SetObjectViewer(CGUI_OBJTYPE_CHECK, my_check_draw, bmps, clone_key); /* Pass the clone key and the objects will be of the modified clone. The size needs to be set per object since this need not be the same for all objects of a certain type. */ StartContainer(RIGHT, ADAPTIVE, "Customized objects", clone_key|CT_BORDER); id = AddButton(DOWNLEFT, "", do_nothing, NULL); SetObjectSize(id, bmps[0]->w, bmps[0]->h); id = AddCheck(DOWNLEFT, "", &var1); SetObjectSize(id, bmps[0]->w, bmps[0]->h); /* Make a clone to be modified for the last two ones" */ clone_key = CreateClone(); /* Here we make the modified "rectangle-check-box" */ SetObjectViewer(CGUI_OBJTYPE_CHECK, my_check_draw2, NULL, clone_key); /* Here we make the modified "rounded-corner button" */ SetObjectViewer(CGUI_OBJTYPE_BUTTON, my_button_draw2, NULL, clone_key); /* The extra container is needed to specify the modified clone */ StartContainer(DOWNLEFT, ADAPTIVE, "", clone_key); /* Again: we use the normal AddCheck to specify our custom one */ label = "Re-sizeable check box"; id = AddCheck(DOWNLEFT, label, &var2); /* The AddHandler call is just a trick to attach an application data to the object, later retrieved by `GetObjectData'. */ AddHandler(id, NULL, label); MakeStretchable(id, NULL, NULL, 0); /* ..and we use the normal AddButton to specify our custom one, also this one we make re-sizeable.. just for fun. */ id = AddButton(RIGHT, "Custom_frame here", do_nothing, NULL); MakeStretchable(id, NULL, NULL, 0); EndContainer(); /* end second clone */ EndContainer(); /* end outlining container */ /* No clone key and the buttons are picked from the default set */ StartContainer(DOWNLEFT|ALIGNCENTER, ADAPTIVE, "", 0); AddButton(DOWNLEFT|EQUALWIDTH|EQUALHEIGHT, "\33Close", close_example, NULL); AddButton(RIGHT|EQUALWIDTH|EQUALHEIGHT, "Show_code", show_code, NULL); EndContainer(); DisplayWin(); ProcessEvents(); } else Req("", "Error reading the image data| OK "); return 0; } END_OF_MAIN(); --- NEW FILE: 29rcwrk.c --- /* This example shows drag-and-drop in a bit odd usage. */ #include <allegro.h> #include <string.h> #include "cgui.h" #include "cgui/mem.h" typedef struct t_winopt { int flag; const char *fn; const char *label; } t_winopt; typedef struct t_win { int w, h, id, nid, opt[3]; char *label; struct t_obj **objs; int nobjs; } t_win; typedef struct t_root { t_win templ; struct t_win **wins; int nwins; } t_root; typedef struct t_obj { int x, y, w, h, id; char *label; void *data; struct t_fatb *ftab; t_win *win; } t_obj; typedef struct t_fatb { void (*create_view)(t_obj *); void (*create)(t_obj *); void (*dialog)(void *); int (*generate)(void *, char *); } t_fatb; typedef struct t_but { char *cb, *var, *type; } t_but; typedef struct t_chk { char *var; int intvar; } t_chk; typedef struct t_ed { int w, n, type, tsttyp; char *var, tstdata[100]; } t_ed; static const char *edit_types[]={"FSTRING","FPTRSTR","FINT","FDOUBLE","FPOINTS","FHEX"}; static const t_winopt wopt[3] = {{W_FLOATING, "W_FLOATING", "Floating"},{W_SIBLING,"W_SIBLING","Sibling"}, {W_NOMOVE, "W_NOMOVE", "Not movable"}}; static int ntypes = 6; static void dummy_func(void *data nouse) {} static char *make_id(char *stem) { static int nr; char *s = GetMem(char, 20); sprintf(s, "%s%d", stem, nr++); return s; } static void quit(void *data nouse) { StopProcessEvents(); } static void *gripper(void *src, int id, int reason) { BITMAP *bmp; t_obj *obj=src; if (reason == DD_GRIPPED) { bmp = ObjectApearance(id); obj->w = bmp->w; obj->h = bmp->h; OverlayPointer(bmp, bmp->w/2, bmp->h/2); destroy_bitmap(bmp); } else if (reason == DD_UNGRIPPED || reason == DD_SUCCESS) RemoveOverlayPointer(); return src; } static void create_object_view(t_obj *obj) { SelectContainer(obj->win->nid); obj->ftab->create_view(obj); SetMouseButtons(obj->id, RIGHT_MOUSE); SetObjectGrippable(obj->id, gripper, 2, LEFT_MOUSE, obj); } static void close_dial(void *data) { t_obj *obj=data; int i; CloseWin(NULL); EmptyContainer(obj->win->nid); SelectContainer(obj->win->nid); for (i=0; i<obj->win->nobjs; i++) create_object_view(obj->win->objs[i]); Refresh(obj->win->id); } static void modify(void *data) { t_obj *obj=data; MkDialogue(ADAPTIVE, "Modify object", 0); AddEditBox(DOWNLEFT, 100, "x", FINT, 4, &obj->x); AddEditBox(RIGHT, 100, "y", FINT, 4, &obj->y); AddEditBox(DOWNLEFT, 200, "Label", FPTRSTR, 0, &obj->label); obj->ftab->dialog(obj->data); AddButton(DOWNLEFT|ALIGNCENTER, "OK", close_dial, obj); DisplayWin(); } static int but_gen(void *data, char *buf) { t_obj *obj = data; t_but *b = obj->data; return sprintf(buf, " {\n %s %s;\n void %s(void*);\n " "AddButton(%d, %d, \"%s\", %s, %s);\n }\n", b->type, b->var, b->cb, obj->x, obj->y, obj->label, b->cb, b->var); } static void but_dial(void *data) { t_but *b = data; AddEditBox(DOWNLEFT, 200, "Call back", FPTRSTR, 0, &b->cb); AddEditBox(DOWNLEFT, 200, "Variable name", FPTRSTR, 0, &b->var); AddEditBox(DOWNLEFT, 200, "Data type", FPTRSTR, 0, &b->type); } static void but_create_view(t_obj *obj) { obj->id = AddButton(obj->x, obj->y, obj->label, modify, obj); } static void but_create(t_obj *obj) { t_but *tmp, *b; tmp = obj->data; obj->data = b = GetMem(t_but, 1); *b = *tmp; b->cb = make_id("func"); b->var = make_id("var"); b->type = make_id("type"); } static int chk_gen(void *data, char *buf) { t_obj *obj=data; t_chk *chk = obj->data; return sprintf(buf, " {\n int %s;\n AddCheck(%d, %d, \"%s\", &%s);\n }\n", chk->var, obj->x, obj->y, obj->label, chk->var); } static void chk_dial(void *data) { t_chk *chk = data; AddEditBox(DOWNLEFT, 200, "Variable name", FPTRSTR, 0, &chk->var); } static void chk_create_view(t_obj *obj) { obj->id = AddCheck(obj->x, obj->y, obj->label, &((t_chk*)obj->data)->intvar); AddHandler(obj->id, modify, obj); } static void chk_create(t_obj *obj) { obj->data = GetMem(t_chk, 1); ((t_chk*)obj->data)->var = make_id("var"); } static int tag_gen(void *data, char *buf) { t_obj *obj=data; return sprintf(buf, " AddTag(%d, %d, \"%s\");\n", obj->x, obj->y, obj->label); } static void tag_dial(void *data nouse){} static void tag_create_view(t_obj *obj) { obj->id = AddTag(obj->x, obj->y, obj->label); AddHandler(obj->id, modify, obj); Activate(obj->id); } static void tag_create(t_obj *obj nouse) {} static int ed_gen(void *data, char *buf) { t_obj *obj=data; t_ed *ed = obj->data; const char *t; t = edit_types[ed->type]; return sprintf(buf, " {\n void *%s;\n AddEditBox(%d, %d, %d, \"%s\", %s, %d, %c%s);\n }\n", ed->var, obj->x, obj->y, ed->w, obj->label, t, ed->n, strcmp(t,"FSTRING")?'&':' ', ed->var); } static void ed_dial(void *data) { t_ed *ed = data; AddEditBox(DOWNLEFT, 200, "Width", FINT, 4, &ed->w); AddEditBox(DOWNLEFT, 200, "Max nr of chars", FINT, 4, &ed->n); AddEditBox(DOWNLEFT, 200, "Variable name", FPTRSTR, 0, &ed->var); AddDropDownS(DOWNLEFT, 200, "Variable type", &ed->type, edit_types, ntypes); } static void ed_modify(void *data) { int scan, ascii, dummy; GetEditData(&scan, &ascii, &dummy); if (scan == (int)BEGIN_EDIT) { SetEditData(0, ascii, dummy); modify(data); } } static void ed_create_view(t_obj *obj) { t_ed *ed = obj->data; obj->id = AddEditBox(obj->x, obj->y, ed->w, obj->label, ed->tsttyp, ed->n, ed->tstdata); AddHandler(obj->id, ed_modify, obj); } static void ed_create(t_obj *obj) { t_ed *ed; obj->data = ed = GetMem0(t_ed, 1); ed->var = make_id("var"); ed->n = 4; ed->w = 100; } static int dropper(void *dest, int id, void *src, int reason, int flags) { t_win *win=dest; t_obj *obj=src; int dummy, x, y, wx, wy; if (reason == DD_SUCCESS) { if (flags & 1) { obj = GetMem(t_obj, 1); *obj = *(t_obj *)src; obj->label = MkString(((t_obj *)src)->label); obj->win = win; win->nobjs++; win->objs = ResizeMem(t_obj*, win->objs, win->nobjs); win->objs[win->nobjs-1] = obj; } GetObjectPosition(id, &dummy, &dummy, &x, &y); GetWinInfo(id, &wx, &wy, &dummy, &dummy); obj->x = mouse_x - (x + wx + obj->w/2); obj->y = mouse_y - (y + wy + obj->h/2); if (flags & 1) { obj->ftab->create(obj); create_object_view(obj); } else ObjectMoveTo(obj->id, obj->x, obj->y); Refresh(win->id); } return 1; } static void close_win_modify(void *data) { t_win *win = data; CloseWin(NULL); ModifyHeader(win->id, win->label); SetSizeOffset(win->nid, win->w-300, win->h-200); win->w = 300; win->h = 200; DisplayWin(); } static void win_modify(void *data) { t_win *win = data; int i, w, h; GetSizeOffset(win->nid, &w, &h); win->w += w; win->h += h; MkDialogue(ADAPTIVE, "Modify dialog", 0); AddEditBox(DOWNLEFT, 100, "Inner width", FINT, 4, &win->w); AddEditBox(RIGHT, 100, "...height", FINT, 4, &win->h); AddEditBox(DOWNLEFT, 200, "Label", FPTRSTR, 0, &win->label); for (i=0; i<3; i++) AddCheck(DOWNLEFT, wopt[i].label, win->opt+i); AddButton(DOWNLEFT|ALIGNCENTER, "OK", close_win_modify, win); DisplayWin(); } static void create_window(void *data) { t_root *root=data; t_win *win; win = GetMem(t_win, 1); *win = root->templ; win->label = MkString(root->templ.label); win->id = MkDialogue(ADAPTIVE, win->label, W_FLOATING); win->nid = StartContainer(0, 0, win->w, win->h, "", 0); MakeStretchable(win->nid, NULL, NULL, 0); SetObjectDroppable(win->nid, dropper, 3, win); AddHandler(win->nid, win_modify, win); SetMouseButtons(win->nid, RIGHT_MOUSE); EndContainer(); DisplayWin(); root->wins = ResizeMem(t_win*, root->wins, ++root->nwins); root->wins[root->nwins-1] = win; } static char *cat_string(char *code, int *size, char *buf, int len) { int orgsize = *size; *size += len; code = ResizeMem(char, code, *size); strcpy(code + orgsize - 1, buf); return code; } static void end_code(void *data) { Release(data); CloseWin(NULL); } static void do_generate_code(void *data) { FILE *file; const char *fn = FileSelect("*.c", "", FS_SHOW_MENU, "Save code as", "Save"); if (*fn) { file = fopen(fn, "wt"); if (file == NULL) { Req("Error", "Can't create that file| ~Close "); return; } fprintf(file, data); fclose(file); end_code(data); } } static char *get_code(t_root *root) { t_win *win; int i, j, size=1, len, w, h; char *code, buf[1000]; code = GetMem0(char, 1); len = sprintf(buf, "#include <cgui.h>\n\n"); code = cat_string(code, &size, buf, len); for (i=0; i<root->nwins; i++) { win = root->wins[i]; GetSizeOffset(win->nid, &w, &h); w += win->w; h += win->h; len = sprintf(buf, "void dialog_%d(void)\n{\n" " MkDialogue(ADAPTIVE, \"%s\", %s|%s|%s);\n" " StartContainer(0, 0, %d, %d, \"\", 0);\n", i, win->label, win->opt[0]?wopt[0].fn:"0", win->opt[1]?wopt[1].fn:"0", win->opt[2]?wopt[2].fn:"0", w, h); code = cat_string(code, &size, buf, len); for (j=0; j<win->nobjs; j++) { len = win->objs[j]->ftab->generate(win->objs[j], buf); code = cat_string(code, &size, buf, len); } len = sprintf(buf, " EndContainer();\n DisplayWin();\n}\n\n"); code = cat_string(code, &size, buf, len); } return code; } static void generate_code(void *data) { char *code=get_code(data); MkDialogue(ADAPTIVE, "Generated code", 0); AddTextBox(TOPLEFT, code, 400, 0, TB_FRAMESINK|TB_PREFORMAT|3); StartContainer(DOWNLEFT|ALIGNCENTER, ADAPTIVE, "", 0); AddButton(DOWNLEFT|EQUALWIDTH|EQUALHEIGHT, "Close", end_code, code); AddButton(RIGHT|EQUALWIDTH|EQUALHEIGHT, "Save code", do_generate_code, code); EndContainer(); DisplayWin(); } int main(void) { static t_root root={{300, 200, 0, 0, {0,0,0}, "Dialog", NULL, 0}, NULL, 0}; static t_fatb ftabb={but_create_view, but_create, but_dial, but_gen}; static t_fatb ftabc={chk_create_view, chk_create, chk_dial, chk_gen}; static t_fatb ftabt={tag_create_view, tag_create, tag_dial, tag_gen}; static t_fatb ftabe={ed_create_view, ed_create, ed_dial, ed_gen}; static t_obj objb={DOWNLEFT,0,0,0,"Button",NULL,&ftabb, NULL}; static t_obj objc={DOWNLEFT,0,0,0,"Check box",NULL,&ftabc, NULL}; static t_obj objt={DOWNLEFT,0,0,0,"Tag",NULL,&ftabt, NULL}; static t_obj obje={DOWNLEFT,0,0,0,"Edit box",NULL,&ftabe, NULL}; static int dummyvar; static char dummystring[1]; InitCgui(1024, 768, 15); MkDialogue(ADAPTIVE, "\"Resource work shop\" example", W_FLOATING); AddTextBox(DOWNLEFT, "This example shows a maybe odd usage of the draggable_" "feature of objects. It may however give hints about how to make a resource " "work shop._ _" "Of course 450 lines of code is not seriously ment to be such a tool, only a few objects " "are available, and there are lots of extra features on each of them that can't " "be set here. Specially the generated code can't do anyting meaningful - it " "should however compile, just to verfy._ _Instructions:_" " - Create a dialog_" " - Drop objects from the palette below into it_" " - Modify stuff by right click_ _", 400, 0, TB_LINEFEED_); AddButton(DOWNLEFT, "Create_new dialog", create_window, &root); StartContainer(DOWNLEFT, ADAPTIVE, "Palette of objects", CT_BORDER); objb.id = AddButton(objb.x, objb.y, objb.label, dummy_func, NULL); SetObjectGrippable(objb.id, gripper, 1, LEFT_MOUSE, &objb); objt.id = AddTag(objt.x, objt.y, objt.label); SetObjectGrippable(objt.id, gripper, 1, LEFT_MOUSE, &objt); objc.id = AddCheck(objc.x, objc.y, objc.label, &dummyvar); SetObjectGrippable(objc.id, gripper, 1, LEFT_MOUSE, &objc); obje.id = AddEditBox(obje.x, obje.y, 100, obje.label, FSTRING, 0, dummystring); SetObjectGrippable(obje.id, gripper, 1, LEFT_MOUSE, &obje); EndContainer(); StartContainer(DOWNLEFT|ALIGNCENTER, ADAPTIVE, "", 0); AddButton(DOWNLEFT|EQUALWIDTH|EQUALHEIGHT, "\33~Quit", quit, NULL); AddButton(RIGHT|EQUALWIDTH|EQUALHEIGHT, "Generate_code", generate_code, &root); EndContainer(); DisplayWin(); ProcessEvents(); return 0; } END_OF_MAIN(); Index: 16filere.c =================================================================== RCS file: /cvsroot/cgui/cgui/examples/16filere.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** 16filere.c 8 Jun 2003 09:06:50 -0000 1.2 --- 16filere.c 9 Jun 2003 19:02:31 -0000 1.3 *************** *** 15,19 **** static void start_disk_browse(void *data nouse) { ! FileManager("", FM_BROWSE_DAT); } --- 15,19 ---- static void start_disk_browse(void *data nouse) { ! FileManager("File manager", FM_BROWSE_DAT); } Index: 25viewer.c =================================================================== RCS file: /cvsroot/cgui/cgui/examples/25viewer.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** 25viewer.c 2 Mar 2003 17:57:34 -0000 1.1 --- 25viewer.c 9 Jun 2003 19:02:31 -0000 1.2 *************** *** 30,34 **** int main(int argc,char *argv[]) { ! InitCgui(800,600,8); /* Check command line */ if (argc>2) { --- 30,34 ---- int main(int argc,char *argv[]) { ! InitCgui(800, 600, 15); /* Check command line */ if (argc>2) { Index: 26joytst.c =================================================================== RCS file: /cvsroot/cgui/cgui/examples/26joytst.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** 26joytst.c 2 Mar 2003 17:57:34 -0000 1.1 --- 26joytst.c 9 Jun 2003 19:02:31 -0000 1.2 *************** *** 86,90 **** TRACE("Allegro initialized\n"); install_keyboard(); ! InitCgui(640,480,16); /* Init CGUI */ TRACE("CGUI initialized\n"); --- 86,90 ---- TRACE("Allegro initialized\n"); install_keyboard(); ! InitCgui(640,480,15); TRACE("CGUI initialized\n"); Index: 27usrob.c =================================================================== RCS file: /cvsroot/cgui/cgui/examples/27usrob.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** 27usrob.c 8 Jun 2003 20:30:25 -0000 1.1 --- 27usrob.c 9 Jun 2003 19:02:31 -0000 1.2 *************** *** 1,4 **** /* CGUI Example program showing how to create application specific shapes ! of objects. Circles designed by Rafal. */ #include <allegro.h> #include "cgui.h" --- 1,4 ---- /* CGUI Example program showing how to create application specific shapes ! of objects. "Lamps" (circles) designed by Rafal. */ #include <allegro.h> #include "cgui.h" *************** *** 21,29 **** } - static void do_nothing(void *data nouse) - { - Req("Nothing", "| OK "); - } - static BITMAP *load_circle(const char *name, int *ok) { --- 21,24 ---- *************** *** 42,60 **** } - /* This is the drawing routing for the button-"lamp". We prefere to - show different images for up and down states (it is however an option - of yours to do so or not). 'bmp' is the bitmap of CGUI that we are - supposed to fill with whatever. Behind 'data', our private data, is the - bitmap-array (as passed to 'SetObjectViewer' in main). */ - static void my_button_draw(int id nouse, BITMAP *bmp, void *data, int flags) - { - BITMAP **bmps = data; - - if (flags&CGUI_VIEWER_DOWN) - blit(bmps[1], bmp, 0, 0, 0, 0, bmps[1]->w, bmps[1]->h); - else - blit(bmps[0], bmp, 0, 0, 0, 0, bmps[0]->w, bmps[0]->h); - } - /* This is the drawing routing for the check-"lamp". Note that here we want the check box to alter between four views: Checked, Unchecked --- 37,40 ---- *************** *** 72,180 **** } - /* This one draws the "recangle" check box, just to show that it - mustn't be bitmap based. */ - static void my_check_draw2(int id, BITMAP *bmp, void *data nouse, int flags) - { - char *s = GetObjectData(id); - int color, var = GetObjectState(id); - - if (var) - clear_to_color(bmp, cgui_lblue); - else - clear_to_color(bmp, cgui_blue); - if (flags & CGUI_VIEWER_DOWN) - color = cgui_white; - else - color = cgui_black; - textout_centre_ex(bmp, GetCguiFont(), s, bmp->w/2, - (bmp->h-text_height(GetCguiFont()))/2, color, -1); - } - - /* These two functions has been automatically genrated by a frame generating - program that used a pcx file (drawn in a regular drawing program). The - generating program is available on the contributions page of cgui */ - void draw_in(BITMAP *bmp) - { - int c0 = makecol(0, 0, 0); - int c1 = makecol(128, 128, 128); - int c2 = makecol(230, 230, 230); - int c3 = makecol(255, 255, 255); - - clear_to_color(bmp, cgui_gray); - hline(bmp, 4, 0, bmp->w-5, c0); - hline(bmp, 2, 1, 3, c0); - hline(bmp, 4, 1, bmp->w-3, c1); - hline(bmp, 2, 2, 4, c1); - hline(bmp, 1, bmp->h-3, 2, c2); - hline(bmp, bmp->w-4, bmp->h-3, bmp->w-3, c2); - hline(bmp, 2, bmp->h-2, 3, c3); - hline(bmp, 4, bmp->h-2, bmp->w-5, c2); - hline(bmp, bmp->w-4, bmp->h-2, bmp->w-3, c3); - hline(bmp, 4, bmp->h-1, bmp->w-5, c3); - vline(bmp, 0, 4, bmp->h-5, c0); - vline(bmp, 1, 2, 3, c0); - vline(bmp, 1, 4, bmp->h-4, c1); - vline(bmp, bmp->w-2, 2, bmp->h-5, c2); - vline(bmp, bmp->w-2, bmp->h-4, bmp->h-3, c3); - vline(bmp, bmp->w-1, 4, bmp->h-5, c3); - putpixel(bmp, 2, 3, c1); - putpixel(bmp, bmp->w-1, 3, c2); - putpixel(bmp, 2, bmp->h-4, c2); - putpixel(bmp, bmp->w-3, bmp->h-4, c2); - } - - void draw_out(BITMAP *bmp) - { - int c0 = makecol(255, 255, 255); - int c1 = makecol(230, 230, 230); - int c2 = makecol(128, 128, 128); - int c3 = makecol(0, 0, 0); - - clear_to_color(bmp, cgui_gray); - hline(bmp, 4, 0, bmp->w-5, c0); - hline(bmp, 2, 1, 3, c0); - hline(bmp, 4, 1, bmp->w-3, c1); - hline(bmp, 2, 2, 4, c1); - hline(bmp, bmp->w-4, 2, bmp->w-2, c2); - hline(bmp, 1, bmp->h-3, 3, c2); - hline(bmp, bmp->w-4, bmp->h-3, bmp->w-3, c2); - hline(bmp, 2, bmp->h-2, 3, c3); - hline(bmp, 4, bmp->h-2, bmp->w-5, c2); - hline(bmp, bmp->w-4, bmp->h-2, bmp->w-3, c3); - hline(bmp, 4, bmp->h-1, bmp->w-5, c3); - vline(bmp, 0, 4, bmp->h-5, c0); - vline(bmp, 1, 2, 3, c0); - vline(bmp, 1, 4, bmp->h-5, c1); - vline(bmp, bmp->w-2, 3, bmp->h-5, c2); - vline(bmp, bmp->w-2, bmp->h-4, bmp->h-3, c3); - vline(bmp, bmp->w-1, 4, bmp->h-5, c3); - putpixel(bmp, 2, 3, c1); - putpixel(bmp, bmp->w-3, 3, c2); - putpixel(bmp, bmp->w-1, 3, c2); - putpixel(bmp, 1, bmp->h-4, c2); - putpixel(bmp, 2, bmp->h-4, c1); - putpixel(bmp, bmp->w-3, bmp->h-4, c2); - } - - /* This is the drawing routine for the button with the rounded corners */ - static void my_button_draw2(int id, BITMAP *bmp, void *data nouse, int flags) - { - if (flags&CGUI_VIEWER_DOWN) { - draw_in(bmp); - DrawDefaultButtonSurface(id, bmp, 1, 3, 3, 0); - } else { - draw_out(bmp); - DrawDefaultButtonSurface(id, bmp, 0, 3, 3, 0); - } - } - int main(void) { ! int ok = 1, clone_key, id; ! static int var0, var1, var2; static BITMAP *bmps[4]; - static char *label; ! InitCgui(1024, 768, 24); bmps[0] = load_circle("c1", &ok); bmps[1] = load_circle("c2", &ok); --- 52,63 ---- } int main(void) { ! int ok = 1, id; ! static int var1; static BITMAP *bmps[4]; ! InitCgui(1024, 768, 15); ! bmps[0] = load_circle("c1", &ok); bmps[1] = load_circle("c2", &ok); *************** *** 186,254 **** if (ok) { MkDialogue(ADAPTIVE, "Userdefined objects", 0); ! AddTextBox(DOWNLEFT, "This example shows how to make userdefined " ! "object types. Below you can see some circles, \"lamps\". To " ! "the left there is a button and check box using images the " ! "standard way. To the right there is also a \"lamp\"-button and " ! "a \"lamp\"check box, here however completely under the control " ! "of the CGUI programmer. Try them!_ _" ! "The blue rectangle is yet a customized check-box, not very " ! "beautiful, just to show how it works. This one is made " ! "re-sizeable by a call to `MakeStretchable' just as simple as " ! "for the standard objects_ _" ! "The button with rounded corners is a 4:th example how to make " ! "cursom objects in CGUI. Here the standard drawing routine is " ! "used to draw the top surface of the button, since we only " ! "wanted a different frame in this case._ _" ! "Note that the default look of objects is available in parallel " ! "to the new ones!_ _" ! "To make the customized object types you need to call one singel " ! "function for a new group object types. Another single function " ! "call for ech object type that should get a new look. Finally you " ! "need to write the new drawing routine. This can be done in a few " ! "lines of code. All cusom objects in this example just need " ! "a few lines of han-written code", 500, 0, TB_FRAMESINK|TB_LINEFEED_); ! ! StartContainer(DOWNLEFT, ADAPTIVE, "Standard objects", CT_BORDER); ! AddButton(DOWNLEFT, "#the_image;", do_nothing, NULL); ! AddCheck(DOWNLEFT, "#the_image;", &var0); ! EndContainer(); ! ! /* The following 3 lines specifies buttons and checkboxes to be cusomized */ ! clone_key = CreateClone(); ! SetObjectViewer(CGUI_OBJTYPE_BUTTON, my_button_draw, bmps, clone_key); ! SetObjectViewer(CGUI_OBJTYPE_CHECK, my_check_draw, bmps, clone_key); ! /* Pass the clone key and the objects will be of the modified clone. ! The size needs to be set per object since this need not be the same ! for all objects of a certain type. */ ! StartContainer(RIGHT, ADAPTIVE, "Customized objects", clone_key|CT_BORDER); ! id = AddButton(DOWNLEFT, "", do_nothing, NULL); ! SetObjectSize(id, bmps[0]->w, bmps[0]->h); id = AddCheck(DOWNLEFT, "", &var1); SetObjectSize(id, bmps[0]->w, bmps[0]->h); - /* Make a clone to be modified for the last two ones" */ - clone_key = CreateClone(); - /* Here we make the modified "rectangle-check-box" */ - SetObjectViewer(CGUI_OBJTYPE_CHECK, my_check_draw2, bmps, clone_key); - /* Here we make the modified "rounded-corner button" */ - SetObjectViewer(CGUI_OBJTYPE_BUTTON, my_button_draw2, bmps, clone_key); - - /* The extra container is needed to specify the modified clone */ - StartContainer(DOWNLEFT, ADAPTIVE, "", clone_key); - - /* Again: we use the normal AddCheck to specify our custom one */ - label = "Re-sizeable check box"; - id = AddCheck(DOWNLEFT, label, &var2); - AddHandler(id, NULL, label); - MakeStretchable(id, NULL, NULL, 0); - - /* and we use the normal AddButton to specify our custom one */ - AddButton(RIGHT, "Custom_frame here", do_nothing, NULL); - EndContainer(); /* end second clone */ - - EndContainer(); /* end outlining container */ - - /* No clone key and the buttons are picked from the default set */ StartContainer(DOWNLEFT|ALIGNCENTER, ADAPTIVE, "", 0); AddButton(DOWNLEFT|EQUALWIDTH|EQUALHEIGHT, "\33Close", close_example, NULL); --- 69,83 ---- if (ok) { MkDialogue(ADAPTIVE, "Userdefined objects", 0); ! AddTextBox(DOWNLEFT, "This example shows how to make a custom " ! "designed check-box._ _" ! "The custom check box is the lamp (circle) down here. It's yellow " ! "when checked and black when un-checked. If you " ! "have forgotten how the default one looks you can re-visit " ! "example 02objtyp, or go on to next example.", 400, 0, TB_FRAMESINK|TB_LINEFEED_); ! SetObjectViewer(CGUI_OBJTYPE_CHECK, my_check_draw, bmps, 0); id = AddCheck(DOWNLEFT, "", &var1); SetObjectSize(id, bmps[0]->w, bmps[0]->h); StartContainer(DOWNLEFT|ALIGNCENTER, ADAPTIVE, "", 0); AddButton(DOWNLEFT|EQUALWIDTH|EQUALHEIGHT, "\33Close", close_example, NULL); Index: game6.c =================================================================== RCS file: /cvsroot/cgui/cgui/examples/game6.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** game6.c 8 Jun 2003 09:06:50 -0000 1.2 --- game6.c 9 Jun 2003 19:02:31 -0000 1.3 *************** *** 105,113 **** int main(void) { - /* allegro_init(); - if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 1020, 720, 0, 0) < 0) - return 1; - InitCguiKeepCurrent(); - SetCguiColors(1);*/ srand(time(NULL)); InitCguiLoadMode(); --- 105,108 ---- Index: readme.txt =================================================================== RCS file: /cvsroot/cgui/cgui/examples/readme.txt,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** readme.txt 2 Mar 2003 17:26:12 -0000 1.1.1.1 --- readme.txt 9 Jun 2003 19:02:31 -0000 1.2 *************** *** 108,111 **** --- 108,122 ---- A joy stick testing program. Ported from Allegro's example by Rafal. + 27usrob.c + Shows a simple example how to customize the look of object types. + + 28clones.c + Shows an advanced example how to customize the look of object types. + + 29rcwrk.c + This example uses misc facilities of cgui, e.g. drag-and-drop. It is + a program to build a gui application in graphic mode. The program does + only give hints how to do that, it is not complete. + ------------------------ The game*.c examples: Not a real game, just a bouncing ball, but anyway it |