220 lines
6.7 KiB
C
Executable File
220 lines
6.7 KiB
C
Executable File
/** \file
|
|
* \brief GLButton Control.
|
|
*
|
|
* See Copyright Notice in "iup.h"
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#include "iup.h"
|
|
#include "iupcbs.h"
|
|
#include "iupglcontrols.h"
|
|
|
|
#include "iup_object.h"
|
|
#include "iup_attrib.h"
|
|
#include "iup_str.h"
|
|
#include "iup_register.h"
|
|
|
|
#include "iup_glcontrols.h"
|
|
#include "iup_gldraw.h"
|
|
#include "iup_glicon.h"
|
|
#include "iup_glsubcanvas.h"
|
|
#include "iup_glimage.h"
|
|
|
|
|
|
void iupGLButtonDraw(Ihandle* ih)
|
|
{
|
|
char *image = iupAttribGet(ih, "IMAGE");
|
|
char* title = iupAttribGet(ih, "TITLE");
|
|
int active = iupAttribGetInt(ih, "ACTIVE");
|
|
int pressed = iupAttribGetInt(ih, "PRESSED");
|
|
int highlight = iupAttribGetInt(ih, "HIGHLIGHT");
|
|
int selected = IupGetInt(ih, "VALUE");
|
|
char* fgcolor = iupAttribGetStr(ih, "FGCOLOR");
|
|
char* bgcolor = iupAttribGetStr(ih, "BGCOLOR");
|
|
float bwidth = iupAttribGetFloat(ih, "BORDERWIDTH");
|
|
char* bgimage = iupAttribGet(ih, "BACKIMAGE");
|
|
char* fgimage = iupAttribGet(ih, "FRONTIMAGE");
|
|
int border_width = (int)ceil(bwidth);
|
|
int draw_border = 0;
|
|
|
|
if (pressed || selected)
|
|
{
|
|
char* presscolor = iupAttribGetStr(ih, "PSCOLOR");
|
|
if (presscolor)
|
|
bgcolor = presscolor;
|
|
draw_border = 1;
|
|
|
|
if (!pressed && (bgimage || image))
|
|
iupAttribSet(ih, "PRESSED", "1");
|
|
}
|
|
else if (highlight)
|
|
{
|
|
char* hlcolor = iupAttribGetStr(ih, "HLCOLOR");
|
|
if (hlcolor)
|
|
bgcolor = hlcolor;
|
|
draw_border = 1;
|
|
}
|
|
|
|
/* draw border - can still be disabled setting bwidth=0 */
|
|
if (draw_border)
|
|
{
|
|
char* bordercolor = iupAttribGetStr(ih, "BORDERCOLOR");
|
|
iupGLDrawRect(ih, 0, ih->currentwidth - 1,
|
|
0, ih->currentheight - 1,
|
|
bwidth, bordercolor, active, 0);
|
|
}
|
|
|
|
/* draw background */
|
|
if (bgimage)
|
|
iupGLDrawIconImageZoom(ih, border_width, ih->currentwidth - 1 - border_width,
|
|
border_width, ih->currentheight - 1 - border_width,
|
|
"BACKIMAGE", bgimage, active);
|
|
else
|
|
iupGLDrawBox(ih, border_width, ih->currentwidth - 1 - border_width,
|
|
border_width, ih->currentheight - 1 - border_width,
|
|
bgcolor, 1); /* always active */
|
|
|
|
iupGLIconDraw(ih, border_width, border_width,
|
|
ih->currentwidth - 2 * border_width, ih->currentheight - 2 * border_width,
|
|
"IMAGE", image, title, fgcolor, active);
|
|
|
|
if (fgimage)
|
|
iupGLDrawIconImageZoom(ih, border_width, ih->currentwidth - 1 - border_width,
|
|
border_width, ih->currentheight - 1 - border_width,
|
|
"FRONTIMAGE", fgimage, active);
|
|
else if (!image && !title)
|
|
{
|
|
int space = border_width + 2;
|
|
iupGLDrawRect(ih, space, ih->currentwidth - 1 - space,
|
|
space, ih->currentheight - 1 - space,
|
|
1, "0 0 0", active, 0);
|
|
space++;
|
|
iupGLDrawBox(ih, space, ih->currentwidth - 1 - space,
|
|
space, ih->currentheight - 1 - space,
|
|
fgcolor, active);
|
|
}
|
|
|
|
if (selected && !pressed && (bgimage || image))
|
|
iupAttribSet(ih, "PRESSED", NULL);
|
|
}
|
|
|
|
static int iGLButtonACTION(Ihandle* ih)
|
|
{
|
|
iupGLButtonDraw(ih);
|
|
return IUP_DEFAULT;
|
|
}
|
|
|
|
static int iGLButtonBUTTON_CB(Ihandle* ih, int button, int pressed, int x, int y, char* status)
|
|
{
|
|
if (button == IUP_BUTTON1)
|
|
{
|
|
/* "PRESSED" was already updated */
|
|
iupGLSubCanvasRedraw(ih);
|
|
|
|
if (!pressed)
|
|
{
|
|
Icallback cb = IupGetCallback(ih, "ACTION");
|
|
if (cb)
|
|
{
|
|
int ret = cb(ih);
|
|
if (ret == IUP_CLOSE)
|
|
IupExitLoop();
|
|
}
|
|
}
|
|
}
|
|
|
|
(void)x;
|
|
(void)y;
|
|
(void)status;
|
|
return IUP_DEFAULT;
|
|
}
|
|
|
|
static int iGLButtonCreateMethod(Ihandle* ih, void** params)
|
|
{
|
|
IupSetCallback(ih, "GL_ACTION", iGLButtonACTION);
|
|
IupSetCallback(ih, "GL_BUTTON_CB", (Icallback)iGLButtonBUTTON_CB);
|
|
IupSetCallback(ih, "GL_LEAVEWINDOW_CB", iupGLSubCanvasRedraw);
|
|
IupSetCallback(ih, "GL_ENTERWINDOW_CB", iupGLSubCanvasRedraw);
|
|
|
|
(void)params; /* label create already parsed title */
|
|
return IUP_NOERROR;
|
|
}
|
|
|
|
static void iGLButtonComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand)
|
|
{
|
|
int fit2backimage = iupAttribGetBoolean(ih, "FITTOBACKIMAGE");
|
|
char* bgimage = iupAttribGet(ih, "BACKIMAGE");
|
|
|
|
if (fit2backimage && bgimage)
|
|
{
|
|
iupAttribSet(ih, "BORDERWIDTH", "0");
|
|
iupGLImageGetInfo(bgimage, w, h, NULL);
|
|
}
|
|
else
|
|
{
|
|
float bwidth = iupAttribGetFloat(ih, "BORDERWIDTH");
|
|
int border_width = (int)ceil(bwidth);
|
|
if (border_width == 0)
|
|
return;
|
|
|
|
/* add to the label natural size */
|
|
*w += 2 * border_width;
|
|
*h += 2 * border_width;
|
|
}
|
|
|
|
(void)children_expand; /* unset if not a container */
|
|
}
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
Iclass* iupGLButtonNewClass(void)
|
|
{
|
|
Iclass* ic = iupClassNew(iupRegisterFindClass("gllabel"));
|
|
|
|
ic->name = "glbutton";
|
|
ic->cons = "GLButton";
|
|
ic->format = "s"; /* one string */
|
|
ic->format_attr = "TITLE";
|
|
ic->nativetype = IUP_TYPEVOID;
|
|
ic->childtype = IUP_CHILDNONE;
|
|
ic->is_interactive = 0;
|
|
|
|
/* Class functions */
|
|
ic->New = iupGLButtonNewClass;
|
|
ic->Create = iGLButtonCreateMethod;
|
|
ic->ComputeNaturalSize = iGLButtonComputeNaturalSizeMethod;
|
|
|
|
iupClassRegisterCallback(ic, "ACTION", "");
|
|
|
|
/* disable VALUE inheritance */
|
|
iupClassRegisterAttribute(ic, "VALUE", NULL, NULL, NULL, NULL, IUPAF_NO_INHERIT);
|
|
|
|
iupClassRegisterAttribute(ic, "BACKIMAGE", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "BACKIMAGEPRESS", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "BACKIMAGEHIGHLIGHT", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "BACKIMAGEINACTIVE", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "FITTOBACKIMAGE", NULL, NULL, NULL, NULL, IUPAF_NO_INHERIT);
|
|
|
|
iupClassRegisterAttribute(ic, "FRONTIMAGE", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "FRONTIMAGEPRESS", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "FRONTIMAGEHIGHLIGHT", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
iupClassRegisterAttribute(ic, "FRONTIMAGEINACTIVE", NULL, NULL, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
|
|
|
|
return ic;
|
|
}
|
|
|
|
Ihandle* IupGLButton(const char* title)
|
|
{
|
|
void *params[2];
|
|
params[0] = (void*)title;
|
|
params[1] = NULL;
|
|
return IupCreatev("glbutton", params);
|
|
}
|
|
|