diff options
author | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:56:41 -0800 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:59:33 -0800 |
commit | d577d991b97ae2b5ee1af23641bcffc3f83af5b2 (patch) | |
tree | 590639d50205d1bcfaff2a7d2dc6ebf3f373c7ed /iup/test/pplot.c |
Initial import. Contains the im, cd and iup librairies, and a "working" Makefile for them under linux.
Diffstat (limited to 'iup/test/pplot.c')
-rwxr-xr-x | iup/test/pplot.c | 699 |
1 files changed, 699 insertions, 0 deletions
diff --git a/iup/test/pplot.c b/iup/test/pplot.c new file mode 100755 index 0000000..639aa34 --- /dev/null +++ b/iup/test/pplot.c @@ -0,0 +1,699 @@ +/* + * IupPPlot Test + * Description : Create all built-in plots. + * It is organised as two side-by-side panels: + * - left panel for current plot control + * - right panel containg tabbed plots + * Remark : depend on libs IUP, CD, IUP_PPLOT + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + + +#include "iup.h" +#include "iupcontrols.h" +#include "iup_pplot.h" + +#include <cd.h> +#include <cdiup.h> +#include <cdpdf.h> +#include <cdgdiplus.h> + + +#define MAXPLOT 6 /* room for examples */ + + +static Ihandle *plot[MAXPLOT] = {NULL}; /* PPlot controls */ +static Ihandle *dial1, *dial2, /* dials for zooming */ + *tgg1, *tgg2, /* autoscale on|off toggles */ + *tgg3, *tgg4, /* grid show|hide toggles */ + *tgg5, /* legend show|hide toggle */ + *tabs; /* tabbed control */ + +static int delete_cb(Ihandle* ih, int index, int sample_index, float x, float y) +{ + printf("DELETE_CB(%d, %d, %g, %g)\n", index, sample_index, x, y); + return IUP_DEFAULT; +} + +static int select_cb(Ihandle* ih, int index, int sample_index, float x, float y, int select) +{ + printf("SELECT_CB(%d, %d, %g, %g, %d)\n", index, sample_index, x, y, select); + return IUP_DEFAULT; +} + +static int edit_cb(Ihandle* ih, int index, int sample_index, float x, float y, float *new_x, float *new_y) +{ + printf("EDIT_CB(%d, %d, %g, %g, %g, %g)\n", index, sample_index, x, y, *new_x, *new_y); + return IUP_DEFAULT; +} + +static int postdraw_cb(Ihandle* ih, cdCanvas* cnv) +{ + int ix, iy; + + IupPPlotTransform(ih, 0.003f, 0.02f, &ix, &iy); + cdCanvasFont(cnv, NULL, CD_BOLD, 10); + cdCanvasTextAlignment(cnv, CD_SOUTH); + cdCanvasText(cnv, ix, iy, "My Inline Legend"); + printf("POSTDRAW_CB()\n"); + + return IUP_DEFAULT; +} + +static int predraw_cb(Ihandle* ih, cdCanvas* cnv) +{ + printf("PREDRAW_CB()\n"); + return IUP_DEFAULT; +} + +static void InitPlots(void) +{ + int theI; + float x, y, theFac; + + /* PLOT 0 - MakeExamplePlot1 */ + IupSetAttribute(plot[0], "TITLE", "AutoScale"); + IupSetAttribute(plot[0], "MARGINTOP", "40"); + IupSetAttribute(plot[0], "MARGINLEFT", "40"); + IupSetAttribute(plot[0], "MARGINBOTTOM", "50"); + IupSetAttribute(plot[0], "TITLEFONTSIZE", "16"); + IupSetAttribute(plot[0], "LEGENDSHOW", "YES"); + IupSetAttribute(plot[0], "AXS_XLABEL", "gnu (Foo)"); + IupSetAttribute(plot[0], "AXS_YLABEL", "Space (m^3)"); + IupSetAttribute(plot[0], "AXS_YFONTSIZE", "8"); + IupSetAttribute(plot[0], "AXS_YTICKFONTSIZE", "8"); + IupSetAttribute(plot[0], "AXS_XFONTSIZE", "10"); + IupSetAttribute(plot[0], "AXS_YFONTSIZE", "10"); + IupSetAttribute(plot[0], "AXS_XLABELCENTERED", "NO"); + IupSetAttribute(plot[0], "AXS_YLABELCENTERED", "NO"); + +// IupSetAttribute(plot[0], "USE_IMAGERGB", "YES"); +// IupSetAttribute(plot[0], "USE_GDI+", "YES"); + + theFac = (float)1.0/(100*100*100); + IupPPlotBegin(plot[0], 0); + for (theI=-100; theI<=100; theI++) + { + x = (float)(theI+50); + y = theFac*theI*theI*theI; + IupPPlotAdd(plot[0], x, y); + } + IupPPlotEnd(plot[0]); + IupSetAttribute(plot[0], "DS_LINEWIDTH", "3"); + IupSetAttribute(plot[0], "DS_LEGEND", "Line"); + + theFac = (float)2.0/100; + IupPPlotBegin(plot[0], 0); + for (theI=-100; theI<=100; theI++) + { + x = (float)theI; + y = -theFac*theI; + IupPPlotAdd(plot[0], x, y); + } + IupPPlotEnd(plot[0]); + IupSetAttribute(plot[0], "DS_LEGEND", "Curve 1"); + + IupPPlotBegin(plot[0], 0); + for (theI=-100; theI<=100; theI++) + { + x = (float)(0.01*theI*theI-30); + y = (float)0.01*theI; + IupPPlotAdd(plot[0], x, y); + } + IupPPlotEnd(plot[0]); + IupSetAttribute(plot[0], "DS_LEGEND", "Curve 2"); + + + /* PLOT 1 - MakeExamplePlot2 */ + IupSetAttribute(plot[1], "TITLE", "No Autoscale+No CrossOrigin"); + IupSetAttribute(plot[1], "TITLEFONTSIZE", "16"); + IupSetAttribute(plot[1], "MARGINTOP", "40"); + IupSetAttribute(plot[1], "MARGINLEFT", "65"); + IupSetAttribute(plot[1], "MARGINBOTTOM", "60"); + IupSetAttribute(plot[1], "BGCOLOR", "0 192 192"); + IupSetAttribute(plot[1], "AXS_XLABEL", "Tg (X)"); + IupSetAttribute(plot[1], "AXS_YLABEL", "Tg (Y)"); + IupSetAttribute(plot[1], "AXS_XAUTOMIN", "NO"); + IupSetAttribute(plot[1], "AXS_XAUTOMAX", "NO"); + IupSetAttribute(plot[1], "AXS_YAUTOMIN", "NO"); + IupSetAttribute(plot[1], "AXS_YAUTOMAX", "NO"); + IupSetAttribute(plot[1], "AXS_XMIN", "10"); + IupSetAttribute(plot[1], "AXS_XMAX", "60"); + IupSetAttribute(plot[1], "AXS_YMIN", "-0.5"); + IupSetAttribute(plot[1], "AXS_YMAX", "0.5"); + IupSetAttribute(plot[1], "AXS_XCROSSORIGIN", "NO"); + IupSetAttribute(plot[1], "AXS_YCROSSORIGIN", "NO"); + IupSetAttribute(plot[1], "AXS_XFONTSTYLE", "BOLD"); + IupSetAttribute(plot[1], "AXS_YFONTSTYLE", "BOLD"); + IupSetAttribute(plot[1], "AXS_XREVERSE", "YES"); + IupSetAttribute(plot[1], "GRIDCOLOR", "128 255 128"); + IupSetAttribute(plot[1], "GRIDLINESTYLE", "DOTTED"); + IupSetAttribute(plot[1], "GRID", "YES"); + IupSetAttribute(plot[1], "LEGENDSHOW", "YES"); + + theFac = (float)1.0/(100*100*100); + IupPPlotBegin(plot[1], 0); + for (theI=0; theI<=100; theI++) + { + x = (float)(theI); + y = theFac*theI*theI*theI; + IupPPlotAdd(plot[1], x, y); + } + IupPPlotEnd(plot[1]); + + theFac = (float)2.0/100; + IupPPlotBegin(plot[1], 0); + for (theI=0; theI<=100; theI++) + { + x = (float)(theI); + y = -theFac*theI; + IupPPlotAdd(plot[1], x, y); + } + IupPPlotEnd(plot[1]); + + /* PLOT 2 - MakeExamplePlot4 */ + IupSetAttribute(plot[2], "TITLE", "Log Scale"); + IupSetAttribute(plot[2], "TITLEFONTSIZE", "16"); + IupSetAttribute(plot[2], "MARGINTOP", "40"); + IupSetAttribute(plot[2], "MARGINLEFT", "70"); + IupSetAttribute(plot[2], "MARGINBOTTOM", "60"); + IupSetAttribute(plot[2], "GRID", "YES"); + IupSetAttribute(plot[2], "AXS_XSCALE", "LOG10"); + IupSetAttribute(plot[2], "AXS_YSCALE", "LOG2"); + IupSetAttribute(plot[2], "AXS_XLABEL", "Tg (X)"); + IupSetAttribute(plot[2], "AXS_YLABEL", "Tg (Y)"); + IupSetAttribute(plot[2], "AXS_XFONTSTYLE", "BOLD"); + IupSetAttribute(plot[2], "AXS_YFONTSTYLE", "BOLD"); + + theFac = (float)100.0/(100*100*100); + IupPPlotBegin(plot[2], 0); + for (theI=0; theI<=100; theI++) + { + x = (float)(0.0001+theI*0.001); + y = (float)(0.01+theFac*theI*theI*theI); + IupPPlotAdd(plot[2], x, y); + } + IupPPlotEnd(plot[2]); + IupSetAttribute(plot[2], "DS_COLOR", "100 100 200"); + + /* PLOT 3 - MakeExamplePlot5 */ + IupSetAttribute(plot[3], "TITLE", "Bar Mode"); + IupSetAttribute(plot[3], "TITLEFONTSIZE", "16"); + IupSetAttribute(plot[3], "MARGINTOP", "40"); + IupSetAttribute(plot[3], "MARGINLEFT", "30"); + IupSetAttribute(plot[3], "MARGINBOTTOM", "30"); + + { + const char * kLables[12] = {"jan","feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; + const float kData[12] = {1,2,3,4,5,6,7,8,9,0,1,2}; + IupPPlotBegin(plot[3], 1); + for (theI=0; theI<12; theI++) + IupPPlotAddStr(plot[3], kLables[theI], kData[theI]); + } + IupPPlotEnd(plot[3]); + IupSetAttribute(plot[3], "DS_COLOR", "100 100 200"); + IupSetAttribute(plot[3], "DS_MODE", "BAR"); + + /* PLOT 4 - MakeExamplePlot6 */ + IupSetAttribute(plot[4], "TITLE", "Marks Mode"); + IupSetAttribute(plot[4], "TITLEFONTSIZE", "16"); + IupSetAttribute(plot[4], "MARGINTOP", "40"); + IupSetAttribute(plot[4], "MARGINLEFT", "45"); + IupSetAttribute(plot[4], "MARGINBOTTOM", "40"); + IupSetAttribute(plot[4], "AXS_XAUTOMIN", "NO"); + IupSetAttribute(plot[4], "AXS_XAUTOMAX", "NO"); + IupSetAttribute(plot[4], "AXS_YAUTOMIN", "NO"); + IupSetAttribute(plot[4], "AXS_YAUTOMAX", "NO"); + IupSetAttribute(plot[4], "AXS_XMIN", "0"); + IupSetAttribute(plot[4], "AXS_XMAX", "0.011"); + IupSetAttribute(plot[4], "AXS_YMIN", "0"); + IupSetAttribute(plot[4], "AXS_YMAX", "0.22"); + IupSetAttribute(plot[4], "AXS_XCROSSORIGIN", "NO"); + IupSetAttribute(plot[4], "AXS_YCROSSORIGIN", "NO"); + IupSetAttribute(plot[4], "AXS_XTICKFORMAT", "%1.3f"); + IupSetAttribute(plot[4], "LEGENDSHOW", "YES"); + IupSetAttribute(plot[4], "LEGENDPOS", "BOTTOMRIGHT"); + + theFac = (float)100.0/(100*100*100); + IupPPlotBegin(plot[4], 0); + for (theI=0; theI<=10; theI++) + { + x = (float)(0.0001+theI*0.001); + y = (float)(0.01+theFac*theI*theI); + IupPPlotAdd(plot[4], x, y); + } + IupPPlotEnd(plot[4]); + IupSetAttribute(plot[4], "DS_MODE", "MARKLINE"); + IupSetAttribute(plot[4], "DS_SHOWVALUES", "YES"); + + IupPPlotBegin(plot[4], 0); + for (theI=0; theI<=10; theI++) + { + x = (float)(0.0001+theI*0.001); + y = (float)(0.2-theFac*theI*theI); + IupPPlotAdd(plot[4], x, y); + } + IupPPlotEnd(plot[4]); + IupSetAttribute(plot[4], "DS_MODE", "MARK"); + IupSetAttribute(plot[4], "DS_MARKSTYLE", "HOLLOW_CIRCLE"); + + /* PLOT 5 - MakeExamplePlot8 */ + IupSetAttribute(plot[5], "TITLE", "Data Selection and Editing"); + IupSetAttribute(plot[5], "TITLEFONTSIZE", "16"); + IupSetAttribute(plot[5], "MARGINTOP", "40"); + + theFac = (float)100.0/(100*100*100); + IupPPlotBegin(plot[5], 0); + for (theI=-10; theI<=10; theI++) + { + x = (float)(0.001*theI); + y = (float)(0.01+theFac*theI*theI*theI); + IupPPlotAdd(plot[5], x, y); + } + IupPPlotEnd(plot[5]); + IupSetAttribute(plot[5], "DS_COLOR", "100 100 200"); + IupSetAttribute(plot[5], "DS_EDIT", "YES"); + IupSetCallback(plot[5], "DELETE_CB", (Icallback)delete_cb); + IupSetCallback(plot[5], "SELECT_CB", (Icallback)select_cb); + IupSetCallback(plot[5], "POSTDRAW_CB", (Icallback)postdraw_cb); + IupSetCallback(plot[5], "PREDRAW_CB", (Icallback)predraw_cb); + IupSetCallback(plot[5], "EDIT_CB", (Icallback)edit_cb); + +} + +static int tabs_get_index(void) +{ + Ihandle *curr_tab = IupGetHandle(IupGetAttribute(tabs, "VALUE")); + char *ss = IupGetAttribute(curr_tab, "TABTITLE"); + ss += 5; /* Skip "Plot " */ + return atoi(ss); +} + +/* Some processing required by current tab change: the controls at left + will be updated according to current plot props */ +static int tabs_tabchange_cb(Ihandle* self, Ihandle* new_tab) +{ + int ii=0; + + char *ss = IupGetAttribute(new_tab, "TABTITLE"); + ss += 5; /* Skip "Plot " */ + ii = atoi(ss); + + /* autoscaling X axis */ + if (IupGetInt(plot[ii], "AXS_XAUTOMIN") && IupGetInt(plot[ii], "AXS_XAUTOMAX")) { + IupSetAttribute(tgg2, "VALUE", "ON"); + IupSetAttribute(dial2, "ACTIVE", "NO"); + } + else { + IupSetAttribute(tgg2, "VALUE", "OFF"); + IupSetAttribute(dial2, "ACTIVE", "YES"); + } + /* autoscaling Y axis */ + if (IupGetInt(plot[ii], "AXS_YAUTOMIN") && IupGetInt(plot[ii], "AXS_YAUTOMAX")) { + IupSetAttribute(tgg1, "VALUE", "ON"); + IupSetAttribute(dial1, "ACTIVE", "NO"); + } + else { + IupSetAttribute(tgg1, "VALUE", "OFF"); + IupSetAttribute(dial1, "ACTIVE", "YES"); + } + + /* grid */ + if (IupGetInt(plot[ii], "GRID")) + { + IupSetAttribute(tgg3, "VALUE", "ON"); + IupSetAttribute(tgg4, "VALUE", "ON"); + } + else + { + /* X axis */ + if (*IupGetAttribute(plot[ii], "GRID") == 'V') + IupSetAttribute(tgg3, "VALUE", "ON"); + else + IupSetAttribute(tgg3, "VALUE", "OFF"); + /* Y axis */ + if (*IupGetAttribute(plot[ii], "GRID") == 'H') + IupSetAttribute(tgg4, "VALUE", "ON"); + else + IupSetAttribute(tgg4, "VALUE", "OFF"); + } + + /* legend */ + if (IupGetInt(plot[ii], "LEGENDSHOW")) + IupSetAttribute(tgg5, "VALUE", "ON"); + else + IupSetAttribute(tgg5, "VALUE", "OFF"); + + return IUP_DEFAULT; +} + +/* show/hide V grid */ +static int tgg3_cb(Ihandle *self, int v) +{ + int ii = tabs_get_index(); + + if (v) + { + if (IupGetInt(tgg4, "VALUE")) + IupSetAttribute(plot[ii], "GRID", "YES"); + else + IupSetAttribute(plot[ii], "GRID", "VERTICAL"); + } + else + { + if (!IupGetInt(tgg4, "VALUE")) + IupSetAttribute(plot[ii], "GRID", "NO"); + else + IupSetAttribute(plot[ii], "GRID", "HORIZONTAL"); + } + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + + +/* show/hide H grid */ +static int tgg4_cb(Ihandle *self, int v) +{ + int ii = tabs_get_index(); + + if (v) + { + if (IupGetInt(tgg3, "VALUE")) + IupSetAttribute(plot[ii], "GRID", "YES"); + else + IupSetAttribute(plot[ii], "GRID", "HORIZONTAL"); + } + else + { + if (!IupGetInt(tgg3, "VALUE")) + IupSetAttribute(plot[ii], "GRID", "NO"); + else + IupSetAttribute(plot[ii], "GRID", "VERTICAL"); + } + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + + +/* show/hide legend */ +static int tgg5_cb(Ihandle *self, int v) +{ + int ii = tabs_get_index(); + + if (v) + IupSetAttribute(plot[ii], "LEGENDSHOW", "YES"); + else + IupSetAttribute(plot[ii], "LEGENDSHOW", "NO"); + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + + +/* autoscale Y */ +static int tgg1_cb(Ihandle *self, int v) +{ + int ii = tabs_get_index(); + + if (v) { + IupSetAttribute(dial1, "ACTIVE", "NO"); + IupSetAttribute(plot[ii], "AXS_YAUTOMIN", "YES"); + IupSetAttribute(plot[ii], "AXS_YAUTOMAX", "YES"); + } + else { + IupSetAttribute(dial1, "ACTIVE", "YES"); + IupSetAttribute(plot[ii], "AXS_YAUTOMIN", "NO"); + IupSetAttribute(plot[ii], "AXS_YAUTOMAX", "NO"); + } + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + + +/* autoscale X */ +static int tgg2_cb(Ihandle *self, int v) +{ + int ii = tabs_get_index(); + + if (v) { + IupSetAttribute(dial2, "ACTIVE", "NO"); + IupSetAttribute(plot[ii], "AXS_XAUTOMIN", "YES"); + IupSetAttribute(plot[ii], "AXS_XAUTOMAX", "YES"); + } + else { + IupSetAttribute(dial2, "ACTIVE", "YES"); + IupSetAttribute(plot[ii], "AXS_XAUTOMIN", "NO"); + IupSetAttribute(plot[ii], "AXS_XAUTOMAX", "NO"); + } + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + + +/* Y zoom */ +static int dial1_btndown_cb(Ihandle *self, double angle) +{ + int ii = tabs_get_index(); + + IupStoreAttribute(plot[ii], "OLD_YMIN", IupGetAttribute(plot[ii], "AXS_YMIN")); + IupStoreAttribute(plot[ii], "OLD_YMAX", IupGetAttribute(plot[ii], "AXS_YMAX")); + + return IUP_DEFAULT; +} + +static int dial1_btnup_cb(Ihandle *self, double angle) +{ + int ii = tabs_get_index(); + double x1, x2, xm; + char *ss; + + x1 = IupGetFloat(plot[ii], "OLD_YMIN"); + x2 = IupGetFloat(plot[ii], "OLD_YMAX"); + + ss = IupGetAttribute(plot[ii], "AXS_YMODE"); + if ( ss && ss[3]=='2' ) { + /* LOG2: one circle will zoom 2 times */ + xm = 4.0 * fabs(angle) / 3.141592; + if (angle>0.0) { x2 /= xm; x1 *= xm; } + else { x2 *= xm; x1 /= xm; } + } + if ( ss && ss[3]=='1' ) { + /* LOG10: one circle will zoom 10 times */ + xm = 10.0 * fabs(angle) / 3.141592; + if (angle>0.0) { x2 /= xm; x1 *= xm; } + else { x2 *= xm; x1 /= xm; } + } + else { + /* LIN: one circle will zoom 2 times */ + xm = (x1 + x2) / 2.0; + x1 = xm - (xm - x1)*(1.0-angle*1.0/3.141592); + x2 = xm + (x2 - xm)*(1.0-angle*1.0/3.141592); + } + + if (x1<x2) + { + IupSetfAttribute(plot[ii], "AXS_YMIN", "%f", x1); + IupSetfAttribute(plot[ii], "AXS_YMAX", "%f", x2); + } + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + + +/* X zoom */ +static int dial2_btndown_cb(Ihandle *self, double angle) +{ + int ii = tabs_get_index(); + + IupStoreAttribute(plot[ii], "OLD_XMIN", IupGetAttribute(plot[ii], "AXS_XMIN")); + IupStoreAttribute(plot[ii], "OLD_XMAX", IupGetAttribute(plot[ii], "AXS_XMAX")); + + return IUP_DEFAULT; +} + +static int dial2_btnup_cb(Ihandle *self, double angle) +{ + int ii = tabs_get_index(); + double x1, x2, xm; + + x1 = IupGetFloat(plot[ii], "OLD_XMIN"); + x2 = IupGetFloat(plot[ii], "OLD_XMAX"); + + xm = (x1 + x2) / 2.0; + + x1 = xm - (xm - x1)*(1.0-angle*1.0/3.141592); /* one circle will zoom 2 times */ + x2 = xm + (x2 - xm)*(1.0-angle*1.0/3.141592); + + IupSetfAttribute(plot[ii], "AXS_XMIN", "%f", x1); + IupSetfAttribute(plot[ii], "AXS_XMAX", "%f", x2); + + IupSetAttribute(plot[ii], "REDRAW", NULL); + + return IUP_DEFAULT; +} + +static int bt1_cb(Ihandle *self) +{ +// int ii = tabs_get_index(); +// cdCanvas* cnv = cdCreateCanvas(CD_PDF, "pplot.pdf -o"); +// IupPPlotPaintTo(plot[ii], cnv); +// cdKillCanvas(cnv); + return IUP_DEFAULT; +} + +void PPlotTest(void) +{ + Ihandle *vboxr[MAXPLOT+1]; /* tabs containing the plots */ + Ihandle *dlg, *vboxl, *hbox, *lbl1, *lbl2, *lbl3, *bt1, + *boxinfo, *boxdial1, *boxdial2, *f1, *f2; + int ii; + + IupPPlotOpen(); /* init IupPPlot library */ + +// cdInitGdiPlus(); + + /* create plots */ + for (ii=0; ii<MAXPLOT; ii++) + plot[ii] = IupPPlot(); + + /* left panel: plot control + Y zooming */ + dial1 = IupDial("VERTICAL"); + lbl1 = IupLabel("+"); + lbl2 = IupLabel("-"); + boxinfo = IupVbox(lbl1, IupFill(), lbl2, NULL); + boxdial1 = IupHbox(boxinfo, dial1, NULL); + + IupSetAttribute(boxdial1, "ALIGN", "ACENTER"); + IupSetAttribute(boxinfo, "ALIGN", "ACENTER"); + IupSetAttribute(boxinfo, "SIZE", "20x52"); + IupSetAttribute(boxinfo, "GAP", "2"); + IupSetAttribute(boxinfo, "MARGIN", "4"); + IupSetAttribute(boxinfo, "EXPAND", "YES"); + IupSetAttribute(lbl1, "EXPAND", "NO"); + IupSetAttribute(lbl2, "EXPAND", "NO"); + + IupSetAttribute(dial1, "ACTIVE", "NO"); + IupSetAttribute(dial1, "SIZE", "20x52"); + IupSetCallback(dial1, "BUTTON_PRESS_CB", (Icallback)dial1_btndown_cb); + IupSetCallback(dial1, "MOUSEMOVE_CB", (Icallback)dial1_btnup_cb); + IupSetCallback(dial1, "BUTTON_RELEASE_CB", (Icallback)dial1_btnup_cb); + + tgg1 = IupToggle("Y Autoscale", NULL); + IupSetCallback(tgg1, "ACTION", (Icallback)tgg1_cb); + IupSetAttribute(tgg1, "VALUE", "ON"); + + f1 = IupFrame( IupVbox(boxdial1, tgg1, NULL) ); + IupSetAttribute(f1, "TITLE", "Y Zoom"); + + /* X zooming */ + dial2 = IupDial("HORIZONTAL"); + lbl1 = IupLabel("-"); + lbl2 = IupLabel("+"); + boxinfo = IupHbox(lbl1, IupFill(), lbl2, NULL); + boxdial2 = IupVbox(dial2, boxinfo, NULL); + + IupSetAttribute(boxdial2, "ALIGN", "ACENTER"); + IupSetAttribute(boxinfo, "ALIGN", "ACENTER"); + IupSetAttribute(boxinfo, "SIZE", "64x16"); + IupSetAttribute(boxinfo, "GAP", "2"); + IupSetAttribute(boxinfo, "MARGIN", "4"); + IupSetAttribute(boxinfo, "EXPAND", "HORIZONTAL"); + + IupSetAttribute(lbl1, "EXPAND", "NO"); + IupSetAttribute(lbl2, "EXPAND", "NO"); + + IupSetAttribute(dial2, "ACTIVE", "NO"); + IupSetAttribute(dial2, "SIZE", "64x16"); + IupSetCallback(dial2, "BUTTON_PRESS_CB", (Icallback)dial2_btndown_cb); + IupSetCallback(dial2, "MOUSEMOVE_CB", (Icallback)dial2_btnup_cb); + IupSetCallback(dial2, "BUTTON_RELEASE_CB", (Icallback)dial2_btnup_cb); + + tgg2 = IupToggle("X Autoscale", NULL); + IupSetCallback(tgg2, "ACTION", (Icallback)tgg2_cb); + + f2 = IupFrame( IupVbox(boxdial2, tgg2, NULL) ); + IupSetAttribute(f2, "TITLE", "X Zoom"); + + lbl1 = IupLabel(""); + IupSetAttribute(lbl1, "SEPARATOR", "HORIZONTAL"); + + tgg3 = IupToggle("Vertical Grid", NULL); + IupSetCallback(tgg3, "ACTION", (Icallback)tgg3_cb); + tgg4 = IupToggle("Horizontal Grid", NULL); + IupSetCallback(tgg4, "ACTION", (Icallback)tgg4_cb); + + lbl2 = IupLabel(""); + IupSetAttribute(lbl2, "SEPARATOR", "HORIZONTAL"); + + tgg5 = IupToggle("Legend", NULL); + IupSetCallback(tgg5, "ACTION", (Icallback)tgg5_cb); + + lbl3 = IupLabel(""); + IupSetAttribute(lbl3, "SEPARATOR", "HORIZONTAL"); + + bt1 = IupButton("Export PDF", NULL); + IupSetCallback(bt1, "ACTION", (Icallback)bt1_cb); + + vboxl = IupVbox(f1, f2, lbl1, tgg3, tgg4, lbl2, tgg5, lbl3, bt1, NULL); + IupSetAttribute(vboxl, "GAP", "4"); + IupSetAttribute(vboxl, "EXPAND", "NO"); + + /* right panel: tabs with plots */ + for (ii=0; ii<MAXPLOT; ii++) { + vboxr[ii] = IupVbox(plot[ii], NULL); /* each plot a tab */ + IupSetfAttribute(vboxr[ii], "TABTITLE", "Plot %d", ii); /* name each tab */ + IupSetHandle(IupGetAttribute(vboxr[ii], "TABTITLE"), vboxr[ii]); + } + vboxr[MAXPLOT] = NULL; /* mark end of vector */ + +// tabs = IupZboxv(vboxr); +// IupSetAttribute(tabs, "VALUE", "Plot 3"); + tabs = IupTabsv(vboxr); + IupSetCallback(tabs, "TABCHANGE_CB", (Icallback)tabs_tabchange_cb); + + hbox = IupHbox(vboxl, tabs, NULL); + IupSetAttribute(hbox, "MARGIN", "4x4"); + IupSetAttribute(hbox, "GAP", "10"); + + dlg = IupDialog(hbox); + IupSetAttribute(dlg, "SIZE", "170x"); + IupSetAttribute(dlg, "TITLE", "IupPPlot Example"); + + InitPlots(); /* It must be able to be done independent of dlg Mapping */ + + tabs_tabchange_cb(tabs, vboxr[0]); + + IupShowXY(dlg, IUP_CENTER, IUP_CENTER); + IupSetAttribute(dlg, "SIZE", NULL); +} + +#ifndef BIG_TEST +int main(int argc, char* argv[]) +{ + IupOpen(&argc, &argv); + + PPlotTest(); + + IupMainLoop(); + + IupClose(); + + return EXIT_SUCCESS; +} +#endif |