/* * pb.c * ***************************************************************************** * * Pushbuttons for C in graphics mode * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ***************************************************************************** * * Author : Rajesh _ThE gReAt * Built on : 08/04/2001 * Last Modified on : 08/04/2001 * * Known errors : The functions in the file use standard * library functions like 'setcolor' 'getcolor' * 'setbkcolor' and some function might have forgotten * to reset the original value . Though much care is * taken to avoid this by the user it just might be * there . So double check your drawing colors after * you have called any fuction in PB.C * ***************************************************************************** * DISCLAIMER: ***************************************************************************** * * Programmers may incorporate any or all code into their programs, * giving proper credit within the source. Publication of the * source routines is permitted so long as proper credit is given * to Rajesh _ThE gReAt. * * Copyright (C) 1990, 1991 by Rajesh _ThE gReAt. You may use this program, or * code or tables extracted from it, as desired without restriction. * I can not and will not be held responsible for any damage caused from * the use of this software. * ***************************************************************************** * This source works with Turbo C 2.0 and Turbo C++ 3.0 and above. ***************************************************************************** * Rajesh _ThE gReAt is a synonym of Rajesh Goli * Source freely distributable *****************************************************************************/ #ifndef __GRAPHICS_H #include #endif #ifndef __STRING_H #include #endif #ifndef NOOFPBS #define NOOFPBS 128 #endif #define DEFAULT -2 #define DEFAULT_FONT GOTHIC_FONT #define DEFAULT_COLOR LIGHTGRAY #define DEFAULT_TOP_COLOR WHITE #define DEFAULT_BOTTOM_COLOR BLACK #define DEFAULT_TEXT_COLOR WHITE #define SIZE 2 #define MAX_CHARS 128 #define ADDITIONALH_SPACES 2 #define ADDITIONALV_SPACES 6 #ifdef DEBUG #include #endif typedef struct { signed top; /* Cant be DEFAULT*/ signed left; /* Ditto*/ signed right; /* Can be DEFAULT*/ signed bottom; /* Ditto*/ } PBDIMENSION; typedef struct { /* These can either be a color (Enum or int) or DEFAULT */ signed color; /*Color of body of PB*/ signed topbor; /*Top Border Color*/ signed botbor; /*Bottom Border color*/ signed text; /*Color of text*/ } PBCOLOR; typedef struct { PBDIMENSION dim; /*Dimemsions of Push Button */ PBCOLOR col; /*Color definations */ int font2use; /* Font to use*/ char string[MAX_CHARS]; /* String to appear on PB */ } PUSHBUTTON; /* Function Prototypes */ void initialset(PUSHBUTTON *,PUSHBUTTON ); signed drawpb(PUSHBUTTON ); void drawrect(int ,int ,int ,int ,int ); void drawborders(PBDIMENSION ,unsigned ,unsigned ); int pbcpy(PUSHBUTTON *,PUSHBUTTON ); int registerpb(PUSHBUTTON ); int getstatus(int ,int ); void clicked(int ,int ); int unregisterpb(int ); int reportpb(int ); void destroydb(void); signed drawpb(PUSHBUTTON pb) { PUSHBUTTON pbuse; unsigned savecolor,textx,texty; initialset(&pbuse,pb); drawrect(pbuse.dim.top,pbuse.dim.bottom,pbuse.dim.right,pbuse.dim.left,pbuse.col.color); savecolor = getcolor(); setcolor(pbuse.col.text); /* outtextxy((pbuse.dim.left+((ADDITIONALH_SPACES)/2)),(pbuse.dim.top / *+((ADDITIONALV_SPACES)/2) * /),pbuse.string); */ settextstyle(pbuse.font2use,HORIZ_DIR,SIZE); textx = (unsigned) ( ( (float)(((float)pbuse.dim.right - (float)pbuse.dim.left)/2.0) + (float)(pbuse.dim.left - ((float)ADDITIONALH_SPACES/2.0) )) - ( (float)((float)textwidth(pbuse.string)/2.0) ) ); texty = (unsigned)( (float) (( ((float)pbuse.dim.bottom - (float)pbuse.dim.top)/2.0) + (float)((float)pbuse.dim.top - ((float)ADDITIONALV_SPACES/2.0) )) - (float) ((float)textheight(pbuse.string)/2.0) ); #ifdef DEBUG printf("textx = %d texty = %d",textx,texty); #endif outtextxy(textx,texty,pbuse.string); setcolor(savecolor); drawborders(pbuse.dim,pbuse.col.topbor,pbuse.col.botbor); setcolor(savecolor); return registerpb(pbuse); } void initialset(PUSHBUTTON *pbuse,PUSHBUTTON pb) { if(pb.font2use == DEFAULT) { pbuse->font2use = DEFAULT_FONT; settextstyle(DEFAULT_FONT,HORIZ_DIR,SIZE); } else { pbuse->font2use = pb.font2use; settextstyle(pbuse->font2use,HORIZ_DIR,SIZE); } if(pb.col.color == DEFAULT) pbuse->col.color = DEFAULT_COLOR; else pbuse->col.color = pb.col.color; if(pb.col.topbor == DEFAULT) pbuse->col.topbor = DEFAULT_TOP_COLOR; else pbuse->col.topbor = pb.col.topbor; if(pb.col.botbor == DEFAULT) pbuse->col.botbor = DEFAULT_BOTTOM_COLOR; else pbuse->col.botbor = pb.col.botbor; if(pb.col.text == DEFAULT) pbuse->col.text = DEFAULT_TEXT_COLOR; else pbuse->col.text = pb.col.text; strcpy(pbuse->string,pb.string); pbuse->dim.top = pb.dim.top; pbuse->dim.left = pb.dim.left; if(pb.dim.right == DEFAULT) pbuse->dim.right = ((pbuse->dim.left) + textwidth(pbuse->string) + ADDITIONALH_SPACES); else pbuse->dim.right = pb.dim.right; if(pb.dim.bottom == DEFAULT) pbuse->dim.bottom = ((pbuse->dim.top) + textheight(pbuse->string) + ADDITIONALV_SPACES); else pbuse->dim.bottom = pb.dim.bottom; } void drawrect(int top,int bottom,int right,int left,int color) { int rect[5*2]; rect[0] = left; rect[1] = top; rect[2] = left; rect[3] = bottom; rect[4] = right; rect[5] = bottom; rect[6] = right; rect[7] = top; rect[8] = rect[0]; rect[9] = rect[1]; setfillstyle(SOLID_FILL,color); fillpoly(5,rect); } void drawborders(PBDIMENSION dim,unsigned topbor,unsigned botbor) { unsigned nowcolor; nowcolor = getcolor(); setcolor(topbor); line(dim.left,dim.bottom,dim.left,dim.top); line(dim.left,dim.top,dim.right,dim.top); setcolor(botbor); line(dim.left,dim.bottom,dim.right,dim.bottom); line(dim.right,dim.bottom,dim.right,dim.top); setcolor(nowcolor); } int pbcpy(PUSHBUTTON *dest,PUSHBUTTON src) { dest->font2use = src.font2use; dest->dim.top = src.dim.top; dest->dim.left = src.dim.left; dest->dim.right = src.dim.right; dest->dim.bottom = src.dim.bottom; dest->col.color = src.col.color; dest->col.topbor = src.col.topbor; dest->col.botbor = src.col.botbor; dest->col.text = src.col.text; strcpy(dest->string,src.string); } unsigned char dont_report[NOOFPBS]; int reportpb(int i) { dont_report[i] = !dont_report[i]; return dont_report[i]; } int no_of_pb_in_db=0; PUSHBUTTON pbdb[NOOFPBS]; void destroydb(void) { no_of_pb_in_db = 0; } int registerpb(PUSHBUTTON pb) { if(no_of_pb_in_db == (NOOFPBS - 1)) return -1; pbcpy(&pbdb[no_of_pb_in_db],pb); no_of_pb_in_db++; return no_of_pb_in_db; } int unregisterpb(int i) { i--; if(i > no_of_pb_in_db ) return -1; for(/**/ ; i < no_of_pb_in_db ; i++) pbcpy(&pbdb[i],pbdb[i+1]); no_of_pb_in_db--; return 0; } int getstatus(int x,int y) { int index; static char flag=0; if(flag == 0) { int i; for(i=0;i= pbdb[index].dim.left) && (x <= pbdb[index].dim.right)) && ((y >= pbdb[index].dim.top) && (y <= pbdb[index].dim.bottom))) if(!dont_report[index]) return (index+1); } return 0; } void clicked(int i,int color) { int temp; PUSHBUTTON invpb; i--; pbcpy(&invpb,pbdb[i]); if(color != DEFAULT) invpb.col.text = color; temp = invpb.col.botbor; invpb.col.botbor = invpb.col.topbor; invpb.col.topbor = temp; temp = drawpb(invpb); unregisterpb(temp); }