You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
2.8 KiB

/************************************************************************
This is a simple program which demonstrates the use of the MxGUI
minimalist GUI framework. The application presents a window with a
rotating square that can be moved around with the mouse.
by Michael Garland, 1999.
$Id: t-gui.cxx 400 2004-02-16 16:31:35Z garland $
************************************************************************/
#include <gfx/gfx.h>
#include <gfx/gui.h>
#include <gfx/gltools.h>
class GUI : public MxGUI
{
public:
float angle, opt_theta, center[2];
bool dragging;
public:
virtual void setup_for_drawing();
virtual void draw_contents();
virtual void update_animation();
virtual bool mouse_down(int *where, int which);
virtual bool mouse_up(int *where, int which);
virtual bool mouse_drag(int *where, int *last, int which);
};
GUI gui;
void GUI::setup_for_drawing()
{
glClearColor(0.65f, 0.65f, 0.65f, 0.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
}
void GUI::draw_contents()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex2f(-1.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(0.0, -1.0);
glVertex2f(0.0, 1.0);
glEnd();
glTranslatef(center[0], center[1], 0);
glRotatef(angle, 0, 0, 1);
glEnable(GL_BLEND);
glColor4d(0.8, 0.15, 0.15, 0.85);
glBegin(dragging?GL_LINE_LOOP:GL_POLYGON);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glDisable(GL_BLEND);
glPopMatrix();
}
void GUI::update_animation()
{
angle += opt_theta;
}
static
bool center_on_click(float *ctr, int *where)
{
double world[3];
unproject_pixel(where, world);
ctr[0] = (float)world[0];
ctr[1] = (float)world[1];
return true;
}
bool GUI::mouse_down(int *where, int which)
{
status("Clicked mouse %d at %d,%d", which, where[0], where[1]);
if( which==1 )
{
dragging = true;
return center_on_click(center, where);
}
else return false;
}
bool GUI::mouse_up(int *where, int which)
{
status("Released mouse %d at %d,%d", which, where[0], where[1]);
dragging = false;
return (which==1);
}
bool GUI::mouse_drag(int *where, int *last, int which)
{
if( which==1 )
return center_on_click(center, where);
else
return false;
}
int main(int argc, char **argv)
{
gui.opt_theta = 10.0f;
gui.angle = 0.0f;
gui.dragging = false;
gui.center[0] = gui.center[1] = 0.0f;
gui.initialize(argc, argv);
gui.toplevel->label("Simple GUI Example");
return gui.run();
}